From 9c56b6f53b4b75532173569d7c914212b99650fb Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 29 Jun 2021 15:44:01 +0200 Subject: [PATCH 0001/1169] adding bwamem2/mem and index --- .../software/bwamem2/index/functions.nf | 68 +++++++++++++++++++ .../nf-core/software/bwamem2/index/main.nf | 35 ++++++++++ .../nf-core/software/bwamem2/index/meta.yml | 29 ++++++++ .../nf-core/software/bwamem2/mem/functions.nf | 68 +++++++++++++++++++ modules/nf-core/software/bwamem2/mem/main.nf | 47 +++++++++++++ modules/nf-core/software/bwamem2/mem/meta.yml | 44 ++++++++++++ 6 files changed, 291 insertions(+) create mode 100644 modules/nf-core/software/bwamem2/index/functions.nf create mode 100644 modules/nf-core/software/bwamem2/index/main.nf create mode 100644 modules/nf-core/software/bwamem2/index/meta.yml create mode 100644 modules/nf-core/software/bwamem2/mem/functions.nf create mode 100644 modules/nf-core/software/bwamem2/mem/main.nf create mode 100644 modules/nf-core/software/bwamem2/mem/meta.yml diff --git a/modules/nf-core/software/bwamem2/index/functions.nf b/modules/nf-core/software/bwamem2/index/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/nf-core/software/bwamem2/index/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/bwamem2/index/main.nf b/modules/nf-core/software/bwamem2/index/main.nf new file mode 100644 index 00000000..b667f266 --- /dev/null +++ b/modules/nf-core/software/bwamem2/index/main.nf @@ -0,0 +1,35 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process BWAMEM2_INDEX { + tag "$fasta" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'index', meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/bwa-mem2:2.2.1--he513fc3_0" + } else { + container "quay.io/biocontainers/bwa-mem2:2.2.1--he513fc3_0" + } + + input: + path fasta + + output: + path "bwamem2" , emit: index + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + mkdir bwamem2 + bwa-mem2 index $options.args $fasta -p bwamem2/${fasta} + echo \$(bwa-mem2 version 2>&1) > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/bwamem2/index/meta.yml b/modules/nf-core/software/bwamem2/index/meta.yml new file mode 100644 index 00000000..9d717f73 --- /dev/null +++ b/modules/nf-core/software/bwamem2/index/meta.yml @@ -0,0 +1,29 @@ +name: bwamem2_index +description: Create BWA-mem2 index for reference genome +keywords: + - index + - fasta + - genome + - reference +tools: + - bwa: + description: | + BWA-mem2 is a software package for mapping DNA sequences against + a large reference genome, such as the human genome. + homepage: https://github.com/bwa-mem2/bwa-mem2 + documentation: https://github.com/bwa-mem2/bwa-mem2#usage +input: + - fasta: + type: file + description: Input genome fasta file +output: + - index: + type: file + description: BWA genome index files + pattern: "*.{0132,amb,ann,bwt.2bit.64,pac}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@maxulysse" diff --git a/modules/nf-core/software/bwamem2/mem/functions.nf b/modules/nf-core/software/bwamem2/mem/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/nf-core/software/bwamem2/mem/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/bwamem2/mem/main.nf b/modules/nf-core/software/bwamem2/mem/main.nf new file mode 100644 index 00000000..5d0ff617 --- /dev/null +++ b/modules/nf-core/software/bwamem2/mem/main.nf @@ -0,0 +1,47 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process BWAMEM2_MEM { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.12" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:cf603b12db30ec91daa04ba45a8ee0f35bbcd1e2-0" + } else { + container "quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:cf603b12db30ec91daa04ba45a8ee0f35bbcd1e2-0" + } + + input: + tuple val(meta), path(reads) + path index + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt" , emit: version + + script: + def split_cpus = Math.floor(task.cpus/2) + def software = getSoftwareName(task.process) + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def read_group = meta.read_group ? "-R ${meta.read_group}" : "" + """ + INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` + + bwa-mem2 mem \\ + $options.args \\ + $read_group \\ + -t ${split_cpus} \\ + \$INDEX \\ + $reads \\ + | samtools view $options.args2 -@ ${split_cpus} -bhS -o ${prefix}.bam - + + echo \$(bwa-mem2 version 2>&1) > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/bwamem2/mem/meta.yml b/modules/nf-core/software/bwamem2/mem/meta.yml new file mode 100644 index 00000000..2fc7713d --- /dev/null +++ b/modules/nf-core/software/bwamem2/mem/meta.yml @@ -0,0 +1,44 @@ +name: bwamem2_mem +description: Performs fastq alignment to a fasta reference using BWA +keywords: + - mem + - bwa + - alignment + - map + - fastq + - bam + - sam +tools: + - bwa: + description: | + BWA is a software package for mapping DNA sequences against + a large reference genome, such as the human genome. + homepage: http://bio-bwa.sourceforge.net/ + documentation: http://www.htslib.org/doc/samtools.html + arxiv: arXiv:1303.3997 +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + - index: + type: file + description: BWA genome index files + pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" +output: + - bam: + type: file + description: Output BAM file containing read alignments + pattern: "*.{bam}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@maxulysse" From 56043c7827c8c5db851f8167ec5761aebee12c83 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 7 Jul 2021 09:26:42 +0200 Subject: [PATCH 0002/1169] added temporary test data from sarek --- conf/test.config | 4 ++-- .../normal/tiny_n_L001_R1_xxx.fastq.gz | Bin 0 -> 45010 bytes .../normal/tiny_n_L001_R2_xxx.fastq.gz | Bin 0 -> 47703 bytes .../normal/tiny_n_L002_R1_xxx.fastq.gz | Bin 0 -> 45431 bytes .../normal/tiny_n_L002_R2_xxx.fastq.gz | Bin 0 -> 47941 bytes .../normal/tiny_n_L004_R1_xxx.fastq.gz | Bin 0 -> 44140 bytes .../normal/tiny_n_L004_R2_xxx.fastq.gz | Bin 0 -> 44343 bytes .../normal/tiny_n_L007_R1_xxx.fastq.gz | Bin 0 -> 45690 bytes .../normal/tiny_n_L007_R2_xxx.fastq.gz | Bin 0 -> 43685 bytes .../normal/tiny_n_L008_R1_xxx.fastq.gz | Bin 0 -> 40944 bytes .../normal/tiny_n_L008_R2_xxx.fastq.gz | Bin 0 -> 42844 bytes testdata_sarek/rd_tiny.csv | 12 ++++++++++++ testdata_sarek/rd_tiny.csv.old | 14 ++++++++++++++ testdata_sarek/rd_tiny.csv~ | 14 ++++++++++++++ .../tumor/tiny_t_L001_R1_xxx.fastq.gz | Bin 0 -> 27427 bytes .../tumor/tiny_t_L001_R2_xxx.fastq.gz | Bin 0 -> 26833 bytes .../tumor/tiny_t_L002_R1_xxx.fastq.gz | Bin 0 -> 47308 bytes .../tumor/tiny_t_L002_R2_xxx.fastq.gz | Bin 0 -> 45779 bytes .../tumor/tiny_t_L003_R1_xxx.fastq.gz | Bin 0 -> 45864 bytes .../tumor/tiny_t_L003_R2_xxx.fastq.gz | Bin 0 -> 45400 bytes .../tumor/tiny_t_L005_R1_xxx.fastq.gz | Bin 0 -> 48397 bytes .../tumor/tiny_t_L005_R2_xxx.fastq.gz | Bin 0 -> 48850 bytes .../tumor/tiny_t_L006_R1_xxx.fastq.gz | Bin 0 -> 46027 bytes .../tumor/tiny_t_L006_R2_xxx.fastq.gz | Bin 0 -> 45277 bytes .../tumor/tiny_t_L007_R1_xxx.fastq.gz | Bin 0 -> 20812 bytes .../tumor/tiny_t_L007_R2_xxx.fastq.gz | Bin 0 -> 21180 bytes workflows/raredisease.nf | 4 +++- 27 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz create mode 100644 testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz create mode 100644 testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz create mode 100644 testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz create mode 100644 testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz create mode 100644 testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz create mode 100644 testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz create mode 100644 testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz create mode 100644 testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz create mode 100644 testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz create mode 100644 testdata_sarek/rd_tiny.csv create mode 100644 testdata_sarek/rd_tiny.csv.old create mode 100644 testdata_sarek/rd_tiny.csv~ create mode 100644 testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L003_R2_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L006_R1_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz create mode 100644 testdata_sarek/tumor/tiny_t_L007_R2_xxx.fastq.gz diff --git a/conf/test.config b/conf/test.config index ff4c6c82..55284c3f 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,8 +22,8 @@ params { // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' + input = 'testdata_sarek/rd_tiny.csv' // Genome references - genome = 'R64-1-1' + genome = 'GRCh38' } diff --git a/testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..b25487aa91cafdd1a6873130cc3061014106c575 GIT binary patch literal 45010 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 literal 0 HcmV?d00001 diff --git a/testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..b917c80cef2c6ae89cbc1f7af4f5f237f20074ee GIT binary patch literal 47703 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 nEi0M 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 DLA~X2 literal 0 HcmV?d00001 diff --git a/testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..ae0e1e6ee75fe733472245f9198cbd11520e66b8 GIT binary patch literal 47941 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 RE~4Q7{XcKaFr@S+0st+%ySV@W literal 0 HcmV?d00001 diff --git a/testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..29e4a3bd15a88bf0207643ea2b73b0914202438d GIT binary patch literal 44140 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μPM8qNpB!2lRE&mKfL6){9IhI$g) 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 M56kM$b*t?G0B~8;>;M1& literal 0 HcmV?d00001 diff --git a/testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..f645870a8fa2f737c280e88e4f86fd34227fd9fb GIT binary patch literal 44343 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 C+#I6- literal 0 HcmV?d00001 diff --git a/testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..d03e2369c00ecb81cb6aae02192c3dae2f45f703 GIT binary patch literal 43685 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 Z5iV!1jP1C4QA36DGMp4&>#P{@v+c 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 literal 0 HcmV?d00001 diff --git a/testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..770ea2dfb7ae2d43b009fc07bd084702e73740cd GIT binary patch literal 26833 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 literal 0 HcmV?d00001 diff --git a/testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..e591b6080e30363d25f46c7bf80836517a8f1e2e GIT binary patch literal 47308 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 IyRa7m0AfZH{r~^~ literal 0 HcmV?d00001 diff --git a/testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..7c5f826f11f1d31210afb1a05782159e2a0645b6 GIT binary patch literal 45779 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

HNBd_OocP) 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 nGRFDoWuVuonUVbYCdl literal 0 HcmV?d00001 diff --git a/testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..52059387c9744f64df6fbca94676a8992f36324a GIT binary patch literal 45864 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 Y)Su^{dS1*Ia{Pb&12&p~eC*c&01B2jkpKVy literal 0 HcmV?d00001 diff --git a/testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..def85db089263b07ed944fbc7e3fc72e37e8de6b GIT binary patch literal 48397 zcmV(tKO5MF!& zcM-|k?&Yw24esXC{O^~iUwrTsB9ToL`7b8Cg+L)he(`op_@G33GRXmc1=7=3KANuN zBfrUi*q7_&gD;Hqi@PIo(^vIa)kWX2$o%;7jGM?zB8WWg1|fM9G9Q=Z>pV{J86203 z^afdi4L9tY*N;u^g2*o5*&~UB{3c>U7Kn&V2w<@3=~x7LPd26BT^s^ov8*+{;cKr; znwAiQ4OqwZ;l=T7!(EZfqOO~QF)u>P3XC&80(6{CHS-?Z29yfzi&gOQ@KI=&u9U8P z;HviVj?8V*jde5BCG`BhhVbw>k6jUEgSmO-MXw`s%y2t+C-oMDa@@`>#Sx-NY7%6~DxdmR;TQ?E34V8$K zvU6sclYBVH8ARtelEmmeOS-T(i-Gu{YK|oDeC(P;&$3qcWp2v0Vr?5!B8JIxscEYo zw=FA3^_=}1A#FcAdfN}@mjzJO=Qt?wjlasvI%b=J&>|>|JER+ zx|h(z#-6mc`S7d>X{NcZc z4x!myyk9o5CCDwi#Bo_07!UNntCb*dd&o!R;+VwFlX^6~n^?t3mm*PicdUR0IQ}0m z*ma2=#2d&9^Ondh!s?P?vF-~!v<*bBhe5)a=trKAe2(BAkqb}lZ{eGt{TAWR@GfCH z`}iiQOYCJooki3Sp{)~5&yVBt62{r9RO>`5J7i)LrX>Z(N~I-;Ng)4ttU!piW-Im) z`VD?A*(c(p;4gJe(8c(!TemL!ug2)0;}lY}#PEDk9sNfN&_MB#Il=$2idBe#GP3G|9jlHSOU z;O~oUSmd(l%eIHi8oxGuLVO}( znh@8~0guu1{5*yl;ML44gRnF)f8hjbY&@eR)8TvX*+P_o+I&z(TI*pBwIknYI?QC^G$=l z;8I+)Nr8zAMb8q$D9ozH18M_*=3p-6AkCvL3IL1*XB!c@Au%5s>@^4VAczy&65z;( zWbeyd*L5-0WnbnZL%dZoj$p}MAJi)vRl&0QwZhD6qXB+b@ujfV1nuRZ1piIV0I3Q| z7!t4($1sO%)Ip2M1dA77%5PRGOtto~&}@imPtG-8s?`^TUDxQBae6l0GK7_;^^Z$u z=>ywtIx~!Y*XI~^c&Y@VP3vZ&x1RhKckjmmuhchqdA37r8NG84_jCVahK^;8V_$}4nia@lcT=B{ncXojjNw16h5egsK~ znm0OBe$-g96tv}45#ey$=W0_5QPH`|={0)gbx_;3Y?~8DDT92>(TFX5&{_#ryi&yu zPe3T-=alQKloNV#f;#!)DHM(~SG@+T!wkX%W}az=cVsqPQ;i*G=R#xHt?0{fD?6$e zpe4Wpu~;l!&g-?gu$F^+HjkVHvYLH{?z_e?siHzW3&;bHoCJZl2TgFC#TGliO|w9+ zboHy^uB328)Qo!TBRz8w*^Yy$o8};ge!_|O_ncUH1VwJxJ;KCn^N;4LdSsg}IFMCCqcQAfgr+RC*P9Qa_df}} z(IK>8k`PR^z7HeA4la&35&KxBz%kiUZE4|E8Jq&pN8{}0k;o@xu8Rg+rfr9#lJuGC z`~X4z2u7v130o^kluVqTgMjEHxcm3PtWYwqfalB|reMR9l7&4-c%e$C$#yQYCbqC) z;&SX|oQ8P_T{XQF!8VLzmy4x)w#_n|MiN$MGWOguDFoN^8CabOdCLh~GSZfpV^fM~ z%VwZj^%~%$e$-UHk(MNyt311O;4ID6V+ZKL|C6P6VV#`gl*E2CP`sca{3HSG2MFTgLG@ zBmF~ELN2RF*r2F%7|0T6dySbCL@h|ChmUey5}*QlC<#(Y9OkZCP+c{ap{znsPsk#7 zWo`@BbJq^V!EdXgNVV-zI!K&SdN+q~@zyO9oVrZ=0mXd&5;?GKH(9G$YfOz0)(;>_G|}cX3YPrvtty z@RWD0Bp(}RpPFx7Z6Ch5!v7l*zaz6L`$8zO9<*m>)|uk)!kQ4sVC_-y(yS?IwO=%s(5qtFkEu4r0xK65~Gy!qR?vrfN@s^%jJktjT^{f3hlK?aGrV z+v^W+5FEoY|2nc0!}(}Uxi#k#f*04*Y{J1=!&d{3;-r=C6W9YoCU_I6?uNw`{p%&T zpj~IKDF?fTdbXCmh3LM_4VM_b8OvrE3X@xOKah2{AMs;45+U?V=)%BkJ!15PU4_+jWY}RL>TD zNzh?Y;;uAmxHJyYfhDpGH6D#k(@s zZBvYGRVxe=J?)vX)6(c@G@d18j#oaDglA79Gf9d}y|&*o5v;L6BcQmmrFr25)r8l9 z>NIm4bM>XL1M4zzMa7Z$i}^M+oRU^fKDKWbj^fTgPen*Ww3S`vcAa0jO5mKwl_-ll zX+t*%tMaaCb5%8rywRE)VenCw+HRej53c{7ao-37;X7qWW=8cWjG$zx=vYxJ$`2<= zAhevSTtD=njB4^}wDmCg85oVD-WVUox_enU%gw9*0EIPU)0O>LcD1ys{#6c4TOTqr zgh~<84q@rz$T-BpzBwOHux7(GB~1aOPZ*TN?byJx?16^v@na_IRdc*6= zh;3vjbG1IbD{@~npm~eRZ-66@6Rl4d zJI1wk$%kjYCjF4eEf|ubYMVhDl0Q&P{6O`g08FU^ZAeZeV^SX3cV;11rSCJn87Ict zC^Z&L76i0tW^GOeU@!*SGuy9chz-J+eo)PQWyZG9X}IsksE>g3-=zEisw?cAkcbE2 zM~-f@mw7gdi_XumcRROg_rjWXt!6Vnzj${3&i>Z@*%vso$&nucBYy$>pJ4qkI_(T@NId^3)%YI;?J5%b| zY{fYy3R| zXg_y9B!Kd0h8l>He;IdD4q_x23{K3cS;sypJG3^Y<&exEFfPqtEukd|jW1GEjRL@= zqDtESkUoaYjors!EHuD&+0<2i5`Y1~fPYIW0KFO+)v_ND&%)XvT2sjGXo=YhN|%Sx+nta}Qii{Xa{ z`}^42i9IBu%9vco$GJ4;h!^e+K0;_yf&uJ$VLkV=YWkd;z`gS03?G^ zIww9eKFd`1z8{vc^TQ(03&0IzLG+}fi80}1QX`Rr* zO`Pp!KbM9z%;kr39ixq#WL4VKjT4zjMeRdB%VQfMR|` z`!+JO{3xT>nv`*Yj0UBUd$Ms(TwSlys*zbi_Vp{mHi{{oDB+dhii{6k?^$*hx$L^4 zIbcanDwHRj=qP@*f>xgF&78&CfiZt#6RA?U^}b9B~NuEfW#T?1DoNCZ=wUN~>n_l0gbKaWFI zn^MW`{lLf4aNqLdZaF{cxIj+3bWQ>0kvGNBKL7SAE& z3&YD}HCWr0=I8jJPixxn-dGNGYdWp1KFeQzo*@0}4QFk|HPd{Khsh{S98ggT$xZCp zv}!*h*`e)vCG}76c*fnG za`%GH;Cv20zWJ@#+Y4^PkAB;Zv~>(WDqVsOv=#WZLTV?G3BS0B7%IVWRLf2dAZ10h zTm0rii3LU<05Dd6qm#J4;`AlIQdl^@1$VEuYB3*HS0GJ>{L=)QflZ=3Dv9rpSLT~j@w3p|B}SJv8;o`3ji-%q~-_s|KGA*-3^Xpi?ZZ6 zn?tKeGy9AI&_{Ju@mwR?Q!VB!2qmtP*sXnmw2+#n4^>^(TPqc{G}O1GoHaF-^(*u( z-B>>4X52&jz%_TjUY2s1n#FMf_7Tb=I`NPGFOQx&r52EW2=~+$QlNL6AG2Bd$z|U;pB^0r!nK?2 zF#2d_3W4#5$alWx23Seute~I&2Y#3!fjo-j;fvptlTLxnt@K+d$M+S7qzoh%X8cT{WbMXzb?u9iWV8F{hT9x6#8NBMaQa~k+{@Q~}L#oIp_HXnf(iH+W{UB`XBr*&}s>4Qo zNL-5)5Pc*x?wb*)A0JR+wH&?SStz5-RA)Far{#3bbd&96uvPE$I?E#eHRL;`nai}&wTO1Q8+&P%j;xX01Cv(2&u7_OmQd`EvRAj_bR>rwb6ZZAj z6E^4Pn5aQab-D|FO7v%>PD6kL)w@%c2JvzI<8QjZL*S2Sp+CbE);XqSrWfS({^2qV zeoLC|R@81o7~)TE^aVZD(A8BhHOW5>QBr?KB{@rY=T&DF#R{V&GFn0fH-%iOvQ%$$ zh>94;&&rIGF%`EVqC0zLaS;YP1LY>)!}EftTQf8~++&{A+sIR0XNShRrr{nV{}Vmg zODW3rg%m{#a&5JkIK<@$58by3!>G9MVxUOUx2qbs zL0^le>~=)2B3IT*BnvrWztvV(ZAV_+SD~UXFmyg1Kv80obceh+WMd9tywxMqe#CuGyJ;$wd`krS2(%SH#lpzP8x;NA zFosU+A?xNr<#ZUdZ(I9QxHNtbmumYg^VqDDch*^~(*l9BPMOnI2Gl&p zih-gQHH}*@oizpO4ly8Uo{~v41LT;+r!xtP8BEs!3v?Cds-x@AM;-ENInn}O^`sw0 zHJ^eRc+CTsKM7o^)KDm!KxPZM9#?w_LKe%0+QOx27dOQe?(9==z3JNSk4H;&9H#8K z_f$*uQ$KfTq>~B57*_hnd-}gW-)7geX6UV}5AM*%0H6GtBJ&}Dh`&nIUKd=ui5jIC zMmn?5E2EFXZKg#}w1z5uz3aZrA$8t=8Voy+UMnDt z#*xAtPcqs#nv{j)8AoLEIJo2&KlssaJh6&9Bqj&BsRFjTfXnv1#)b+(ZzP|XX&3N$} zLNm$PDs4Qbl*u}n6jGE(u{{;|dm9nsYlg(caEJ;r$e$V59tQ9*?gv1gOQ17j&uS7l z4fS0$^py}GCDw}N3fGN?=@3^a+(ks$U(P%-lhyKbm#R$I2~w)Yf(vqT6DOBgELjBA zgT0QrLM3r>K$hl6tqx0B>gZgA-|O)y6c+&TE-DlarX;MV7@z^MqBFp`Sqm)859Q5d zInA$_BPCWVUa%KE9n+%tvUBOWt1wL$F0UyTH#(hUVk`c1Ja$h)#$P}o@QF)KW`_tI zn1G05ZVkTg!u$)=p~!7)la_#TXSHSFAv|62ch=m18wb>&kcWQcb;+R=OlTJxP%cC% zEj4#N!U`KnRNEzPOVJiJ5*$KzkC_@4!ldMNimpmwUcZTl7Qk(6e4m0}kiEG{1k}IH zGqucfq7&@_H`G4zd6E7!7y$cVg1>XPU0roU-&}Y&`Kbsj&LmgiO{pnf0SbzWQqs9p zvAf7GwS`VGdJ0p0m@NG6@)CU?qRDG__vbK-m#?P1qtrZF9|tP4?=N@VVtwDnyRUYh zmL)#+v1=v8O%K6y!@Z!4#|c4HeRIt<%1-CH!5YhKz~Y3*SY}l77@0pXUxqCjuHx@^ zi2k*KC`2hf9eY;7#V!Z>rTv_oZLTKSP%CnM%n^<4wb&IgO)zP|_Le!Fpb0+9+=J8E zG-jT$=jmCv2wuF%gbaDQh+D3#L ztQNMIZ$#!lUzVw&4`&Lv?Tn2gY6EMS2J{`EMZ0C3sZu>%bKhM+AEKXh>O=E;C?&-b z^G8YvS7I!j$kPQN!4SYqWw{tevs8-GVjy%En~q#&9N@=6^KJ6H_H+}1AEx!bcXmnB zk_`43W4d*is`_z08OLJHwreVUSIa&t2|sIzby!;FQfHQeGarD8(mf@t%lKBukoZ9? zo%4Yk7w*u;bg5!Ul0+#Q2Ehml6sD*UcTYknnzluv)l9b{f?KhPvQ#BF+qNJs#xS3+ zxrfn`YniNHhU3iVDpWC+%)OpY{3CpnBN#>$37hP*84z~Eve{t20yF_OkirJAH(i+U zr)0n_boXgv!xFmJCfj9WYF#s`!NKNxNGk)6MoyRPx{Dbab7>24J?FAj%#DzPEipW5 zv7Pn)?(!|40!0sn2gvz)Tees`-k8m?X$``m&|>YIDV{J zA%h`CLj`nimjCwSpA+qFHZlEegL@d3uTQ9~=lQ?${b;@oK8H*6{v5pjRAa@9u6ehe z=~R>#lE3(k{$@mf!@!;1HR6|&u-;p9V~4J; zFGeiWMC^AAt8mVb5!}JnE&dzj2S;&wEwHfE>C%N>Uly-=xHG)4Qb#YGEKuK7+QrdQ zj=2o%@;brLkxhCc>u%60CQ8Wf8>M|@pWBM@ZMxTW;TaTNlrRN$Ex}?Tta5>I6$+sK zqooKV4%~KU^`$AZFUEy;JwDt(rzB>pGF)ZPLrzI6J03CvkjJ%CW?zp&jmt~&JvWzl zUyRRUS1giA@p#_yCYbQ~qC1M*JdG_jG(!E*8IG3HSyr~|c;;H*uBdL93U>)}WIt@R ziawloSv4MF2gvmF*`-TfX9xfhf2n~UXkV8nd>{!;q|KAyn1I8%9dToJsAib(I9JeP ztx~E1En}%dTtbA*?tIC;HSN$`I>T({_tBtpW|Uyuw<}RzuOM0Z8NUi;n3d9tF~D*4 zNt@+OB`MNYW(ESeK|}+_{nw0!DoeM8NKFMOc!d2x#TQzU!Bb`Wv$Jg)(+#HTnH6^} z1x6`A;z1P1Dne1FoH+0NQvD+L86=UF0imF+v-rZT>{zg}l@`6k3nHw9U!SSidJKWt zG+TDCZ>7EM`}H{~!kr%C$mq)3;u~JGgCwJIJ-5%=|CR{#?+7%seICINJ0=x6v{7h; zFC{ak=1t8_WxNB`*|I85lDw2*+ccx-WZDAg2{;{Tcw3QC!>qUNTEJmdBW2icw>;$OZ>i`pR8UqXt6GQh@U}#)l*Hg6tKg_$gCayZUvdK{Eoa+~ zEyq7Tu-M<~no8BJ{bVk|?s{n5vrel}UvllVu4Z~j_dfP?$Ne3WR9J^G7&_W%j#V`c z&ca0NcaLH0CFbw@QaLY zZ7RLN_mj|?`N-#Ri@Yz|2jomzQ&Toa_K5%wHg6so7u8+9YHeKP*)V)qodg+eN&U4I`a*HV1mA*L^Xzq< zoa8l%)yyYwG5^un1zxq2z~51UKa0di`VLB*PY1BMhI{x$m8~Syt|LNhT ze<@kD^wmkZ{ZS8XWr6KFt6)nygEJn(Vc(Br_T!fF zvCcPGU#SK=V*&duRf#t){4)Av6#P@M8gYjcDDL!Dk&hCJQM2>XQNJcT$5^bHXU)<>V zrCI({KnFIDiy}f1^9q^AOj2HQ9jT9XVwGo3ihyq7z0EZ@em5||k+ITH49Ue^jBC=& z^ujX=O$`GvOM%;UEjtwd8&CB4p?=}olbJz0id#i{uuN2GVal2}i`r{o^-1cnnet4O zM5mep^lF%6M4@k6I_g1&dv~GJOtB$%)8cJd-@ngnA9kUm-K%;~*)i%J6LtK~=Y7wG zVxaz>R}IoSvfXb%TzMpt1CHs2Y8%whlxZ_tDq3IFCdekQQkWi|2h3V$EoImMZVNY^ zdg_h4if29jY0k+mi_AjK&@l9nU=CG=@%$6Q$S*32PAnifJqIqMy;Ra0S7NW>A_F_A)KO0{dBqc!=`e#w4{ zsiqHUpfCm$DF6A!U*~H!t{q%mi&V0dOGia=;-B-P;QTb%o9!DsXO(enr#wTi96d!I zHvZeF>p;-nsCeF{@tg5{wta#P6Q2Jv(??(i9a=y&*_=G!C@ZEb%lkPwmUmems0Q6lh6x^*6lv8F z)vCbQrqNpX`Fxj0l;9iF9-mjX38Z?Zo}wUQOjoC}n|%h)6Z55m%7|(ac`(K&VW4x| zsBCz7y;NaW?WwS}LYaYOC7zy;4jaCfZGgb z3rAn7DcSMP@aP$K!+2(!TSvEqDn~9wr|nPIbWh8@b0&ctnU~o6HiofE>7C>4 zdegE>l;hYhS^WKc=WlP2jSj)7CNjgnl<9t>JY0{urXT?<01-qN1x;Zb{C^r+VIN~3 ztfP;@o7C3)`aZ4~|1>{M{y$$A#QTunxzg=WcNYutjE_LuC#!#TjDKVtX*4Ss zAn)ju#+fZuGQ05#zWD+Qn#6-?nq-UxCe&TJJk1YulvjIiL#h{cMflMN@qEn|#7arv>2zJWK!NtvPPJfNnNW1y% z+XJ4ISSOHT9-Q@m-CGO}aia6E#PIEF=bt?F)UlgZ`tjm^J#^El?rJ*#&^Mw3-algF zxxZ=SnU!UcOG~CG376rL#iJnlJVDD~5X>7JRlube!is=s1uugQKXH9$H#iu8&%QC8 zv!cxQt(z(QjA8xqwdwzC{KEn@Z4|qviQ1RdKbrQeD#4O_+UrYKi8)Cw({-7#Nc6f2 zOQP)j^_aos8yg|N_*$UgL!`ix7I6t+h{WS4FL@j)o2uH=jUM1@FhWEZM{cO&gsg3n zU#GvEw{Yc%IZz!|QJ!8y|IoP}!`ZM-gI}zP-wd?Cf`33u%(5&p9Y~5av z-GcmPd9Zb1RS2PCmuBo`k;Q_ejy53XqvGFeX~fJn`B@GkLyd!y^oH>4n1l zE1>;nPljm8q!TWG^L~XQ0bQAvA6PINj|T!XHM@&zukzSLAJVftD!Hi1j!>V@c_i&% zmA2g)<*I-8d{bey$v9aCGo`^6c8F{=e>U1IYnQD8QyyJjWBDYmifo6>j|`Z=mY64K zLn%sy1RrK48dS~!-!*E~&u4Ud_aJLv&8Qhuk#F~j|Nkuqk&!4; zZIvWX=X!6;YDx4mSU@5(GBVcNCgT@!hXwu1#Y5ZR+ZpHv~^FA>g1Fl;(8Vl2aP) zgD4H5&kWwVE=s0?LujqVdp6+$nxS0b#j{L=w9+Slw#j{SGs$n`2McxJzOECZCXG3JmadGQMjJbwA#GdOhVT|rf=-#;bv9gv3@qLddA=cLzKnPS=Mc8#Z?Xv`0;TeG(zYY} z7OUe_nGif3XMy*d`Uu`mYc?Hh7Q4Rcaw++n7@jwWSEYLXhydZ+3k)aZ&Q0c%34u|QE7u}zzY1)z-cFn-$e-dZ1r*_87F*%Z7(ENlE zaBu0zK0y$(oSgIeumu_m;%^kA_H#DJ*~zR`LJv`q8xy{P@Zm^+lSC|lRD;3yRXmN} z3u59R+SGK%{rw|GJkRSYDJSk@m;+$t9CViibcF{r_i%)xtTA+fi9&Df8;s{{cEn`h zreeMQ;6yJC@8l$A>GAl6E>8xscx`=BM%-^{WxQ^_3!5aYlZANaW3ZL~cR-Uh^wT;9 zJIj+ykzKH&2>`FPLloLY41cd{vk`|#8Js~!*1|=`hjv{-@`km>$y zUH<jWGRk2ze$+9fRA$ltWW`0s7B-}J7HS3_#jv!i zo8~m6yhOk-W#IGNxt-~yW#UyQTrWCmq3hpE>8pMev_Sq2Ny{bpsZ{aZJO<@VMd6Q)Sb4alggJfIyNNjl46;tQaJ8YH zC#obMtFN&7hT`qI$zzsy)~}Myzb#l%idb(`6lvk62V>|Xbs?=9_JNvPcj~ipfLE<0 zoz#6JoVSD&6a~W;{gr8w14=iqmBTbxF6d*aWKQY!G=U*xhw>$UO4?zY>MqRxQoLI>>QiehgRn^>% zQfawVVtJ@HOOi6he(Zz`x};6ehpBF1(>bimvJ6c(9vGp>qN`e5atmoe=hEpDS@-3K zv+hiYOHbJZInvnUPMGKDJ8hJAO&4+sSfyCSV)X+MZ&y42V%>^TYEH{{*!Wh6(S8%T z8dyd^GQb^;#LAir(PpkVbo0ANa4LTxug^U?Y7F^IcYB)zrye0Bweq=V?`P2pljL*D zV=UAW6z0)^0iP^71uz+YE<}3g$O$?8N+TRn;`A26AWfjZLsZpHWTIGVn_|0LJtg4e zG=K_DIX$!gX3;2yTDP zfqbtoTpo@75f=@P(S@+Wi{1OFWN{_dU6>t(JPjayjA+QPyDBA8R}R+RN)C;) z27p6_UnazyS}EdB`wB2JVAhkmB3m1_Ms3+lUaS&@Dp^9%>IZ&XvS5XTX!|Q;OGegSTV59!OEk zqPwy#h7`Ju%EbL%L@XCqJy@WW&0rIY|8V?`k!@yvY{?Hx{BFni&#CW%D*0l8_J zzqP+{#J{DA22o!U?J)*bdL&4)TO8fd|6N&8t5vksBq`!^9gmg~<;4h2_GwU(c;B=Adc<)kCX6Sk^GZb_?Gi386IlaDw`_`=s zSMj*hu4XJlTcoO8Syb<7Io)_TrpiK8z(d_Yvr74N|;^H+xeQ9FQG zF;u0Yhds~e@2#U@k&%LSs_?f{=;KzUyuzV3(}(%*eqHV00cF=?lj?~+`eB;7aj~Iq z{5ltF`Leb)?P?dN^2t6;^YW(m;9=ly2UB1yw&_iwN?La_`QM_~&S~%R`s({vO~SKX zm(xP~?&U5Acr1BxM8q%`hg|#7q6gzqIe8kb;bTfHJd|_UgxY7hhV)l{UqAa@V%Vwy{>U5$X zUC^xZsyB~>ANI{j(04hD{85P>VH+rG7YmVG(u)sMUO6+%tneCkDuIYS*r4?Nl&sL} z=FB-H`8g^i?6#H%ftW47n6TylSD$RO_PYCwF#uYfe0mi&F%a zDxe|j$ps~G%a*1eXpYI$slY#8W`uEL>wp-!LqZ=)Ynns;mG;X)687$Om43G+NS|E> z4L%3*2x_FM^c~AUvrPg?Hze$;hxCm8syNwq_ z)MM~n2sEi?_8`tZWA-8}ZOXfRFn@GuODqB^^|PJJbs7iTzoc?xJ)~DaeY=IsQr*z{ z`M{8?pWa5Ve#UH4qBet8zKrE+nqpS%m?Taw=*vtht0hkMFo8z5k`;1rb2u|- zqd7N+jlC=gs0DLK2E@)j0Wc^Up&DF1Gv|5vfx*!G7i2Mgor?`Y733#B1-H}UK>BqS zMTbB{czcG)#=$KHE-_QuF+f9{}7(v(BWOEO3zDVE!7{ETwkw3shhv^Ikz@@+=vJ!0SYE{K<8XpzQDVpO&cMWEa z>b5Y{GuRu+pB2*%-z{oF>lZ4g2rT9Ub8R`|iUU$DE+`3q6S{JcAv8Z~Z5d)$;ipGc zfe_zo;4AF+ytnAqv=AOLyVm91wsjnIy!_H#ub94<>|>lE)jeFQkDWI7F32x936~x~52ONdfE`#97RdWc5}!BQcvF=7B35PGBc`T z7VrhJa#;b*pZ)?)J80OHX^Z>QGTzt*qMSYyRSR>pYJTXg=$BC(w3Fx zki<%^3}oTg>K5xX3U=W_@)x!?{cw8~X&?rsE8SPTO{vE4gA~|lkGOutY^_RKqp?fc z5r6jWBVCDnE$WP-?z>*~E-z{m@b<;!zPA#2HnLQZt^Q13fiN8LQ7&C8c}c1*ESt9L7T`qJL%Z3XDyRC!XP=^eJWHEX4xl@~ zv$@*_6pOafy!$TB20paRKPSY?ic;fr_%SZsE`~^$TbNS8o8V>SN-7LliQN>}Q$#rI zO% zbYJ|BCmOVg-!GMlQ)YpMBe*}!jUPt$2n=iy39fZran_eF_Swc_cp2BnseLw!--dLc zKib@o5j#oRO1XoGWfj`_~(jjCD>4T+=UDtP{cvVT^`SMBnLqd z?(Uyv9j4Vf>racX=dpI{vl9b?*~F#`t33>62Wu{evM$=8ZfGWY(PT1rnAli$*Iz2b zq}5gAAYs9954dW+RwMWiZnV7ApWzK(4>DvYgCVSzZNVL`U>>ESWU1 zzU-x&arw|VRja3;p*E9LBGbz${5lkge9UX+PO-eqpjpV&W-M?K$Pg(T_VJt^Hx@jm z0wl%7)%$bg?3QzHk7i)aZPyk<*VQKu9sRPtD=~d1Z{kHYZrJGLl!Bo5&_+vz1MSJQ za@IdJ|Eji~1UzYC;$`j%fqGpfAH%KZWtdVL9^}p*z@J!hSBY+~Fo$@@@;atZz<+lq z32v|I2i7AOeJ41opxEw?r0ygf#}&&Y_Xr0NA@lB8md!0joN2kW$*5tMZVv{f}Bgdmm2aWTF*+1Bh(Gx>1`xX77YhJ@GOL2aRgOg z-yoFSLEHBY5BDtrCGVaKuQ8B^Jej<;o5%Utp;HMn>p0DY8(?gWXS?|IVeb5NT7tFG za7;0(S=|2|q)2|Sfx|V!+o-Qw5!KJn;+9*#H{Ht~l#<3Mh?(KCec%=FmQ*2fa=RUh!o?I=&8wi#_DVmaaYG ze9Gl~0{yXQPPIJf-%n@O)Dw@@L#;u;0&OKL%{LFq4x;mkjctQ6KqaQD?&lKOr_Z=b zCO0FX!Diy^xg##R?qG9Xkqp+e0# zFVL3()L}!jMmn{@z8fm9*y#`ODf3IVPCzCS&9-h^NB(a*w$oF&&eopE8%2FBN4;B@ zLmGDlZPNk*EvJ)FXOOH-Ngzb8)!Q2PzUoD}a2d&FihaE?j<`i`o&0=%GjxN0EIi#& zfB`xmQ>-N4SM1(Qw=a?4PQHbtXlLhmubWk+ps=N&%W%&>F+t6 z1ovfXKaO4>L@^cExy@O^K;<^cBkrU6e-DR5deaG1o&xU1dOyXF0q&i~F`F*^6J;^)6kw z+;4l?=hWbOlW52489lfFAQROvxPcu0_UQ(u{to5mQ{n}EmI9qy^k;{&40l_>@C_)! zSiT*h!PNPbexB2ho#VStxhc9Pl^JE1k)gX~-qxwSnM@}N-yH9J`orBio%XZ1`fE;F zq;@7xL~$KGi0DISvSS|9U;(XB8KB`57b2SxHfBgeWXxa65J83j_J>3Mqb%9<^-!e` zwKBMKpXKriA+aB#&q*C=WsYd!IMgnzo@H4)`_pl~IaY{U2(k-W~?u)`c3U+1!1~EW+TSBIXs$LIi+)8!U z1_wS<(38(B{o^{&_2HRe<5HmnG$UjWJiK!Oq3~=2Jg~t|Vd{+=eM&t1RvMR*wiy7b zELjA)ac?>M-eGR*5(MA6DLG>G_5u6_OxLT1M0w6Io5v&VLy^+Y(4_pSTb2}{W^e4= zf;zLUr+V_!6FddhAUwh7M`PUFAe&j@;^!$P9`>A`|I_Mic$~uLVs=*+mJsh}38!tQkJ?b54SrbjJev7&Ucb!6zhD0OceY>6xVqCa|2sUcO}UtEvEKN%Zl7Op zPr=~_J*$RD*j2Azt%ELHV9++*-oSIby>~g|j4HVNbi>_FU>1^#@vLAQG_lZGU{ZDa zTjHT`5f#SohH;{R1jx0|XxwnxNG4FG4PVMHJWfaYx;u%;l(-0JPeSlZO|X=}N?cRw z4Bf?Kb21}mIl`)$lNeMdx#TK5mzE)@j#$pBWtXx8zxhGr$Yq+&i&3&7{gETW&KX}p zT!*&cslx6gS#?V~$F3itQ{qW4bniv&;sj0oqHK#&J*>j3`H2r2c0ZK4sN6b3Ga5I- zN_L_awMrW<)fU2Two#N4gVRnW%3=_iF|^=PHc}5^Pc@+lfj^P04q`HEOSDiCPOfU?Wb8g)puelNj=u;yH`iJ}YZKr%x?iVm8j+fChcM=Dq;|vZ*T35&PlD^gUZa zJ?WTiK0}yz>EQOU!Q}&K^^!74%=P0zS3O#mZJ1YdW<$Stc_rQn=jz6`F!74h^jGyT zOz6i7@(a88qw2ZFXe@?;`@Yr#{R>S`^y7b1Q)SVhh3wdY3{1xS{(wn4z?NNuxaf`< zCLCNS1>%+z&QDTX^y+aJS3fNCM7__W0}b7wlS#L9FA_YTm@Ob=%|EW}*nn zchRGrnZNYUUk5L-rEbl-f$*KFU|6=I|3LO)0u0h|4!uy5i^$ zdSz3{JA?#W4S#_69)X^9DykZjB3My|}T&?Q`NN)5T5+5`AckIiB< zK~|Z9R@%%{;CR2x7)ca|iKOW5L_Sh^^Q0jYBD{}Quhd_0LJlk{H`=_*7nsHzF4>$g zYE<_Hn{$pxrrcFKas53RO!uFm|Ley?|BPSKS@t-iE;F0N zww_%UfaQmv!1#Vs6C#;XMTGtP;_LA8<*BQqovba~!{4KQcr<=p&Erz7zoo#ahyEn_ zNX=f=$At3`KGkgx@4SG$b}x#Zh&anlf?E)7Z@UShD#a|nl%-E4GV12hu1l(%zq;qg zadFmd(_BtJwC40*6{Lz&`P|+0Fn-F_CTHj5hUR|eB@63m*cN0c=x9INubI7_J`Nit z#WtTC&=`dk8E)xZ%rXudJb)n_l(UFI;%jr%fvlq}Ow?Sfaxit(8Ft&rX1p?;P*5iq z7}9OhrmE^#u)yGT{K<4i`*VSG?JZVJKQ_`I<-QWsV+FHyRpNnEl3t{XOXjGUe{~FC zaT^DTTwYQA0Y1X-tr?kTnXczbb+~yaDFKT9r`owv*dr69^xD1CUxSDi$1@H0M;`0T|kMZq@(-q zNJ6eO%_Pm}s_Ig#Cq(*Baxcj343PFrNhlgNVS){6_P6GI|HfK!$$W%)W*Wj7qYzXP zG_z5T7hRXlX=qJR-o!ez`%0YTdo;v8dI6C^)ug7D5Ki`_iPufVbka5skb@~WVI_!; z9pLOw>@XP_sRi|j(P)=l46Q)m zml1eaFOn2CiR_Y1XMK@M3f0pBGl6NdZUplc@7B1GV1>i~&YJtOml*{LK>o-H<=(ws zE<335%{(#r6?`H0wrHr2VR9)-d(j1iGJ~2DreOT&Ys}Y_tJ4ijMr2y=1P65I)2TIc zN>9%0!TOm_P-u2|G%%0Ls+59tkd`W2$xD94mVQ(5;&PXXYv>+>(uQItQjAo6)LIfQ zMnQxTCGlJ#RPLRzeoA|N8O_(fQXaVsYkIiukHwEg)mH7_fBd_wcETwU3>wViuA&Fz|YJ$6xgh4Fs2>+GhZMh4d0r7Jp>lLLg>kLD^PEjtbwgEl(#ZIDBj1;lZ%>h4K6=4!lN)jtg0jl;;!^gu zxLaZIR_4D^K#v~O8RI2(r+4em{;8P3AW6wt9Yhup_W|0wolMoev*x}$4Ndxr>gtEw zq*MN%^3N}O3+JL(H|OlMXd-&T+A2SOmKVGqUfro$3VG>_U~9e%F6WbODBFj#>2|=pWTo$ZbPtF$r1YNl0RgRJ^^_2i7}ps zoU>hW&njbxWPEBj2x$%H(zxc>A{iTzVKiPeUBmjf9ecNwOD950p+U~F2((4oGN8@Y zy4FjU;!;*UIV(eVVuKBMZH}Gw%lcmXS=L-*?5Hy=u9WM!c#B;X z>roxbpcP5g5SM5)SW$Yt0 zLOt{X963WuGkB+n#-h9QX;o*6>#Z;GpGLIHz{vZJ=$m*VzjkXuUwCI_!F4I0ASETC z*$L|9IE^FE*6K(hlpeg=K*tuWUY$aU#%yOlhwsb8L{a}Vr0cn-j>CUIEcdZy?RSgZ zGWmo=6s^rkV5R+w)5}?!%~4Q4%}Bj08zU+!i;2lClc%!&)(V`|qcU$6rY502Tyocz z6)tHRqx)5Cu-wb1dc!VlsnUKB)CxH*zk(!6Ef2$-uCwymj;ch_syeVOkkg}h~#YHI2-&Y4dt2gdLD-)|8Y*rJp3$?0zSmx>Vx z(vUF>1cM|cn^m?%D(E1%kvQM@wZ+gkr;J3}mI^$AnBX;sLv$iC4{_$YY_gE++f9sb zqx0o1I$z(2&W9-~;9goaPh+Z;LLozBe=lL!ViQiylSxl+_4eV(PUB-+uXY_LYwha0 zs{eOrP8Oc_KA7>;tUc5Pm#1kd*4V}H*uHeZm#dlU_MMxmgn5@~8hSeAsv&4qtWWEr z$j_CO&x@uj#F5zB%DIR}`U{z2ZVz_^#uX?L8HWuQ^9WN^!47OH7vUx0iLQ zEstw(yeQ!Kr%Nft?g2f^ZAc+)gML=v_#lKNVS;tM=>F8U1CWE0dV~CSDMV51rGkU_ zB9qk1dP9LS{Ie07p~o<>sNxv-c|kg!HnBjS%_^=?I0gMCqKbLS9Vh3VHJ5EUn5t0Z z^YZh;;z6l2?7?4eP^xSj4v1QD2N|K3WGAG~XgOLuJN3ZEutJ@3=!t&l{7UfS80I<- zbC_{`&ppfqM6Xxa76I_dStXC(R!!rYjWGh3w2d~cE;=;#Qx>w?tj^Cob1MWu*QS+B zh|<)FQY4y%v67x-u1HFYEw5Ql12y+K{_px75gju~DuGP!^20@^Pn(o{Rz^e|Uf(`% z8eY8D#K}MZ{`E#GGx0xU-13X~Hg79W;z3Xx6!hOw^_IXPTQ>S5Z}dCc^61U($+v|z z*x~3vw?kc-95G|_NLR+-Sb`*ekeuZ!Cp1WesL!Jp1RZ8?4E^J}i#dZ^lh`n5l9$Q5qW zRF}M)_1?bb)56`JYe~tzge9f~F`sAWl-Wswh|V2tIxmR+&6(^lG%00Dk~x?ni03TR zbhza1WZI!@(#koEp;V`k|CM?({lak02qyWZN1AC>m1SHQ#xN;Kq$6rL-#AVsgE$kS z9F5t|G73*Asd-bej_7-n&i#8&xl1>5x}C`mljo787$`Z*97IqZm2%BQSAl)?{O)-; zBNwx7=5UIZg&io@!;GuAKxXV96oso9@(uK=6L{~05Z8!j+1!)x6@A@qH3rbOKArLM zuPOGT4!8B~TueiJnK3-?*K#?$s9JDbtA6PF+SJ;`AbJPbAPcmTW=}%z<(dIq=W?uO z@)2~^`L4Q9)_}cAwlEpEGp~1JOFgZDlXM%LYVe=%;q%U>FlJrKvj6#~@8B8?g-178 zvSpU#ucxN1qfZHlwIoFc$xnc_4E~tn3N`Ao69ka%MxS$gxGE@^MQZdi;?8#a7i90t zt95vgQCxMUQi>d>!v5X)-V?pU{NM;Ju_})1!=r;|-Dc*r4d$1p_2k#}c@2w;tE8RI zo5}p!0vUHm>d=`Uw)mL{R@7<1L(_JBy~~a>m6qV6T#E1?jgpJfX)dp$yL&UbUtZs4 zT(j{**~JG}r>JWO5_`vOUc)%O7^yQn+Ex7%v^|GzGM{R{elBVksXi-iGvEKOU|6YC*TJ3Y0jGuUqjeLU>C5Y)=6P z(bPeoWtVyR&nOX>F*M^g(<-(wc`p zt~1(POML0(uKTMqbz1sl`nf#}W8F}nOf{Ig$RppE*QoA)2lVsv{Ru)9N4`hzD0gP7 zUM9;{%mow9rb40@*(JHkH&#;~3O%-hBiRb%pq~N#IVXBH;=qXlB<=S$g~QYFl3S58 zD62-*E`LW?PTw0od%=1IyAAzZ0NGAop6cKS)0PiQ7$4^N_uq{eGU-a2e?4V`0RN*+l3(y@IStWx(gt1 z+Ct$F>+OcN69uulR+=kC34-ERmm3A@6H^-QjVTR{;`+YG_vJKm!eo%GOOX!fK1#1H zcw*c#kd!W}=#^0fWNg`pCW-s8LjcpdJALmA>P7pKwg5D%jyUVx&_PBkWh7NcPF(Id zIL;pIlpmL2AW{V{w@xI#pP{e}kzEcc8kzivMTofHM89tlFwLVj{7ryF#R`O!zW^~L z&GDS-vh!I$gR{>)JJlW9j_G0DU;qGCg(*(^l0PQ2{uI=|FFBwmGm+ORsNVnxB(R!d zA9kDtEJ_)tj4YrQtNxb?(0E#41YK-ZiqB7G>J~f4(ff7qLhpX}G^d(5)y{pFHn@@u zez{PXhJsy^UzC|=F?V?!=P;$pV3PKXhbo-NI>@k~%!RJh_mrK#xn*peh;y)CiQGgc zF@Op$t1GEY9&DFl-4W=?Yq=QOrfiioq~N4}bh-9t_NgLSSp;nFUFuZxI-c)ElUUPG* zkaIU|(Gljo+{3&#)c4acZ+Hds%2wH7-XN@@!4|ImJjC;3zm6B()jg!vi>ei0&F>g! zX6mBCYHZ@V%&1cRotv^6ryZ!^L~}Md#18t~ZsU+-kVHh>B{jW{DoL`@T~u-4z*Zz= zn7lMLptUZgme7QiU31_T!9{my#&%6nG}#~cyD_nM`&#b5KQ9d{CnK<-kADPn!qAaP zDcS7(jOAOIPJ!>{+7F$z#-v;X3hb$fZmsQ+nXYzBW$5VE(abmr-}R&oRA~CXAq05c zsi@judP_Qo5CX3#Cts8*@|xv{n0XUv372os7Yee_*@n+9i|O36rc{X~oVnb>yNCGzNUrDP(mqyXg{l;2EtV2bYFsncnnsdmL2{EuSd45v>QI=es z#7DrW=J+pYFMs$>QJ_TQwA+=JWf`76?joclx}`3TH<5yLZkH_;+uQ6Za;R2=v)ZG` zT$#LO-r0B7j80XmpWFUM96F{gs<6^7D^J&^D~qm77Gx4a8YC|+4U3MWIe8XXZW}K` zLJU?;;~FEHkjJ7D`T%TGDKsTiZ?ho2Czk)KC zHOC__mQ_3>=RQvboy`B|Yqa*ZZ4%v2HRp1zF=eCS#(o% z;FXjrrKKGSO}KK^#O*C1SQH=?0no(q4h&`Ks0>dg;F+he&nEt#Y-TUe2UOtr$h-=z zQ*=7$1kyeS&RJkr+VbOL>Qm7i}s~N{XhVwWiL&F?mwSsGBfF zzK_1Wv3Fj6P+mUiVBbn=>2yEa=ry#lP$4g7LQxT0I;c`d8xOC|H};D#B{6M=vI?8s z1-po#1Mg+e=JN*4%jo8}Nv>RTkEFXQn%1a7@plsk6fw!HlW+%tYyV~!akyw>GCgOM zl$)Ibi31`^vXbbeNeS~!zfo8$kX`|iz$LOZb#`kHLyho9J5f*2Z{j8cJ)$_h$*zz! zm#0)r0^)9}lggTY0=wM9cTgNf`Mf)ha;1*c9{29mEVPOi`k&<9x{2k9{z)>s3%BHJ zyE7Wa=1z#;2Nj*KURdi`K*hu!h@GhL2Wx81@ zkx|SgRiS&F`?^8x31^rY-oTsKb)F&8l*)`Z)oW$R>6*g$VB2*CGwypYi;MPXc57>Q zCD_M{oQ0L<-5kB*jHsiM7W)AF3qsIcuS5eGGYX*n^>ug>mS21veFK#lakF368UAzw zxq?~oVd?wOrF?zxbGqcG!HFi~ipJG*Ri{^?2$|6hcw3`b*4!5Gu{Woa%6ndayMrn( zXvY~kmrH|OO619mjpF%1yfS09?t**tq99qi%^dBIvxBPK*6>OW=L6o5EZLlz6v1kW zY3=j-cf1%L(93^-%>97gccd<#(tnjD_hBC!%pyB-9ZhjxwATbg!=aNFo^{r1)h2=5`tR)#! zQT{!0%(XqecipXHtj>gjoO%k7OEO8=9wp(Tjg5c_c(_X-jv(Ieaw%=fisbh*6YxM} zoog<;8d*2SZ}vgD%QqrHmz!F;_Bt|zlr?*AuegvW<`gXtdvbQ+c~DFYz#iNMgIN4} zUAGk0dS9*S9}cIJ2-c@iLQ|R82R9;3g^Y3Rt2NRk`b1GgU&dCua9A&|bUWdLVf!?d~qT3CyGeH=$2c*~S4Emb*a*gEIYwnf`c zj=<*KG=$YZv?+sGjYNCDPVX$aYh<#lX=oI2Q5MCXISF>Ffc}L>Aem7T+>YAsj1uJ* zG3R>QhyaL~71l2F!=oDi24(8!;z9FKHGEbiMW*Y#+Q+7Jq_M0Yr84E$&QLKD`M|?P zrw>R;DpQtK?m%mcA{WM=H5Cx8hM+e);ew2DOB`UjebF%#i$DZxK~d!OpjT;|DyfO>ls4mHm$bKCB_)sfC#KeLDaGR$AKH$ zS{XR>V+ai<$mB+zjpy)&i`2veaS$zPJoh(;2W821*PB#Jc7027#bu}K?e*a0JHXG+ zya0O}rd?hFcjmmsn1!{{9vAOWD^(_gc6v*Sxl6f56QBrc%Cx@c=ASm@a;qPmd7kWC zES1*3y$_y2F6;e-w4iYcf=m)`EYr#6O$ z!zDMTBCWeD>z*?x3{YA>^N!Yo8^|LGl$LgEy-V(~vk$nHnVGWwkp9h;Y!fFwJ`pyW(z$~7Q3?a!xm zffBp3@I{@+R7kFd;9uJOO9*qjV)jN*z&QKmG_Nb3{@Z$hvgWo=p}T3?T1A#V*QszH z%|{-?NomC}c=es{YFpT`vane!rc+g$ZcZy3Fkus%ncU+4YA0(Kw*u1p&ftBx;-aa= z`{mT^!x%XLX**HJegj8tFy*oe)^r>Uc zLFK6dlWqTM0j)Ji`hoLAZE^G|2BN$;4M<;joIRBRjt_IuRv56Ps)^?(ZuLEaQF#Sw zozkQ9g6T-%gftv*fed%6z@L1wrEB*A6AGffJxdNJ<2J&V4Y{h6R`v0kJ5w4+Q5UAz z9W~zrZu8M}A0xf*0KHBfHF@twn}u9&f=Uw*p!AOXH4F5EL_{_NGlK}-Px;+EIn;~KGp+c?Ga+Y=HE{@{2&2dq?bJ;PiI-v`lU zmilCqv`m7+dDBJ9o{&|)^Pu~-u7|p6rCXI55fZ?D*N{S{N(F(tz>v{9*{jL9bfvbf z$HSkt+=gYV0%8WR36Ob}MXqB{V0fF|#${93_IS-@`VT0@oy0ix^W*I9hE=~FXTRvr zW|&v?Epm@GsDOj^mV->Y$4G#8L&mX(GNG&fJ6X+G#QG^+-E*B1wsP%OxPNcwasB6I zc24>^62v~btkSMNm8A?CN%Ps|4tdaHnB&(gu)zHwF*1-CiJA)Kl56ds{w0=Q;E3#( zRA-G}{_>%0%tJ~yx2M>)rAoa)DL*MVZc{YDnNYMv54ugy-OjXQ-orh>(A+LSgOGu0R~vJ>AC@~?wuwj zykM_-bXi#B!5fzoHJ4Mh9qN>4`>v-sJ~*z~YSY#2%~UzS+JvonW63#Qw>(@$4Y71# zFWZFM8QyhH)wZ>o@^s+?%itL3h1#VlnxRU$Ny~)$=t4fKoG&+CkmBD|fMBG{qD%7g z3NG$FNpZWC@hU+3(xF_iFi~qY=?z&QCi4~_=qJx}(RJy5PBli^sV=i7$eg3PGB`;w z{O&Jm)3Vv4bU1knLVjm%zhvTD1RSDdTeyd1GgHxS+Z@p@+(8baEBC*C$(l`7wu7m< z%As(y{453l%FPZ>PSw=Mb}<#T=UCy;G4>Lj)*>>&e`v0m>;A~ zg$1g^B1aZx6rq?7#W$z<%nS{@Ba|DfSMN5we+O%ZcmwLHl${hhUUhfHxYt)w_ymV} zzmvl83nUL4^x=xUBZe{@T#5jO1T_hf+EN5OC3P936}b&@d-kXGulA`swapS9hb6rM zO}7gCJDJW($37L^ZyKA+nyWh1RkbOlu3{@WV?2aJLU#9H?=d&zui?6<-~#$wTpk(C zT}Yhp+!2xEagpr(jwmH1rDwSj*~y6lf&%#hH*6Dihn#{_(sUJWeh~f*sYSTLpa~(9 zrHtI+kU*1`+%~0@&r)KrM|Hi)hX+;2dX;>-%d6u|b~86~peoA^F1pV>^&6UQ%PayK zjFy{u5>+j3WL{N)bqKfhYFC`n7Aiymu9>O0T7pbjIWVCo7px`sU=c>rQMwJe$MS@Z z)v3?kl5giu`O^J#vUU6d<>@mFK|E^8SP7r=UQeP}?xoupMmY*jluZ6v47p*^z1Wn( z`g6+9B+!2vhGCtCFdVO0wsr%TML|h^v;Is_4}pPj&@*WS3J&P5mTKAw zVlZv&UB*qhG;k~+I5CEpFm{CYwk@s)O9Ue`&&E7Od;VN%ZII~ z*Xul6GuC4}$(+&V;u$-a$#w<|SVHKG2GA|iDfSB&KhX-$gmgh@d za$gvj<5pFvzLGj3b@@FWPJsX*<z&2=CA@YF-=E{`m@^#!}lWE zzj_G}Qgu5%@Z-l^oZ3`VwS6N>y?58l<>PzlKN;F*K?Av*J-soq(xWUg&n93XQX#P@ zlabu2&fC>KnXyaNGIHwGEf9Z%0cZ2iylv`=F@`Z!WA1G!K(4td(W^41q#50>P)|A} zL6SU0JIy|mTXUmX^v6T531`->@UzSohU|3{#x1OQ3@b(VGyaNT&fP9Cj7zz@8*zw7f8IrFfnw-YO*)d46(`$;=Jf;*b$gDlf$| z!~)aK=mZy>w|NPQDAL>}h}j}Y4yqn|Hp zsw$sC3Rqz+o*qF&cd=W_F?>y-?Q6fdX&Zw-pBZcl+|);xRXfyO zS)_8Zu8aGkYJWz1Pb&NZ%V*;MIL^{_+h~C?r-A^E#M@Rg=Z3R4DBGVLfuynQ!eI znWJX158Mqk3>-h9x2GPuB!yAGgzpW*?t240CZDmg^p=ie9m4E76J0x} zOar<@;HI8j>>o?#{Bz1sz603(+>%Xc(49LOdCa8R6X#O2;G)&z4tUBZnU8+iS1PQN z%<|h=ftMZdzrmlJw&|Q-rowmYQaJ0@Wx$oaNa$6uDuIz$aKv!Hy>O&D65zDEG zJ$9VkNn>`V$!)h74m^AkKI@GCa|~}|tvpk^S-5dxaP-ciyS9YiO;Ix2W=HJ@gqHPZ z?|RIVmwoHQDtz8v`sbMLRy+XE?nH!l5E0KPtvZTP^Ik)hy$WC;z8{q4-7;A{kaZ#) zBB5yM zbcPE5(YOr+rA{JpX=?T`xM#I@o{!=$p2{Ghw@GhYdffBq>tP+{AVPpqOkfbl+W@Qj z7>zRn-TGE<=Vq-ZU(J7-HpTLOZrW{jAf)(ps~^|F+w_`tO~007UIkUO#LK;vy6SZo zDrb%RZhe;yc{>Y4y?CXC*L29B1e(BVN%g0d-jxwwGU9kpyH}HBGO8f`J2}y2(6K9| z-L6L#ELSuDHh(l73N@*=s#9ums@QzK{084p$B1~*u{(u5kyH1ueXv?VdgfwOPfCB` zu=&O=6BzB(GEO(K8{u;!x|rKGO)m?Fp1qRbLQ2+z6X?d~2poc?xsfU0PRL=m{DOmG zuN6A3IUl{=?}zIxePMXhT=RarxIEr|Wmd965^Gx9IzGpc4s1-tLLAF&5z&TaLB$1r z>zsi?#?7G^b z77169vgIGiz#N7vA63|r&sDmY88YK6D5IPX(lIgHiDQV|<6?&1+Q)~rvhKnC zV|zC(ZDsxG;h}r}`qVtMPu9S_DwPcBWY69YzluQ9rQ}oOcdA;QQ`wr3Bty9**IZ*= z^{MX9TdORm)&Es{c|l3~Ib&DFgZ%m%#~_HT8`WtQ8o_a#H5q6AoO?N>#Cf5I3DH%c z-aOOJoE)P@4g*(Uf*vnf8gzA4lDd5mbuPKUBIDo(Joon6OO<+w{0*9Yi1O^@MJ{dI zTUW?Wlq|L@JWN6_LGxKg=a{m{nOkUDdn%;U*hslF z%%6ldeTJga1!#6mgEVKyAsuN@UH+MsU*B1|V7=(FyHMbXxKuI?(=yjEYz z%1c6cG0@#v=_crwvGwtJ>ZfjQ`qh_13P#SKr*`O|Yn#HoL9429&j(UNvgW?Tb8gyJ zbPSXb@vD6yUJG~Z^>a#~U?Z4bA=X6X?WP;63KaMg)Ps)KIL{*2k>c|j#*Lol(@GNi zYW+6OCjCDx*vXwg+9Rm9gT@fO77Oi4-jXWC!>$=N$elVRsplSr4v^l>QtmtXs$>)9 zZS4GIWfDuqevg)Ng>E!h_uijET4jq6?pkAQtjz+Uec*+ov?2SH#B`&Zrv+H=k6qB|cPg#= zw(GLD`45ZcU-Ap`r}~22!e%JYDnpvijLM`cn|P`)N9buFi*ho>?RCT!@OH5;)AKmD zOXK|?FJQ9H{YOy3@tV=MfhbFtX}uSX&GM->sDfgdGD-I7p|c}y0^4+fBrZBsjb7zU z7x*CyrYD*B;zmyq7L*qlwE4QkA)REnqK6oeNZn{#cN+Sr7 zOe1J=dC6HLNg~%9jVKokmwdVLXEH(VgYl#+b{UlKmXP~3trgjOQaBs*f-`q{_0hL)6LkJwBR=%%H7QYk5+OFw_vN2R;zUDBb z({l1CNoac|siF@xZg&3mrm#RzNr$jMT$T`-FhWe9A|4z4S1}*zvtZhplVw04j@R6$ z@_DEYhsv&dEFw3|DZ6(kx@N5r#^qP&f>V9ZJ9t5nU@bfpFXF5b*^fF;w`J#|-5Z#l zb;=~7krVUxQ}$)gn&5@eMPNeBcT@UO;zb!bP)||5TqHE!**)*pN_`d2UYjg^C z-Q-tS*?;E4H9g6-*qbjvGs8Psbss7Vqu)*1GP4ggj=3q<=ch2G9BpgM)o%X|z5jYD z=3%nlOwG$DxA@_jO;f_3EnU$BKR?1bzRj#i>eimro|tG)^RAfO8+~cb4=Dk8Nn!UP zw2%Ls(nSOR&oEi=++t|bUbP`DH^!&u;eU|f`P!WN^{=M0wGWSzt!8VSHQnHrS#A8(np0V2`k}2;y+Lu3>-WtM5fJCVsD`<3h1FH^!Cmr@=n5?jw5Bl4I*aJA z0Rs>?HW)($W3%h%{cxg|Trb8rw1` zr9#~NAY!H$O~$@YvRmL1Cm`4ZYRHv_$Fhrgb!`%c=Y0rx$`{%Mm-`v%Xhi#F9n(*q zH|0-BJ`E`ES1HN#3WNuXGRy;a-#_WO=2aBv0k=UzK9= z7Kc+T#dA{V2Cr$sh(a} z>#dX{D-Ogkcqc@{qb804lcofdrt0e~Fn^)=%qImNi3;t(D%=Df-9djBYaT^GCA^S5 z<6IZrjJnFj2dE6iVBD7m&C7oKI($k0zT&Y%bAIVzQMRRc2GX_}9?k6fDJ?RU&`?_k zk1W;X$Gf{c6+_h&{m@svR2jKOzW%H~?mI7_0JrQxczkd6mTpmHXuM@8p&|{^)0Ytw z7!y?=tq9OdKC=NSQpdqKY-@UF(vyC>nSm9j>LNYrsxdnBofRv?D~3hpR4}{DnD&o> zDtYKTWJObUr?y+dxkXkTJ8@*&zup7zJ!_b^p78crIsWRMAVZ@Ey$mebG~H?FdNMw> z>7JVoP8$}vNvC}ZB@X3$B;$aeoL~LmH*--FR`@^_vY3sIr9Vj|8IFH0L_sUaWr=1d(J(HC0TRR z>}CTfR2BGl!Vx-z75AONKbn(524A$UH+kAyRSrW2A%ODv94e#}(=?`GUVR$u>^w#) ztlnWBGVQ;kpU<{)W8){ly)KwEJx}A9YEeb~Bt^c^Jk~PCj zzi1lK_8%&KKO_5YH><6;nqrR4A|HuU3C|(7U@4=a8f*A5&I54KwR#zzPW{vOQ`OGN z&v4(RXY)LEPb~}{lbeR(+lv{y_UW@LdTHW;N~mAIK(O1gXSc!ncn3>tXVp_yVEa|cJn)s!hU0kpe_e;L5_8H zYW7rLRTh~Qb-5+09!&9-uPYWR5+!}9Wg0fXw6kdKq#?`r$;U(NWzk|?(N7;{|FBOF@5?^jcO ze2%6p;Q$hoMfbGmx@rrfc}Y&2rAep$4VNzjMOEq^MKrmJLLtdB5EZ5Dtcm% zRziY{?5<=z6KWC%s^C_!q2WAkJzR4+RNTwxx}x0uJ!OqjE=lqstO=12Zdw{%LWZ>U zJND)09Ry!0|0o2dHnwgx0I%mCHcrkxB?{lO z@8~DaP(j%k`X=TwI&g``l)gRK{$vYldsq6ddUQDQm=15POI^Hc&Bdt(4rnS?D11F7 zO!Slb>jD7lB_^3j&alKxeOmT3TXAeB?Pt{+n%WzEJw zi&8O>`y&Q{GP_^bPe~!d*9Fw|6y%=A4s^d0??}?kSyz<#CV3mzH@X|?$E~lvBY#1) zp!icd^U#|G4=pgDCL_FVMd%Wce%HZO>!i5;9ce|7HA=hYmCQSMX25{xj-qDz;B9Zc{bj9MpB!OQY_t{$kLaeA_vqLO@Vk6ET?* zq*NwphoskbP|;D0I`Iaa87L%~j?5OVtC$asGZ@Sr7ai*^FPhot{R{%g-uA5vuESFdA5vTogULnJXm(9-<+i z!Y4s~AtVGBy|m6^cP#E1`LLu?3Tmmxxe(K<)RdJGi3J!Yaf_9$^<|JT#= z-v!+O&z7>VrZSx$zrD22&(q-2J#I85c&=4d4CYiY5U7GFp`vS5w1d@`e3|9?;hnLT z+ymiLV=aLV;uxo3=t%Ni%bV<$416;}z-WH~j!9aDDTLYWDSq!Mp9%e(TtCfg|2)%K zd5Vt~RVUk#d%7%+`mtDYX&?*kOxgVpXU0nEc{nq6OiCw`r?G06W8sN}t6g+v>=K4) z(UF9laSHJjE#7fHFr&ees}`yZ_&LQE+{?{gHw6rL5ej))_iGthD69pOijInW#=FwBEF?H`J$~BUw@)B1S&pp7%rm)zK zevTmv|I958Ufajjcu2Bf(LN0wJq|zEsr%OcW6jt;4fflQo_m?M-sTcEh*hQDQo6NC zC!l2cQLdpcIbvs0pl<#C0jWGz!_UuCxL3}PJos3qW~#zUSwl!ZIhakHlqK=35XFMy zZZx1To6eIaG5C7M>oKhCauU<6C3kG9C2rK0{{=S02?_pB0DC^n0BINQJyI_5Xd-C7 z;!MON86*?&AB`g^|iV1X)>76G@= z7Y=Bz1126Vg>L%L(E5+9A9>L=Et@XyqE=79I}CZ#uX)7fUrOsqmgM`6%56Hw@EXsGh8)34J}nmxCj`-Fbws&+qc?`6{5fbBIavSyC}3SLs$SM~0WY=#CO@TxD(XN>6v3b8W}?#|Jr= zgl&#qR{=Q_#AKE?+-d2uo@6@gB%@-ZAX}oPlo_&u5U{^IFRP~lD}=S@K{vt0F3{e` zr%6e{BJ)39vtdD9-JfKPsQhPzTs{8|PceZ>7MPlb$f6qqp*oMaWv_L|P7f<||H(Ow zh;^y;%d?rl}fPLeJeasD0?dN52rR zzaXXLh)%5d%QMa)w|2Z9YIv#-TwVJa{8am<>nL0iVtDSDJ-+9q_9XISNFTOdJt zv`+*&B8h?1TXvXved@RaEd=!RdtF_5(ScLt0dU1q;iARH}y{>NfbUbHC+NN~`%y2}{w3&=&;7?5We z(XO=GQD53c{2)EgDq1|KG8c8xggXTp6O3TXbH`Reyq(_S?1;&) zG``Pyn4xNt^U|}ZkAQsY%qx8N=!M3TVXM^?%}F?7HzDiv=_$X2cc)xRE`5OfK!hVE z+?je|x1}+#nULd)EB&%}*nJmw1LL%MsGDAf(rt=)=CFFVK$OcT`R&i<*JZPH1lfsw zdv%++h8{5EMWRz4tDreI-`U^I+$9|)DOH&YM4jj930z`|)865d!O#a!|I~Mlxa#Yi zo1oy2lo3Ij%J*Z0n`WjTV1(kT52YmKAV|ViF{B=xfZEB)GOduoOvBB57truX?cz@p zGLxB}jx*MpWe(#Q)-z?PgGcE+xH;Y2=b~+zo=2hx88D?i-TG}Xw|K@SzM|QcH_x?+ znaGP`cuG1#W0ZMh3Ujl?MZjDj7;9nNB#+EsN8E_XgFHrs>dFI;d0sTV(5Im-i~6MO zihKKuIYYVDT5>*=RiUc0R{&XN4vSKhD+$aq}kZjfv%PGi-cR^;sA1Oskwv59iRuoO$WT($dzO$K0^TuRmhX_)}4K6ub zm2^`s=#=yhxH8u_Wv**{9=Ivv>Sc)QpW}(Pvd2I^fjvEyAoKU4wG_#IOa|3Q_|v3R z*a-L52cK?UUY}fIE%eVF%IH&}%J2WwXASol>8O8ZWbj?kHly z^XtUs#he^mALZ3#>ppXGiC4XYH`Ub_nQ0NJlIhc-VGSOhO~O z10`xjt!dO(Sy2lUQ138yXQ9M&sBNG@M=DTp^ zveA~tV44}Um9TPkK#K8Fs|@91fj^eqc2$k$WMe8RpasYe;nhSzeJO8F6jY!rjB~FBcjzuZlULyX{uerYF}JgPp4} zv||;YgZ;x(?HeB`F1n7cN#ASY zXE+aGXF9Gd0D-cc2KkwHl6m@4cALc}ftwsS-u~=ZkAX?K9oifwVtfRboHq`)DSFVv zs)}V+dQR1SgFR>7UtimvMoX{x$|SgVp6;#`6}(GS2&$(O=u40g>1stq!6u=$(wFwk zGl9=yp(eaAMZ{h;KhC!n-4q5TbSF%}j|%8F-coNX=$mt(4_IQ%itDjz<r2A@U)ikTj&6>I zE6S>qndh`L0&K6@b_ro=ol;)4Sk8&Yq&kC#$dfGa1QCO>Dowe?LcBG_1BcU`=-NkrdU}F&l$&vXuY7CwKc3r2Sy*+`eq;Y~ zf6fszt30J4xQ{{S)M=aPZ%RjFS0_JuE|<$vX-T1o=vm7U(eoTG*;L~H*w)f0;3bpfc+n~4VbK;7u6&dWO?71FB-&@0v%&ZJ+RR63Cwxs$yz-J` z^W`cH6U18I*Pyf*EF){_%f#{%8)s_yVCG7ndiqi z7t^!`Z@#-Uv}G8lzg$geDqU5nx6k9ZIT4gQ-!-pASXcFDJPl7z$= zfy1JTN)|QzTm|vrcsw%FsYo>s$%Y)m!oxP+)zG@J=(2~Mca^6n=)H5vuWC@(YiBxT z$SCL5(#P1|{CramhC)he=p6Qpgku%0r%pvmr(}iq85k{z!8rws5>L|z$j1QR`rwC( zhkYfFh#e-o^s{JU+2@xX+Ferh)r~b{q8VK&vXAr2;RBr;bCmNn~JBh8QVXaF3@qH0M^RD-4p$l z#jc$*^!*!4?u%yVnx<-W%|GXV_6zFSY-ccXQMd|Tr%({*nV_$G#l6b&2JoBSoPB*Oqt{1Id+Ig0^)U#3$=j%7pwzP(8T4{X);n>2`q)E-h3@RkoHQ+I{eGOC@GNl#)oNg!zfgS%h&!2l~DKlzN+e z#iGfo@oP=rISWxvJhG6;>_##S;(>NFiN%`PSrtvJx=F2gzf6A(X@av}=u!#X zRg6I9cLI8=&m0F&3}NZv z&B81A!9U#H#Sbce@%ZmB-How*4x^#p)-+es)6-+wpY8LA$WbUg4*4Vypkx#SS4M_( zvba_JTT{W|(wJQ;lvM!FjcvysAbJH7xgF+oKd)HaIvg2c3^!iTULeE*~&p<3LM=8RF1#tWId!tUNP;u*fnkx#b;ppTt29fd2LBkWh63 z&fD4-D6`W$JojQGE|_opZ!tVtpN?&)4nBZ-SA>0tZr~P5vVwG7TuxEd1 zH4oQZmgT9R_6}&0hc>BaMWuCc7Q>9v&Gv}O9DC;~zRr1-pUM=jd92EJ z`<*LikxRl+{+jgKiu+%S(N_6HRGhb^a82ZM#U=xFrJz`Lq3RdVzN7p`x@dZUQiK%0 zu8KDqN#8x3g}(RbHrzrz9ko>hoEdpUaXP z`_FHo-PbtLLw`w*R@_tOHLy-wk}PAnq(xxX9uyQxa}8}J9AQ6fWb4w6wd`?x;=zO4 z`HdwrO!SmBbt1&E1JXH0l9;KWM6m8Hb6%L zB(Gp+xVWaZg#BB<^9xxr>>noy-vmD@eu|Q-DdaJUuHt{=HW&`&&vDHaNJFMDxdhp7 zS}GC_THkNW?AB}hV)vGPu_R=W?bFWRLOh{w7-3J#UddNuBSr2X^N~@EDkMkEKusnXw4g9z3tf3!ELUBJ#RhFs7zPQyLpM*iFp7E6G zPDrJXTf6cOzRSx@Ht!U>;z3Y6Mk7~K=-fz*@BYU$o%(U?tJX~O+ew?pORiz2Uz}>g zL;DlvGdgj77ZA*E;F?2n&D<(PA6s$ z{sh1O9TA~0hKN_gd_=rB1G#WsiZ7l*VG`(15~%)2h;`^(Qev?Y_(BB2MUY+tL-U7?FN5 zP6k_vBQ@(}u_L5KegBfi=Hf;|K+H2UVu|-vQ;$_KFaJ7gpGNyQ%-K195>N4Lt8V)- zG#G6z%kOvgIb#Y6CO0Y%T~k@Dh2pQozwkQoZ@Uox+$+RCJ>-f1-8MJV)6Fy#`SKXizj z3O`P$(T~?$lzFU3@~SG-i28R;@<+yX>&t6^pN8fRa^mK7+6r=;`jjLp37O8GaXy&P zhCa4fqxXfiu_=z7M0eb3_3LOd6^e- zd~PFy&%o8Rtn!Ns&HAde{}>L~zh0W|1aWUNuzAIW2Fl%d)6{;xaiJb;5ch@-)fVsr z-pPF|Lz-gJ01Y#oO!e*IestCJcsITNaNqf);}fnB-E}7ZcZFSs@UlzLYk9rKHiIyD z_v1|%2GW_hot7e}_r67x)4RxIEfyt>*Sv41>%*Dd2f>H@=y#V_`pfj9xMTX9J)yyT z)>B?+>*6SepT33vf!=y*OrDER+-pul#}9dXxhc{&?3?>FkO&1g4P0Yg8A@h}`m6hj zGD=iqIsONG+=X_mr`z5a$w%6SNR4^ zJ`$~OeE%_aUSiQMq8)4j?hAZ`2X4Jsa)CN&Q`odrRlI-R+ z`G>vuv29loKNjk^I_R;qH-zGm)W^PwiP-q@Q7r$hhg=j*-PT6LWPAw|_T@x%fpK{d zFR4`-1`2k|h(heArO?s~YEyuPXE_VCE$MO8v^ItNXe=ZlFn$PXQ@p6y+p8#YR!z>J zs0lx$!KUI|zyfhHcos0}^>-O7j@NS87O|Twc31gNA-C`UhCL=iLmxVYK2+k2iEA%_ zKDrR!Ef!J>^vbc)=;meWW_71F(=+taPpyw{G2AUbet%g-&L^YMN z@+A=?72&aD(=2p2a!|gpfDVlTwoonba<>@GzYZ7h^vbKeWX)YQYK!+FF3e{bz=8_} z4Z%=jAtB2QWcl;uZ(UGti6ucyFKcx-wXL!vV%i z!rM-Wd!6v+UL(A{qvMuHO`gKB?DkDV*w%41Rt!EtSbZ}1F9NV zqLZPU))CMa2ykA+Jj}W0;ds%-IfLNF$QV|iia?iIOz7}gN=Lzb_cK_*qM%zsFS0c~ zUG8Uo&!%yHtFS#keh7c!#~X`oilVKWqLjvJ(?QLablZun8T3?E+Alv09pvfD`(8hj zDG~z4JP9G!Q<3(4Q0X?id)u)uT=#n9tl#))>lHo$3kkE2@jN48l3VWBF zdggs_vtH9Er4A#W1HBvDN$Qezch^-8;b4e zbd$US^oJ{9jR)&j#G@>}nY?6QOF&Q1oLE_0gszgOIK$ zl_CTM0mZIYm!1e>i-toi2y&`fis7)HCMTup!lVdkpNB>4KaMV}tj%)_pTTrJCDV#) zI?Nxnl;QQ3GTG3C6bX`S9fjDr>;s*JxiIsbG&lNc&!U_}(Q5JfiWBv-BEria7;?Pk z_(r#RytFjdNRUq{zux0dO3{>(hu){yQ8R;?@IcZ-qFi<|h+9;RKn--K!#NEMNe-vW z3^{*aI*9|8qQoa1-GYp|qrNJOn;Jk#)11hN`+I@}N@sT+u(f;Ig%)JmIcP|ifMSW) zcqP*yPPV8%FiiG2D19)^Bt`kn?>JoZ`FtuRd9VpILxXNZCv@?j2Ck+`?t~G^o=v8m72aol zzdL@==c`gVWYES%5qNq6U_%vQ;d!@z1oan2& zu3vN}iPbrWQSe}{Z+4y6mscANdD@cEcXV(g?}ikb>QoarxFT-~Y4dNGa3_l;o?;%y zmx*_Eg>Ea1w8SIx2^z?U_)PGaE%_&)Id|}+wrXTBoMP2(M~4DSgx-uZ3mn_1ttu-1>C-s@v`S#u43SXrFSDG`T$Qk;Yr^NRJ)4KcOq4#|RB%zFuA z!?ZNzp^!MjOx#)HbM*~yszQsqd*r5`pD&pav-}S{4GtHbo$?Ii^|CB9FX9WC6l+kW zmh6x8S*jyod>X+BVj`4lJ$-}1`Gjrx`+O0CfGi`Oisi&w0?#o=H|BUqh*kBnJoH05 z9pu>Ou&+JQ5imQQF51|y7~Skfy_X68s$Z|+30Mt4KAzp_=_-!ETY4&|+2`>c?nt5v z@wl&>%GU+#Ofks{pK2-dSc}yLW9YNd^cU%$HUal|F7Zy*_g5i7DO0WrO(`-j6>CU) z-mS{@-M>~IGi~DJ=2uObIJtIWNj)d;`FRg$Q_c5m9k+aJp%AP2EWjYJrlngn*N8y> z;gahrE85JQ&b5-(WuO?+CTBmP-csAu1$^OseUxCNH#9q`#r1Q_#T|RCxHwmzd5+Dl zbx4p545xzZ48E`F8g>CWWn>6qq05qrGWM2-OKyrfr+2MMSm5VMFLzve3A*C;`%K;C zd29sQ)!4KpyknMRcl1SypTTIGiOE!av7tzc_Y&Z6%8lya zOYhxehj>SsiEP+eG^cTs3}&20M{sdCx~uSrV-ww)tf9h6uc&leU3A?+b=|8FVpgZ~ zr#DFRwdF*c$VEPjUTZ<(AjK{ah+7(UQO3Kt{el4teW?&zb@C6Qpl2> zscsjSo;KHvNKGuH_pvPT9Y~NELf>LG6-yB}jNPqWxSrWTM(4n%vY}mUZ5L*PG-Hvu zr+;j)qN;uOseLZ8vIL1clQEr0SY3K1o67uU5|Q5J4`~axpS6Xm?gxJcnIGX>Y=mum zYI8CB8YUHB^jbd_ap@0Pn9l8J$96QsINESJ)$z6-gTK#)P?=bNW>r@8NJO$@{4?#? zkDYz1%gC8wZ@?`vCiT$l1Qi5Q9}3>Cf_rQi<43`OMJ)F!XuACZnsOtE24z4IVc_D> zz`xW@lW+W($IpRO*7)!q5JGr@YoJeA(B6-6|91vi?{Q$5CSwHBXC-n;&K4VdKIR9q(r55*n6gif8;(N4mb8-|}uoAlh;G;JQ`K!bhj zxQHz?&+LAtti^?C@U1V+!J6aMoYyDnCd)=H=#Nb3ws7zbF5$lE8@4pk69VMmN)NE3 zc={gyezBwKef9LuHy;<$p^x@;bLz6DpXR!QTo3r$sj%?>{SPMKc`4OolUjRSQ7FlAp!~+1)3uoEmNFt zMj(I)6A?*Oq-l5^5n2TzML6P$83clIS1_^3caIBwS2= zReE6%U78D&dDf`W`Rrh4kQ~(FHy-s>;JBWkDuaIoM;Tu(s8Tb2^-5IBAuBc`B6JtF zlQJKB!Nry|epfbRvX4Tjt`imsRNzj`59JVG4zj%MFkU(uWguL#MD|Ob7j=CJLtc+6 zPBmB3VeJ00^1nfKO2T;$3i@s7Gzc=8bZjOoJB)v_Z~t&}*Ku37#t7Nqb)CVM5bIQU zsVQPuwFMLAiPO$oc%P!>=c=8qUhooWpiy1<*go_eXRr|pEzj}A+c^cED8kz(CK2om z;K41v>%N`l=N_GOA3Je3F2P9eP1)M<=FZNis(?LnCRw6?FlLpvL8l!$0!Un6<%7$` zo#yU9s6FjRfPip?G;Z(|eU1 z)OX!xMP-!5{jmc3r;0rMOz3{`4e}KVe0Dl!p6A+kuxo zn@Gw@9Bs|q0NutbF#0wO1`sIfHd~C;Xbnv}_Z1+0VEV1?LN&yu^LWV(b?z4m_ZRUA z-q`3Q56OU)Fn7n|%5%Kvw68!HVVhZqu!~AT#k+>vor6k`;jQM+EpwX6&h*<~4jewQ z<~%!BK*j2^6uZlpxYl-zYe~_yHx;S15J)K`09B89X?OzBadMM;@3|e<+`ykCGc^)|fspMRncI2uhYhf|ar6+Sc^-@|`jZQ5p^ZG*%%=fe@1XS$_B= zI9bv_Lk=^S&a-FDBfZS7)vTirZ%m-ewloEVD5j<*;FexJtvu6i4Z6H92>?owvDEXE zY9Ph-95fbIV`L{edMx+XR0Ni{cs;YlX2=#)mWD> zX+B=`xnef3Nin&9PGt?-+kS~UbZ06J2N~r5NX0#AKaC%iO>$r2LsFPPc?Fgf4(Dgg z=$|D+Bn0|a3`;^z4?KIh=2&q5zqTvUa@$6N|B_97jCJt7Ne}=j{eb@eTNc&TpfvGN zo^i%`yFO+tCm?}FcXf4@WZXG-x81P%O>aBK>8*Wk^|ZciXtV9`S9ArnC6M1J>k|>8 zMX6+HqCgfPN9UCF8Ggz@<&Pe2>&bN9mZ7SaM_}6GWR9j^F2cuI;a<30e0GFB=D2^N z;bEV2Rh~AnW#vD1Wyu$Qy0UJ2SJq9V7Bq4&ORnbbq{h#ll4gY*H zt0c)MnM01kZ*HTvG9@DvB>g!@GnlZ8Wo8&U2Zm5D(om;qm>0G$OAjT%?k1mAS3xu_ z9B6tiGSMU;w8+)Mqtj=dA#L9A&Su}jNEPxT_f+1B-8m@Rh2Jf6&0j9;pkQ!`GkIh4JfOg*-B zemdq~x^wToOkG&>uWl-svo+z@dC^3X;{E^V*SO&IH#^bX*q#Ki5UC{6DNA3o?r1@DGKE?J~;iPN(ysozn4WmR}2Y$cpQ#=<2jiG=5zb&G>B^ zx4mE4*X!#mn`w#SLegR%yh6F$uPimtiVs0pzK5-AnV$^M&I&hfC(q>~6FLM5oJ ztAx)=vLj}42p-t1b^C}ul99BPiHuBgZFU^CNhw}dKI)mW&LRQM$41SsZ9@s3X}_9_ zhRYWE>)sWs5=x-6WMp#xZVa({H}#TYL2gM#WJeqe4%@)=c?p%(Lfm(n*tXXRj~$aT zS#;RfSy!f&SZdxlHzyQF;+(guwwAe%y7w@OLywOSIuGWtC#jXy5U=ujDvmY{%98iYpz6#x~+IsT~$ElK2QTeT~T zzmaHQ2mARt`l&A&X|$63m=fCOg$oLplmmT#B(syMm2t%#>a@ zT}IFhKkO%-Y1=@%w#d?){IEZsktj?;Q}W&k*HM-u-MUHUEQpTGD~G_%BaChUg>XB-XLAGPUL;9+5TAxoRf z-t_k1<_q$c(jJC$Z!b&iW$dmwM-(gTrj0Ww9|Hc~`hb1@0o~g&O!q*EV+HLtVK^c~ z3&$fvc!!pFs3-erss`swXR2fQQVxg8p$FTCjAiYbp_`7A;4e>?T!hlOY7>cJe**jZ zspe2>g}?>gZc}p38%VZ{Jm}^hwST6d5(kwL)eDHHS!T-c$!s~M@`&zmt3$v zNB=6eAa43Xlup1jSz&G6)QXF2&w^E@kGKMv-Zu7SHE@%BVKstzr%uRyoM(sE`Km_t zA=`jK3LNI7A1{-@PNJJxwM0fKDwwv^kNCEjjLP#1>G}SWYlv4gNt0Fadj7E1_6M_W z@zWF%L0|ircS1&N!a3gl2?d64fa*JS;X^42lQQO>W4oHF6WmZ{Q54pf@z{%uDD1Df zZL)Bpiz?G$jBCuB{3i^|aoay+-`3y9B{}{qTC`pqV(+7q2;wt}j{$sV(I6oRIDraE zWOrQQ+s4r=t(GrZV205IQx$X@PhM$DHT@|&+ zGH;cXjg{1AJ3s3HikkB{Z)2vo$rHofWMx2GB8f(XwW&!XeOAsnU&Ny_yxY;mLQB+( z2?*{-u(B#3A6C>U=bz&Sw6TVa==A5wYvDal!ppT~C>fRsEha0jgZ>oaayyLSeS@0r zr|`9TwzZ+(_b?arkK#Bm*1Nf@{iW_E7f!&>ZP@*bs-|Z`8gfq}2C;|1|KQ(pK=}m# zE+K5z{+#w9B?)t!3Z}k1V*2Rx=HASZk${CQZ>GTyYo0cuB=5#Spl_9-7BtM*Jt-PE z(bX;HL-UljMjJ56WHD|{?a)czPQ#Yfndoa|^>Tgj)mkku^sk^Sk32T@OaPCu$5rc8 zyg)K)OeBn~3|o>~t(Y=8)6bYGn-<$6hcRX_htr`Rd39f68UtQf*xhztGp+906xDN8 zrA<_?z5N-JYpZa+x*Ca?L60W#Ftm0EyL4&1Pgje<;01hwGXj!;5O2jh`; zCSlvV>5FMhRff#$qeWF%avQ>STWi+&@diwsE1^6Kfdm`lpzMBTV50CJD!BStW5fY?#dTFtRyI)+Sbg*jEQp!lRTi;%f z_7Okz%?rI1^C#i0LhUj`d28r!2E+VexTLQopY8n8}uxfp3yx zRndcNe#XD+RSV5)%-~`V7MWtd6pJqx${`N5q~0M0&%zzZrF-SKe`H{zUOi4TRP!$0 z4B*lsiy1{#ZHC%bs6VE$Yj+t#vSxHJ%0gL>e@c?%ff9_UJxgL8?%UE+nia^;xT;?l z2i67gpYF^tskWqPJQ(a zHeeJJzMkky#6afxx)mo1>9kCJM`H|TYM_7enXGH1KwlJHx;WK;{Kdm46RHzed0oXclHod02T#oy)iBAH!WDC}K^2D2EjBWEVj$F)%@ojrJ| zGzAToz>K@CmoW_#Qr3pccn#m|jqtgtWDjB&}FVmRS*X5I@?scu2I~Zd>sC zKFW%zQk=XdOTzk=XDMM_%EqNaduM{XNpz1` zvL@aO#K#PTZP)uIhnK)Inq$}JFLtePb%l5O?EnMLPXo7W;JhVp-ZUw- zTlFcusqN7`{(1cyHYw^5k>KXeZWI*|1xb*yVukz;PQ3BWJV)^cF0K4oUX$D_w{UM zAA!-?brZysLW(Uw;Z*(I%>9h>{Qk`y)|}_yt7n;d(Gk95`uvQf`Wo)DPr>l(>kp_! zF1GR6eFah9N;eTSd^RN*#Kk>!TnQW@g+{|>i`y+cGa8b4)hr8bBLqg+ z!JXFvR!%xq#?cdAvpB(Usk44Vej!_m@mCXy5XbpYBl6pprZ~8;FG{^x_PftbS5~2} zYSIwCDVMeri?5Hj&TjCw{|?@7eSmUl1L?`&wz|LO6&p9~-~IXTCHJm5CS^M;V`tA}GgpVwd^z^0LhU%zEo6(ACvUkbL=rGBk~rb+-#f~F`_(AB ze%t%k5}$}*X6i%5A1>!_U(2)`PO~}v7`ya*tjDCtd~4@9Z)($qJ^R}uqWf#E(*&*O zwu(`kB$#-=a#$*!?5mGx2a86#wQdwj+5X^@t~HHNB-{Gi6^qtYPBqt|QX$o&!%z4% zDiNo=3O@}PqLVx`yne$>T^d!RW^nAr?kinl%_0R@=UMtdps~ynKfG-pKk(CFS^R)@ zVR3lB&R<-}E;E{|IY9P@ke*=(0j>7YBT6?N8yOa!?WG;QPo`|;Io18ock(;lb6r(+ zmp3ZLa<2r~q=|b~?;DoI+az?XByL-!!LWS&SMeR21KdLr!B+KIM0{Q(R4aBs+M~+E zBQvYT8V9L3_QohWmom@3$Yted)aclq^ODXvNEba>GOQ)rG*76>Ec*F2l2_Fe!3xEd zYlx+hyhH^?)CyejFT(dW8W+CuL5idbXCXD@AgCX9DZpL3x&msXq1+mseJMv<0o66@ za_p9V#(SSlUo~T2KYO+BddscA26fR;eA{Y7lEr&9LRKix(szvTkiA6>#O*oxSI_Bo z)9Ws#D)BLi=O71e{_ejx*E@*CJ6OYd$kfiQ$gaqXAHwDqnPv8DRs%&LFB5exT+F|> zX7LHC6*2z+SGZ$pznDZunY9E^PTlFpPSwuR+HvA55>$hQ> za|cAGLUGccG(rxOc_JA&3Ew-1-}J*A?y0E@yTVS+)T4o7`wE$lu)Uk!K3j8|q#QW`a2BG<}VAiqs909peVzQ`*A!>&JX9ZXAwM`0< zDR;5|-h(N*4y&(w*QNVwPV1)aYIG%uZX?aU=^Iqqd3+ELv~=EOp5p7*`w!->N^om%;1a~PAs-$8JMHJwkW!+qIfdvhVP8_Y$&H^233YlrRqvpY8jg=`S zk;I$X!ED&%^v~XN9@4OIs>>|m1)n6a^NKIzAF>hw^lk4Bvpt%247=^bm^>+~%u^<0;E9Nbae|^%oW>f_qC^|9{HA)2k*n F0ss_ZOVj`W literal 0 HcmV?d00001 diff --git a/testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..e6de821cddd3860c87430eb55e77077a20df237b GIT binary patch literal 48850 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%0Dh0ZmoSxTC+A;=G?T!QQ) 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�^COm&PNpzi-P^iM2av>7Iw3r0U?|t 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 bd*H-2H9qz|r7(!wSoHq^GV&ThYzP7X($B)| literal 0 HcmV?d00001 diff --git a/testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..46ef89b257c35826587e82558031129358d85a92 GIT binary patch literal 45277 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 F0swJyYIpzu literal 0 HcmV?d00001 diff --git a/testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..62e710307e8bfe85e8391661c703aaa212b4ec1b GIT binary patch literal 20812 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'xPT=MMw*OpdpZxYYppyyStfPLQb+>58 zbC#xY{b0>`wQbi9RWG)H2(Wh%T7H_sEkLV?3^%l-pTLl|`xw39#=C<-q3%#TOkIZP zU+iAH(|hHXN+6f8PY)dhnIa(`^s-I3h^95>SIRGyTT~#<^^DaYHLGLL9Q>7jJQ|-+P#gz zc0SO@+QTKAvL(lLnr|few$5=8Pj$&QaZx3_P|m@^b}PDAkOA%qyadHK6Gr>=d}PA? zy6$-x^)V<8$Gs`3yfB7J=&j3w9W#Hyk|RGMYB}a#&8k5V`vbb{i3XYQeaDBHlw{Pz zkZVd`EW+}R8EgXhsUz`zY0KBuagzF73KSOah|DziW?F9jsuXrCj8m&L zb30mStZ|>7DlJ-?`m%_%%k_0B2Ceu~)MYLt+aAtRZ(%#%;|N0a{a`!xMuz4J!~Mez zsVSEiBNR6CIGiUw$2p?1`gzK=MAy&H$uq2K-Ok6v|g$lKNgM_$gju!ehq14?skPUqa2+t6dPlC~AB4 zsi9N<#+ok;4P3mK3Ph412U4jbt7OzWhH%5m_8;tQbf?mU$@_1!^~*yD=4!nw+n=AkdA#Pjs0h_>jJUGMtpoc4Ng-F* z>MOD>?M9dp$>>48!GiFqFxCfEC*JLgA3M5Dv|eJZFQ^}ZW&7a6vZp4}herGP3Xe-R z{3Nn=4$V}MSTIURGs;y9P0YzT+))lzaw$n|y0R`sAi6*Y&V!vCUmuTu(BpQh+34xcVn+ zL$G-l2TL}GKfQN#n^O&raybx5CuLo{4?@ z!g{sak?y|#`)&t71ReF0zr`m*o@kEop~xeV2`ZQw6r1@1pGA5D;5#jyT-o0oN#2ux zy0~;X4~<_;uE#ER@bh~wx};yxAgj_Cm{NbJQ+1DmCKVth{Q%!zJMbseLP$K!k^gP)lgP-GhDh$+sf3NRq8{zaE~QJv~Afh zY=g4_%+^!hB#;iz`ShWu)wW21x5`>6`Kx0z-p+ArXEaVDxv7_ElK29cY&NK ztO{V>rCD+{Cq1vblnSPKxT;s3Y_#LsjMz)|K~a2?J2fpnk5D zpD^qzE=$<$$15fSho)~knf5JUofzOJd0#kYXF#*m6X1*S{zAE^66$Rx85Im@i_m-|4ff(5Fge0k-) zKBcZObqvenli`bOB4=%yN$1lvxpp8OEIRqj@9iVc&E=RvaK0z?>EW82zBFXy+Liz3 z*34ocCK(AG?lG{Nsbt)ySlB&__1zu3|~kZn-W^C3HZn+#j!vn;O2*&n-7;I7H}kd zeAQUCDSXWHQGn-@L5I@tUDUbXTwp|u*_?KWB+AT_D;a6AI}amba&NPXf%D+96G?Vq zi0Jyd)exHU?~s$EK!oc@e}LqYj68ef|rr+0++;04oqHe&3Gb zmWi+TnfM(AWxYSo_j9jf92n&0^n`eSso^Hw!$ZsS-tCIC!BI82GoHe&;fJh>!A7i|He!0}-wB2_LtuCN-X9GzXZ0=;GDX-Cs= zC(^83k2LPQ=CWy;q3?3&#(5Uw1>U2IZYHpm_y3jVY}lWSq#Xbll6=p0Gx6Z|Y!U=Q ztuFT;VO%s1CAKHM^+|CP=8wUC*hT%!4860xUYXZ=r8z%fc#;935?<|2lFxcN;ONVm zNln%^dDWOn_sTe5g!9*~uV0#Q&o7$nWh|Tf%}dUXDTiv^V-DKW^P{6SO_{n#6Yk^5 zEf4I`6Z0bdf?Qi4m@x&Rq|^|u_|d|70o1rNJ4bfv%JFEgunUL zm6Q@%1V)PDN+uGOW+1asn1>)exU|SPoU26ntIju)N^%Kr?e40siQH={MgciCX(Iy4 zj0FC&*vlyHjkHCNyWn4vRPW#rKE4MxiO6v~7N zsYyxxchkEu5wyZi`l%-e`dmy-#0({O78l~I46!#B-4LUsXdAZPN&2_rrksY}RjZ{S zB#KRVemlaMfGC7L|4djmGBPC|0TbpoJ+>h@_e5?Tvm2`+**^H9GK)>=Z0R2RHo7#M znFn{#uD+P$g3T%FlKPS+)ul@;sN?REdmTSHUUXfPeQldxb*~mBf4e`)ytpOV{FkLr z1_!al_cWu(TjVG)UtivJDNHuWIH#18Ha6?cpTPKlT$#|+_qe!lHJxR{Da!5g7iq%o z@uE8(G}&G{);}wxC2#0Q6639$4&P0Kl|=Ie+8~yJ;r`>ux`pqF`R)Mu_D;?UD?veSIW?MJ>~V+{HHm(rt{(b(nXrLm>-JG5iA)qQ4(&4v-5@DE%1IN?IvKq z9qLj>5bngcAmoP-l;s7qCurfd{xaWN`jbqPA>uWQa0sh(GZ3r;a7K(pky!81{&y`*r3GTahst&#%fauEt zoG70})+Y0v2gix`bAR@}H%-pIe0&<(r|!vF`*;fB%a?wNPsS2jpQ}$>{EwA%A2`i# ztl2cAfNr{a??DUyMf1tMSYAWW4lSpaw;h3kL68#t#Hw=z*82-Uc6Lw)2Xbg7y(6_H zMkR4`Rfv2$kf1O}ZZ9pzTtqwereWD6on=ba`0kpPYj4wqP|>jtM@*WUMh{Yxt|;10 znScpd1n*2~$_cB45hFA+?l%ASlTYeqb-6oN=wL-*l`x%TQU!_-h>{qm32U9kMZmRn z782x=#2t@4F6R1p&3#)9UE3Do)bTNdDE)8((%}b`mLeZe7uTo=(YPZ-1b;Tmat6nM zeGqp*!5Kg0;yKuuOlxu(GEma}2I7CXVpEj;(Dga%ma;0LWpmr0w>_y}R+YQ3zgEEt zQ~J>STz$!-!X*N861RjT!e~?ROXf$9eAL?B&7%T^vzU!vM{Vhl!!xz{EN^()=*LU$ zx{|xkb@PH}kkYF|=<;A5SaV6~NL7Ml@Sf21 z1>Zn6|2^Fx-BBp+L|XSsT9g+dR}ncsnOuI2RS07;)H9Cxetx3!UG+_G?eiRa8-CG$ z>UhaH1EXrPY>do)(N3z+TJLg`?P!9{T_qCK_-}h9wUO6ymC|BuIeE?V=KY zxTs7j1~#KweqLpu)gqiv3G3Ixnu=$YkvcZl7Y*1XZHUlnkEB>g(BAGC7!YY2tY_ zC7tVlaUs`yfzbgEZ*A_bVlA*KUSU+z?_A8mJq7FL^P}a~Bi(0<;bRe8$Z5L&r*E5f zb~b;EMhA!Ru@l|Z)V?WlzTFCkM%)V4ZBH@w6M6qS@2ZXU=fFZS>zJc`Ho3HaUg|NO zbI=NeYkAV%q&WcTKs zSGB1@Hp1%y*+5AZTtp@X#OZ=|ZmMlKk?V9WqfWVqAkI(B1#$>qb2{?mk!;WmwvO1` zlz)R(5c&vdUxhK5mH+5a&hzLpvZK2bY@1qbNPj>NBTBb0b+wsxnL*2*VT$)E4mcdUh zKY*tk#{Sf6?z^6aRs}p+_>BaCZ#U68{#k~z25y-qDlXi>D;f5c+X_vL2-ugMYH<}= zsWLdAv2c>uVTsKyeYE*buVxad9j>{ewtLf*Re`PjlEMdWD;gTxcBhr(U%obEb-f$1 z%6LJLukv32^2FVAH% zTi6=1!($*c($E3wT8?DcO`{k3qb5dPGpk~Yre=og2fSvs_fqh;4SXdJ8kn3>GZPx=A>dSk%(Z^g! zZk&-HXQb>zg**0k+J){>{O?39mv)2CxXU7uhz-j>HuW6jtqpddVKB7bdUoA&4aU{cbc}SU$7qJWuUO^YUP{Hn zf(pP^?ZMrV+C*=JsdPyzM%>c~Tq{C#I&|2RHHVqxBrcfPk*7WlO(cDOx0t0T_x0I* zi)TUt&v^m%d03VqOeV*?A^(%StBsv$Vl3HOELR`w>`CMDAMzPH0uF(!UJi!!Mn9Ec?fvh_+!preo9t3BUOd&2K06WQoPI z_G0RW+_de`)y6am zlKeWsPd~oh5Kam3_cxb4`l;dwp?A1u~Av%_aB4j}-%XOj!TQI?R z`Ql4zUlW=8%JsBwJo}&?FWGcezM*@it0!r;s6C~M3Y0q{`&%G{P1|qVep~I+++<^@ zy@8x&ID3+O+X=el$rsEq62J*FRaNO(hA4z6Qo%qUSmuKJ%MSDAcr*l$cFP$!Aq$@K zwEUL)lR1)mH(X5d1X1bD?GiFUJMlKRmoF84IIbh~97|8`R(Ii{q`NpS`HD{K+EEg8 zTCqd{MwGD+v4$Wh@Nu|8)V?!lD5&MS!%9wy+|*Ma@Ay4mii#9vWutv6VP|tXu}S9` zx-jvP(Y_;Y>Q(CI4Z;(_dvStMH3B2tB+C)}uZWgXke1AMQ-$F#)Po8W>-+Oz4`eS! zRo3LV-|nbo8);-f{t`*49D_mujD%~?bl?034FAw*()`CBFS#@wxeaxu*3JE!<_yR4 zkk=O-49tCwJ6sPwYhL@9x9GS8VO4N;qKZJ=R*BW#EUcNA{D#G}H_6yK!9nMvUOTyx zm|Q!Xs;tT#=v}w_JY;8o@(qN{dkgw?sSSUI9m)sVlkY(AXC?y1I0RyyM}iEVLwHJ4 z-+k%3ytlij$A(DibK8dY!CLE{$LFE{a%$#8-c&i?GG?5o!Vlv_eC~2K|DJoYS36#F zQ`VQEDvV5u{d0-O%fXa5CH#OuagAiJ9aB$^6#f)D+R||%kteyb(5{WkoGWWS%^?jm z|0K>dY;a_~$#uCr^+hf{@*VG4cJqA?=XlLsNByd%;wi{Ub={~5bePc%r-fhs3z+_= zJ9#$=9XdBWj%*apn+$P+Sp~#&yND7b8V|xB`*pynV~I2QtAW%FhBsxk$9O?;DTo?Y z);ueA70vb?`*A&FKd!&Xe&n3Qg5j5wjoG)8|MuzA#aGtRD5ifW;w>-XG(WewknH|> zpsU)eFe(*lVTEN0x#&i9~stW~6~XpC^h` zL@!7ndM_g}z4HTE;%L)#UK$HjKj&doeiA9#be*BG;Kxg@Xy{8{w3kA`ZNMZ_{4q|w zaca#enVfWn$F?B3h@{?dn&xFI4RjTw9?jjg+s@vd;8Uc%GZi&dt1tnqIQG#J{5$Qg ziEJjvgQ~9RYhXS!RCV;H9$i-L(3hqj@?pL-H#|T6H3s0e-n_&3?=F+8D6yQs1>&MF zs;iUsd(eWJGIZzJe5rH6Kb|q$<|>m?IXS&z3iewejLPPcY|~8Lv-UY98R!jcd)p*V z1JVvLKxX#DzcH5OoE=@ zTC`~{gDK1UW0PXJu;8NUJJPeGgJFX}T?n)*Z5-P_Q4aq%hzdZnF{m=j$ta*rF z6!bn-`S%#rn2hG23#A~Zp(XM;H5yabG;w%#Y&o@jY07-A&s}~V#*NkuGo_uwX(Fq+ z{FVdFUp<^U$ZPJ}vS9v9^KuOGcUA?z;nDm32c)p#S=ZwpwuR2S?DDzv4LpR%#_Ljt zc zPs+PVbpgyX!j>YawmrXlr}vgeY!k9;9ASSta>JTX(h&7xjsxK=?5uyBmK2TYhqi9n z0ddpp87Z}}C4ywue6aa`+SwLjSgOCb3QtT-B4O^Z?&Ub593pp!&6Mj#GFayUipepy z?HKu)b5TKq1E`@jKhS`=d}Q0I>)bSdb#4CZ(}==3!Y+&#>mRHC`Dp)jet9p7l|@gJ zkc;M0Yg_WS-S4ywFR)6GCQuL;h<#ocY)AM#?R=6YJsaM*ZYDD5KIjHHsodAZ{EIYx faOMX^Gey1i!Qi%H>$JS*|KI-yC#7D;gZ=;j=~CXC literal 0 HcmV?d00001 diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 13567c1d..91f61083 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -57,7 +57,9 @@ multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \" // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/software/fastqc/main' addParams( options: modules['fastqc'] ) +include { FASTQC } from '../modules/nf-core/software/fastqc/main' addParams( options: modules['fastqc'] ) +include { BWAMEM2_INDEX } from '../modules/nf-core/software/bwamem2/index/main' addParams( options: modules['bwa_mem2_index'] ) +include { BWAMEM2_MEM } from '../modules/nf-core/software/bwamem2/mem/main' addParams( options: modules['bwa_mem2_mem'] ) include { MULTIQC } from '../modules/nf-core/software/multiqc/main' addParams( options: multiqc_options ) /* From 5a5b9e71e520878542183722cab3cfed40d08676 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 7 Jul 2021 15:33:25 +0200 Subject: [PATCH 0003/1169] bwamem2 works --- conf/modules.config | 11 +++++++++-- conf/test.config | 2 +- workflows/raredisease.nf | 14 +++++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0b1bfdec..8725ffea 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -23,10 +23,17 @@ params { modules { 'fastqc' { - args = "--quiet" + args = '--quiet' + } + 'bwa_mem2_index' { + publish_dir = 'reference' + publish_files = false + } + 'bwa_mem2_mem' { + args = '' } 'multiqc' { - args = "" + args = '' } } } diff --git a/conf/test.config b/conf/test.config index 55284c3f..9e89aa2e 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,5 +25,5 @@ params { input = 'testdata_sarek/rd_tiny.csv' // Genome references - genome = 'GRCh38' + fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 91f61083..c3e0c2c5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -88,7 +88,19 @@ workflow RAREDISEASE { FASTQC ( INPUT_CHECK.out.reads ) - ch_software_versions = ch_software_versions.mix(FASTQC.out.version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(FASTQC.out.version.ifEmpty(null)) + + // + // MODULE: Run BWAMEM2 + // + BWAMEM2_INDEX ( + params.fasta + ) + + BWAMEM2_MEM ( + INPUT_CHECK.out.reads, BWAMEM2_INDEX.out.index + ) + ch_software_versions = ch_software_versions.mix(BWAMEM2_MEM.out.version.ifEmpty(null)) // // MODULE: Pipeline reporting From c1fd2f76fb079c734f5f2441910581ede3e18ef8 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 13 Jul 2021 10:44:35 +0200 Subject: [PATCH 0004/1169] Template update for nf-core/tools version 2.0 --- .github/workflows/awsfulltest.yml | 47 +++++++---------- .github/workflows/awstest.yml | 50 +++++++------------ .vscode/settings.json | 3 ++ modules.json | 14 ++++++ .../{software => modules}/fastqc/functions.nf | 0 .../{software => modules}/fastqc/main.nf | 2 +- .../{software => modules}/fastqc/meta.yml | 0 .../multiqc/functions.nf | 0 .../{software => modules}/multiqc/main.nf | 0 .../{software => modules}/multiqc/meta.yml | 0 workflows/raredisease.nf | 4 +- 11 files changed, 56 insertions(+), 64 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 modules.json rename modules/nf-core/{software => modules}/fastqc/functions.nf (100%) rename modules/nf-core/{software => modules}/fastqc/main.nf (95%) rename modules/nf-core/{software => modules}/fastqc/meta.yml (100%) rename modules/nf-core/{software => modules}/multiqc/functions.nf (100%) rename modules/nf-core/{software => modules}/multiqc/main.nf (100%) rename modules/nf-core/{software => modules}/multiqc/meta.yml (100%) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 260b3bf4..2ca44198 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,45 +1,34 @@ name: nf-core AWS full size tests # This workflow is triggered on published releases. -# It can be additionally triggered manually with GitHub actions workflow dispatch. +# It can be additionally triggered manually with GitHub actions workflow dispatch button. # It runs the -profile 'test_full' on AWS batch on: release: types: [published] workflow_dispatch: - - -env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - - jobs: - run-awstest: + run-tower: name: Run AWS full tests if: github.repository == 'nf-core/raredisease' runs-on: ubuntu-latest steps: - - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - python-version: 3.7 - - name: Install awscli - run: conda install -c conda-forge awscli - - name: Start AWS batch job + - name: Launch workflow via tower + uses: nf-core/tower-action@master # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters - # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command - run: | - aws batch submit-job \ - --region eu-west-1 \ - --job-name nf-core-raredisease \ - --job-queue $AWS_JOB_QUEUE \ - --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/raredisease", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/raredisease/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/raredisease/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" + } + profiles: '[ "test_full", "aws_tower" ]' + diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 2b5dd6d7..c072e483 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -1,42 +1,28 @@ name: nf-core AWS test -# This workflow is triggered on push to the master branch. -# It can be additionally triggered manually with GitHub actions workflow dispatch. -# It runs the -profile 'test' on AWS batch. +# This workflow can be triggered manually with the GitHub actions workflow dispatch button. +# It runs the -profile 'test' on AWS batch on: workflow_dispatch: - - -env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - - jobs: - run-awstest: + run-tower: name: Run AWS tests if: github.repository == 'nf-core/raredisease' runs-on: ubuntu-latest steps: - - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v2 + - name: Launch workflow via tower + uses: nf-core/tower-action@master + with: - auto-update-conda: true - python-version: 3.7 - - name: Install awscli - run: conda install -c conda-forge awscli - - name: Start AWS batch job - # TODO nf-core: You can customise CI pipeline run tests as required - # For example: adding multiple test runs with different parameters - # Remember that you can parallelise this by using strategy.matrix - run: | - aws batch submit-job \ - --region eu-west-1 \ - --job-name nf-core-raredisease \ - --job-queue $AWS_JOB_QUEUE \ - --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/raredisease", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/raredisease/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/raredisease/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" + } + profiles: '[ "test", "aws_tower" ]' + diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..649d4c59 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "git.ignoreLimitWarning": true +} diff --git a/modules.json b/modules.json new file mode 100644 index 00000000..0494c19e --- /dev/null +++ b/modules.json @@ -0,0 +1,14 @@ +{ + "name": "nf-core/raredisease", + "homePage": "https://github.com/nf-core/raredisease", + "repos": { + "nf-core/modules": { + "fastqc": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "multiqc": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + } + } + } +} diff --git a/modules/nf-core/software/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf similarity index 100% rename from modules/nf-core/software/fastqc/functions.nf rename to modules/nf-core/modules/fastqc/functions.nf diff --git a/modules/nf-core/software/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf similarity index 95% rename from modules/nf-core/software/fastqc/main.nf rename to modules/nf-core/modules/fastqc/main.nf index 7ce76adf..39c327b2 100644 --- a/modules/nf-core/software/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -29,7 +29,7 @@ process FASTQC { script: // Add soft-links to original FastQs for consistent naming in pipeline def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}.${options.suffix}" : "${meta.id}" + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz diff --git a/modules/nf-core/software/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml similarity index 100% rename from modules/nf-core/software/fastqc/meta.yml rename to modules/nf-core/modules/fastqc/meta.yml diff --git a/modules/nf-core/software/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf similarity index 100% rename from modules/nf-core/software/multiqc/functions.nf rename to modules/nf-core/modules/multiqc/functions.nf diff --git a/modules/nf-core/software/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf similarity index 100% rename from modules/nf-core/software/multiqc/main.nf rename to modules/nf-core/modules/multiqc/main.nf diff --git a/modules/nf-core/software/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml similarity index 100% rename from modules/nf-core/software/multiqc/meta.yml rename to modules/nf-core/modules/multiqc/meta.yml diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 13567c1d..986002e7 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -57,8 +57,8 @@ multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \" // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/software/fastqc/main' addParams( options: modules['fastqc'] ) -include { MULTIQC } from '../modules/nf-core/software/multiqc/main' addParams( options: multiqc_options ) +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) /* ======================================================================================== From 7720a5d725ca309b31e087e07981554c29c63264 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 13 Jul 2021 10:58:59 +0200 Subject: [PATCH 0005/1169] delete vscode folder --- .vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 649d4c59..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "git.ignoreLimitWarning": true -} From b3a73bd7d1bd7de24da22cf7638b74b9f0cc34f4 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 13 Jul 2021 11:25:32 +0200 Subject: [PATCH 0006/1169] updated sha for bwa --- modules.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 0494c19e..f2367aff 100644 --- a/modules.json +++ b/modules.json @@ -8,7 +8,13 @@ }, "multiqc": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "bwamem2/index": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "bwamem2/mem": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" } } } -} +} \ No newline at end of file From 1c83e638ed80289d6b831f031f23e9602ad03cb7 Mon Sep 17 00:00:00 2001 From: kevinmenden Date: Tue, 13 Jul 2021 12:57:41 +0200 Subject: [PATCH 0007/1169] Template update for nf-core/tools version 2.0 --- .github/workflows/awsfulltest.yml | 47 +++++++---------- .github/workflows/awstest.yml | 50 +++++++------------ modules.json | 14 ++++++ .../{software => modules}/fastqc/functions.nf | 0 .../{software => modules}/fastqc/main.nf | 2 +- .../{software => modules}/fastqc/meta.yml | 0 .../multiqc/functions.nf | 0 .../{software => modules}/multiqc/main.nf | 0 .../{software => modules}/multiqc/meta.yml | 0 workflows/raredisease.nf | 4 +- 10 files changed, 53 insertions(+), 64 deletions(-) create mode 100644 modules.json rename modules/nf-core/{software => modules}/fastqc/functions.nf (100%) rename modules/nf-core/{software => modules}/fastqc/main.nf (95%) rename modules/nf-core/{software => modules}/fastqc/meta.yml (100%) rename modules/nf-core/{software => modules}/multiqc/functions.nf (100%) rename modules/nf-core/{software => modules}/multiqc/main.nf (100%) rename modules/nf-core/{software => modules}/multiqc/meta.yml (100%) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 260b3bf4..2ca44198 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,45 +1,34 @@ name: nf-core AWS full size tests # This workflow is triggered on published releases. -# It can be additionally triggered manually with GitHub actions workflow dispatch. +# It can be additionally triggered manually with GitHub actions workflow dispatch button. # It runs the -profile 'test_full' on AWS batch on: release: types: [published] workflow_dispatch: - - -env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - - jobs: - run-awstest: + run-tower: name: Run AWS full tests if: github.repository == 'nf-core/raredisease' runs-on: ubuntu-latest steps: - - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - python-version: 3.7 - - name: Install awscli - run: conda install -c conda-forge awscli - - name: Start AWS batch job + - name: Launch workflow via tower + uses: nf-core/tower-action@master # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters - # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command - run: | - aws batch submit-job \ - --region eu-west-1 \ - --job-name nf-core-raredisease \ - --job-queue $AWS_JOB_QUEUE \ - --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/raredisease", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/raredisease/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/raredisease/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" + } + profiles: '[ "test_full", "aws_tower" ]' + diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 2b5dd6d7..c072e483 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -1,42 +1,28 @@ name: nf-core AWS test -# This workflow is triggered on push to the master branch. -# It can be additionally triggered manually with GitHub actions workflow dispatch. -# It runs the -profile 'test' on AWS batch. +# This workflow can be triggered manually with the GitHub actions workflow dispatch button. +# It runs the -profile 'test' on AWS batch on: workflow_dispatch: - - -env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - - jobs: - run-awstest: + run-tower: name: Run AWS tests if: github.repository == 'nf-core/raredisease' runs-on: ubuntu-latest steps: - - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v2 + - name: Launch workflow via tower + uses: nf-core/tower-action@master + with: - auto-update-conda: true - python-version: 3.7 - - name: Install awscli - run: conda install -c conda-forge awscli - - name: Start AWS batch job - # TODO nf-core: You can customise CI pipeline run tests as required - # For example: adding multiple test runs with different parameters - # Remember that you can parallelise this by using strategy.matrix - run: | - aws batch submit-job \ - --region eu-west-1 \ - --job-name nf-core-raredisease \ - --job-queue $AWS_JOB_QUEUE \ - --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/raredisease", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/raredisease/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/raredisease/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" + } + profiles: '[ "test", "aws_tower" ]' + diff --git a/modules.json b/modules.json new file mode 100644 index 00000000..0494c19e --- /dev/null +++ b/modules.json @@ -0,0 +1,14 @@ +{ + "name": "nf-core/raredisease", + "homePage": "https://github.com/nf-core/raredisease", + "repos": { + "nf-core/modules": { + "fastqc": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "multiqc": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + } + } + } +} diff --git a/modules/nf-core/software/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf similarity index 100% rename from modules/nf-core/software/fastqc/functions.nf rename to modules/nf-core/modules/fastqc/functions.nf diff --git a/modules/nf-core/software/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf similarity index 95% rename from modules/nf-core/software/fastqc/main.nf rename to modules/nf-core/modules/fastqc/main.nf index 7ce76adf..39c327b2 100644 --- a/modules/nf-core/software/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -29,7 +29,7 @@ process FASTQC { script: // Add soft-links to original FastQs for consistent naming in pipeline def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}.${options.suffix}" : "${meta.id}" + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz diff --git a/modules/nf-core/software/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml similarity index 100% rename from modules/nf-core/software/fastqc/meta.yml rename to modules/nf-core/modules/fastqc/meta.yml diff --git a/modules/nf-core/software/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf similarity index 100% rename from modules/nf-core/software/multiqc/functions.nf rename to modules/nf-core/modules/multiqc/functions.nf diff --git a/modules/nf-core/software/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf similarity index 100% rename from modules/nf-core/software/multiqc/main.nf rename to modules/nf-core/modules/multiqc/main.nf diff --git a/modules/nf-core/software/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml similarity index 100% rename from modules/nf-core/software/multiqc/meta.yml rename to modules/nf-core/modules/multiqc/meta.yml diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 13567c1d..986002e7 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -57,8 +57,8 @@ multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \" // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/software/fastqc/main' addParams( options: modules['fastqc'] ) -include { MULTIQC } from '../modules/nf-core/software/multiqc/main' addParams( options: multiqc_options ) +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) /* ======================================================================================== From 001aa4be6a5e7cb12e5c6140467407bd8bf9d173 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 13 Jul 2021 17:25:14 +0200 Subject: [PATCH 0008/1169] added samtools merge --- conf/modules.config | 12 +++- modules.json | 6 ++ .../modules/samtools/index/functions.nf | 68 +++++++++++++++++++ .../nf-core/modules/samtools/index/main.nf | 35 ++++++++++ .../nf-core/modules/samtools/index/meta.yml | 47 +++++++++++++ .../modules/samtools/merge/functions.nf | 68 +++++++++++++++++++ .../nf-core/modules/samtools/merge/main.nf | 35 ++++++++++ .../nf-core/modules/samtools/merge/meta.yml | 44 ++++++++++++ workflows/raredisease.nf | 15 ++++ 9 files changed, 329 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/modules/samtools/index/functions.nf create mode 100644 modules/nf-core/modules/samtools/index/main.nf create mode 100644 modules/nf-core/modules/samtools/index/meta.yml create mode 100644 modules/nf-core/modules/samtools/merge/functions.nf create mode 100644 modules/nf-core/modules/samtools/merge/main.nf create mode 100644 modules/nf-core/modules/samtools/merge/meta.yml diff --git a/conf/modules.config b/conf/modules.config index 8725ffea..41a9d8ef 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -30,7 +30,17 @@ params { publish_files = false } 'bwa_mem2_mem' { - args = '' + args = '-M' + } + 'merge_bam_mapping' { + publish_by_meta = true + publish_files = ['bam':'mapped'] + publish_dir = 'preprocessing' + } + 'samtools_index_mapping' { + publish_by_meta = true + publish_files = ['bai':'mapped'] + publish_dir = 'preprocessing' } 'multiqc' { args = '' diff --git a/modules.json b/modules.json index f2367aff..41924fbe 100644 --- a/modules.json +++ b/modules.json @@ -14,6 +14,12 @@ }, "bwamem2/mem": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "samtools/merge": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "samtools/index": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" } } } diff --git a/modules/nf-core/modules/samtools/index/functions.nf b/modules/nf-core/modules/samtools/index/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/nf-core/modules/samtools/index/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf new file mode 100644 index 00000000..778e9384 --- /dev/null +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -0,0 +1,35 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SAMTOOLS_INDEX { + tag "$meta.id" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::samtools=1.12" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" + } else { + container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" + } + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.bai"), optional:true, emit: bai + tuple val(meta), path("*.csi"), optional:true, emit: csi + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools index $options.args $bam + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml new file mode 100644 index 00000000..5d076e3b --- /dev/null +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -0,0 +1,47 @@ +name: samtools_index +description: Index SAM/BAM/CRAM file +keywords: + - index + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - csi: + type: file + description: CSI index file + pattern: "*.{csi}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@drpatelh" + - "@ewels" diff --git a/modules/nf-core/modules/samtools/merge/functions.nf b/modules/nf-core/modules/samtools/merge/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/nf-core/modules/samtools/merge/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/samtools/merge/main.nf b/modules/nf-core/modules/samtools/merge/main.nf new file mode 100644 index 00000000..81b2828c --- /dev/null +++ b/modules/nf-core/modules/samtools/merge/main.nf @@ -0,0 +1,35 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SAMTOOLS_MERGE { + tag "$meta.id" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::samtools=1.12" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" + } else { + container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" + } + + input: + tuple val(meta), path(bams) + + output: + tuple val(meta), path("*merged.bam"), emit: merged_bam + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + """ + samtools merge ${prefix}_merged.bam $bams + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/samtools/merge/meta.yml b/modules/nf-core/modules/samtools/merge/meta.yml new file mode 100644 index 00000000..9092f22e --- /dev/null +++ b/modules/nf-core/modules/samtools/merge/meta.yml @@ -0,0 +1,44 @@ +name: samtools_merge +description: Merge BAM file +keywords: + - merge + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam,cram,sam}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - merged_bam: + type: file + description: BAM file + pattern: "*.{bam}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@drpatelh" + - "@yuukiiwa " + - "@maxulysse" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c5216a79..37cbe5a6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -60,6 +60,8 @@ multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \" include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) include { BWAMEM2_INDEX } from '../modules/nf-core/modules/bwamem2/index/main' addParams( options: modules['bwa_mem2_index'] ) include { BWAMEM2_MEM } from '../modules/nf-core/modules/bwamem2/mem/main' addParams( options: modules['bwa_mem2_mem'] ) +include { SAMTOOLS_MERGE } from '../modules/nf-core/modules/samtools/merge/main' addParams(options: modules['merge_bam_mapping']) +include { SAMTOOLS_INDEX } from '../modules/nf-core/modules/samtools/index/main' addParams(options: modules['samtools_index_mapping']) include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) /* @@ -102,6 +104,19 @@ workflow RAREDISEASE { ) ch_software_versions = ch_software_versions.mix(BWAMEM2_MEM.out.version.ifEmpty(null)) + bam_bwa = BWAMEM2_MEM.out.bam + + bam_bwa.map{ meta, bam -> + meta.id = meta.id.split('_')[0] + [meta, bam] + }.groupTuple().branch{ + single: it[1].size() == 1 + multiple: it[1].size() > 1 + }.set{ bam_bwa_to_sort } + + SAMTOOLS_MERGE(bam_bwa_to_sort.multiple) + ch_software_versions = ch_software_versions.mix(SAMTOOLS_MERGE.out.version.ifEmpty(null)) + // // MODULE: Pipeline reporting // From 97a1682c6b300320cc945f75a4adf1e2c422bdad Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 13 Jul 2021 15:32:32 +0000 Subject: [PATCH 0009/1169] Template update for nf-core/tools version 2.0.1 --- .github/workflows/linting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 13b4fc81..fbde5cf8 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -127,7 +127,7 @@ jobs: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core -l lint_log.txt lint ${GITHUB_WORKSPACE} --markdown lint_results.md + run: nf-core -l lint_log.txt lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Save PR number if: ${{ always() }} From ebae6ba1c2502bfc78b8a6f153d200fcebe1c01a Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 14 Jul 2021 15:52:29 +0200 Subject: [PATCH 0010/1169] added samtools sort --- conf/modules.config | 6 ++ modules.json | 3 + .../modules/samtools/sort/functions.nf | 68 +++++++++++++++++++ modules/nf-core/modules/samtools/sort/main.nf | 35 ++++++++++ .../nf-core/modules/samtools/sort/meta.yml | 43 ++++++++++++ workflows/raredisease.nf | 17 +++-- 6 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 modules/nf-core/modules/samtools/sort/functions.nf create mode 100644 modules/nf-core/modules/samtools/sort/main.nf create mode 100644 modules/nf-core/modules/samtools/sort/meta.yml diff --git a/conf/modules.config b/conf/modules.config index 41a9d8ef..8e0a3894 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -31,8 +31,14 @@ params { } 'bwa_mem2_mem' { args = '-M' + publish_files = false + } + 'samtools_sort' { + suffix = '.sorted' + publish_files = false } 'merge_bam_mapping' { + suffix = '.sorted' publish_by_meta = true publish_files = ['bam':'mapped'] publish_dir = 'preprocessing' diff --git a/modules.json b/modules.json index 41924fbe..dc4da7a4 100644 --- a/modules.json +++ b/modules.json @@ -20,6 +20,9 @@ }, "samtools/index": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "samtools/sort": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" } } } diff --git a/modules/nf-core/modules/samtools/sort/functions.nf b/modules/nf-core/modules/samtools/sort/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/nf-core/modules/samtools/sort/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf new file mode 100644 index 00000000..240e8e9f --- /dev/null +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -0,0 +1,35 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SAMTOOLS_SORT { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::samtools=1.12" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" + } else { + container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" + } + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + """ + samtools sort $options.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml new file mode 100644 index 00000000..704e8c1f --- /dev/null +++ b/modules/nf-core/modules/samtools/sort/meta.yml @@ -0,0 +1,43 @@ +name: samtools_sort +description: Sort SAM/BAM/CRAM file +keywords: + - sort + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@drpatelh" + - "@ewels" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 37cbe5a6..22840acc 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -60,6 +60,7 @@ multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \" include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) include { BWAMEM2_INDEX } from '../modules/nf-core/modules/bwamem2/index/main' addParams( options: modules['bwa_mem2_index'] ) include { BWAMEM2_MEM } from '../modules/nf-core/modules/bwamem2/mem/main' addParams( options: modules['bwa_mem2_mem'] ) +include { SAMTOOLS_SORT } from '../modules/nf-core/modules/samtools/sort/main' addParams(options: modules['samtools_sort']) include { SAMTOOLS_MERGE } from '../modules/nf-core/modules/samtools/merge/main' addParams(options: modules['merge_bam_mapping']) include { SAMTOOLS_INDEX } from '../modules/nf-core/modules/samtools/index/main' addParams(options: modules['samtools_index_mapping']) include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) @@ -95,28 +96,30 @@ workflow RAREDISEASE { // // MODULE: Run BWAMEM2 // - BWAMEM2_INDEX ( - params.fasta - ) + BWAMEM2_INDEX ( params.fasta ) BWAMEM2_MEM ( INPUT_CHECK.out.reads, BWAMEM2_INDEX.out.index ) ch_software_versions = ch_software_versions.mix(BWAMEM2_MEM.out.version.ifEmpty(null)) - bam_bwa = BWAMEM2_MEM.out.bam + SAMTOOLS_SORT( BWAMEM2_MEM.out.bam ) + + sorted_bam_bwa = SAMTOOLS_SORT.out.bam - bam_bwa.map{ meta, bam -> + sorted_bam_bwa.map{ meta, bam -> meta.id = meta.id.split('_')[0] [meta, bam] }.groupTuple().branch{ single: it[1].size() == 1 multiple: it[1].size() > 1 - }.set{ bam_bwa_to_sort } + }.set{ bam_bwa } - SAMTOOLS_MERGE(bam_bwa_to_sort.multiple) + SAMTOOLS_MERGE(bam_bwa.multiple) ch_software_versions = ch_software_versions.mix(SAMTOOLS_MERGE.out.version.ifEmpty(null)) + SAMTOOLS_INDEX(SAMTOOLS_MERGE.out.merged_bam) + // // MODULE: Pipeline reporting // From 2b963598ce3358316e2027e885dff164311033f7 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 15 Jul 2021 12:48:12 +0200 Subject: [PATCH 0011/1169] added samtools stats --- modules.json | 3 + .../modules/samtools/stats/functions.nf | 68 +++++++++++++++++++ .../nf-core/modules/samtools/stats/main.nf | 34 ++++++++++ .../nf-core/modules/samtools/stats/meta.yml | 47 +++++++++++++ 4 files changed, 152 insertions(+) create mode 100644 modules/nf-core/modules/samtools/stats/functions.nf create mode 100644 modules/nf-core/modules/samtools/stats/main.nf create mode 100644 modules/nf-core/modules/samtools/stats/meta.yml diff --git a/modules.json b/modules.json index dc4da7a4..754655fa 100644 --- a/modules.json +++ b/modules.json @@ -23,6 +23,9 @@ }, "samtools/sort": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "samtools/stats": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" } } } diff --git a/modules/nf-core/modules/samtools/stats/functions.nf b/modules/nf-core/modules/samtools/stats/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/nf-core/modules/samtools/stats/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf new file mode 100644 index 00000000..6bb0a4c7 --- /dev/null +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -0,0 +1,34 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SAMTOOLS_STATS { + tag "$meta.id" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::samtools=1.12" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" + } else { + container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" + } + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path("*.stats"), emit: stats + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools stats $bam > ${bam}.stats + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/modules/samtools/stats/meta.yml new file mode 100644 index 00000000..b549ff5c --- /dev/null +++ b/modules/nf-core/modules/samtools/stats/meta.yml @@ -0,0 +1,47 @@ +name: samtools_stats +description: Produces comprehensive statistics from SAM/BAM/CRAM file +keywords: + - statistics + - counts + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - stats: + type: file + description: File containing samtools stats output + pattern: "*.{stats}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@drpatelh" From 85566234d39c57f19e90cbd2bca2557b1c96801f Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 15 Jul 2021 15:25:50 +0200 Subject: [PATCH 0012/1169] added samtools view --- modules.json | 3 + .../modules/samtools/view/functions.nf | 68 +++++++++++++++++++ modules/nf-core/modules/samtools/view/main.nf | 35 ++++++++++ .../nf-core/modules/samtools/view/meta.yml | 43 ++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 modules/nf-core/modules/samtools/view/functions.nf create mode 100644 modules/nf-core/modules/samtools/view/main.nf create mode 100644 modules/nf-core/modules/samtools/view/meta.yml diff --git a/modules.json b/modules.json index 754655fa..ea50c306 100644 --- a/modules.json +++ b/modules.json @@ -26,6 +26,9 @@ }, "samtools/stats": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "samtools/view": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" } } } diff --git a/modules/nf-core/modules/samtools/view/functions.nf b/modules/nf-core/modules/samtools/view/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/nf-core/modules/samtools/view/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/samtools/view/main.nf b/modules/nf-core/modules/samtools/view/main.nf new file mode 100644 index 00000000..ec6c747f --- /dev/null +++ b/modules/nf-core/modules/samtools/view/main.nf @@ -0,0 +1,35 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SAMTOOLS_VIEW { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::samtools=1.12" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" + } else { + container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" + } + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + """ + samtools view $options.args $bam > ${prefix}.bam + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/samtools/view/meta.yml b/modules/nf-core/modules/samtools/view/meta.yml new file mode 100644 index 00000000..c35a8b03 --- /dev/null +++ b/modules/nf-core/modules/samtools/view/meta.yml @@ -0,0 +1,43 @@ +name: samtools_view +description: filter/convert SAM/BAM/CRAM file +keywords: + - view + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: filtered/converted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@drpatelh" + - "@joseespinosa" From ef1a98a12bfc5b9ee94a2b9fc0d96cbe5900445f Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 15 Jul 2021 19:12:41 +0200 Subject: [PATCH 0013/1169] modularized preliminary mapping --- subworkflows/nf-core/mapping.nf | 57 +++++++++++++++++++++++++++++++++ workflows/raredisease.nf | 45 ++++++++------------------ 2 files changed, 71 insertions(+), 31 deletions(-) create mode 100644 subworkflows/nf-core/mapping.nf diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf new file mode 100644 index 00000000..b12dc833 --- /dev/null +++ b/subworkflows/nf-core/mapping.nf @@ -0,0 +1,57 @@ +/* +======================================================================================== + MAPPING +======================================================================================== +*/ + +params.bwamem2_idx_options = [:] +params.bwamem2_mem_options = [:] +params.samtools_idx_options = [:] +params.samtools_merge_options = [:] +params.samtools_sort_options = [:] +params.samtools_stats_options = [:] +params.samtools_view_options = [:] + +include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) +include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_options ) +include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams(options: params.samtools_merge_options ) +include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) +include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) +include { SAMTOOLS_VIEW } from '../../modules/nf-core/modules/samtools/view/main' addParams(options: params.samtools_view_options ) + + +workflow MAPPING { + take: + reads_input // channel: [mandatory] meta, reads_input + fasta // channel: [mandatory] fasta + + main: + + BWAMEM2_INDEX ( fasta ) + BWAMEM2_MEM ( reads_input, BWAMEM2_INDEX.out.index ) + bwamem2_version = BWAMEM2_MEM.out.version + + SAMTOOLS_SORT( BWAMEM2_MEM.out.bam ) + sorted_bam_bwa = SAMTOOLS_SORT.out.bam + + sorted_bam_bwa.map{ meta, bam -> + meta.id = meta.id.split('_')[0] + [meta, bam] + }.groupTuple().branch{ + single: it[1].size() == 1 + multiple: it[1].size() > 1 + }.set{ bam_bwa } + + SAMTOOLS_MERGE( bam_bwa.multiple ) + SAMTOOLS_INDEX( SAMTOOLS_MERGE.out.merged_bam ) + samtools_version = SAMTOOLS_SORT.out.version + + emit: + bam = SAMTOOLS_MERGE.out.merged_bam + bai = SAMTOOLS_INDEX.out.bai + + bwamem2_version + samtools_version +} + diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 22840acc..5d835280 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -58,13 +58,19 @@ multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \" // MODULE: Installed directly from nf-core/modules // include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) -include { BWAMEM2_INDEX } from '../modules/nf-core/modules/bwamem2/index/main' addParams( options: modules['bwa_mem2_index'] ) -include { BWAMEM2_MEM } from '../modules/nf-core/modules/bwamem2/mem/main' addParams( options: modules['bwa_mem2_mem'] ) -include { SAMTOOLS_SORT } from '../modules/nf-core/modules/samtools/sort/main' addParams(options: modules['samtools_sort']) -include { SAMTOOLS_MERGE } from '../modules/nf-core/modules/samtools/merge/main' addParams(options: modules['merge_bam_mapping']) -include { SAMTOOLS_INDEX } from '../modules/nf-core/modules/samtools/index/main' addParams(options: modules['samtools_index_mapping']) include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) +// +// SUBWORKFLOW: Consists entirely of nf-core/modules +// +include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( + bwamem2_idx_options: modules['bwa_mem2_index'], + bwamem2_mem_options: modules['bwa_mem2_mem'], + samtools_idx_options: modules['samtools_index_mapping'], + samtools_merge_options: modules['merge_bam_mapping'], + samtools_sort_options: modules['samtools_sort'], + ) + /* ======================================================================================== RUN MAIN WORKFLOW @@ -93,32 +99,9 @@ workflow RAREDISEASE { ) ch_software_versions = ch_software_versions.mix(FASTQC.out.version.ifEmpty(null)) - // - // MODULE: Run BWAMEM2 - // - BWAMEM2_INDEX ( params.fasta ) - - BWAMEM2_MEM ( - INPUT_CHECK.out.reads, BWAMEM2_INDEX.out.index - ) - ch_software_versions = ch_software_versions.mix(BWAMEM2_MEM.out.version.ifEmpty(null)) - - SAMTOOLS_SORT( BWAMEM2_MEM.out.bam ) - - sorted_bam_bwa = SAMTOOLS_SORT.out.bam - - sorted_bam_bwa.map{ meta, bam -> - meta.id = meta.id.split('_')[0] - [meta, bam] - }.groupTuple().branch{ - single: it[1].size() == 1 - multiple: it[1].size() > 1 - }.set{ bam_bwa } - - SAMTOOLS_MERGE(bam_bwa.multiple) - ch_software_versions = ch_software_versions.mix(SAMTOOLS_MERGE.out.version.ifEmpty(null)) - - SAMTOOLS_INDEX(SAMTOOLS_MERGE.out.merged_bam) + MAPPING ( INPUT_CHECK.out.reads, params.fasta ) + ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) // // MODULE: Pipeline reporting From 84867bb10b775c3a5598d02276d5ac7a2992bfdb Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 20 Jul 2021 10:56:14 +0200 Subject: [PATCH 0014/1169] modularized mapping and breaking alnmt into contigs --- conf/modules.config | 23 ++++---- modules.json | 3 -- .../samtools/merge/functions.nf | 0 .../modules => local}/samtools/merge/main.nf | 8 +-- .../modules => local}/samtools/merge/meta.yml | 0 subworkflows/local/merge2break.nf | 39 ++++++++++++++ subworkflows/nf-core/mapping.nf | 52 ++++++++----------- workflows/raredisease.nf | 11 +++- 8 files changed, 88 insertions(+), 48 deletions(-) rename modules/{nf-core/modules => local}/samtools/merge/functions.nf (100%) rename modules/{nf-core/modules => local}/samtools/merge/main.nf (82%) rename modules/{nf-core/modules => local}/samtools/merge/meta.yml (100%) create mode 100644 subworkflows/local/merge2break.nf diff --git a/conf/modules.config b/conf/modules.config index 8e0a3894..bf53a13a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -33,20 +33,21 @@ params { args = '-M' publish_files = false } + 'samtools_merge' { + args = "--write-index -f" + publish_dir = 'samtools_merge' + } + 'samtools_index' { + args = '' + } 'samtools_sort' { - suffix = '.sorted' - publish_files = false + suffix = '_sorted' } - 'merge_bam_mapping' { - suffix = '.sorted' - publish_by_meta = true - publish_files = ['bam':'mapped'] - publish_dir = 'preprocessing' + 'samtools_stats' { + args = '-s --remove-overlaps' } - 'samtools_index_mapping' { - publish_by_meta = true - publish_files = ['bai':'mapped'] - publish_dir = 'preprocessing' + 'samtools_view'{ + args = '' } 'multiqc' { args = '' diff --git a/modules.json b/modules.json index ea50c306..9f5f26be 100644 --- a/modules.json +++ b/modules.json @@ -15,9 +15,6 @@ "bwamem2/mem": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, - "samtools/merge": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" - }, "samtools/index": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, diff --git a/modules/nf-core/modules/samtools/merge/functions.nf b/modules/local/samtools/merge/functions.nf similarity index 100% rename from modules/nf-core/modules/samtools/merge/functions.nf rename to modules/local/samtools/merge/functions.nf diff --git a/modules/nf-core/modules/samtools/merge/main.nf b/modules/local/samtools/merge/main.nf similarity index 82% rename from modules/nf-core/modules/samtools/merge/main.nf rename to modules/local/samtools/merge/main.nf index 81b2828c..ba0f703f 100644 --- a/modules/nf-core/modules/samtools/merge/main.nf +++ b/modules/local/samtools/merge/main.nf @@ -19,17 +19,19 @@ process SAMTOOLS_MERGE { } input: - tuple val(meta), path(bams) + tuple val(meta), path(bams), path(bai) + val chr output: - tuple val(meta), path("*merged.bam"), emit: merged_bam + tuple val(meta), path("*.bam"), emit: merged_bam + tuple val(meta), path("*.csi"), optional:true, emit: csi path "*.version.txt" , emit: version script: def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ - samtools merge ${prefix}_merged.bam $bams + samtools merge $options.args -R ${chr} ${prefix}.sorted.${chr}.bam $bams echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt """ } diff --git a/modules/nf-core/modules/samtools/merge/meta.yml b/modules/local/samtools/merge/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/merge/meta.yml rename to modules/local/samtools/merge/meta.yml diff --git a/subworkflows/local/merge2break.nf b/subworkflows/local/merge2break.nf new file mode 100644 index 00000000..67761c38 --- /dev/null +++ b/subworkflows/local/merge2break.nf @@ -0,0 +1,39 @@ +// +// Merge bams and then break into contigs. +// + +params.samtools_idx_options = [:] +params.samtools_merge_options = [:] +params.samtools_view_options = [:] + +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_options ) +include { SAMTOOLS_MERGE } from '../../modules/local/samtools/merge/main' addParams( options: params.samtools_merge_options ) +include { SAMTOOLS_VIEW } from '../../modules/nf-core/modules/samtools/view/main' addParams( options: params.samtools_view_options ) + +workflow MERGE2BREAK { + // chr = Channel.of(1..22, 'X', 'Y', 'M').map{ "chr" + it } + chr = "chr20" + // TODO: need to write a validation check for chromosomes present in bam files? potentially not needed as fastq likely to map to psuedo-regions in other chrom. + + take: + fasta // channel: [mandatory] fasta + bam // channel: [mandatory] [ val(meta), [ bam ] ] + bai // channel: [mandatory for regional merge] [ val(meta), [ bai ] ] + + main: + new_bam = bam.join(bai) + new_bam.map{ meta, bam, bai -> + new_meta = meta.clone() + new_meta.id = new_meta.id.split('_')[0] + [new_meta, bam, bai] + }.groupTuple().branch{ + single: it[1].size() == 1 + multiple: it[1].size() > 1 + }.set{ bam_bwa } + + SAMTOOLS_MERGE ( bam_bwa.multiple, chr ) + + emit: + bam = SAMTOOLS_MERGE.out.merged_bam + csi = SAMTOOLS_MERGE.out.csi +} diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index b12dc833..7f6409df 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -1,24 +1,18 @@ -/* -======================================================================================== - MAPPING -======================================================================================== -*/ +// +// Map to reference, sort + index + stats each alignment file. +// params.bwamem2_idx_options = [:] params.bwamem2_mem_options = [:] params.samtools_idx_options = [:] -params.samtools_merge_options = [:] params.samtools_sort_options = [:] params.samtools_stats_options = [:] -params.samtools_view_options = [:] include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_options ) -include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams(options: params.samtools_merge_options ) include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) -include { SAMTOOLS_VIEW } from '../../modules/nf-core/modules/samtools/view/main' addParams(options: params.samtools_view_options ) workflow MAPPING { @@ -27,31 +21,31 @@ workflow MAPPING { fasta // channel: [mandatory] fasta main: + // Index + BWAMEM2_INDEX ( fasta ) - BWAMEM2_INDEX ( fasta ) - BWAMEM2_MEM ( reads_input, BWAMEM2_INDEX.out.index ) - bwamem2_version = BWAMEM2_MEM.out.version + // Map, sort, and index + BWAMEM2_MEM ( reads_input, BWAMEM2_INDEX.out.index ) + SAMTOOLS_SORT ( BWAMEM2_MEM.out.bam ) + SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) - SAMTOOLS_SORT( BWAMEM2_MEM.out.bam ) - sorted_bam_bwa = SAMTOOLS_SORT.out.bam + // Join the mapped bam + bai paths by their keys + bam_sorted_indexed = Channel.empty() + bam_sorted_indexed = SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai) - sorted_bam_bwa.map{ meta, bam -> - meta.id = meta.id.split('_')[0] - [meta, bam] - }.groupTuple().branch{ - single: it[1].size() == 1 - multiple: it[1].size() > 1 - }.set{ bam_bwa } + // Get stats + SAMTOOLS_STATS ( bam_sorted_indexed ) + // TODO: MIP adds an add'l line to the stats file: percentage mapped: ((mapped/total raw) * 100). I think we should write a process to handle this. - SAMTOOLS_MERGE( bam_bwa.multiple ) - SAMTOOLS_INDEX( SAMTOOLS_MERGE.out.merged_bam ) - samtools_version = SAMTOOLS_SORT.out.version + // Collect versions + bwamem2_version = BWAMEM2_MEM.out.version + samtools_version = SAMTOOLS_SORT.out.version emit: - bam = SAMTOOLS_MERGE.out.merged_bam - bai = SAMTOOLS_INDEX.out.bai + bam = SAMTOOLS_SORT.out.bam + bai = SAMTOOLS_INDEX.out.bai + stats = SAMTOOLS_STATS.out.stats - bwamem2_version - samtools_version + bwamem2_version + samtools_version } - diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5d835280..d6c3cf60 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -45,6 +45,11 @@ include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' // include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) +include { MERGE2BREAK } from '../subworkflows/local/merge2break' addParams( + samtools_merge_options: modules['samtools_merge'], + samtools_view_options: modules['samtools_view'], +) + /* ======================================================================================== IMPORT NF-CORE MODULES/SUBWORKFLOWS @@ -66,9 +71,9 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( op include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], bwamem2_mem_options: modules['bwa_mem2_mem'], - samtools_idx_options: modules['samtools_index_mapping'], - samtools_merge_options: modules['merge_bam_mapping'], + samtools_idx_options: modules['samtools_index'], samtools_sort_options: modules['samtools_sort'], + samtools_stats_options: modules['samtools_stats'] ) /* @@ -103,6 +108,8 @@ workflow RAREDISEASE { ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) + MERGE2BREAK ( params.fasta, MAPPING.out.bam, MAPPING.out.bai ) + // // MODULE: Pipeline reporting // From f56e3aa5b3676e84a0d7f21b1c3063285de9ce3e Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 21 Jul 2021 10:33:43 +0200 Subject: [PATCH 0015/1169] added calculate percntg mapped --- conf/modules.config | 6 +++++- modules/local/calculate_mapped.nf | 31 +++++++++++++++++++++++++++++++ subworkflows/local/merge2break.nf | 2 ++ subworkflows/nf-core/mapping.nf | 6 ++++-- testdata_sarek/rd_tiny.csv~ | 14 -------------- 5 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 modules/local/calculate_mapped.nf delete mode 100644 testdata_sarek/rd_tiny.csv~ diff --git a/conf/modules.config b/conf/modules.config index bf53a13a..15736268 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -33,6 +33,9 @@ params { args = '-M' publish_files = false } + 'map_dir' { + publish_dir = '' + } 'samtools_merge' { args = "--write-index -f" publish_dir = 'samtools_merge' @@ -45,9 +48,10 @@ params { } 'samtools_stats' { args = '-s --remove-overlaps' + publish_files = false } 'samtools_view'{ - args = '' + args = '--output-fmt BAM' } 'multiqc' { args = '' diff --git a/modules/local/calculate_mapped.nf b/modules/local/calculate_mapped.nf new file mode 100644 index 00000000..29a4cea1 --- /dev/null +++ b/modules/local/calculate_mapped.nf @@ -0,0 +1,31 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process CALCULATE_MAPPED { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:"samtools", meta:[:], publish_by_meta:['id']) } + + conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/python:3.8.3" + } else { + container "quay.io/biocontainers/python:3.8.3" + } + + input: + tuple val(meta), path(stats) + + output: + path "*.stats" , emit: stats + + script: + def prefix = stats.getSimpleName() + """ + cat $stats | grep -E "raw total sequences:|reads mapped:" | cut -f3 | tr '\\n' '\\t' | awk '{print (\$2/\$1) * 100}' | while read line; do awk -v p=\$line 'NR==15 {print "percentage mapped reads:\\t" p }1' $stats; done > ${prefix}.stats + """ +} diff --git a/subworkflows/local/merge2break.nf b/subworkflows/local/merge2break.nf index 67761c38..cce34384 100644 --- a/subworkflows/local/merge2break.nf +++ b/subworkflows/local/merge2break.nf @@ -32,6 +32,8 @@ workflow MERGE2BREAK { }.set{ bam_bwa } SAMTOOLS_MERGE ( bam_bwa.multiple, chr ) + // TODO: Singles? WELLL, we shall re-name instead + // SAMTOOLS_VIEW ( bam_bwa.single ) emit: bam = SAMTOOLS_MERGE.out.merged_bam diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 7f6409df..c0feeb29 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -4,6 +4,7 @@ params.bwamem2_idx_options = [:] params.bwamem2_mem_options = [:] +params.calculate_mapped_options = [:] params.samtools_idx_options = [:] params.samtools_sort_options = [:] params.samtools_stats_options = [:] @@ -13,6 +14,7 @@ include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' a include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_options ) include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) +include { CALCULATE_MAPPED } from '../../modules/local/calculate_mapped' addParams(options: params.calculate_mapped_options ) workflow MAPPING { @@ -35,7 +37,7 @@ workflow MAPPING { // Get stats SAMTOOLS_STATS ( bam_sorted_indexed ) - // TODO: MIP adds an add'l line to the stats file: percentage mapped: ((mapped/total raw) * 100). I think we should write a process to handle this. + CALCULATE_MAPPED ( SAMTOOLS_STATS.out.stats ) // Collect versions bwamem2_version = BWAMEM2_MEM.out.version @@ -44,7 +46,7 @@ workflow MAPPING { emit: bam = SAMTOOLS_SORT.out.bam bai = SAMTOOLS_INDEX.out.bai - stats = SAMTOOLS_STATS.out.stats + stats = CALCULATE_MAPPED.out.stats bwamem2_version samtools_version diff --git a/testdata_sarek/rd_tiny.csv~ b/testdata_sarek/rd_tiny.csv~ deleted file mode 100644 index 4127c094..00000000 --- a/testdata_sarek/rd_tiny.csv~ +++ /dev/null @@ -1,14 +0,0 @@ -sample,fastq_1,fastq_2 -1234N,testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz -1234N,testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz -1234N,testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz -1234N,testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz -1234N,testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz -1234N,testdata_sarek/dummy/normal/dummy_n_R1_xxx.fastq.gz,testdata_sarek/dummy/normal/dummy_n_R2_xxx.fastq.gz -9876T,testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz -9876T,testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz -9876T,testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L003_R2_xxx.fastq.gz -9876T,testdata_sarek/dummy/tumor/dummy_t_R1_xxx.fastq.gz,testdata_sarek/dummy/tumor/dummy_t_R2_xxx.fastq.gz -9877R,testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz -9877R,testdata_sarek/tumor/tiny_t_L006_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz -9877R,testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L007_R2_xxx.fastq.gz From 729446ae93bad7fa2b3704d2d5cd723dffa67ad8 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 23 Jul 2021 09:59:37 +0200 Subject: [PATCH 0016/1169] placeholder for read group map --- conf/modules.config | 2 +- subworkflows/nf-core/mapping.nf | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 15736268..503a105c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -30,7 +30,7 @@ params { publish_files = false } 'bwa_mem2_mem' { - args = '-M' + args = '-M -K 100000000' publish_files = false } 'map_dir' { diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index c0feeb29..7a6d7fd6 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -26,6 +26,16 @@ workflow MAPPING { // Index BWAMEM2_INDEX ( fasta ) + // Add @RG, there should be a conditional for this in case read group is not needed + reads_input.map{ meta, reads -> + new_meta = meta.clone() + reads[0].baseName.split('_').init() + + // Should there be a process to catch the RG from fastq headers? + // "\"@RG\\tID:${row.lane}\\t${CN}PU:${row.lane}\\tSM:${row.sample}\\tLB:${row.sample}\\tPL:ILLUMINA\"" + // meta.read_group = read_group + }.view() + // Map, sort, and index BWAMEM2_MEM ( reads_input, BWAMEM2_INDEX.out.index ) SAMTOOLS_SORT ( BWAMEM2_MEM.out.bam ) From c7918ac55268901ba268c4a9a15df84f8861b8a7 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 27 Jul 2021 16:08:40 +0000 Subject: [PATCH 0017/1169] Template update for nf-core/tools version 2.1 --- .editorconfig | 3 +++ .github/CONTRIBUTING.md | 6 +++--- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/linting.yml | 2 +- README.md | 2 +- bin/scrape_software_versions.py | 2 +- lib/NfcoreTemplate.groovy | 22 +++++++++++++--------- nextflow_schema.json | 4 ++-- workflows/raredisease.nf | 4 +++- 9 files changed, 28 insertions(+), 19 deletions(-) diff --git a/.editorconfig b/.editorconfig index afb20bb1..95549501 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,6 +11,9 @@ indent_style = space [*.{yml,yaml}] indent_size = 2 +[*.json] +insert_final_newline = unset + # These files are edited and tested upstream in nf-core/modules [/modules/nf-core/**] charset = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 032ea20b..b2f28393 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ If you'd like to write some code for nf-core/raredisease, the standard workflow * If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/raredisease repository](https://github.com/nf-core/raredisease) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core schema build .` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). +4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. 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/). @@ -69,7 +69,7 @@ If you wish to contribute a new step, please use the following coding standards: 2. Write the process block (see below). 3. Define the output channel if needed (see below). 4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build .`). +5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). 6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). 7. Add sanity checks for all relevant parameters. 8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. @@ -83,7 +83,7 @@ If you wish to contribute a new step, please use the following coding standards: Parameters should be initialised / defined with default values in `nextflow.config` under the `params` scope. -Once there, use `nf-core schema build .` to add to `nextflow_schema.json`. +Once there, use `nf-core schema build` to add to `nextflow_schema.json`. ### Default processes resource requirements diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b11e3616..94c01b6c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. -- [ ] Make sure your code lints (`nf-core lint .`). +- [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index fbde5cf8..3b448773 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -53,7 +53,7 @@ jobs: - uses: actions/setup-node@v1 with: - node-version: "10" + node-version: '10' - name: Install editorconfig-checker run: npm install -g editorconfig-checker diff --git a/README.md b/README.md index 27db6607..9d27eeec 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Quick Start -1. Install [`Nextflow`](https://nf-co.re/usage/installation) (`>=21.04.0`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index e3403e86..4cbbae3a 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -30,7 +30,7 @@ print("

{}
{}
".format(k, v)) print(" ") -# Write out regexes as csv file: +# Write out as tsv file: with open("software_versions.tsv", "w") as f: for k, v in sorted(results.items()): f.write("{}\t{}\n".format(k, v)) diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index b6e689ec..44551e0a 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -24,17 +24,21 @@ class NfcoreTemplate { public static void hostName(workflow, params, log) { Map colors = logColours(params.monochrome_logs) if (params.hostnames) { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" + try { + def hostname = "hostname".execute().text.trim() + params.hostnames.each { prof, hnames -> + hnames.each { hname -> + if (hostname.contains(hname) && !workflow.profile.contains(prof)) { + log.info "=${colors.yellow}====================================================${colors.reset}=\n" + + "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + + " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + + " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + + "=${colors.yellow}====================================================${colors.reset}=" + } } } + } catch (Exception e) { + log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." } } } diff --git a/nextflow_schema.json b/nextflow_schema.json index d2cc50d7..60fdb051 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -18,7 +18,7 @@ "type": "string", "format": "file-path", "mimetype": "text/csv", - "pattern": "\\.csv$", + "pattern": "^\\S+\\.csv$", "schema": "assets/schema_input.json", "description": "Path to comma-separated file containing information about the samples in the experiment.", "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row. See [usage docs](https://nf-co.re/raredisease/usage#samplesheet-input).", @@ -60,7 +60,7 @@ "type": "string", "format": "file-path", "mimetype": "text/plain", - "pattern": "\\.fn?a(sta)?(\\.gz)?$", + "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", "fa_icon": "far fa-file-code" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 986002e7..3b6af916 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -130,7 +130,9 @@ workflow RAREDISEASE { */ workflow.onComplete { - NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) + if (params.email || params.email_on_fail) { + NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) + } NfcoreTemplate.summary(workflow, params, log) } From 2c341313bc153787fced9e9991fe71a30b449c88 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 12 Aug 2021 13:47:24 +0200 Subject: [PATCH 0018/1169] updated samplesheet checks in both .py and .nf --- assets/samplesheet.csv | 4 +- bin/check_samplesheet.py | 38 ++++++------------ conf/test.config | 2 +- nextflow.config | 1 + subworkflows/local/input_check.nf | 22 +++++++++- subworkflows/local/merge2break.nf | 13 +++--- subworkflows/nf-core/mapping.nf | 10 ----- testdata_sarek/rd_tiny.csv | 12 ------ testdata_sarek/rd_tiny_mod.csv | 6 +++ .../tumor/tiny_t_L001_R1_xxx.fastq.gz | Bin 27427 -> 0 bytes .../tumor/tiny_t_L001_R2_xxx.fastq.gz | Bin 26833 -> 0 bytes .../tumor/tiny_t_L002_R1_xxx.fastq.gz | Bin 47308 -> 0 bytes .../tumor/tiny_t_L002_R2_xxx.fastq.gz | Bin 45779 -> 0 bytes .../tumor/tiny_t_L003_R1_xxx.fastq.gz | Bin 45864 -> 0 bytes .../tumor/tiny_t_L003_R2_xxx.fastq.gz | Bin 45400 -> 0 bytes .../tumor/tiny_t_L005_R1_xxx.fastq.gz | Bin 48397 -> 0 bytes .../tumor/tiny_t_L005_R2_xxx.fastq.gz | Bin 48850 -> 0 bytes .../tumor/tiny_t_L006_R1_xxx.fastq.gz | Bin 46027 -> 0 bytes .../tumor/tiny_t_L006_R2_xxx.fastq.gz | Bin 45277 -> 0 bytes .../tumor/tiny_t_L007_R1_xxx.fastq.gz | Bin 20812 -> 0 bytes .../tumor/tiny_t_L007_R2_xxx.fastq.gz | Bin 21180 -> 0 bytes workflows/raredisease.nf | 6 +-- 22 files changed, 51 insertions(+), 63 deletions(-) delete mode 100644 testdata_sarek/rd_tiny.csv create mode 100644 testdata_sarek/rd_tiny_mod.csv delete mode 100644 testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L003_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L006_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/tumor/tiny_t_L007_R2_xxx.fastq.gz diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 5f653ab7..d2a41795 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,3 +1 @@ -sample,fastq_1,fastq_2 -SAMPLE_PAIRED_END,/path/to/fastq/files/AEG588A1_S1_L002_R1_001.fastq.gz,/path/to/fastq/files/AEG588A1_S1_L002_R2_001.fastq.gz -SAMPLE_SINGLE_END,/path/to/fastq/files/AEG588A4_S4_L003_R1_001.fastq.gz, +sample,sex,phenotype,paternal_id,maternal_id,case_id,lane,fastq_1,fastq_2 diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index d8831053..507ea853 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -1,8 +1,5 @@ #!/usr/bin/env python -# TODO nf-core: Update the script to check the samplesheet -# This script is based on the example at: https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv - import os import sys import errno @@ -38,17 +35,13 @@ def print_error(error, context="Line", context_str=""): sys.exit(1) -# TODO nf-core: Update the check_samplesheet function def check_samplesheet(file_in, file_out): """ This function checks that the samplesheet follows the following structure: - sample,fastq_1,fastq_2 - SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz - SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz - SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, + sample,sex,phenotype,paternal_id,maternal_id,case_id,lane,fastq_1,fastq_2 - For an example see: + For an example see: MEI CHANGE THIS TO AN UPDATED LINK https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv """ @@ -57,8 +50,7 @@ def check_samplesheet(file_in, file_out): ## Check header MIN_COLS = 2 - # TODO nf-core: Update the column names for the input samplesheet - HEADER = ["sample", "fastq_1", "fastq_2"] + HEADER = ["sample", "lane", "fastq_1", "fastq_2", "sex", "phenotype", "paternal_id", "maternal_id", "case_id"] header = [x.strip('"') for x in fin.readline().strip().split(",")] if header[: len(HEADER)] != HEADER: print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) @@ -84,7 +76,7 @@ def check_samplesheet(file_in, file_out): ) ## Check sample name entries - sample, fastq_1, fastq_2 = lspl[: len(HEADER)] + sample, lane, fastq_1, fastq_2, sex, phenotype, paternal_id, maternal_id, case_id = lspl[: len(HEADER)] sample = sample.replace(" ", "_") if not sample: print_error("Sample entry has not been specified!", "Line", line) @@ -102,15 +94,15 @@ def check_samplesheet(file_in, file_out): ) ## Auto-detect paired-end/single-end - sample_info = [] ## [single_end, fastq_1, fastq_2] + sample_info = [] ## [single_end, lane, fastq_1, fastq_2, sex, phenotype, paternal_id, maternal_id, case_id] if sample and fastq_1 and fastq_2: ## Paired-end short reads - sample_info = ["0", fastq_1, fastq_2] + sample_info = ["0", lane, fastq_1, fastq_2, sex, phenotype, paternal_id, maternal_id, case_id] elif sample and fastq_1 and not fastq_2: ## Single-end short reads - sample_info = ["1", fastq_1, fastq_2] + sample_info = ["1", lane, fastq_1, fastq_2, sex, phenotype, paternal_id, maternal_id, case_id] else: print_error("Invalid combination of columns provided!", "Line", line) - ## Create sample mapping dictionary = { sample: [ single_end, fastq_1, fastq_2 ] } + ## Create sample mapping dictionary = { sample: [ single_end, sex, phenotype, paternal_id, maternal_id, case_id, lane, fastq_1, fastq_2 ] } if sample not in sample_mapping_dict: sample_mapping_dict[sample] = [sample_info] else: @@ -124,15 +116,11 @@ def check_samplesheet(file_in, file_out): out_dir = os.path.dirname(file_out) make_dir(out_dir) with open(file_out, "w") as fout: - fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2"]) + "\n") - for sample in sorted(sample_mapping_dict.keys()): - - ## Check that multiple runs of the same sample are of the same datatype - if not all(x[0] == sample_mapping_dict[sample][0][0] for x in sample_mapping_dict[sample]): - print_error("Multiple runs of a sample must be of the same datatype!", "Sample: {}".format(sample)) - - for idx, val in enumerate(sample_mapping_dict[sample]): - fout.write(",".join(["{}_T{}".format(sample, idx + 1)] + val) + "\n") + fout.write(",".join(["sample", "single_end", "lane", "fastq_1", "fastq_2", "sex", "phenotype", "paternal_id", "maternal_id", "case_id"]) + "\n") + for sample, sample_info in sorted(sample_mapping_dict.items()): + for val in sample_info: + lane = val[1] + fout.write(",".join(["{}_{}".format(sample, lane)] + val) + "\n") else: print_error("No entries to process!", "Samplesheet: {}".format(file_in)) diff --git a/conf/test.config b/conf/test.config index 9e89aa2e..84d3a223 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,7 +22,7 @@ params { // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'testdata_sarek/rd_tiny.csv' + input = 'testdata_sarek/rd_tiny_mod.csv' // Genome references fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' diff --git a/nextflow.config b/nextflow.config index 329e093e..a9f18428 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,6 +15,7 @@ params { // References genome = null + save_reference = false igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index b664bc8c..650258bd 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -13,11 +13,14 @@ workflow INPUT_CHECK { main: SAMPLESHEET_CHECK ( samplesheet ) .splitCsv ( header:true, sep:',' ) - .map { create_fastq_channels(it) } - .set { reads } + .set { sheet } + + reads = sheet.map { create_fastq_channels(it) } + sample = sheet.map { create_sample_channels(it) } emit: reads // channel: [ val(meta), [ reads ] ] + sample // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] @@ -26,6 +29,8 @@ def create_fastq_channels(LinkedHashMap row) { meta.id = row.sample meta.single_end = row.single_end.toBoolean() + // TODO: add read group to the meta map + def array = [] if (!file(row.fastq_1).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" @@ -40,3 +45,16 @@ def create_fastq_channels(LinkedHashMap row) { } return array } + +// Function to get a list of metadata (e.g. pedigree, case id) from the sample; [ meta ] +def create_sample_channels(LinkedHashMap row) { + def sample = [:] + sample.id = row.sample + sample.sex = row.sex + sample.phenotype = row.phenotype + sample.maternal = row.maternal_id + sample.paternal = row.paternal_id + sample.case_id = row.case_id + + return sample +} diff --git a/subworkflows/local/merge2break.nf b/subworkflows/local/merge2break.nf index cce34384..cd7af88e 100644 --- a/subworkflows/local/merge2break.nf +++ b/subworkflows/local/merge2break.nf @@ -1,19 +1,17 @@ // -// Merge bams and then break into contigs. +// Merge bams and then break into contigs (e.g. chromosomes). // -params.samtools_idx_options = [:] params.samtools_merge_options = [:] params.samtools_view_options = [:] -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_options ) include { SAMTOOLS_MERGE } from '../../modules/local/samtools/merge/main' addParams( options: params.samtools_merge_options ) include { SAMTOOLS_VIEW } from '../../modules/nf-core/modules/samtools/view/main' addParams( options: params.samtools_view_options ) workflow MERGE2BREAK { // chr = Channel.of(1..22, 'X', 'Y', 'M').map{ "chr" + it } chr = "chr20" - // TODO: need to write a validation check for chromosomes present in bam files? potentially not needed as fastq likely to map to psuedo-regions in other chrom. + // TODO: need to write a validation check for chromosomes present in bam files and then chop bam file for each chr present. take: fasta // channel: [mandatory] fasta @@ -21,8 +19,8 @@ workflow MERGE2BREAK { bai // channel: [mandatory for regional merge] [ val(meta), [ bai ] ] main: - new_bam = bam.join(bai) - new_bam.map{ meta, bam, bai -> + bam_bai = bam.join(bai) + bam_bai.map{ meta, bam, bai -> new_meta = meta.clone() new_meta.id = new_meta.id.split('_')[0] [new_meta, bam, bai] @@ -31,8 +29,9 @@ workflow MERGE2BREAK { multiple: it[1].size() > 1 }.set{ bam_bwa } + SAMTOOLS_MERGE ( bam_bwa.multiple, chr ) - // TODO: Singles? WELLL, we shall re-name instead + // TODO: Singles? WELLL, we shall re-name instead of merge but still chop into contigs for each chr present. // SAMTOOLS_VIEW ( bam_bwa.single ) emit: diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 7a6d7fd6..c0feeb29 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -26,16 +26,6 @@ workflow MAPPING { // Index BWAMEM2_INDEX ( fasta ) - // Add @RG, there should be a conditional for this in case read group is not needed - reads_input.map{ meta, reads -> - new_meta = meta.clone() - reads[0].baseName.split('_').init() - - // Should there be a process to catch the RG from fastq headers? - // "\"@RG\\tID:${row.lane}\\t${CN}PU:${row.lane}\\tSM:${row.sample}\\tLB:${row.sample}\\tPL:ILLUMINA\"" - // meta.read_group = read_group - }.view() - // Map, sort, and index BWAMEM2_MEM ( reads_input, BWAMEM2_INDEX.out.index ) SAMTOOLS_SORT ( BWAMEM2_MEM.out.bam ) diff --git a/testdata_sarek/rd_tiny.csv b/testdata_sarek/rd_tiny.csv deleted file mode 100644 index 74505e48..00000000 --- a/testdata_sarek/rd_tiny.csv +++ /dev/null @@ -1,12 +0,0 @@ -sample,fastq_1,fastq_2 -1234N,testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz -1234N,testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz -1234N,testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz -1234N,testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz -1234N,testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz -9876T,testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz -9876T,testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz -9876T,testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L003_R2_xxx.fastq.gz -9877R,testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz -9877R,testdata_sarek/tumor/tiny_t_L006_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz -9877R,testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L007_R2_xxx.fastq.gz diff --git a/testdata_sarek/rd_tiny_mod.csv b/testdata_sarek/rd_tiny_mod.csv new file mode 100644 index 00000000..7458234b --- /dev/null +++ b/testdata_sarek/rd_tiny_mod.csv @@ -0,0 +1,6 @@ +sample,lane,fastq_1,fastq_2,sex,phenotype,paternal_id,maternal_id,case_id +1234N,1,testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey +1234N,4,testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey +1234N,2,testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey +1234N,7,testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey +1234N,8,testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey diff --git a/testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz deleted file mode 100644 index 305cb53553530f9d778f1d756c97bba958cfabef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27427 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 diff --git a/testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz deleted file mode 100644 index 770ea2dfb7ae2d43b009fc07bd084702e73740cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26833 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 diff --git a/testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz deleted file mode 100644 index e591b6080e30363d25f46c7bf80836517a8f1e2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47308 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 IyRa7m0AfZH{r~^~ diff --git a/testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz deleted file mode 100644 index 7c5f826f11f1d31210afb1a05782159e2a0645b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45779 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

HNBd_OocP) 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 nGRFDoWuVuonUVbYCdl diff --git a/testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz deleted file mode 100644 index 52059387c9744f64df6fbca94676a8992f36324a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45864 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 Y)Su^{dS1*Ia{Pb&12&p~eC*c&01B2jkpKVy diff --git a/testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz deleted file mode 100644 index def85db089263b07ed944fbc7e3fc72e37e8de6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48397 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 F0ss_ZOVj`W diff --git a/testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz deleted file mode 100644 index e6de821cddd3860c87430eb55e77077a20df237b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48850 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%0Dh0ZmoSxTC+A;=G?T!QQ) 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�^COm&PNpzi-P^iM2av>7Iw3r0U?|t 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 bd*H-2H9qz|r7(!wSoHq^GV&ThYzP7X($B)| diff --git a/testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz deleted file mode 100644 index 46ef89b257c35826587e82558031129358d85a92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45277 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 F0swJyYIpzu diff --git a/testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz deleted file mode 100644 index 62e710307e8bfe85e8391661c703aaa212b4ec1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20812 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'xPT=MMw*OpdpZxYYppyyStfPLQb+>58 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 diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index d6c3cf60..e8ed8b03 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -96,18 +96,18 @@ workflow RAREDISEASE { ch_input ) - // - // MODULE: Run FastQC - // + // STEP 0: QUALITY CHECK. FASTQC ( INPUT_CHECK.out.reads ) ch_software_versions = ch_software_versions.mix(FASTQC.out.version.ifEmpty(null)) + // STEP 1: MAPPING READS AND CHOP BAM INTO CONTIGS. MAPPING ( INPUT_CHECK.out.reads, params.fasta ) ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) + // Merge and then chop into chromosomes. MERGE2BREAK ( params.fasta, MAPPING.out.bam, MAPPING.out.bai ) // From 40f51505af8f97050ae06efc2a9a2f84b549be28 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 12 Aug 2021 13:53:15 +0200 Subject: [PATCH 0019/1169] lint --- nextflow.config | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index a9f18428..329e093e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,7 +15,6 @@ params { // References genome = null - save_reference = false igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false From 07ba0892b9623e856e8a9471b90e08229a79a55b Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 13 Aug 2021 10:33:49 +0200 Subject: [PATCH 0020/1169] rm'd offline test data folder and using samplesheet temporarily --- assets/samplesheet.csv | 7 ++++++- conf/test.config | 3 +-- .../normal/tiny_n_L001_R1_xxx.fastq.gz | Bin 45010 -> 0 bytes .../normal/tiny_n_L001_R2_xxx.fastq.gz | Bin 47703 -> 0 bytes .../normal/tiny_n_L002_R1_xxx.fastq.gz | Bin 45431 -> 0 bytes .../normal/tiny_n_L002_R2_xxx.fastq.gz | Bin 47941 -> 0 bytes .../normal/tiny_n_L004_R1_xxx.fastq.gz | Bin 44140 -> 0 bytes .../normal/tiny_n_L004_R2_xxx.fastq.gz | Bin 44343 -> 0 bytes .../normal/tiny_n_L007_R1_xxx.fastq.gz | Bin 45690 -> 0 bytes .../normal/tiny_n_L007_R2_xxx.fastq.gz | Bin 43685 -> 0 bytes .../normal/tiny_n_L008_R1_xxx.fastq.gz | Bin 40944 -> 0 bytes .../normal/tiny_n_L008_R2_xxx.fastq.gz | Bin 42844 -> 0 bytes testdata_sarek/rd_tiny.csv.old | 14 -------------- testdata_sarek/rd_tiny_mod.csv | 6 ------ 14 files changed, 7 insertions(+), 23 deletions(-) delete mode 100644 testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz delete mode 100644 testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz delete mode 100644 testdata_sarek/rd_tiny.csv.old delete mode 100644 testdata_sarek/rd_tiny_mod.csv diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index d2a41795..e4a3d013 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1 +1,6 @@ -sample,sex,phenotype,paternal_id,maternal_id,case_id,lane,fastq_1,fastq_2 +sample,lane,fastq_1,fastq_2,sex,phenotype,paternal_id,maternal_id,case_id +1234N,1,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L001_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L001_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey +1234N,4,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L004_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L004_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey +1234N,2,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L002_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L002_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey +1234N,7,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L007_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L007_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey +1234N,8,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L008_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L008_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey diff --git a/conf/test.config b/conf/test.config index 84d3a223..1ad30e4b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,9 +20,8 @@ params { max_time = 6.h // Input data - // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'testdata_sarek/rd_tiny_mod.csv' + input = 'https://raw.githubusercontent.com/Clinical-Genomics/raredisease/feature/bwamem2/assets/samplesheet.csv' // Genome references fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' diff --git a/testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz deleted file mode 100644 index b25487aa91cafdd1a6873130cc3061014106c575..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45010 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 diff --git a/testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz deleted file mode 100644 index b917c80cef2c6ae89cbc1f7af4f5f237f20074ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47703 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 nEi0M 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 DLA~X2 diff --git a/testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz deleted file mode 100644 index ae0e1e6ee75fe733472245f9198cbd11520e66b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47941 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 RE~4Q7{XcKaFr@S+0st+%ySV@W diff --git a/testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz deleted file mode 100644 index 29e4a3bd15a88bf0207643ea2b73b0914202438d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44140 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μPM8qNpB!2lRE&mKfL6){9IhI$g) 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 M56kM$b*t?G0B~8;>;M1& diff --git a/testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz deleted file mode 100644 index f645870a8fa2f737c280e88e4f86fd34227fd9fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44343 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 C+#I6- diff --git a/testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz b/testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz deleted file mode 100644 index d03e2369c00ecb81cb6aae02192c3dae2f45f703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43685 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 Z5iV!1jP1C4QA36DGMp4&>#P{@v+c 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 o$Lu1h%`tl*DBQOSi6N%pAzVoxZZisnHkm&rr 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 Q-?^;%e=q5y%~uHm0L1YDc>n+a diff --git a/testdata_sarek/rd_tiny.csv.old b/testdata_sarek/rd_tiny.csv.old deleted file mode 100644 index c53c0a3b..00000000 --- a/testdata_sarek/rd_tiny.csv.old +++ /dev/null @@ -1,14 +0,0 @@ -sample,fastq_1,fastq_2 -1234N,//testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz -1234N,//testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz -1234N,//testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz -1234N,//testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz -1234N,//testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz -1234N,//testdata_sarek/dummy/normal/dummy_n_R1_xxx.fastq.gz,//testdata_sarek/dummy/normal/dummy_n_R2_xxx.fastq.gz -9876T,//testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz -9876T,//testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz -9876T,//testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L003_R2_xxx.fastq.gz -9876T,//testdata_sarek/dummy/tumor/dummy_t_R1_xxx.fastq.gz,//testdata_sarek/dummy/tumor/dummy_t_R2_xxx.fastq.gz -9877R,//testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz -9877R,//testdata_sarek/tumor/tiny_t_L006_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz -9877R,//testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L007_R2_xxx.fastq.gz diff --git a/testdata_sarek/rd_tiny_mod.csv b/testdata_sarek/rd_tiny_mod.csv deleted file mode 100644 index 7458234b..00000000 --- a/testdata_sarek/rd_tiny_mod.csv +++ /dev/null @@ -1,6 +0,0 @@ -sample,lane,fastq_1,fastq_2,sex,phenotype,paternal_id,maternal_id,case_id -1234N,1,testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey -1234N,4,testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey -1234N,2,testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey -1234N,7,testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey -1234N,8,testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey From 1fa07e7342507eabcde798085926e30ac604f509 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 13 Aug 2021 10:37:20 +0200 Subject: [PATCH 0021/1169] sprinkled some linting magic --- .github/CONTRIBUTING.md | 6 +++--- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/linting.yml | 4 ++-- bin/scrape_software_versions.py | 2 +- lib/NfcoreTemplate.groovy | 22 +++++++++++++--------- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 032ea20b..b2f28393 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ If you'd like to write some code for nf-core/raredisease, the standard workflow * If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/raredisease repository](https://github.com/nf-core/raredisease) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core schema build .` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). +4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. 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/). @@ -69,7 +69,7 @@ If you wish to contribute a new step, please use the following coding standards: 2. Write the process block (see below). 3. Define the output channel if needed (see below). 4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build .`). +5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). 6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). 7. Add sanity checks for all relevant parameters. 8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. @@ -83,7 +83,7 @@ If you wish to contribute a new step, please use the following coding standards: Parameters should be initialised / defined with default values in `nextflow.config` under the `params` scope. -Once there, use `nf-core schema build .` to add to `nextflow_schema.json`. +Once there, use `nf-core schema build` to add to `nextflow_schema.json`. ### Default processes resource requirements diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b11e3616..94c01b6c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. -- [ ] Make sure your code lints (`nf-core lint .`). +- [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 13b4fc81..3b448773 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -53,7 +53,7 @@ jobs: - uses: actions/setup-node@v1 with: - node-version: "10" + node-version: '10' - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -127,7 +127,7 @@ jobs: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core -l lint_log.txt lint ${GITHUB_WORKSPACE} --markdown lint_results.md + run: nf-core -l lint_log.txt lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Save PR number if: ${{ always() }} diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index e3403e86..4cbbae3a 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -30,7 +30,7 @@ print("

{}
{}
".format(k, v)) print(" ") -# Write out regexes as csv file: +# Write out as tsv file: with open("software_versions.tsv", "w") as f: for k, v in sorted(results.items()): f.write("{}\t{}\n".format(k, v)) diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index b6e689ec..44551e0a 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -24,17 +24,21 @@ class NfcoreTemplate { public static void hostName(workflow, params, log) { Map colors = logColours(params.monochrome_logs) if (params.hostnames) { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" + try { + def hostname = "hostname".execute().text.trim() + params.hostnames.each { prof, hnames -> + hnames.each { hname -> + if (hostname.contains(hname) && !workflow.profile.contains(prof)) { + log.info "=${colors.yellow}====================================================${colors.reset}=\n" + + "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + + " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + + " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + + "=${colors.yellow}====================================================${colors.reset}=" + } } } + } catch (Exception e) { + log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." } } } From 92082d802615876ab6c5a092c14b9e25f34f2f48 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 16 Aug 2021 17:08:15 +0200 Subject: [PATCH 0022/1169] updated sex to gender, required # of cols., and refrnce link to samplesheet --- assets/samplesheet.csv | 2 +- bin/check_samplesheet.py | 22 +++++++++++----------- subworkflows/local/input_check.nf | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index e4a3d013..d8fcccca 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,4 +1,4 @@ -sample,lane,fastq_1,fastq_2,sex,phenotype,paternal_id,maternal_id,case_id +sample,lane,fastq_1,fastq_2,gender,phenotype,paternal_id,maternal_id,case_id 1234N,1,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L001_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L001_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey 1234N,4,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L004_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L004_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey 1234N,2,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L002_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L002_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 507ea853..8c00424a 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -39,18 +39,18 @@ def check_samplesheet(file_in, file_out): """ This function checks that the samplesheet follows the following structure: - sample,sex,phenotype,paternal_id,maternal_id,case_id,lane,fastq_1,fastq_2 + sample, lane, fastq_1, fastq_2, gender, phenotype, paternal_id, maternal_id, case_id - For an example see: MEI CHANGE THIS TO AN UPDATED LINK - https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv + For an example see: + https://raw.githubusercontent.com/Clinical-Genomics/raredisease/feature/bwamem2/assets/samplesheet.csv """ sample_mapping_dict = {} with open(file_in, "r") as fin: ## Check header - MIN_COLS = 2 - HEADER = ["sample", "lane", "fastq_1", "fastq_2", "sex", "phenotype", "paternal_id", "maternal_id", "case_id"] + MIN_COLS = 9 + HEADER = ["sample", "lane", "fastq_1", "fastq_2", "gender", "phenotype", "paternal_id", "maternal_id", "case_id"] header = [x.strip('"') for x in fin.readline().strip().split(",")] if header[: len(HEADER)] != HEADER: print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) @@ -76,7 +76,7 @@ def check_samplesheet(file_in, file_out): ) ## Check sample name entries - sample, lane, fastq_1, fastq_2, sex, phenotype, paternal_id, maternal_id, case_id = lspl[: len(HEADER)] + sample, lane, fastq_1, fastq_2, gender, phenotype, paternal_id, maternal_id, case_id = lspl[: len(HEADER)] sample = sample.replace(" ", "_") if not sample: print_error("Sample entry has not been specified!", "Line", line) @@ -94,15 +94,15 @@ def check_samplesheet(file_in, file_out): ) ## Auto-detect paired-end/single-end - sample_info = [] ## [single_end, lane, fastq_1, fastq_2, sex, phenotype, paternal_id, maternal_id, case_id] + sample_info = [] ## [single_end, lane, fastq_1, fastq_2, gender, phenotype, paternal_id, maternal_id, case_id] if sample and fastq_1 and fastq_2: ## Paired-end short reads - sample_info = ["0", lane, fastq_1, fastq_2, sex, phenotype, paternal_id, maternal_id, case_id] + sample_info = ["0", lane, fastq_1, fastq_2, gender, phenotype, paternal_id, maternal_id, case_id] elif sample and fastq_1 and not fastq_2: ## Single-end short reads - sample_info = ["1", lane, fastq_1, fastq_2, sex, phenotype, paternal_id, maternal_id, case_id] + sample_info = ["1", lane, fastq_1, fastq_2, gender, phenotype, paternal_id, maternal_id, case_id] else: print_error("Invalid combination of columns provided!", "Line", line) - ## Create sample mapping dictionary = { sample: [ single_end, sex, phenotype, paternal_id, maternal_id, case_id, lane, fastq_1, fastq_2 ] } + ## Create sample mapping dictionary = { sample: [ single_end, gender, phenotype, paternal_id, maternal_id, case_id, lane, fastq_1, fastq_2 ] } if sample not in sample_mapping_dict: sample_mapping_dict[sample] = [sample_info] else: @@ -116,7 +116,7 @@ def check_samplesheet(file_in, file_out): out_dir = os.path.dirname(file_out) make_dir(out_dir) with open(file_out, "w") as fout: - fout.write(",".join(["sample", "single_end", "lane", "fastq_1", "fastq_2", "sex", "phenotype", "paternal_id", "maternal_id", "case_id"]) + "\n") + fout.write(",".join(["sample", "single_end", "lane", "fastq_1", "fastq_2", "gender", "phenotype", "paternal_id", "maternal_id", "case_id"]) + "\n") for sample, sample_info in sorted(sample_mapping_dict.items()): for val in sample_info: lane = val[1] diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 650258bd..027eec3c 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -50,7 +50,7 @@ def create_fastq_channels(LinkedHashMap row) { def create_sample_channels(LinkedHashMap row) { def sample = [:] sample.id = row.sample - sample.sex = row.sex + sample.gender = row.gender sample.phenotype = row.phenotype sample.maternal = row.maternal_id sample.paternal = row.paternal_id From 71cc5425bd89572042090924a5ea5677db52222f Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 18 Aug 2021 17:40:39 +0200 Subject: [PATCH 0023/1169] deleted merge2break subworkf, merge bams in mapping subworkf --- conf/modules.config | 9 +---- modules.json | 11 +++-- .../modules}/samtools/merge/functions.nf | 0 .../modules}/samtools/merge/main.nf | 18 ++++----- .../modules}/samtools/merge/meta.yml | 0 subworkflows/local/merge2break.nf | 40 ------------------- subworkflows/nf-core/mapping.nf | 28 +++++++++---- workflows/raredisease.nf | 13 ++---- 8 files changed, 39 insertions(+), 80 deletions(-) rename modules/{local => nf-core/modules}/samtools/merge/functions.nf (100%) rename modules/{local => nf-core/modules}/samtools/merge/main.nf (62%) rename modules/{local => nf-core/modules}/samtools/merge/meta.yml (100%) delete mode 100644 subworkflows/local/merge2break.nf diff --git a/conf/modules.config b/conf/modules.config index 503a105c..62b1e699 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -33,26 +33,19 @@ params { args = '-M -K 100000000' publish_files = false } - 'map_dir' { - publish_dir = '' - } 'samtools_merge' { - args = "--write-index -f" publish_dir = 'samtools_merge' } 'samtools_index' { args = '' } 'samtools_sort' { - suffix = '_sorted' + suffix = '.sorted' } 'samtools_stats' { args = '-s --remove-overlaps' publish_files = false } - 'samtools_view'{ - args = '--output-fmt BAM' - } 'multiqc' { args = '' } diff --git a/modules.json b/modules.json index 9f5f26be..bcd21e96 100644 --- a/modules.json +++ b/modules.json @@ -3,21 +3,24 @@ "homePage": "https://github.com/nf-core/raredisease", "repos": { "nf-core/modules": { - "fastqc": { + "bwamem2/index": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, - "multiqc": { + "bwamem2/mem": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, - "bwamem2/index": { + "fastqc": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, - "bwamem2/mem": { + "multiqc": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, "samtools/index": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, + "samtools/merge": { + "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + }, "samtools/sort": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, diff --git a/modules/local/samtools/merge/functions.nf b/modules/nf-core/modules/samtools/merge/functions.nf similarity index 100% rename from modules/local/samtools/merge/functions.nf rename to modules/nf-core/modules/samtools/merge/functions.nf diff --git a/modules/local/samtools/merge/main.nf b/modules/nf-core/modules/samtools/merge/main.nf similarity index 62% rename from modules/local/samtools/merge/main.nf rename to modules/nf-core/modules/samtools/merge/main.nf index ba0f703f..0182b9fd 100644 --- a/modules/local/samtools/merge/main.nf +++ b/modules/nf-core/modules/samtools/merge/main.nf @@ -11,27 +11,25 @@ process SAMTOOLS_MERGE { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? "bioconda::samtools=1.12" : null) + conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" + container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" } else { - container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" + container "quay.io/biocontainers/samtools:1.13--h8c37831_0" } input: - tuple val(meta), path(bams), path(bai) - val chr + tuple val(meta), path(bams) output: - tuple val(meta), path("*.bam"), emit: merged_bam - tuple val(meta), path("*.csi"), optional:true, emit: csi - path "*.version.txt" , emit: version + tuple val(meta), path("${prefix}.bam"), emit: bam + path "*.version.txt" , emit: version script: def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ - samtools merge $options.args -R ${chr} ${prefix}.sorted.${chr}.bam $bams + samtools merge ${prefix}.bam $bams echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt """ } diff --git a/modules/local/samtools/merge/meta.yml b/modules/nf-core/modules/samtools/merge/meta.yml similarity index 100% rename from modules/local/samtools/merge/meta.yml rename to modules/nf-core/modules/samtools/merge/meta.yml diff --git a/subworkflows/local/merge2break.nf b/subworkflows/local/merge2break.nf deleted file mode 100644 index cd7af88e..00000000 --- a/subworkflows/local/merge2break.nf +++ /dev/null @@ -1,40 +0,0 @@ -// -// Merge bams and then break into contigs (e.g. chromosomes). -// - -params.samtools_merge_options = [:] -params.samtools_view_options = [:] - -include { SAMTOOLS_MERGE } from '../../modules/local/samtools/merge/main' addParams( options: params.samtools_merge_options ) -include { SAMTOOLS_VIEW } from '../../modules/nf-core/modules/samtools/view/main' addParams( options: params.samtools_view_options ) - -workflow MERGE2BREAK { - // chr = Channel.of(1..22, 'X', 'Y', 'M').map{ "chr" + it } - chr = "chr20" - // TODO: need to write a validation check for chromosomes present in bam files and then chop bam file for each chr present. - - take: - fasta // channel: [mandatory] fasta - bam // channel: [mandatory] [ val(meta), [ bam ] ] - bai // channel: [mandatory for regional merge] [ val(meta), [ bai ] ] - - main: - bam_bai = bam.join(bai) - bam_bai.map{ meta, bam, bai -> - new_meta = meta.clone() - new_meta.id = new_meta.id.split('_')[0] - [new_meta, bam, bai] - }.groupTuple().branch{ - single: it[1].size() == 1 - multiple: it[1].size() > 1 - }.set{ bam_bwa } - - - SAMTOOLS_MERGE ( bam_bwa.multiple, chr ) - // TODO: Singles? WELLL, we shall re-name instead of merge but still chop into contigs for each chr present. - // SAMTOOLS_VIEW ( bam_bwa.single ) - - emit: - bam = SAMTOOLS_MERGE.out.merged_bam - csi = SAMTOOLS_MERGE.out.csi -} diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index c0feeb29..826cece0 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -1,20 +1,20 @@ // -// Map to reference, sort + index + stats each alignment file. +// Map to reference, sort + index + stats each alignment file, and then merge. // params.bwamem2_idx_options = [:] params.bwamem2_mem_options = [:] -params.calculate_mapped_options = [:] params.samtools_idx_options = [:] params.samtools_sort_options = [:] params.samtools_stats_options = [:] +params.samtools_merge_options = [:] include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_options ) include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) -include { CALCULATE_MAPPED } from '../../modules/local/calculate_mapped' addParams(options: params.calculate_mapped_options ) +include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams( options: params.samtools_merge_options ) workflow MAPPING { @@ -31,13 +31,24 @@ workflow MAPPING { SAMTOOLS_SORT ( BWAMEM2_MEM.out.bam ) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) - // Join the mapped bam + bai paths by their keys + // Join the mapped bam + bai paths by their keys for stats + // Get stats for each demultiplexed read pair. bam_sorted_indexed = Channel.empty() bam_sorted_indexed = SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai) - - // Get stats SAMTOOLS_STATS ( bam_sorted_indexed ) - CALCULATE_MAPPED ( SAMTOOLS_STATS.out.stats ) + + // Merge multiple lane samples + SAMTOOLS_SORT.out.bam.map{ meta, bam -> + new_meta = meta.clone() + new_meta.id = new_meta.id.split('_')[0] + [new_meta, bam] + }.groupTuple().branch{ + single: it[1].size() == 1 + multiple: it[1].size() > 1 + }.set{ bams_to_merge } + + SAMTOOLS_MERGE ( bams_to_merge.multiple ) + bam_merged = bams_to_merge.single.mix(SAMTOOLS_MERGE.out.bam) // Collect versions bwamem2_version = BWAMEM2_MEM.out.version @@ -46,7 +57,8 @@ workflow MAPPING { emit: bam = SAMTOOLS_SORT.out.bam bai = SAMTOOLS_INDEX.out.bai - stats = CALCULATE_MAPPED.out.stats + stats = SAMTOOLS_STATS.out.stats + bam_merged bwamem2_version samtools_version diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e8ed8b03..3264fca5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -45,11 +45,6 @@ include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' // include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) -include { MERGE2BREAK } from '../subworkflows/local/merge2break' addParams( - samtools_merge_options: modules['samtools_merge'], - samtools_view_options: modules['samtools_view'], -) - /* ======================================================================================== IMPORT NF-CORE MODULES/SUBWORKFLOWS @@ -73,7 +68,8 @@ include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( bwamem2_mem_options: modules['bwa_mem2_mem'], samtools_idx_options: modules['samtools_index'], samtools_sort_options: modules['samtools_sort'], - samtools_stats_options: modules['samtools_stats'] + samtools_stats_options: modules['samtools_stats'], + samtools_merge_options: modules['samtools_merge'], ) /* @@ -102,14 +98,11 @@ workflow RAREDISEASE { ) ch_software_versions = ch_software_versions.mix(FASTQC.out.version.ifEmpty(null)) - // STEP 1: MAPPING READS AND CHOP BAM INTO CONTIGS. + // STEP 1: MAPPING READS, FETCH STATS, AND MERGE. MAPPING ( INPUT_CHECK.out.reads, params.fasta ) ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) - // Merge and then chop into chromosomes. - MERGE2BREAK ( params.fasta, MAPPING.out.bam, MAPPING.out.bai ) - // // MODULE: Pipeline reporting // From 7aeea98a0ad79d83809cc768c6466ea7d8e23660 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 18 Aug 2021 17:45:51 +0200 Subject: [PATCH 0024/1169] publish stats, add sorted suffix to merge --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 62b1e699..815e3289 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -34,6 +34,7 @@ params { publish_files = false } 'samtools_merge' { + suffix = '.sorted' publish_dir = 'samtools_merge' } 'samtools_index' { @@ -44,7 +45,6 @@ params { } 'samtools_stats' { args = '-s --remove-overlaps' - publish_files = false } 'multiqc' { args = '' From 885d9fb28651248032438befbd2cc412c8986951 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 19 Aug 2021 10:02:20 +0200 Subject: [PATCH 0025/1169] removed local module calculatemapped --- modules/local/calculate_mapped.nf | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 modules/local/calculate_mapped.nf diff --git a/modules/local/calculate_mapped.nf b/modules/local/calculate_mapped.nf deleted file mode 100644 index 29a4cea1..00000000 --- a/modules/local/calculate_mapped.nf +++ /dev/null @@ -1,31 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles } from './functions' - -params.options = [:] -options = initOptions(params.options) - -process CALCULATE_MAPPED { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:"samtools", meta:[:], publish_by_meta:['id']) } - - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } - - input: - tuple val(meta), path(stats) - - output: - path "*.stats" , emit: stats - - script: - def prefix = stats.getSimpleName() - """ - cat $stats | grep -E "raw total sequences:|reads mapped:" | cut -f3 | tr '\\n' '\\t' | awk '{print (\$2/\$1) * 100}' | while read line; do awk -v p=\$line 'NR==15 {print "percentage mapped reads:\\t" p }1' $stats; done > ${prefix}.stats - """ -} From 20fa7a8adffb611d80c267f8064195133fb69071 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 19 Aug 2021 10:22:33 +0200 Subject: [PATCH 0026/1169] removing unused nf-core module: samtools/view --- modules.json | 3 - .../modules/samtools/view/functions.nf | 68 ------------------- modules/nf-core/modules/samtools/view/main.nf | 35 ---------- .../nf-core/modules/samtools/view/meta.yml | 43 ------------ 4 files changed, 149 deletions(-) delete mode 100644 modules/nf-core/modules/samtools/view/functions.nf delete mode 100644 modules/nf-core/modules/samtools/view/main.nf delete mode 100644 modules/nf-core/modules/samtools/view/meta.yml diff --git a/modules.json b/modules.json index bcd21e96..6b2b36f7 100644 --- a/modules.json +++ b/modules.json @@ -26,9 +26,6 @@ }, "samtools/stats": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" - }, - "samtools/view": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" } } } diff --git a/modules/nf-core/modules/samtools/view/functions.nf b/modules/nf-core/modules/samtools/view/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/nf-core/modules/samtools/view/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/samtools/view/main.nf b/modules/nf-core/modules/samtools/view/main.nf deleted file mode 100644 index ec6c747f..00000000 --- a/modules/nf-core/modules/samtools/view/main.nf +++ /dev/null @@ -1,35 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -process SAMTOOLS_VIEW { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - - conda (params.enable_conda ? "bioconda::samtools=1.12" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" - } else { - container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" - } - - input: - tuple val(meta), path(bam) - - output: - tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt" , emit: version - - script: - def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" - """ - samtools view $options.args $bam > ${prefix}.bam - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/modules/samtools/view/meta.yml b/modules/nf-core/modules/samtools/view/meta.yml deleted file mode 100644 index c35a8b03..00000000 --- a/modules/nf-core/modules/samtools/view/meta.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: samtools_view -description: filter/convert SAM/BAM/CRAM file -keywords: - - view - - bam - - sam - - cram -tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: filtered/converted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - version: - type: file - description: File containing software version - pattern: "*.{version.txt}" -authors: - - "@drpatelh" - - "@joseespinosa" From fe43686b7b7f7d784d78e3f58285de18f1ef3b7d Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 19 Aug 2021 10:46:20 +0200 Subject: [PATCH 0027/1169] indexed final bams --- subworkflows/nf-core/mapping.nf | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 826cece0..9bdbf941 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -15,6 +15,7 @@ include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/ma include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams( options: params.samtools_merge_options ) +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_2 } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_options ) workflow MAPPING { @@ -36,8 +37,9 @@ workflow MAPPING { bam_sorted_indexed = Channel.empty() bam_sorted_indexed = SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai) SAMTOOLS_STATS ( bam_sorted_indexed ) + stats = SAMTOOLS_STATS.out.stats - // Merge multiple lane samples + // Merge multiple lane samples and index SAMTOOLS_SORT.out.bam.map{ meta, bam -> new_meta = meta.clone() new_meta.id = new_meta.id.split('_')[0] @@ -48,17 +50,20 @@ workflow MAPPING { }.set{ bams_to_merge } SAMTOOLS_MERGE ( bams_to_merge.multiple ) - bam_merged = bams_to_merge.single.mix(SAMTOOLS_MERGE.out.bam) + bam = bams_to_merge.single.mix(SAMTOOLS_MERGE.out.bam) + + SAMTOOLS_INDEX_2 ( bam_merged ) + bai = SAMTOOLS_INDEX_2.out.bai + // Collect versions bwamem2_version = BWAMEM2_MEM.out.version samtools_version = SAMTOOLS_SORT.out.version emit: - bam = SAMTOOLS_SORT.out.bam - bai = SAMTOOLS_INDEX.out.bai - stats = SAMTOOLS_STATS.out.stats - bam_merged + stats + bam + bai bwamem2_version samtools_version From 1a4cb632eeb04e4c7dd3f21e74c05e8cfa8b5069 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 19 Aug 2021 10:53:17 +0200 Subject: [PATCH 0028/1169] woops! quick fix --- subworkflows/nf-core/mapping.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 9bdbf941..3fe386c0 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -52,7 +52,7 @@ workflow MAPPING { SAMTOOLS_MERGE ( bams_to_merge.multiple ) bam = bams_to_merge.single.mix(SAMTOOLS_MERGE.out.bam) - SAMTOOLS_INDEX_2 ( bam_merged ) + SAMTOOLS_INDEX_2 ( bam ) bai = SAMTOOLS_INDEX_2.out.bai From 070aef2ac13ea16b7a4bd512f1c568da465098b9 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 20 Aug 2021 11:43:36 +0200 Subject: [PATCH 0029/1169] loaded md, pipeline emits sorted + mduped bams and metrics --- conf/modules.config | 10 ++- modules.json | 3 + .../picard/markduplicates/functions.nf | 68 +++++++++++++++++++ .../modules/picard/markduplicates/main.nf | 49 +++++++++++++ .../modules/picard/markduplicates/meta.yml | 46 +++++++++++++ subworkflows/nf-core/mapping.nf | 25 ++++--- workflows/raredisease.nf | 3 + 7 files changed, 194 insertions(+), 10 deletions(-) create mode 100644 modules/nf-core/modules/picard/markduplicates/functions.nf create mode 100644 modules/nf-core/modules/picard/markduplicates/main.nf create mode 100644 modules/nf-core/modules/picard/markduplicates/meta.yml diff --git a/conf/modules.config b/conf/modules.config index 815e3289..ad7cfb89 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -33,13 +33,19 @@ params { args = '-M -K 100000000' publish_files = false } - 'samtools_merge' { + 'picard_markduplicates' { suffix = '.sorted' - publish_dir = 'samtools_merge' + publish_dir = 'markduplicates' + } + 'samtools_merge' { + publish_files = false } 'samtools_index' { args = '' } + 'samtools_index_md' { + publish_dir = 'markduplicates' + } 'samtools_sort' { suffix = '.sorted' } diff --git a/modules.json b/modules.json index 6b2b36f7..c819eccc 100644 --- a/modules.json +++ b/modules.json @@ -15,6 +15,9 @@ "multiqc": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, + "picard/markduplicates": { + "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + }, "samtools/index": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, diff --git a/modules/nf-core/modules/picard/markduplicates/functions.nf b/modules/nf-core/modules/picard/markduplicates/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/nf-core/modules/picard/markduplicates/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf new file mode 100644 index 00000000..d20014bf --- /dev/null +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -0,0 +1,49 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process PICARD_MARKDUPLICATES { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0" + } else { + container "quay.io/biocontainers/picard:2.25.7--hdfd78af_0" + } + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.bam") , emit: bam + tuple val(meta), path("*.metrics.txt"), emit: metrics + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + MarkDuplicates \\ + $options.args \\ + INPUT=$bam \\ + OUTPUT=${prefix}.bam \\ + METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt + + echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d: > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/picard/markduplicates/meta.yml b/modules/nf-core/modules/picard/markduplicates/meta.yml new file mode 100644 index 00000000..6420ce9a --- /dev/null +++ b/modules/nf-core/modules/picard/markduplicates/meta.yml @@ -0,0 +1,46 @@ +name: picard_markduplicates +description: Locate and tag duplicate reads in a BAM file +keywords: + - markduplicates + - pcr + - duplicates + - bam + - sam + - cram +tools: + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file with duplicate reads marked/removed + pattern: "*.{bam}" + - metrics: + type: file + description: Duplicate metrics file generated by picard + pattern: "*.{metrics.txt}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@drpatelh" diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 3fe386c0..8de49573 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -1,5 +1,5 @@ // -// Map to reference, sort + index + stats each alignment file, and then merge. +// Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // params.bwamem2_idx_options = [:] @@ -8,6 +8,8 @@ params.samtools_idx_options = [:] params.samtools_sort_options = [:] params.samtools_stats_options = [:] params.samtools_merge_options = [:] +params.markduplicates_options = [:] +params.samtools_idx_md_options = [:] include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) @@ -15,7 +17,8 @@ include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/ma include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams( options: params.samtools_merge_options ) -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_2 } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_options ) +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_md_options ) +include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' addParams(options: params.markduplicates_options ) workflow MAPPING { @@ -34,7 +37,6 @@ workflow MAPPING { // Join the mapped bam + bai paths by their keys for stats // Get stats for each demultiplexed read pair. - bam_sorted_indexed = Channel.empty() bam_sorted_indexed = SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai) SAMTOOLS_STATS ( bam_sorted_indexed ) stats = SAMTOOLS_STATS.out.stats @@ -50,21 +52,28 @@ workflow MAPPING { }.set{ bams_to_merge } SAMTOOLS_MERGE ( bams_to_merge.multiple ) - bam = bams_to_merge.single.mix(SAMTOOLS_MERGE.out.bam) + merged_bam = bams_to_merge.single.mix(SAMTOOLS_MERGE.out.bam) - SAMTOOLS_INDEX_2 ( bam ) - bai = SAMTOOLS_INDEX_2.out.bai + // Marking duplicates + index + MARKDUPLICATES ( merged_bam ) + marked_bam = MARKDUPLICATES.out.bam + + SAMTOOLS_INDEX_MD ( marked_bam ) + marked_bai = SAMTOOLS_INDEX_MD.out.bai // Collect versions bwamem2_version = BWAMEM2_MEM.out.version + markduplicates_version = MARKDUPLICATES.out.version samtools_version = SAMTOOLS_SORT.out.version emit: stats - bam - bai + marked_bam + marked_bai + bwamem2_version + markduplicates_version samtools_version } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3264fca5..e1dba7a5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -70,6 +70,8 @@ include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( samtools_sort_options: modules['samtools_sort'], samtools_stats_options: modules['samtools_stats'], samtools_merge_options: modules['samtools_merge'], + markduplicates_options: modules['picard_markduplicates'], + samtools_idx_md_options: modules['samtools_index_md'], ) /* @@ -101,6 +103,7 @@ workflow RAREDISEASE { // STEP 1: MAPPING READS, FETCH STATS, AND MERGE. MAPPING ( INPUT_CHECK.out.reads, params.fasta ) ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(MAPPING.out.markduplicates_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) // From 05212a5833b0c0a725670e84d9438dc90458cdab Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 27 Aug 2021 13:17:09 +0200 Subject: [PATCH 0030/1169] first try with modulating index preparation --- README.md | 4 +++- conf/genomes.config | 21 +++++++++++++++++++ conf/modules.config | 3 +-- main.nf | 1 + nextflow.config | 6 ++++-- nextflow_schema.json | 14 +++++++++++++ subworkflows/local/prepare_genome.nf | 31 ++++++++++++++++++++++++++++ subworkflows/nf-core/mapping.nf | 12 +++++------ workflows/raredisease.nf | 16 ++++++++++++-- 9 files changed, 94 insertions(+), 14 deletions(-) create mode 100644 conf/genomes.config create mode 100644 subworkflows/local/prepare_genome.nf diff --git a/README.md b/README.md index 27db6607..7bf45ce9 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,9 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) +2. Map reads to reference ([`BWA mem`](http://bio-bwa.sourceforge.net/bwa.shtml), `BWA mem2`) with the option to ([`merge`](http://www.htslib.org/doc/samtools-merge.html)) +3. Mark duplicated reads ([`GATK4 MarkDuplicates`](https://gatk.broadinstitute.org/hc/en-us/articles/360037052812-MarkDuplicates-Picard-)) +4. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Quick Start diff --git a/conf/genomes.config b/conf/genomes.config new file mode 100644 index 00000000..c077f146 --- /dev/null +++ b/conf/genomes.config @@ -0,0 +1,21 @@ +/* +======================================================================================== + Nextflow config file for local reference genomes +======================================================================================== + Defines reference genomes without using iGenomes. + Can be used by any config that customises the base path using: + $params.local_genomes / --local_genomes +---------------------------------------------------------------------------------------- +*/ + +params { + genomes { + 'GRCh37' { + bwamem = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{amb,ann,bwt,pac,sa}" + } + 'GRCh38' { + bwamem = "${params.local_genomes}/grch38_homo_sapiens_-v0_m-.fasta.{amb,ann,bwt,pac,sa}" + bwamem2 = "${params.local_genomes}/grch38_homo_sapiens.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + } + } +} diff --git a/conf/modules.config b/conf/modules.config index ad7cfb89..0b21cc73 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -26,8 +26,7 @@ params { args = '--quiet' } 'bwa_mem2_index' { - publish_dir = 'reference' - publish_files = false + publish_dir = 'references' } 'bwa_mem2_mem' { args = '-M -K 100000000' diff --git a/main.nf b/main.nf index 9d7ece62..c1eefa92 100644 --- a/main.nf +++ b/main.nf @@ -18,6 +18,7 @@ nextflow.enable.dsl = 2 */ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') +params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') /* ======================================================================================== diff --git a/nextflow.config b/nextflow.config index 329e093e..e9fc931d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -17,6 +17,8 @@ params { genome = null igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false + local_genomes = null + save_reference = false // MultiQC options multiqc_config = null @@ -68,11 +70,11 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load igenomes.config if required +// Load igenomes.config if required else load custom genomes.config if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' } else { - params.genomes = [:] + includeConfig 'conf/genomes.config' } profiles { diff --git a/nextflow_schema.json b/nextflow_schema.json index d2cc50d7..059a082b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -79,6 +79,20 @@ "fa_icon": "fas fa-ban", "hidden": true, "help_text": "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`." + }, + "bwamem2_index": { + "type": "string", + "format": "directory-path", + "fa_icon": "fas fa-copy", + "description": "Path to directory or tar.gz archive for pre-built STAR index.", + "help_text": "> **NB** If none provided, will be generated automatically from the FASTA reference." + }, + "save_reference": { + "type": "boolean", + "default": false, + "description": "If generated by the pipeline save the BWA index in the results directory.", + "help_text": "If the BWA index is generated by the pipeline use this parameter to save it to your results folder. These can then be used for future pipeline runs, reducing processing times.", + "fa_icon": "fas fa-save" } } }, diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf new file mode 100644 index 00000000..3d597b7d --- /dev/null +++ b/subworkflows/local/prepare_genome.nf @@ -0,0 +1,31 @@ +// +// Prepare indices for reference genome files +// + +params.bwamem2_idx_options = [:] + +include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) + +workflow PREPARE_GENOME { + take: + prepare_tool_indicies // list: tools to prepare indices for + + main: + + ch_bwamem2_index = Channel.empty() + ch_bwamem2_version = Channel.empty() + // Download BWAMEM2 index or create from scratch if required + if ('bwamem2' in prepare_tool_indicies) { + if (params.bwamem2_index) { + ch_bwamem2_index = file(params.bwamem2_index) + } else { + ch_bwamem2_index = BWAMEM2_INDEX ( params.fasta ).index + ch_bwamem2_version = BWAMEM2_INDEX.out.version + } + } + + + emit: + bwamem2_index = ch_bwamem2_index + bwamem2_version = ch_bwamem2_version +} diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 8de49573..53d4fcf0 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -2,7 +2,7 @@ // Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // -params.bwamem2_idx_options = [:] +// params.bwamem2_idx_options = [:] params.bwamem2_mem_options = [:] params.samtools_idx_options = [:] params.samtools_sort_options = [:] @@ -11,7 +11,7 @@ params.samtools_merge_options = [:] params.markduplicates_options = [:] params.samtools_idx_md_options = [:] -include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) +// include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_options ) include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) @@ -24,14 +24,12 @@ include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/ workflow MAPPING { take: reads_input // channel: [mandatory] meta, reads_input - fasta // channel: [mandatory] fasta + // fasta // channel: [mandatory] fasta + index // channel: /path/to/bwamem2/index/ main: - // Index - BWAMEM2_INDEX ( fasta ) - // Map, sort, and index - BWAMEM2_MEM ( reads_input, BWAMEM2_INDEX.out.index ) + BWAMEM2_MEM ( reads_input, index ) SAMTOOLS_SORT ( BWAMEM2_MEM.out.bam ) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e1dba7a5..be6a9515 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -11,7 +11,10 @@ WorkflowRaredisease.initialise(params, log) // TODO nf-core: Add all file path parameters for the pipeline to the list below // Check input path parameters to see if they exist -def checkPathParamList = [ params.input, params.multiqc_config, params.fasta ] +def checkPathParamList = [ + params.input, params.multiqc_config, params.fasta, + params.bwamem2_index +] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } // Check mandatory parameters @@ -35,6 +38,8 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // Don't overwrite global params.modules, create a copy instead and use that within the main script. def modules = params.modules.clone() +def publish_idx_options = params.save_reference ? modules['bwa_mem2_index'] : [publish_files: false] +def prepareToolIndices = ['bwamem2'] // // MODULE: Local to the pipeline // @@ -63,6 +68,9 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( op // // SUBWORKFLOW: Consists entirely of nf-core/modules // + +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( bwamem2_idx_options: publish_idx_options ) + include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], bwamem2_mem_options: modules['bwa_mem2_mem'], @@ -100,8 +108,12 @@ workflow RAREDISEASE { ) ch_software_versions = ch_software_versions.mix(FASTQC.out.version.ifEmpty(null)) + // STEP 0: PREPARE GENOME REFERENCES AND INDICES. + PREPARE_GENOME ( prepareToolIndices ) + // STEP 1: MAPPING READS, FETCH STATS, AND MERGE. - MAPPING ( INPUT_CHECK.out.reads, params.fasta ) + // MAPPING ( INPUT_CHECK.out.reads, params.fasta ) + MAPPING ( INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.markduplicates_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) From 37736eeede3592010160344d4aef4507fea6e44a Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 27 Aug 2021 13:20:36 +0200 Subject: [PATCH 0031/1169] updated the test input --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 1ad30e4b..d14ee681 100644 --- a/conf/test.config +++ b/conf/test.config @@ -21,7 +21,7 @@ params { // Input data // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/Clinical-Genomics/raredisease/feature/bwamem2/assets/samplesheet.csv' + input = 'https://raw.githubusercontent.com/nf-core/raredisease/dev/assets/samplesheet.csv' // Genome references fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' From 7e9269640ec082f8aa351259d08c8362939a90e5 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 27 Aug 2021 13:34:42 +0200 Subject: [PATCH 0032/1169] removed idx option for stats --- conf/modules.config | 3 --- subworkflows/nf-core/mapping.nf | 3 +-- workflows/raredisease.nf | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ad7cfb89..60a4344d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -40,9 +40,6 @@ params { 'samtools_merge' { publish_files = false } - 'samtools_index' { - args = '' - } 'samtools_index_md' { publish_dir = 'markduplicates' } diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 8de49573..d00b83f7 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -4,7 +4,6 @@ params.bwamem2_idx_options = [:] params.bwamem2_mem_options = [:] -params.samtools_idx_options = [:] params.samtools_sort_options = [:] params.samtools_stats_options = [:] params.samtools_merge_options = [:] @@ -13,7 +12,7 @@ params.samtools_idx_md_options = [:] include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_options ) +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams( options: params.samtools_merge_options ) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e1dba7a5..dd7afcc4 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -66,7 +66,6 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( op include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], bwamem2_mem_options: modules['bwa_mem2_mem'], - samtools_idx_options: modules['samtools_index'], samtools_sort_options: modules['samtools_sort'], samtools_stats_options: modules['samtools_stats'], samtools_merge_options: modules['samtools_merge'], From fd2901f26a9c70eb309b33dea4434a029ab95440 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 27 Aug 2021 15:52:42 +0200 Subject: [PATCH 0033/1169] address comments --- conf/modules.config | 6 +++++- subworkflows/nf-core/mapping.nf | 3 ++- workflows/raredisease.nf | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 60a4344d..e3cc051e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -34,9 +34,12 @@ params { publish_files = false } 'picard_markduplicates' { - suffix = '.sorted' + suffix = '.sorted.md' publish_dir = 'markduplicates' } + 'samtools_index' { + publish_files = false + } 'samtools_merge' { publish_files = false } @@ -45,6 +48,7 @@ params { } 'samtools_sort' { suffix = '.sorted' + publish_files = false } 'samtools_stats' { args = '-s --remove-overlaps' diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index d00b83f7..acfd0e5f 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -4,6 +4,7 @@ params.bwamem2_idx_options = [:] params.bwamem2_mem_options = [:] +params.samtools_idx_options = [:] params.samtools_sort_options = [:] params.samtools_stats_options = [:] params.samtools_merge_options = [:] @@ -12,7 +13,7 @@ params.samtools_idx_md_options = [:] include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_options ) include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams( options: params.samtools_merge_options ) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index dd7afcc4..e1dba7a5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -66,6 +66,7 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( op include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], bwamem2_mem_options: modules['bwa_mem2_mem'], + samtools_idx_options: modules['samtools_index'], samtools_sort_options: modules['samtools_sort'], samtools_stats_options: modules['samtools_stats'], samtools_merge_options: modules['samtools_merge'], From e3e331a402ee691accb88188fce3288fe991fc0b Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 27 Aug 2021 13:17:09 +0200 Subject: [PATCH 0034/1169] first try with modulating index preparation --- README.md | 4 +++- conf/genomes.config | 21 +++++++++++++++++++ conf/modules.config | 3 +-- main.nf | 1 + nextflow.config | 6 ++++-- nextflow_schema.json | 14 +++++++++++++ subworkflows/local/prepare_genome.nf | 31 ++++++++++++++++++++++++++++ subworkflows/nf-core/mapping.nf | 12 +++++------ workflows/raredisease.nf | 16 ++++++++++++-- 9 files changed, 94 insertions(+), 14 deletions(-) create mode 100644 conf/genomes.config create mode 100644 subworkflows/local/prepare_genome.nf diff --git a/README.md b/README.md index 9d27eeec..e61bf69a 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,9 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) +2. Map reads to reference ([`BWA mem`](http://bio-bwa.sourceforge.net/bwa.shtml), `BWA mem2`) with the option to ([`merge`](http://www.htslib.org/doc/samtools-merge.html)) +3. Mark duplicated reads ([`GATK4 MarkDuplicates`](https://gatk.broadinstitute.org/hc/en-us/articles/360037052812-MarkDuplicates-Picard-)) +4. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Quick Start diff --git a/conf/genomes.config b/conf/genomes.config new file mode 100644 index 00000000..c077f146 --- /dev/null +++ b/conf/genomes.config @@ -0,0 +1,21 @@ +/* +======================================================================================== + Nextflow config file for local reference genomes +======================================================================================== + Defines reference genomes without using iGenomes. + Can be used by any config that customises the base path using: + $params.local_genomes / --local_genomes +---------------------------------------------------------------------------------------- +*/ + +params { + genomes { + 'GRCh37' { + bwamem = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{amb,ann,bwt,pac,sa}" + } + 'GRCh38' { + bwamem = "${params.local_genomes}/grch38_homo_sapiens_-v0_m-.fasta.{amb,ann,bwt,pac,sa}" + bwamem2 = "${params.local_genomes}/grch38_homo_sapiens.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + } + } +} diff --git a/conf/modules.config b/conf/modules.config index e3cc051e..21c086cd 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -26,8 +26,7 @@ params { args = '--quiet' } 'bwa_mem2_index' { - publish_dir = 'reference' - publish_files = false + publish_dir = 'references' } 'bwa_mem2_mem' { args = '-M -K 100000000' diff --git a/main.nf b/main.nf index 9d7ece62..c1eefa92 100644 --- a/main.nf +++ b/main.nf @@ -18,6 +18,7 @@ nextflow.enable.dsl = 2 */ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') +params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') /* ======================================================================================== diff --git a/nextflow.config b/nextflow.config index 329e093e..e9fc931d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -17,6 +17,8 @@ params { genome = null igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false + local_genomes = null + save_reference = false // MultiQC options multiqc_config = null @@ -68,11 +70,11 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load igenomes.config if required +// Load igenomes.config if required else load custom genomes.config if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' } else { - params.genomes = [:] + includeConfig 'conf/genomes.config' } profiles { diff --git a/nextflow_schema.json b/nextflow_schema.json index 60fdb051..6a07a669 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -79,6 +79,20 @@ "fa_icon": "fas fa-ban", "hidden": true, "help_text": "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`." + }, + "bwamem2_index": { + "type": "string", + "format": "directory-path", + "fa_icon": "fas fa-copy", + "description": "Path to directory or tar.gz archive for pre-built STAR index.", + "help_text": "> **NB** If none provided, will be generated automatically from the FASTA reference." + }, + "save_reference": { + "type": "boolean", + "default": false, + "description": "If generated by the pipeline save the BWA index in the results directory.", + "help_text": "If the BWA index is generated by the pipeline use this parameter to save it to your results folder. These can then be used for future pipeline runs, reducing processing times.", + "fa_icon": "fas fa-save" } } }, diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf new file mode 100644 index 00000000..3d597b7d --- /dev/null +++ b/subworkflows/local/prepare_genome.nf @@ -0,0 +1,31 @@ +// +// Prepare indices for reference genome files +// + +params.bwamem2_idx_options = [:] + +include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) + +workflow PREPARE_GENOME { + take: + prepare_tool_indicies // list: tools to prepare indices for + + main: + + ch_bwamem2_index = Channel.empty() + ch_bwamem2_version = Channel.empty() + // Download BWAMEM2 index or create from scratch if required + if ('bwamem2' in prepare_tool_indicies) { + if (params.bwamem2_index) { + ch_bwamem2_index = file(params.bwamem2_index) + } else { + ch_bwamem2_index = BWAMEM2_INDEX ( params.fasta ).index + ch_bwamem2_version = BWAMEM2_INDEX.out.version + } + } + + + emit: + bwamem2_index = ch_bwamem2_index + bwamem2_version = ch_bwamem2_version +} diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index acfd0e5f..496845a7 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -2,7 +2,7 @@ // Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // -params.bwamem2_idx_options = [:] +// params.bwamem2_idx_options = [:] params.bwamem2_mem_options = [:] params.samtools_idx_options = [:] params.samtools_sort_options = [:] @@ -11,7 +11,7 @@ params.samtools_merge_options = [:] params.markduplicates_options = [:] params.samtools_idx_md_options = [:] -include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) +// include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_options ) include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) @@ -24,14 +24,12 @@ include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/ workflow MAPPING { take: reads_input // channel: [mandatory] meta, reads_input - fasta // channel: [mandatory] fasta + // fasta // channel: [mandatory] fasta + index // channel: /path/to/bwamem2/index/ main: - // Index - BWAMEM2_INDEX ( fasta ) - // Map, sort, and index - BWAMEM2_MEM ( reads_input, BWAMEM2_INDEX.out.index ) + BWAMEM2_MEM ( reads_input, index ) SAMTOOLS_SORT ( BWAMEM2_MEM.out.bam ) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 1c85bb26..5e28cd9c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -11,7 +11,10 @@ WorkflowRaredisease.initialise(params, log) // TODO nf-core: Add all file path parameters for the pipeline to the list below // Check input path parameters to see if they exist -def checkPathParamList = [ params.input, params.multiqc_config, params.fasta ] +def checkPathParamList = [ + params.input, params.multiqc_config, params.fasta, + params.bwamem2_index +] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } // Check mandatory parameters @@ -35,6 +38,8 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // Don't overwrite global params.modules, create a copy instead and use that within the main script. def modules = params.modules.clone() +def publish_idx_options = params.save_reference ? modules['bwa_mem2_index'] : [publish_files: false] +def prepareToolIndices = ['bwamem2'] // // MODULE: Local to the pipeline // @@ -63,6 +68,9 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( op // // SUBWORKFLOW: Consists entirely of nf-core/modules // + +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( bwamem2_idx_options: publish_idx_options ) + include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], bwamem2_mem_options: modules['bwa_mem2_mem'], @@ -100,8 +108,12 @@ workflow RAREDISEASE { ) ch_software_versions = ch_software_versions.mix(FASTQC.out.version.ifEmpty(null)) + // STEP 0: PREPARE GENOME REFERENCES AND INDICES. + PREPARE_GENOME ( prepareToolIndices ) + // STEP 1: MAPPING READS, FETCH STATS, AND MERGE. - MAPPING ( INPUT_CHECK.out.reads, params.fasta ) + // MAPPING ( INPUT_CHECK.out.reads, params.fasta ) + MAPPING ( INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.markduplicates_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) From 54e1a749fa3311da4684dd842719b998a0f54353 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 6 Sep 2021 13:34:52 +0200 Subject: [PATCH 0035/1169] tidy configs --- conf/genomes.config | 3 +-- conf/test.config | 4 +++- nextflow_schema.json | 14 ++++++++++---- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index c077f146..7d181d5f 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -11,10 +11,9 @@ params { genomes { 'GRCh37' { - bwamem = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{amb,ann,bwt,pac,sa}" + bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{amb,ann,bwt,pac,sa}" } 'GRCh38' { - bwamem = "${params.local_genomes}/grch38_homo_sapiens_-v0_m-.fasta.{amb,ann,bwt,pac,sa}" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens.fasta.{0123,amb,ann,bwt.2bit.64,pac}" } } diff --git a/conf/test.config b/conf/test.config index d14ee681..136e56ad 100644 --- a/conf/test.config +++ b/conf/test.config @@ -4,8 +4,10 @@ ======================================================================================== Defines input files and everything required to run a fast and simple pipeline test. - Use as follows: + Use as follows (only works after release): nextflow run nf-core/raredisease -profile test, + For now while it's under active development: + nextflow run main.nf -profile test, ---------------------------------------------------------------------------------------- */ diff --git a/nextflow_schema.json b/nextflow_schema.json index 6a07a669..a262306b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -84,15 +84,21 @@ "type": "string", "format": "directory-path", "fa_icon": "fas fa-copy", - "description": "Path to directory or tar.gz archive for pre-built STAR index.", + "description": "Path to directory for pre-built bwamem2 index.", "help_text": "> **NB** If none provided, will be generated automatically from the FASTA reference." }, "save_reference": { "type": "boolean", "default": false, - "description": "If generated by the pipeline save the BWA index in the results directory.", - "help_text": "If the BWA index is generated by the pipeline use this parameter to save it to your results folder. These can then be used for future pipeline runs, reducing processing times.", + "description": "If generated by the pipeline save the required indices/references in the results directory.", + "help_text": "The saved references can be used for future pipeline runs, reducing processing times.", "fa_icon": "fas fa-save" + }, + "local_genomes": { + "type": "string", + "fa_icon": "fas fa-map-marker-alt", + "description": "Directory / URL base for genomes references.", + "help_text": "All files are supposed to be in the same folder defining a flat structure" } } }, @@ -302,4 +308,4 @@ "$ref": "#/definitions/generic_options" } ] -} +} \ No newline at end of file From 813236370f03a35aa25cbab78ce3c2f12c5809bd Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 6 Sep 2021 13:47:45 +0200 Subject: [PATCH 0036/1169] woops! forgot to rm comments --- subworkflows/nf-core/mapping.nf | 2 -- workflows/raredisease.nf | 1 - 2 files changed, 3 deletions(-) diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 496845a7..b834580f 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -11,7 +11,6 @@ params.samtools_merge_options = [:] params.markduplicates_options = [:] params.samtools_idx_md_options = [:] -// include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_options ) include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) @@ -24,7 +23,6 @@ include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/ workflow MAPPING { take: reads_input // channel: [mandatory] meta, reads_input - // fasta // channel: [mandatory] fasta index // channel: /path/to/bwamem2/index/ main: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5e28cd9c..4d763a25 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -112,7 +112,6 @@ workflow RAREDISEASE { PREPARE_GENOME ( prepareToolIndices ) // STEP 1: MAPPING READS, FETCH STATS, AND MERGE. - // MAPPING ( INPUT_CHECK.out.reads, params.fasta ) MAPPING ( INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.markduplicates_version.ifEmpty(null)) From 21128549ebd228383af5d3e080ba40b2ea9de518 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 6 Sep 2021 15:48:33 +0200 Subject: [PATCH 0037/1169] fix bwamem index parameter and add local fasta copy --- conf/genomes.config | 3 ++- subworkflows/local/prepare_genome.nf | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index 7d181d5f..077eb798 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -14,7 +14,8 @@ params { bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{amb,ann,bwt,pac,sa}" } 'GRCh38' { - bwamem2 = "${params.local_genomes}/grch38_homo_sapiens.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" + bwamem2 = "${params.local_genomes}/grch38_homo_sapiens.fasta.{0123,amb,ann,bwt.2bit.64,pac}" } } } diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 3d597b7d..46da2087 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -18,6 +18,8 @@ workflow PREPARE_GENOME { if ('bwamem2' in prepare_tool_indicies) { if (params.bwamem2_index) { ch_bwamem2_index = file(params.bwamem2_index) + } else if (params.bwamem2){ + ch_bwamem2_index = file(params.bwamem2) } else { ch_bwamem2_index = BWAMEM2_INDEX ( params.fasta ).index ch_bwamem2_version = BWAMEM2_INDEX.out.version From 679023a05d45a91cbf6f68f48531b0b675da8046 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 6 Sep 2021 15:49:07 +0200 Subject: [PATCH 0038/1169] fix bwamem index parameter and add local fasta copy --- subworkflows/local/prepare_genome.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 46da2087..0a0449f5 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -14,7 +14,7 @@ workflow PREPARE_GENOME { ch_bwamem2_index = Channel.empty() ch_bwamem2_version = Channel.empty() - // Download BWAMEM2 index or create from scratch if required + // Fetch BWAMEM2 index or create from scratch if required if ('bwamem2' in prepare_tool_indicies) { if (params.bwamem2_index) { ch_bwamem2_index = file(params.bwamem2_index) From 86846763a48083bb6290ba6afccdab7190eac690 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 7 Sep 2021 11:30:22 +0200 Subject: [PATCH 0039/1169] fixed as per suggestions --- conf/genomes.config | 3 ++- main.nf | 2 +- nextflow_schema.json | 4 ++-- subworkflows/local/prepare_genome.nf | 16 ++++++---------- subworkflows/nf-core/mapping.nf | 1 - workflows/raredisease.nf | 7 ++++--- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 077eb798..07acc3c0 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -11,11 +11,12 @@ params { genomes { 'GRCh37' { + fasta ="${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{amb,ann,bwt,pac,sa}" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" - bwamem2 = "${params.local_genomes}/grch38_homo_sapiens.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" } } } diff --git a/main.nf b/main.nf index c1eefa92..d378bf7d 100644 --- a/main.nf +++ b/main.nf @@ -18,7 +18,7 @@ nextflow.enable.dsl = 2 */ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') -params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') +params.bwamem2 = WorkflowMain.getGenomeAttribute(params, 'bwamem2') /* ======================================================================================== diff --git a/nextflow_schema.json b/nextflow_schema.json index a262306b..f791148c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -80,9 +80,9 @@ "hidden": true, "help_text": "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`." }, - "bwamem2_index": { + "bwamem2": { "type": "string", - "format": "directory-path", + "format": "file-path", "fa_icon": "fas fa-copy", "description": "Path to directory for pre-built bwamem2 index.", "help_text": "> **NB** If none provided, will be generated automatically from the FASTA reference." diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 0a0449f5..cb75bcc2 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -8,22 +8,18 @@ include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main workflow PREPARE_GENOME { take: - prepare_tool_indicies // list: tools to prepare indices for + fasta main: ch_bwamem2_index = Channel.empty() ch_bwamem2_version = Channel.empty() // Fetch BWAMEM2 index or create from scratch if required - if ('bwamem2' in prepare_tool_indicies) { - if (params.bwamem2_index) { - ch_bwamem2_index = file(params.bwamem2_index) - } else if (params.bwamem2){ - ch_bwamem2_index = file(params.bwamem2) - } else { - ch_bwamem2_index = BWAMEM2_INDEX ( params.fasta ).index - ch_bwamem2_version = BWAMEM2_INDEX.out.version - } + if ( params.bwamem2 && file(params.bwamem2, checkIfExists:true) ) { + ch_bwamem2_index = file(params.bwamem2) + } else { + ch_bwamem2_index = BWAMEM2_INDEX ( fasta ).index + ch_bwamem2_version = BWAMEM2_INDEX.out.version } diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index b834580f..d74addbd 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -2,7 +2,6 @@ // Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // -// params.bwamem2_idx_options = [:] params.bwamem2_mem_options = [:] params.samtools_idx_options = [:] params.samtools_sort_options = [:] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4d763a25..5791a0bb 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -13,7 +13,7 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, - params.bwamem2_index + params.bwamem2 ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } @@ -39,7 +39,7 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi def modules = params.modules.clone() def publish_idx_options = params.save_reference ? modules['bwa_mem2_index'] : [publish_files: false] -def prepareToolIndices = ['bwamem2'] + // // MODULE: Local to the pipeline // @@ -94,6 +94,7 @@ def multiqc_report = [] workflow RAREDISEASE { ch_software_versions = Channel.empty() + ch_fasta = file(params.fasta) // // SUBWORKFLOW: Read in samplesheet, validate and stage input files @@ -109,7 +110,7 @@ workflow RAREDISEASE { ch_software_versions = ch_software_versions.mix(FASTQC.out.version.ifEmpty(null)) // STEP 0: PREPARE GENOME REFERENCES AND INDICES. - PREPARE_GENOME ( prepareToolIndices ) + PREPARE_GENOME ( ch_fasta ) // STEP 1: MAPPING READS, FETCH STATS, AND MERGE. MAPPING ( INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) From 0f8356c88ab77efef75e8a92e5919b497795ce70 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 7 Sep 2021 16:41:04 +0200 Subject: [PATCH 0040/1169] fixed indices --- conf/genomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index 07acc3c0..77f9c1f8 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -12,7 +12,7 @@ params { genomes { 'GRCh37' { fasta ="${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" - bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{amb,ann,bwt,pac,sa}" + bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" From f71398dd96f5f67200fab3576741e5692bf1388c Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 9 Sep 2021 16:08:35 +0200 Subject: [PATCH 0041/1169] reformat --- conf/genomes.config | 2 +- subworkflows/local/prepare_genome.nf | 8 +++----- subworkflows/nf-core/mapping.nf | 27 +++++++++------------------ workflows/raredisease.nf | 15 ++++++++------- 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 77f9c1f8..d9f316b8 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -11,7 +11,7 @@ params { genomes { 'GRCh37' { - fasta ="${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" + fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" } 'GRCh38' { diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index cb75bcc2..abb0b764 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -8,10 +8,9 @@ include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main workflow PREPARE_GENOME { take: - fasta + fasta // path: genome.fasta main: - ch_bwamem2_index = Channel.empty() ch_bwamem2_version = Channel.empty() // Fetch BWAMEM2 index or create from scratch if required @@ -22,8 +21,7 @@ workflow PREPARE_GENOME { ch_bwamem2_version = BWAMEM2_INDEX.out.version } - emit: - bwamem2_index = ch_bwamem2_index - bwamem2_version = ch_bwamem2_version + bwamem2_index = ch_bwamem2_index // path: bwamem2/index + bwamem2_version = ch_bwamem2_version // path: *.version.txt } diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index d74addbd..6f8ac60b 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -21,7 +21,7 @@ include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/ workflow MAPPING { take: - reads_input // channel: [mandatory] meta, reads_input + reads_input // channel: [ val(meta), reads_input ] index // channel: /path/to/bwamem2/index/ main: @@ -34,7 +34,6 @@ workflow MAPPING { // Get stats for each demultiplexed read pair. bam_sorted_indexed = SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai) SAMTOOLS_STATS ( bam_sorted_indexed ) - stats = SAMTOOLS_STATS.out.stats // Merge multiple lane samples and index SAMTOOLS_SORT.out.bam.map{ meta, bam -> @@ -51,24 +50,16 @@ workflow MAPPING { // Marking duplicates + index MARKDUPLICATES ( merged_bam ) - marked_bam = MARKDUPLICATES.out.bam - SAMTOOLS_INDEX_MD ( marked_bam ) - marked_bai = SAMTOOLS_INDEX_MD.out.bai - - - // Collect versions - bwamem2_version = BWAMEM2_MEM.out.version - markduplicates_version = MARKDUPLICATES.out.version - samtools_version = SAMTOOLS_SORT.out.version emit: - stats - marked_bam - marked_bai - + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] + metrics = MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] + marked_bam = MARKDUPLICATES.out.bam // channel: [ val(meta), [ marked_bam ] ] + marked_bai = SAMTOOLS_INDEX_MD.out.bai // channel: [ val(meta), [ marked_bai ] ] - bwamem2_version - markduplicates_version - samtools_version + // Collect versions + bwamem2_version = BWAMEM2_MEM.out.version // path: *.version.txt + picard_version = MARKDUPLICATES.out.version // path: *.version.txt + samtools_version = SAMTOOLS_SORT.out.version // path: *.version.txt } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5791a0bb..a0e7490e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -38,6 +38,7 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // Don't overwrite global params.modules, create a copy instead and use that within the main script. def modules = params.modules.clone() +// Switch for saving references def publish_idx_options = params.save_reference ? modules['bwa_mem2_index'] : [publish_files: false] // @@ -115,7 +116,7 @@ workflow RAREDISEASE { // STEP 1: MAPPING READS, FETCH STATS, AND MERGE. MAPPING ( INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(MAPPING.out.markduplicates_version.ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(MAPPING.out.picard_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) // @@ -139,12 +140,12 @@ workflow RAREDISEASE { workflow_summary = WorkflowRaredisease.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) - ch_multiqc_files = Channel.empty() - ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) - ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(GET_SOFTWARE_VERSIONS.out.yaml.collect()) - ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = Channel.empty() + ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) + ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_files = ch_multiqc_files.mix(GET_SOFTWARE_VERSIONS.out.yaml.collect()) + ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( ch_multiqc_files.collect() From c2b307c754cb03640b4e73f0dc9733c06ff0f5a7 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 9 Sep 2021 16:19:12 +0200 Subject: [PATCH 0042/1169] fixed fails --- subworkflows/nf-core/mapping.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 6f8ac60b..74901e67 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -50,7 +50,7 @@ workflow MAPPING { // Marking duplicates + index MARKDUPLICATES ( merged_bam ) - SAMTOOLS_INDEX_MD ( marked_bam ) + SAMTOOLS_INDEX_MD ( MARKDUPLICATES.out.bam ) emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] From 09327d050d28491a71675b7a1a89c222cf7dbad4 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 13 Sep 2021 16:35:05 +0200 Subject: [PATCH 0043/1169] updated module versions --- modules.json | 8 ++++---- modules/nf-core/modules/multiqc/main.nf | 6 +++--- modules/nf-core/modules/samtools/index/main.nf | 6 +++--- modules/nf-core/modules/samtools/sort/main.nf | 6 +++--- modules/nf-core/modules/samtools/stats/main.nf | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/modules.json b/modules.json index c819eccc..0bf492bd 100644 --- a/modules.json +++ b/modules.json @@ -13,22 +13,22 @@ "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, "multiqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "c5235a983d454787fa0c3247b02086969217163b" }, "picard/markduplicates": { "git_sha": "c5235a983d454787fa0c3247b02086969217163b" }, "samtools/index": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "c5235a983d454787fa0c3247b02086969217163b" }, "samtools/merge": { "git_sha": "c5235a983d454787fa0c3247b02086969217163b" }, "samtools/sort": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "c5235a983d454787fa0c3247b02086969217163b" }, "samtools/stats": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "c5235a983d454787fa0c3247b02086969217163b" } } } diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index da780800..8b6d6f0c 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -10,11 +10,11 @@ process MULTIQC { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0" + container "https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0" } else { - container "quay.io/biocontainers/multiqc:1.10.1--py_0" + container "quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0" } input: diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index 778e9384..e1966fb3 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -11,11 +11,11 @@ process SAMTOOLS_INDEX { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? "bioconda::samtools=1.12" : null) + conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" + container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" } else { - container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" + container "quay.io/biocontainers/samtools:1.13--h8c37831_0" } input: diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index 240e8e9f..0a6b7048 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -11,11 +11,11 @@ process SAMTOOLS_SORT { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? "bioconda::samtools=1.12" : null) + conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" + container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" } else { - container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" + container "quay.io/biocontainers/samtools:1.13--h8c37831_0" } input: diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 6bb0a4c7..8c72d725 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -11,11 +11,11 @@ process SAMTOOLS_STATS { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? "bioconda::samtools=1.12" : null) + conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.12--hd5e65b6_0" + container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" } else { - container "quay.io/biocontainers/samtools:1.12--hd5e65b6_0" + container "quay.io/biocontainers/samtools:1.13--h8c37831_0" } input: From b0c0566b9917f56f614dd77f8756e4c048f1c3ef Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 13 Sep 2021 16:49:39 +0200 Subject: [PATCH 0044/1169] added the module --- modules/local/deepvariant/functions.nf | 68 + modules/local/deepvariant/main.nf | 1475 ++++++++++++++++++++++ modules/local/deepvariant/meta.yml | 1585 ++++++++++++++++++++++++ 3 files changed, 3128 insertions(+) create mode 100644 modules/local/deepvariant/functions.nf create mode 100644 modules/local/deepvariant/main.nf create mode 100644 modules/local/deepvariant/meta.yml diff --git a/modules/local/deepvariant/functions.nf b/modules/local/deepvariant/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/local/deepvariant/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/local/deepvariant/main.nf b/modules/local/deepvariant/main.nf new file mode 100644 index 00000000..1d089031 --- /dev/null +++ b/modules/local/deepvariant/main.nf @@ -0,0 +1,1475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + modules/main.nf at c3814a760cd57a2e7906eb9492a514de1fb45afa · nf-core/modules · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + Permalink + + + +
+ +
+
+ + + c3814a760c + + + + +
+
+
+ Switch branches/tags + +
+ + + +
+ +
+ +
+ + +
+ +
+ + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ +
+ +
+ + + + Go to file + + +
+ + + + + + + + + +
+
+
+ + + + +
+ +
+
+
 
+
+ +
+
 
+ Cannot retrieve contributors at this time +
+
+ + + + + + + + + +
+ +
+ + +
+ + 45 lines (36 sloc) + + 1.48 KB +
+ +
+ + + +
+ + + + + + + + + +
+
+ +
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
include { initOptions; saveFiles; getSoftwareName } from './functions'
+
params.options = [:]
options = initOptions(params.options)
+
process DEEPVARIANT {
tag "$meta.id"
label 'process_medium'
publishDir "${params.outdir}",
mode: params.publish_dir_mode,
saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
+
conda (params.enable_conda ? "bioconda::deepvariant=1.2.0" : null)
if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
container "docker://google/deepvariant:1.2.0"
} else {
container "google/deepvariant:1.2.0"
}
+
input:
tuple val(meta), path(bam), path(bai)
tuple path(fasta), path(fai)
+
output:
tuple val(meta), path("*.vcf.gz"), emit: vcf
tuple val(meta), path("*g.vcf.gz"), emit: gvcf
path "*.version.txt" , emit: version
+
script:
def software = getSoftwareName(task.process)
def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}"
+
"""
/opt/deepvariant/bin/run_deepvariant \\
--ref=${fasta} \\
--reads=${bam} \\
--output_vcf=${prefix}.vcf.gz \\
--output_gvcf=${prefix}.g.vcf.gz \\
${options.args} \\
--num_shards=${task.cpus}
echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' > ${software}.version.txt
"""
+
}
+ + + +
+ +
+ + + + +
+ + +
+ + +
+
+ + +
+ + + +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/modules/local/deepvariant/meta.yml b/modules/local/deepvariant/meta.yml new file mode 100644 index 00000000..972e7971 --- /dev/null +++ b/modules/local/deepvariant/meta.yml @@ -0,0 +1,1585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + modules/meta.yml at c3814a760cd57a2e7906eb9492a514de1fb45afa · nf-core/modules · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + Permalink + + + +
+ +
+
+ + + c3814a760c + + + + +
+
+
+ Switch branches/tags + +
+ + + +
+ +
+ +
+ + +
+ +
+ + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ +
+ +
+ + + + Go to file + + +
+ + + + + + + + + +
+
+
+ + + + +
+ +
+
+ + @abhi18av + + +
+ + Latest commit + c7b0c1a + Sep 6, 2021 + + + + + + History + + +
+
+ +
+ +
+
+ + + 1 + + contributor + + +
+ +

+ Users who have contributed to this file +

+
+ + + + + + +
+
+
+
+ + + + + + + + + +
+ +
+ + +
+ + 58 lines (55 sloc) + + 1.59 KB +
+ +
+ + + +
+ + + + + + + + + +
+
+ +
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
name: deepvariant
description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data
keywords:
- variant calling
- machine learning
tools:
- deepvariant:
description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data
homepage: https://github.com/google/deepvariant
documentation: https://github.com/google/deepvariant
tool_dev_url: https://github.com/google/deepvariant
doi: "https://doi.org/10.1038/nbt.4235"
licence: ['BSD-3-clause']
+
input:
- meta:
type: map
description: |
Groovy Map containing sample information
e.g. [ id:'test', single_end:false ]
- bam:
type: file
description: BAM file
pattern: "*.bam"
- bai:
type: file
description: Index of BAM file
pattern: "*.bai"
- fasta:
type: file
description: The reference fasta file
pattern: "*.fasta"
- fai:
type: file
description: Index of reference fasta file
pattern: "*.fai"
+
output:
- meta:
type: map
description: |
Groovy Map containing sample information
e.g. [ id:'test', single_end:false ]
- vcf:
type: file
description: Compressed VCF file
pattern: "*.vcf.gz"
- gvcf:
type: file
description: Compressed GVCF file
pattern: "*.g.vcf.gz"
- version:
type: file
description: File containing software version
pattern: "*.{version.txt}"
+
authors:
- "@abhi18av"
+ + + +
+ +
+ + + + +
+ + +
+ + +
+
+ + +
+ + + +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + From 5cfa6b1cd336b41df29693904ff5af9aaecaf83b Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 13 Sep 2021 16:56:24 +0200 Subject: [PATCH 0045/1169] omg added the wrong files but this commit fixes it --- modules/local/deepvariant/main.nf | 1520 +------------------------ modules/local/deepvariant/meta.yml | 1643 +--------------------------- 2 files changed, 103 insertions(+), 3060 deletions(-) diff --git a/modules/local/deepvariant/main.nf b/modules/local/deepvariant/main.nf index 1d089031..e9139ee6 100644 --- a/modules/local/deepvariant/main.nf +++ b/modules/local/deepvariant/main.nf @@ -1,1475 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - modules/main.nf at c3814a760cd57a2e7906eb9492a514de1fb45afa · nf-core/modules · GitHub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - -
- - - -
- - - - - - - - - - -
-
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - -
- - - - Permalink - - - -
- -
-
- - - c3814a760c - - - - -
-
-
- Switch branches/tags - -
- - - -
- -
- -
- - -
- -
- - - - - - - - - - - - - - - - -
- - -
-
-
-
- -
- -
- - - - Go to file - - -
- - - - - - - - - -
-
-
- - - - -
- -
-
-
 
-
- -
-
 
- Cannot retrieve contributors at this time -
-
- - - - - - - - - -
- -
- - -
- - 45 lines (36 sloc) - - 1.48 KB -
- -
- - - -
- - - - - - - - - -
-
- -
- -
-
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
include { initOptions; saveFiles; getSoftwareName } from './functions'
-
params.options = [:]
options = initOptions(params.options)
-
process DEEPVARIANT {
tag "$meta.id"
label 'process_medium'
publishDir "${params.outdir}",
mode: params.publish_dir_mode,
saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
-
conda (params.enable_conda ? "bioconda::deepvariant=1.2.0" : null)
if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
container "docker://google/deepvariant:1.2.0"
} else {
container "google/deepvariant:1.2.0"
}
-
input:
tuple val(meta), path(bam), path(bai)
tuple path(fasta), path(fai)
-
output:
tuple val(meta), path("*.vcf.gz"), emit: vcf
tuple val(meta), path("*g.vcf.gz"), emit: gvcf
path "*.version.txt" , emit: version
-
script:
def software = getSoftwareName(task.process)
def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}"
-
"""
/opt/deepvariant/bin/run_deepvariant \\
--ref=${fasta} \\
--reads=${bam} \\
--output_vcf=${prefix}.vcf.gz \\
--output_gvcf=${prefix}.g.vcf.gz \\
${options.args} \\
--num_shards=${task.cpus}
echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' > ${software}.version.txt
"""
-
}
- - - -
- -
- - - - -
- - -
- - -
-
- - -
- - - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process DEEPVARIANT { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::deepvariant=1.2.0" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "docker://google/deepvariant:1.2.0" + } else { + container "google/deepvariant:1.2.0" + } + + input: + tuple val(meta), path(bam), path(bai) + tuple path(fasta), path(fai) + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*g.vcf.gz"), emit: gvcf + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + + """ + /opt/deepvariant/bin/run_deepvariant \\ + --ref=${fasta} \\ + --reads=${bam} \\ + --output_vcf=${prefix}.vcf.gz \\ + --output_gvcf=${prefix}.g.vcf.gz \\ + ${options.args} \\ + --num_shards=${task.cpus} + + echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' > ${software}.version.txt + """ + +} diff --git a/modules/local/deepvariant/meta.yml b/modules/local/deepvariant/meta.yml index 972e7971..05269a3b 100644 --- a/modules/local/deepvariant/meta.yml +++ b/modules/local/deepvariant/meta.yml @@ -1,1585 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - modules/meta.yml at c3814a760cd57a2e7906eb9492a514de1fb45afa · nf-core/modules · GitHub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - -
- - - -
- - - - - - - - - - -
-
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - -
- - - - Permalink - - - -
- -
-
- - - c3814a760c - - - - -
-
-
- Switch branches/tags - -
- - - -
- -
- -
- - -
- -
- - - - - - - - - - - - - - - - -
- - -
-
-
-
- -
- -
- - - - Go to file - - -
- - - - - - - - - -
-
-
- - - - -
- -
-
- - @abhi18av - - -
- - Latest commit - c7b0c1a - Sep 6, 2021 - - - - - - History - - -
-
- -
- -
-
- - - 1 - - contributor - - -
- -

- Users who have contributed to this file -

-
- - - - - - -
-
-
-
- - - - - - - - - -
- -
- - -
- - 58 lines (55 sloc) - - 1.59 KB -
- -
- - - -
- - - - - - - - - -
-
- -
- -
-
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
name: deepvariant
description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data
keywords:
- variant calling
- machine learning
tools:
- deepvariant:
description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data
homepage: https://github.com/google/deepvariant
documentation: https://github.com/google/deepvariant
tool_dev_url: https://github.com/google/deepvariant
doi: "https://doi.org/10.1038/nbt.4235"
licence: ['BSD-3-clause']
-
input:
- meta:
type: map
description: |
Groovy Map containing sample information
e.g. [ id:'test', single_end:false ]
- bam:
type: file
description: BAM file
pattern: "*.bam"
- bai:
type: file
description: Index of BAM file
pattern: "*.bai"
- fasta:
type: file
description: The reference fasta file
pattern: "*.fasta"
- fai:
type: file
description: Index of reference fasta file
pattern: "*.fai"
-
output:
- meta:
type: map
description: |
Groovy Map containing sample information
e.g. [ id:'test', single_end:false ]
- vcf:
type: file
description: Compressed VCF file
pattern: "*.vcf.gz"
- gvcf:
type: file
description: Compressed GVCF file
pattern: "*.g.vcf.gz"
- version:
type: file
description: File containing software version
pattern: "*.{version.txt}"
-
authors:
- "@abhi18av"
- - - -
- -
- - - - -
- - -
- - -
-
- - -
- - - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - +name: deepvariant +description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data +keywords: + - variant calling + - machine learning +tools: + - deepvariant: + description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data + homepage: https://github.com/google/deepvariant + documentation: https://github.com/google/deepvariant + tool_dev_url: https://github.com/google/deepvariant + doi: "https://doi.org/10.1038/nbt.4235" + licence: ['BSD-3-clause'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.bam" + - bai: + type: file + description: Index of BAM file + pattern: "*.bai" + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fai" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: Compressed VCF file + pattern: "*.vcf.gz" + - gvcf: + type: file + description: Compressed GVCF file + pattern: "*.g.vcf.gz" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" + +authors: + - "@abhi18av" From d3e15e0bd817a314f77d0bf33c6891c04015e213 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 13 Sep 2021 17:41:23 +0200 Subject: [PATCH 0046/1169] added subworkflow + incl. in rd.nf --- conf/modules.config | 3 +++ subworkflows/local/deepvariant_caller.nf | 23 +++++++++++++++++++++++ workflows/raredisease.nf | 12 ++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 subworkflows/local/deepvariant_caller.nf diff --git a/conf/modules.config b/conf/modules.config index 21c086cd..e8cefb20 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -32,6 +32,9 @@ params { args = '-M -K 100000000' publish_files = false } + 'deepvariant' { + args = '--model_type=WGS' + } 'picard_markduplicates' { suffix = '.sorted.md' publish_dir = 'markduplicates' diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf new file mode 100644 index 00000000..aa4a06d7 --- /dev/null +++ b/subworkflows/local/deepvariant_caller.nf @@ -0,0 +1,23 @@ +// +// A variant caller workflow for deepvariant +// + +params.deepvariant_options = [:] + +include { DEEPVARIANT } from '../../modules/local/depvariant/main' addParams( options: params.deepvariant_options ) + +workflow DEEPVARIANT_CALLER { + take: + bam // channel: [ val(meta), path(bam), path(bai) ] + fasta // channel: [ path(fasta), path(fai) ] + + main: + DEEPVARIANT ( bam, fasta ) + + emit: + vcf = DEEPVARIANT.out.vcf + gvcf = DEEPVARIANT.out.gvf + + // Collect versions + deepvariant_version = DEEPVARIANT.out.version +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5791a0bb..c2cee6fe 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -82,6 +82,13 @@ include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( samtools_idx_md_options: modules['samtools_index_md'], ) + +// +// SUBWORKFLOW: Consists of mix/local modules +// + +include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' addParams( deepvariant_options: modules['deepvariant'] ) + /* ======================================================================================== RUN MAIN WORKFLOW @@ -118,6 +125,11 @@ workflow RAREDISEASE { ch_software_versions = ch_software_versions.mix(MAPPING.out.markduplicates_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) + // STEP 2: VARIANT CALLING + // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. + DEEPVARIANT_CALLER ( MAPPING.out.marked_bam, ch_fasta ) + ch_software_versions = ch_software_versions.mix(DEEPVARIANT_CALLER.out.deepvariant_version.ifEmpty(null)) + // // MODULE: Pipeline reporting // From d1415999f9cd29a78ab73064f9932dd754494ffc Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 14 Sep 2021 10:11:59 +0200 Subject: [PATCH 0047/1169] added faidx module and refactored genome.fasta emit --- modules.json | 3 + .../modules/samtools/faidx/functions.nf | 68 +++++++++++++++++++ .../nf-core/modules/samtools/faidx/main.nf | 34 ++++++++++ .../nf-core/modules/samtools/faidx/meta.yml | 32 +++++++++ subworkflows/local/prepare_genome.nf | 9 ++- workflows/raredisease.nf | 3 +- 6 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 modules/nf-core/modules/samtools/faidx/functions.nf create mode 100644 modules/nf-core/modules/samtools/faidx/main.nf create mode 100644 modules/nf-core/modules/samtools/faidx/meta.yml diff --git a/modules.json b/modules.json index c819eccc..7fb0497f 100644 --- a/modules.json +++ b/modules.json @@ -18,6 +18,9 @@ "picard/markduplicates": { "git_sha": "c5235a983d454787fa0c3247b02086969217163b" }, + "samtools/faidx": { + "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + }, "samtools/index": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, diff --git a/modules/nf-core/modules/samtools/faidx/functions.nf b/modules/nf-core/modules/samtools/faidx/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/nf-core/modules/samtools/faidx/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/modules/samtools/faidx/main.nf new file mode 100644 index 00000000..a89ff2bb --- /dev/null +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -0,0 +1,34 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SAMTOOLS_FAIDX { + tag "$fasta" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" + } else { + container "quay.io/biocontainers/samtools:1.13--h8c37831_0" + } + + input: + path fasta + + output: + path "*.fai" , emit: fai + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools faidx $fasta + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml new file mode 100644 index 00000000..f92234d0 --- /dev/null +++ b/modules/nf-core/modules/samtools/faidx/meta.yml @@ -0,0 +1,32 @@ +name: samtools_faidx +description: Index FASTA file +keywords: + - index + - fasta +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 +input: + - fasta: + type: file + description: FASTA file + pattern: "*.{fa,fasta}" +output: + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@drpatelh" + - "@ewels" + - "@phue" diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index abb0b764..fd8f97aa 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -3,16 +3,18 @@ // params.bwamem2_idx_options = [:] +params.samtools_faidx_options = [:] include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' addParams( options: params.samtools_faidx_options ) workflow PREPARE_GENOME { take: fasta // path: genome.fasta main: - ch_bwamem2_index = Channel.empty() - ch_bwamem2_version = Channel.empty() + ch_fasta = file(fasta) + // Fetch BWAMEM2 index or create from scratch if required if ( params.bwamem2 && file(params.bwamem2, checkIfExists:true) ) { ch_bwamem2_index = file(params.bwamem2) @@ -22,6 +24,9 @@ workflow PREPARE_GENOME { } emit: + fasta = ch_fasta // path: genome.fasta + fai = ch_fai // path: genome.fasta.fai + bwamem2_index = ch_bwamem2_index // path: bwamem2/index bwamem2_version = ch_bwamem2_version // path: *.version.txt } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index a0e7490e..4304c1eb 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -95,7 +95,6 @@ def multiqc_report = [] workflow RAREDISEASE { ch_software_versions = Channel.empty() - ch_fasta = file(params.fasta) // // SUBWORKFLOW: Read in samplesheet, validate and stage input files @@ -111,7 +110,7 @@ workflow RAREDISEASE { ch_software_versions = ch_software_versions.mix(FASTQC.out.version.ifEmpty(null)) // STEP 0: PREPARE GENOME REFERENCES AND INDICES. - PREPARE_GENOME ( ch_fasta ) + PREPARE_GENOME ( params.fasta ) // STEP 1: MAPPING READS, FETCH STATS, AND MERGE. MAPPING ( INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) From da9fb0d6a0771db08ba4e3c3cc78d22f95e7000b Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 14 Sep 2021 16:14:08 +0200 Subject: [PATCH 0048/1169] refactored save ref --- conf/genomes.config | 2 ++ conf/modules.config | 9 ++++++--- main.nf | 1 + subworkflows/local/prepare_genome.nf | 16 ++++++++++++++-- workflows/raredisease.nf | 9 ++++++--- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index d9f316b8..4f9835b3 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -12,10 +12,12 @@ params { genomes { 'GRCh37' { fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" + fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" + fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" } } diff --git a/conf/modules.config b/conf/modules.config index 21c086cd..dd0b665d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -36,15 +36,18 @@ params { suffix = '.sorted.md' publish_dir = 'markduplicates' } - 'samtools_index' { - publish_files = false + 'samtools_faidx' { + publish_dir = 'references' } - 'samtools_merge' { + 'samtools_index' { publish_files = false } 'samtools_index_md' { publish_dir = 'markduplicates' } + 'samtools_merge' { + publish_files = false + } 'samtools_sort' { suffix = '.sorted' publish_files = false diff --git a/main.nf b/main.nf index d378bf7d..54646f05 100644 --- a/main.nf +++ b/main.nf @@ -18,6 +18,7 @@ nextflow.enable.dsl = 2 */ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') +params.fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2 = WorkflowMain.getGenomeAttribute(params, 'bwamem2') /* diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index fd8f97aa..e9bd93d9 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -1,7 +1,8 @@ // -// Prepare indices for reference genome files +// Prepare reference genome files // + params.bwamem2_idx_options = [:] params.samtools_faidx_options = [:] @@ -15,17 +16,28 @@ workflow PREPARE_GENOME { main: ch_fasta = file(fasta) + ch_bwamem2_version = Channel.empty() // Fetch BWAMEM2 index or create from scratch if required if ( params.bwamem2 && file(params.bwamem2, checkIfExists:true) ) { ch_bwamem2_index = file(params.bwamem2) } else { - ch_bwamem2_index = BWAMEM2_INDEX ( fasta ).index + ch_bwamem2_index = BWAMEM2_INDEX ( ch_fasta ).index ch_bwamem2_version = BWAMEM2_INDEX.out.version } + ch_samtools_version = Channel.empty() + if ( params.fai ) { + ch_fai = file(params.fai) + } else { + ch_fai = SAMTOOLS_FAIDX ( ch_fasta ).fai + ch_samtools_version = SAMTOOLS_FAIDX.out.version + } + + emit: fasta = ch_fasta // path: genome.fasta fai = ch_fai // path: genome.fasta.fai + samtools_version = ch_samtools_version // path: *.version.txt bwamem2_index = ch_bwamem2_index // path: bwamem2/index bwamem2_version = ch_bwamem2_version // path: *.version.txt diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4304c1eb..a3ed7ded 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -13,7 +13,7 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, - params.bwamem2 + params.bwamem2, params.fai ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } @@ -39,7 +39,10 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi def modules = params.modules.clone() // Switch for saving references -def publish_idx_options = params.save_reference ? modules['bwa_mem2_index'] : [publish_files: false] +if (!params.save_reference) { + modules['bwa_mem2_index'].publish_files = false + modules['samtools_faidx'].publish_files = false +} // // MODULE: Local to the pipeline @@ -70,7 +73,7 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( op // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( bwamem2_idx_options: publish_idx_options ) +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], samtools_faidx_options: modules['samtools_faidx'] ) include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], From c5b91585a8e5015de0f361d1b009325f188be602 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 14 Sep 2021 16:31:01 +0200 Subject: [PATCH 0049/1169] renamed fai variable and updated param schema --- main.nf | 6 +++--- nextflow_schema.json | 7 +++++++ subworkflows/local/prepare_genome.nf | 4 ++-- workflows/raredisease.nf | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 54646f05..25ee266b 100644 --- a/main.nf +++ b/main.nf @@ -17,9 +17,9 @@ nextflow.enable.dsl = 2 ======================================================================================== */ -params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') -params.fai = WorkflowMain.getGenomeAttribute(params, 'fai') -params.bwamem2 = WorkflowMain.getGenomeAttribute(params, 'bwamem2') +params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') +params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') +params.bwamem2 = WorkflowMain.getGenomeAttribute(params, 'bwamem2') /* ======================================================================================== diff --git a/nextflow_schema.json b/nextflow_schema.json index f791148c..9dd2d606 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -65,6 +65,13 @@ "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", "fa_icon": "far fa-file-code" }, + "fasta_fai": { + "type": "string", + "format": "file-path", + "help_text": "If none provided, will be generated automatically from the FASTA reference", + "description": "Path to FASTA reference index.", + "fa_icon": "fas fa-file" + }, "igenomes_base": { "type": "string", "format": "directory-path", diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index e9bd93d9..59fffed7 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -26,8 +26,8 @@ workflow PREPARE_GENOME { } ch_samtools_version = Channel.empty() - if ( params.fai ) { - ch_fai = file(params.fai) + if ( params.fasta_fai ) { + ch_fai = file(params.fasta_fai) } else { ch_fai = SAMTOOLS_FAIDX ( ch_fasta ).fai ch_samtools_version = SAMTOOLS_FAIDX.out.version diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index a3ed7ded..e0083294 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -13,7 +13,7 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, - params.bwamem2, params.fai + params.bwamem2, params.fasta_fai ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } From ef657200d7d552055162e02ed029b25fe2a6573f Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 14 Sep 2021 17:16:40 +0200 Subject: [PATCH 0050/1169] improve readibility --- workflows/raredisease.nf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e0083294..b48ef19b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -73,7 +73,10 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( op // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], samtools_faidx_options: modules['samtools_faidx'] ) +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( + bwamem2_idx_options: modules['bwa_mem2_index'], + samtools_faidx_options: modules['samtools_faidx'] +) include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], @@ -84,7 +87,7 @@ include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( samtools_merge_options: modules['samtools_merge'], markduplicates_options: modules['picard_markduplicates'], samtools_idx_md_options: modules['samtools_index_md'], - ) +) /* ======================================================================================== From ef8e4e1482c464f555f13e41081746e041a5fed1 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 15 Sep 2021 15:04:00 +0200 Subject: [PATCH 0051/1169] DONE --- subworkflows/local/deepvariant_caller.nf | 4 ++-- workflows/raredisease.nf | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index aa4a06d7..70319a81 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -4,7 +4,7 @@ params.deepvariant_options = [:] -include { DEEPVARIANT } from '../../modules/local/depvariant/main' addParams( options: params.deepvariant_options ) +include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( options: params.deepvariant_options ) workflow DEEPVARIANT_CALLER { take: @@ -16,7 +16,7 @@ workflow DEEPVARIANT_CALLER { emit: vcf = DEEPVARIANT.out.vcf - gvcf = DEEPVARIANT.out.gvf + gvcf = DEEPVARIANT.out.gvcf // Collect versions deepvariant_version = DEEPVARIANT.out.version diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f0c8b5f3..06e99b3f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -133,7 +133,9 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. - DEEPVARIANT_CALLER ( MAPPING.out.marked_bam, ch_fasta ) + DEEPVARIANT_CALLER (MAPPING.out.marked_bam.join(MAPPING.out.marked_bai), + PREPARE_GENOME.out.fasta.combine(PREPARE_GENOME.out.fai) + ) ch_software_versions = ch_software_versions.mix(DEEPVARIANT_CALLER.out.deepvariant_version.ifEmpty(null)) // From ecc3a235bdddfd0278d3305378486521ee245880 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 17 Sep 2021 10:15:17 +0200 Subject: [PATCH 0052/1169] refactored reference files to be consumed separately --- modules/local/deepvariant/main.nf | 3 ++- subworkflows/local/deepvariant_caller.nf | 5 +++-- workflows/raredisease.nf | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/modules/local/deepvariant/main.nf b/modules/local/deepvariant/main.nf index e9139ee6..c685c18f 100644 --- a/modules/local/deepvariant/main.nf +++ b/modules/local/deepvariant/main.nf @@ -19,7 +19,8 @@ process DEEPVARIANT { input: tuple val(meta), path(bam), path(bai) - tuple path(fasta), path(fai) + path(fasta) + path(fai) output: tuple val(meta), path("*.vcf.gz"), emit: vcf diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 70319a81..96f9ca66 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -9,10 +9,11 @@ include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( workflow DEEPVARIANT_CALLER { take: bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // channel: [ path(fasta), path(fai) ] + fasta // path(fasta) + fai // path(fai) main: - DEEPVARIANT ( bam, fasta ) + DEEPVARIANT ( bam, fasta, fai ) emit: vcf = DEEPVARIANT.out.vcf diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 06e99b3f..0214c1e1 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -133,8 +133,10 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. - DEEPVARIANT_CALLER (MAPPING.out.marked_bam.join(MAPPING.out.marked_bai), - PREPARE_GENOME.out.fasta.combine(PREPARE_GENOME.out.fai) + DEEPVARIANT_CALLER ( + MAPPING.out.marked_bam.join(MAPPING.out.marked_bai), + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.fai ) ch_software_versions = ch_software_versions.mix(DEEPVARIANT_CALLER.out.deepvariant_version.ifEmpty(null)) From 30af5d4702fb60dcc8ff65f977644515aa99412e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 19 Sep 2021 23:22:16 +0200 Subject: [PATCH 0053/1169] add glnexus module --- conf/modules.config | 4 ++ modules/local/glnexus/functions.nf | 68 ++++++++++++++++++++++++++++++ modules/local/glnexus/main.nf | 40 ++++++++++++++++++ modules/local/glnexus/meta.yml | 33 +++++++++++++++ 4 files changed, 145 insertions(+) create mode 100644 modules/local/glnexus/functions.nf create mode 100644 modules/local/glnexus/main.nf create mode 100644 modules/local/glnexus/meta.yml diff --git a/conf/modules.config b/conf/modules.config index 21c086cd..78556130 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -32,6 +32,10 @@ params { args = '-M -K 100000000' publish_files = false } + 'glnexus' { + args = '--config DeepVariant_unfiltered' + publish_dir = 'glnexus' + } 'picard_markduplicates' { suffix = '.sorted.md' publish_dir = 'markduplicates' diff --git a/modules/local/glnexus/functions.nf b/modules/local/glnexus/functions.nf new file mode 100644 index 00000000..da9da093 --- /dev/null +++ b/modules/local/glnexus/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/local/glnexus/main.nf b/modules/local/glnexus/main.nf new file mode 100644 index 00000000..6c6313c6 --- /dev/null +++ b/modules/local/glnexus/main.nf @@ -0,0 +1,40 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process GLNEXUS_MERGE { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + +// conda (params.enable_conda ? "YOUR-TOOL-HERE" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "docker://clinicalgenomics/glnexus:v1.4.1" + } else { + container "clinicalgenomics/glnexus:v1.4.1" + } + + input: + tuple val(meta), path(gvcfs) + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + """ + glnexus_cli \\ + --threads $task.cpus --mem-gbytes $task.memory \\ + $options.args \\ + $gvcfs \\ + > ${prefix}.bcf + + echo \$(glnexus_cli) | | head -n 1 | sed 's/^.*release //; s/ .*$//' > ${software}.version.txt + """ +} diff --git a/modules/local/glnexus/meta.yml b/modules/local/glnexus/meta.yml new file mode 100644 index 00000000..a38dcb77 --- /dev/null +++ b/modules/local/glnexus/meta.yml @@ -0,0 +1,33 @@ +name: glnexus +description: merge gVCF files and perform joint variant calling +keywords: + - merge + - gvcf +tools: + - glnexus: + description: | + GLnexus allows gVCF merging and joint variant calling for population sequencing + projects in a scalable fashion. + homepage: https://github.com/dnanexus-rnd/GLnexus + documentation: https://github.com/dnanexus-rnd/GLnexus/wiki/Getting-Started +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - gvcfs: + type: file + description: Input genomic vcf files +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: Compressed VCF file + pattern: "*.vcf.gz" +authors: + - "@ramprasadn" From 3490e30dc1415b767d611c774a4ab8f37f3f6f5e Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 21 Sep 2021 11:27:56 +0200 Subject: [PATCH 0054/1169] refactor merge process and updated markdupe module --- conf/modules.config | 4 +- modules.json | 2 +- .../modules/picard/markduplicates/main.nf | 7 +- .../modules/picard/markduplicates/meta.yml | 83 ++++++++++--------- subworkflows/nf-core/mapping.nf | 21 +++-- 5 files changed, 62 insertions(+), 55 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 85d386b0..8d3421bf 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -36,6 +36,7 @@ params { args = '--model_type=WGS' } 'picard_markduplicates' { + args = '--CREATE_INDEX' suffix = '.sorted.md' publish_dir = 'markduplicates' } @@ -45,9 +46,6 @@ params { 'samtools_index' { publish_files = false } - 'samtools_index_md' { - publish_dir = 'markduplicates' - } 'samtools_merge' { publish_files = false } diff --git a/modules.json b/modules.json index d3b5ceb9..1636fe70 100644 --- a/modules.json +++ b/modules.json @@ -16,7 +16,7 @@ "git_sha": "c5235a983d454787fa0c3247b02086969217163b" }, "picard/markduplicates": { - "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + "git_sha": "b2a6f5409efa6eb065c8186c606e68ff8004ba51" }, "samtools/faidx": { "git_sha": "c5235a983d454787fa0c3247b02086969217163b" diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index d20014bf..ac829515 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -23,6 +23,7 @@ process PICARD_MARKDUPLICATES { output: tuple val(meta), path("*.bam") , emit: bam + tuple val(meta), path("*.bai") , optional:true, emit: bai tuple val(meta), path("*.metrics.txt"), emit: metrics path "*.version.txt" , emit: version @@ -40,9 +41,9 @@ process PICARD_MARKDUPLICATES { -Xmx${avail_mem}g \\ MarkDuplicates \\ $options.args \\ - INPUT=$bam \\ - OUTPUT=${prefix}.bam \\ - METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt + -I $bam \\ + -O ${prefix}.bam \\ + -M ${prefix}.MarkDuplicates.metrics.txt echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d: > ${software}.version.txt """ diff --git a/modules/nf-core/modules/picard/markduplicates/meta.yml b/modules/nf-core/modules/picard/markduplicates/meta.yml index 6420ce9a..b651b3a0 100644 --- a/modules/nf-core/modules/picard/markduplicates/meta.yml +++ b/modules/nf-core/modules/picard/markduplicates/meta.yml @@ -1,46 +1,51 @@ name: picard_markduplicates description: Locate and tag duplicate reads in a BAM file keywords: - - markduplicates - - pcr - - duplicates - - bam - - sam - - cram + - markduplicates + - pcr + - duplicates + - bam + - sam + - cram tools: - - picard: - description: | - A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) - data and formats such as SAM/BAM/CRAM and VCF. - homepage: https://broadinstitute.github.io/picard/ - documentation: https://broadinstitute.github.io/picard/ + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file - pattern: "*.{bam}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file with duplicate reads marked/removed - pattern: "*.{bam}" - - metrics: - type: file - description: Duplicate metrics file generated by picard - pattern: "*.{metrics.txt}" - - version: - type: file - description: File containing software version - pattern: "*.{version.txt}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file with duplicate reads marked/removed + pattern: "*.{bam}" + - bai: + type: file + description: An optional BAM index file. If desired, --CREATE_INDEX must be passed as a flag + pattern: "*.{bai}" + - metrics: + type: file + description: Duplicate metrics file generated by picard + pattern: "*.{metrics.txt}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" authors: - - "@drpatelh" + - "@drpatelh" + - "@projectoriented" diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 74901e67..98951847 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -15,7 +15,6 @@ include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/ma include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams( options: params.samtools_merge_options ) -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' addParams(options: params.samtools_idx_md_options ) include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' addParams(options: params.markduplicates_options ) @@ -40,23 +39,27 @@ workflow MAPPING { new_meta = meta.clone() new_meta.id = new_meta.id.split('_')[0] [new_meta, bam] - }.groupTuple().branch{ + }.groupTuple(by: 0).branch{ single: it[1].size() == 1 multiple: it[1].size() > 1 - }.set{ bams_to_merge } + }.set{ bams } - SAMTOOLS_MERGE ( bams_to_merge.multiple ) - merged_bam = bams_to_merge.single.mix(SAMTOOLS_MERGE.out.bam) + // If there are no samples to merge, skip the process + if ( bams.multiple.ifEmpty(false) ) { + prepared_bam = bams.single + } else { + SAMTOOLS_MERGE ( bams.multiple ) + prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) + } - // Marking duplicates + index - MARKDUPLICATES ( merged_bam ) - SAMTOOLS_INDEX_MD ( MARKDUPLICATES.out.bam ) + // Marking duplicates + MARKDUPLICATES ( prepared_bam ) emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] metrics = MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] marked_bam = MARKDUPLICATES.out.bam // channel: [ val(meta), [ marked_bam ] ] - marked_bai = SAMTOOLS_INDEX_MD.out.bai // channel: [ val(meta), [ marked_bai ] ] + marked_bai = MARKDUPLICATES.out.bai // channel: [ val(meta), [ marked_bai ] ] // Collect versions bwamem2_version = BWAMEM2_MEM.out.version // path: *.version.txt From 4dc6ec2a958da6b2e576026e45d538101f9cdb02 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 21 Sep 2021 16:21:06 +0200 Subject: [PATCH 0055/1169] removed the conditional --- subworkflows/nf-core/mapping.nf | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 98951847..ec9116e8 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -44,13 +44,9 @@ workflow MAPPING { multiple: it[1].size() > 1 }.set{ bams } - // If there are no samples to merge, skip the process - if ( bams.multiple.ifEmpty(false) ) { - prepared_bam = bams.single - } else { - SAMTOOLS_MERGE ( bams.multiple ) - prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) - } + // TODO: If there are no samples to merge, skip the process + SAMTOOLS_MERGE ( bams.multiple ) + prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) // Marking duplicates MARKDUPLICATES ( prepared_bam ) From 841cf4038c2fe5f8cf1f440dc57444207bc25928 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Sep 2021 19:32:10 +0200 Subject: [PATCH 0056/1169] install nf-core module --- modules.json | 3 ++ modules/local/glnexus/meta.yml | 33 ----------------- .../modules}/glnexus/functions.nf | 0 .../modules}/glnexus/main.nf | 31 ++++++++++------ modules/nf-core/modules/glnexus/meta.yml | 36 +++++++++++++++++++ 5 files changed, 59 insertions(+), 44 deletions(-) delete mode 100644 modules/local/glnexus/meta.yml rename modules/{local => nf-core/modules}/glnexus/functions.nf (100%) rename modules/{local => nf-core/modules}/glnexus/main.nf (50%) create mode 100644 modules/nf-core/modules/glnexus/meta.yml diff --git a/modules.json b/modules.json index d3b5ceb9..c1b966b4 100644 --- a/modules.json +++ b/modules.json @@ -12,6 +12,9 @@ "fastqc": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, + "glnexus": { + "git_sha": "25943a4c23c6ab585e740599df246b66078e966a" + }, "multiqc": { "git_sha": "c5235a983d454787fa0c3247b02086969217163b" }, diff --git a/modules/local/glnexus/meta.yml b/modules/local/glnexus/meta.yml deleted file mode 100644 index a38dcb77..00000000 --- a/modules/local/glnexus/meta.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: glnexus -description: merge gVCF files and perform joint variant calling -keywords: - - merge - - gvcf -tools: - - glnexus: - description: | - GLnexus allows gVCF merging and joint variant calling for population sequencing - projects in a scalable fashion. - homepage: https://github.com/dnanexus-rnd/GLnexus - documentation: https://github.com/dnanexus-rnd/GLnexus/wiki/Getting-Started -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - gvcfs: - type: file - description: Input genomic vcf files -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: Compressed VCF file - pattern: "*.vcf.gz" -authors: - - "@ramprasadn" diff --git a/modules/local/glnexus/functions.nf b/modules/nf-core/modules/glnexus/functions.nf similarity index 100% rename from modules/local/glnexus/functions.nf rename to modules/nf-core/modules/glnexus/functions.nf diff --git a/modules/local/glnexus/main.nf b/modules/nf-core/modules/glnexus/main.nf similarity index 50% rename from modules/local/glnexus/main.nf rename to modules/nf-core/modules/glnexus/main.nf index 6c6313c6..dadb9d60 100644 --- a/modules/local/glnexus/main.nf +++ b/modules/nf-core/modules/glnexus/main.nf @@ -4,37 +4,46 @@ include { initOptions; saveFiles; getSoftwareName } from './functions' params.options = [:] options = initOptions(params.options) -process GLNEXUS_MERGE { +process GLNEXUS { tag "$meta.id" - label 'process_high' + label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } -// conda (params.enable_conda ? "YOUR-TOOL-HERE" : null) + conda (params.enable_conda ? "bioconda::glnexus=1.4.1" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "docker://clinicalgenomics/glnexus:v1.4.1" + container "https://depot.galaxyproject.org/singularity/glnexus:1.4.1--h40d77a6_0" } else { - container "clinicalgenomics/glnexus:v1.4.1" + container "quay.io/biocontainers/glnexus:1.4.1--h40d77a6_0" } input: tuple val(meta), path(gvcfs) output: - tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*.bcf"), emit: bcf path "*.version.txt" , emit: version script: def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + + // Make list of GVCFs to merge + def input = gvcfs.collect { it.toString() } + def avail_mem = 3 + if (!task.memory) { + log.info '[Glnexus] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } """ glnexus_cli \\ - --threads $task.cpus --mem-gbytes $task.memory \\ + --threads $task.cpus \\ + --mem-gbytes $avail_mem \\ $options.args \\ - $gvcfs \\ - > ${prefix}.bcf - - echo \$(glnexus_cli) | | head -n 1 | sed 's/^.*release //; s/ .*$//' > ${software}.version.txt + ${input.join(' ')} \\ + > ${prefix}.bcf + echo \$(glnexus_cli 2>&1) | head -n 1 | sed 's/^.*release //; s/ .*\$//' > ${software}.version.txt """ } diff --git a/modules/nf-core/modules/glnexus/meta.yml b/modules/nf-core/modules/glnexus/meta.yml new file mode 100644 index 00000000..f64a812e --- /dev/null +++ b/modules/nf-core/modules/glnexus/meta.yml @@ -0,0 +1,36 @@ +name: glnexus +description: merge gVCF files and perform joint variant calling +keywords: + - merge + - gvcf +tools: + - glnexus: + description: scalable gVCF merging and joint variant calling for population sequencing projects. + homepage: https://github.com/dnanexus-rnd/GLnexus + documentation: https://github.com/dnanexus-rnd/GLnexus/wiki/Getting-Started + tool_dev_url: None + doi: https://doi.org/10.1101/343970 + licence: ['Apache License 2.0'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - gvcfs: + type: list + description: Input genomic vcf files + pattern: "*.{gvcf,gvcf.gz,g.vcf,g.vcf.gz}" + +output: + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" + - bcf: + type: file + description: merged BCF file + pattern: "*.bcf" +authors: + - "@ramprasadn" From c91149e83a23cb6cd7a129a27d65c6dff0371f46 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 24 Sep 2021 14:26:02 +0200 Subject: [PATCH 0057/1169] applying suggestions --- subworkflows/nf-core/mapping.nf | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index ec9116e8..3719c797 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -21,7 +21,7 @@ include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/ workflow MAPPING { take: reads_input // channel: [ val(meta), reads_input ] - index // channel: /path/to/bwamem2/index/ + index // channel: /path/to/bwamem2/index/ main: // Map, sort, and index @@ -35,14 +35,17 @@ workflow MAPPING { SAMTOOLS_STATS ( bam_sorted_indexed ) // Merge multiple lane samples and index - SAMTOOLS_SORT.out.bam.map{ meta, bam -> - new_meta = meta.clone() - new_meta.id = new_meta.id.split('_')[0] - [new_meta, bam] - }.groupTuple(by: 0).branch{ + SAMTOOLS_SORT.out.bam + .map{ meta, bam -> + new_meta = meta.clone() // clone to avoid overriding the global meta + new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename + [new_meta, bam]} // end the closure to return newly modified channel + .groupTuple(by: 0) // group them bam paths with the same [ samplename, [[bam path], [bam path], ..] ] + .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list single: it[1].size() == 1 multiple: it[1].size() > 1 - }.set{ bams } + } + .set{ bams } // create a new multi-channel named bams // TODO: If there are no samples to merge, skip the process SAMTOOLS_MERGE ( bams.multiple ) From 16cc5e90c350a9368beb714f98895a1494e56f47 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 24 Sep 2021 14:30:36 +0200 Subject: [PATCH 0058/1169] woops quick fix on commented code --- subworkflows/nf-core/mapping.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index 3719c797..e423babc 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -40,13 +40,15 @@ workflow MAPPING { new_meta = meta.clone() // clone to avoid overriding the global meta new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename [new_meta, bam]} // end the closure to return newly modified channel - .groupTuple(by: 0) // group them bam paths with the same [ samplename, [[bam path], [bam path], ..] ] + .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list single: it[1].size() == 1 multiple: it[1].size() > 1 } .set{ bams } // create a new multi-channel named bams + bams.multiple.view() + // TODO: If there are no samples to merge, skip the process SAMTOOLS_MERGE ( bams.multiple ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) From 8b61ad2e958b5232a6764d387c2134faf7d67b2a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Sep 2021 14:42:40 +0200 Subject: [PATCH 0059/1169] add glnexus to the deepvariant workflow --- subworkflows/local/deepvariant_caller.nf | 24 ++++++++++++++++++++++-- workflows/raredisease.nf | 3 ++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 96f9ca66..008ce493 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -5,20 +5,40 @@ params.deepvariant_options = [:] include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( options: params.deepvariant_options ) +include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams( options: params.deepvariant_options ) workflow DEEPVARIANT_CALLER { take: bam // channel: [ val(meta), path(bam), path(bai) ] fasta // path(fasta) fai // path(fai) + sample // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] main: DEEPVARIANT ( bam, fasta, fai ) + def file_list = DEEPVARIANT.out.gvcf.collect{it[1]}.toList() + + //retrieve case id for glnexus and store it in a new channel called case_meta + sample + .first() + .map{ + it -> + new_sample_meta = it.clone() + new_sample_meta.id = new_sample_meta.case_id + [ [ 'id':new_sample_meta.id ] ] } + .set {case_meta} + + //Combine case meta with the list of gvcfs + ch_sample_new.mix(file_list) + .collect() + .set { ch_gvcfs } + GLNEXUS ( ch_gvcfs ) emit: - vcf = DEEPVARIANT.out.vcf - gvcf = DEEPVARIANT.out.gvcf + vcf = GLNEXUS.out.bcf // Collect versions deepvariant_version = DEEPVARIANT.out.version + glnexus_version = GLNEXUS.out.version + } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 0214c1e1..c105a32a 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -136,7 +136,8 @@ workflow RAREDISEASE { DEEPVARIANT_CALLER ( MAPPING.out.marked_bam.join(MAPPING.out.marked_bai), PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai + PREPARE_GENOME.out.fai, + INPUT_CHECK.out.sample ) ch_software_versions = ch_software_versions.mix(DEEPVARIANT_CALLER.out.deepvariant_version.ifEmpty(null)) From c652b86fa8c6cf5413d40f38aec4be5e65aa59cc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Sep 2021 14:55:14 +0200 Subject: [PATCH 0060/1169] Fix lint --- README.md | 3 +-- subworkflows/local/deepvariant_caller.nf | 6 +++--- workflows/raredisease.nf | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e61bf69a..e8391e66 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,6 @@ ## Introduction - **nf-core/raredisease** is a bioinformatics best-practice analysis pipeline for call and score variants from WGS/WES of rare disease patients. The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! @@ -32,7 +31,7 @@ On release, automated continuous integration tests run the pipeline on a full-si 2. Map reads to reference ([`BWA mem`](http://bio-bwa.sourceforge.net/bwa.shtml), `BWA mem2`) with the option to ([`merge`](http://www.htslib.org/doc/samtools-merge.html)) 3. Mark duplicated reads ([`GATK4 MarkDuplicates`](https://gatk.broadinstitute.org/hc/en-us/articles/360037052812-MarkDuplicates-Picard-)) 4. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) - +5. Variant calling ([deepvariant](https://github.com/google/deepvariant) and [glnexus](https://github.com/dnanexus-rnd/GLnexus)) ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 008ce493..65ffdc8c 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -16,12 +16,12 @@ workflow DEEPVARIANT_CALLER { main: DEEPVARIANT ( bam, fasta, fai ) - def file_list = DEEPVARIANT.out.gvcf.collect{it[1]}.toList() + def file_list = DEEPVARIANT.out.gvcf.collect{it[1]}.toList() //retrieve case id for glnexus and store it in a new channel called case_meta sample .first() - .map{ + .map{ it -> new_sample_meta = it.clone() new_sample_meta.id = new_sample_meta.case_id @@ -29,7 +29,7 @@ workflow DEEPVARIANT_CALLER { .set {case_meta} //Combine case meta with the list of gvcfs - ch_sample_new.mix(file_list) + case_meta.mix(file_list) .collect() .set { ch_gvcfs } GLNEXUS ( ch_gvcfs ) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c105a32a..0b4af70c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -136,7 +136,7 @@ workflow RAREDISEASE { DEEPVARIANT_CALLER ( MAPPING.out.marked_bam.join(MAPPING.out.marked_bai), PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, + PREPARE_GENOME.out.fai, INPUT_CHECK.out.sample ) ch_software_versions = ch_software_versions.mix(DEEPVARIANT_CALLER.out.deepvariant_version.ifEmpty(null)) From 4b9d3b3972ab6f5640f322ddd1eb950c2031e599 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Sep 2021 14:58:18 +0200 Subject: [PATCH 0061/1169] Update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e8391e66..7a51387a 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ On release, automated continuous integration tests run the pipeline on a full-si 3. Mark duplicated reads ([`GATK4 MarkDuplicates`](https://gatk.broadinstitute.org/hc/en-us/articles/360037052812-MarkDuplicates-Picard-)) 4. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) 5. Variant calling ([deepvariant](https://github.com/google/deepvariant) and [glnexus](https://github.com/dnanexus-rnd/GLnexus)) + ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) From 1619af61e14dc7a99b8516e78a0450bbe039d61f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Sep 2021 16:12:13 +0200 Subject: [PATCH 0062/1169] suggestions from review --- subworkflows/local/deepvariant_caller.nf | 2 +- subworkflows/nf-core/mapping.nf | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 65ffdc8c..3549baae 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -16,7 +16,7 @@ workflow DEEPVARIANT_CALLER { main: DEEPVARIANT ( bam, fasta, fai ) - def file_list = DEEPVARIANT.out.gvcf.collect{it[1]}.toList() + file_list = DEEPVARIANT.out.gvcf.collect{it[1]}.toList() //retrieve case id for glnexus and store it in a new channel called case_meta sample diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/mapping.nf index e423babc..c18afd8d 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/mapping.nf @@ -47,8 +47,6 @@ workflow MAPPING { } .set{ bams } // create a new multi-channel named bams - bams.multiple.view() - // TODO: If there are no samples to merge, skip the process SAMTOOLS_MERGE ( bams.multiple ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) From 45271d970ffcef6e60ca75781ef5af020f841706 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 24 Sep 2021 16:26:34 +0200 Subject: [PATCH 0063/1169] initialized analysis_type param, Q: should it be main options or ? --- conf/modules.config | 2 +- nextflow.config | 3 +++ nextflow_schema.json | 33 ++++++++++++++++++++++++++------- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 8d3421bf..9476be41 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -33,7 +33,7 @@ params { publish_files = false } 'deepvariant' { - args = '--model_type=WGS' + args = "--model_type=${params.analysis_type}" } 'picard_markduplicates' { args = '--CREATE_INDEX' diff --git a/nextflow.config b/nextflow.config index e9fc931d..9d57bcde 100644 --- a/nextflow.config +++ b/nextflow.config @@ -20,6 +20,9 @@ params { local_genomes = null save_reference = false + // Main options + analysis_type = 'WGS' + // MultiQC options multiqc_config = null multiqc_title = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 9dd2d606..5171db6b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -44,6 +44,23 @@ } } }, + "main_options": { + "title": "Main options", + "type": "object", + "fa_icon": "fas fa-user-cog", + "description": "Options used to steer the direction of the pipeline.", + "properties": { + "analysis_type": { + "type": "string", + "default": "WGS", + "description": "Specifies which analysis type for the pipeline- either 'WGS' or 'WES'. It'll mainly change the resources consumed.", + "fa_icon": "fas fa-book", + "enum": [ + "WES" + ] + } + } + }, "reference_genome_options": { "title": "Reference genome options", "type": "object", @@ -69,8 +86,8 @@ "type": "string", "format": "file-path", "help_text": "If none provided, will be generated automatically from the FASTA reference", - "description": "Path to FASTA reference index.", - "fa_icon": "fas fa-file" + "description": "Path to FASTA genome index file.", + "fa_icon": "far fa-file-code" }, "igenomes_base": { "type": "string", @@ -89,10 +106,11 @@ }, "bwamem2": { "type": "string", - "format": "file-path", - "fa_icon": "fas fa-copy", - "description": "Path to directory for pre-built bwamem2 index.", - "help_text": "> **NB** If none provided, will be generated automatically from the FASTA reference." + "format": "directory-path", + "description": "Directory for pre-built bwamem2 index.", + "help_text": "If none provided, will be generated automatically from the FASTA reference.", + "fa_icon": "fas fa-folder-open", + "hidden": true }, "save_reference": { "type": "boolean", @@ -103,8 +121,9 @@ }, "local_genomes": { "type": "string", + "format": "directory-path", "fa_icon": "fas fa-map-marker-alt", - "description": "Directory / URL base for genomes references.", + "description": "Local directory base for genomes references.", "help_text": "All files are supposed to be in the same folder defining a flat structure" } } From 814aff3f0f3914acb85347bab464cfde0b50414a Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 24 Sep 2021 17:21:30 +0200 Subject: [PATCH 0064/1169] fixed fails --- nextflow_schema.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index 5171db6b..237c3711 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -56,6 +56,7 @@ "description": "Specifies which analysis type for the pipeline- either 'WGS' or 'WES'. It'll mainly change the resources consumed.", "fa_icon": "fas fa-book", "enum": [ + "WGS", "WES" ] } @@ -321,6 +322,9 @@ { "$ref": "#/definitions/input_output_options" }, + { + "$ref": "#/definitions/main_options" + }, { "$ref": "#/definitions/reference_genome_options" }, From 4088729951837c2a1b9b0adcfd66ac57ac91bed9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 27 Sep 2021 13:08:24 +0200 Subject: [PATCH 0065/1169] Code review suggestions & refactoring --- subworkflows/local/deepvariant_caller.nf | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 3549baae..d0252070 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -16,7 +16,9 @@ workflow DEEPVARIANT_CALLER { main: DEEPVARIANT ( bam, fasta, fai ) - file_list = DEEPVARIANT.out.gvcf.collect{it[1]}.toList() + DEEPVARIANT.out.gvcf.collect{it[1]} + .toList() + .set { file_list } //retrieve case id for glnexus and store it in a new channel called case_meta sample @@ -28,9 +30,8 @@ workflow DEEPVARIANT_CALLER { [ [ 'id':new_sample_meta.id ] ] } .set {case_meta} - //Combine case meta with the list of gvcfs - case_meta.mix(file_list) - .collect() + //Combine case_meta with the list of gvcfs + case_meta.combine(file_list) .set { ch_gvcfs } GLNEXUS ( ch_gvcfs ) From 928bb73b38c311aa720d8acd23363b63294fe357 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 27 Sep 2021 13:32:20 +0200 Subject: [PATCH 0066/1169] Make it pretty --- subworkflows/local/deepvariant_caller.nf | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index d0252070..a8877d13 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -9,18 +9,24 @@ include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams workflow DEEPVARIANT_CALLER { take: - bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // path(fasta) - fai // path(fai) - sample // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] + bam // channel: [ val(meta), path(bam), path(bai) ] + sample // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] + fasta // path(fasta) + fai // path(fai) main: + + // + // Call variants with deepvariant and collect the output in a new channel + // DEEPVARIANT ( bam, fasta, fai ) DEEPVARIANT.out.gvcf.collect{it[1]} .toList() .set { file_list } - //retrieve case id for glnexus and store it in a new channel called case_meta + // + // Retrieve case id for glnexus and store it in a new channel called case_meta + // sample .first() .map{ @@ -30,7 +36,9 @@ workflow DEEPVARIANT_CALLER { [ [ 'id':new_sample_meta.id ] ] } .set {case_meta} - //Combine case_meta with the list of gvcfs + // + // Combine case_meta with the list of gvcfs and run GLnexus + // case_meta.combine(file_list) .set { ch_gvcfs } GLNEXUS ( ch_gvcfs ) @@ -38,7 +46,9 @@ workflow DEEPVARIANT_CALLER { emit: vcf = GLNEXUS.out.bcf + // // Collect versions + // deepvariant_version = DEEPVARIANT.out.version glnexus_version = GLNEXUS.out.version From 7fa703f86ff706415c16509777670a6c5bc1220a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 27 Sep 2021 14:55:18 +0200 Subject: [PATCH 0067/1169] revert changes --- subworkflows/local/deepvariant_caller.nf | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index a8877d13..261648a0 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -9,24 +9,18 @@ include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams workflow DEEPVARIANT_CALLER { take: - bam // channel: [ val(meta), path(bam), path(bai) ] - sample // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] - fasta // path(fasta) - fai // path(fai) + bam // channel: [ val(meta), path(bam), path(bai) ] + fasta // path(fasta) + fai // path(fai) + sample // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] main: - - // - // Call variants with deepvariant and collect the output in a new channel - // DEEPVARIANT ( bam, fasta, fai ) DEEPVARIANT.out.gvcf.collect{it[1]} .toList() .set { file_list } - // - // Retrieve case id for glnexus and store it in a new channel called case_meta - // + //retrieve case id for glnexus and store it in a new channel called case_meta sample .first() .map{ @@ -36,9 +30,7 @@ workflow DEEPVARIANT_CALLER { [ [ 'id':new_sample_meta.id ] ] } .set {case_meta} - // - // Combine case_meta with the list of gvcfs and run GLnexus - // + //Combine case meta with the list of gvcfs case_meta.combine(file_list) .set { ch_gvcfs } GLNEXUS ( ch_gvcfs ) @@ -46,9 +38,7 @@ workflow DEEPVARIANT_CALLER { emit: vcf = GLNEXUS.out.bcf - // // Collect versions - // deepvariant_version = DEEPVARIANT.out.version glnexus_version = GLNEXUS.out.version From 151aa26a8faa841d72652aabb06ae4c346e664cc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 27 Sep 2021 15:23:39 +0200 Subject: [PATCH 0068/1169] Update glnexus recipe --- subworkflows/local/deepvariant_caller.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 261648a0..3aca8bd8 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -5,7 +5,7 @@ params.deepvariant_options = [:] include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( options: params.deepvariant_options ) -include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams( options: params.deepvariant_options ) +include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams( options: params.glnexus_options ) workflow DEEPVARIANT_CALLER { take: From 1c2f841b06b6e7ddae0c24eff11d751f4251f50a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 27 Sep 2021 15:30:11 +0200 Subject: [PATCH 0069/1169] Initiate glnexus parameters with default --- subworkflows/local/deepvariant_caller.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 3aca8bd8..2d76b92a 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -3,6 +3,7 @@ // params.deepvariant_options = [:] +params.glnexus_options = [:] include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( options: params.deepvariant_options ) include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams( options: params.glnexus_options ) From d12ee58f5fc0a86ea9c45a42ebc429caaa612b40 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 28 Sep 2021 16:12:34 +0200 Subject: [PATCH 0070/1169] create a case_info channel containing case_id --- subworkflows/local/deepvariant_caller.nf | 14 +----- subworkflows/local/input_check.nf | 57 ++++++++++++++---------- workflows/raredisease.nf | 2 +- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 2d76b92a..eb607ae5 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -13,7 +13,7 @@ workflow DEEPVARIANT_CALLER { bam // channel: [ val(meta), path(bam), path(bai) ] fasta // path(fasta) fai // path(fai) - sample // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] + ch_case_info // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] main: DEEPVARIANT ( bam, fasta, fai ) @@ -21,18 +21,8 @@ workflow DEEPVARIANT_CALLER { .toList() .set { file_list } - //retrieve case id for glnexus and store it in a new channel called case_meta - sample - .first() - .map{ - it -> - new_sample_meta = it.clone() - new_sample_meta.id = new_sample_meta.case_id - [ [ 'id':new_sample_meta.id ] ] } - .set {case_meta} - //Combine case meta with the list of gvcfs - case_meta.combine(file_list) + ch_case_info.combine(file_list) .set { ch_gvcfs } GLNEXUS ( ch_gvcfs ) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 027eec3c..b06170b7 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -1,5 +1,5 @@ // -// Check input samplesheet and get read channels +// Check input samplesheet and get read, sample, and case channels // params.options = [:] @@ -8,53 +8,64 @@ include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addPa workflow INPUT_CHECK { take: - samplesheet // file: /path/to/samplesheet.csv + samplesheet // file: /path/to/samplesheet.csv main: - SAMPLESHEET_CHECK ( samplesheet ) - .splitCsv ( header:true, sep:',' ) - .set { sheet } + SAMPLESHEET_CHECK ( samplesheet ) + .splitCsv ( header:true, sep:',' ) + .set { sheet } - reads = sheet.map { create_fastq_channels(it) } - sample = sheet.map { create_sample_channels(it) } + ch_case_info = sheet.first() + .map { create_case_channel(it) } + reads = sheet.map { create_fastq_channel(it) } + samples = sheet.map { create_samples_channel(it) } emit: - reads // channel: [ val(meta), [ reads ] ] - sample // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] + ch_case_info // channel: [ case_id ] + reads // channel: [ val(meta), [ reads ] ] + samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def create_fastq_channels(LinkedHashMap row) { +def create_fastq_channel(LinkedHashMap row) { + // create meta map def meta = [:] meta.id = row.sample meta.single_end = row.single_end.toBoolean() - // TODO: add read group to the meta map - - def array = [] + // add path(s) of the fastq file(s) to the meta map + def fastq_file_meta = [] if (!file(row.fastq_1).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" } if (meta.single_end) { - array = [ meta, [ file(row.fastq_1) ] ] + fastq_file_meta = [ meta, [ file(row.fastq_1) ] ] } else { if (!file(row.fastq_2).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" } - array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] + fastq_file_meta = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] } - return array + return fastq_file_meta } // Function to get a list of metadata (e.g. pedigree, case id) from the sample; [ meta ] -def create_sample_channels(LinkedHashMap row) { - def sample = [:] - sample.id = row.sample - sample.gender = row.gender +def create_samples_channel(LinkedHashMap row) { + def sample = [:] + sample.id = row.sample + sample.gender = row.gender sample.phenotype = row.phenotype - sample.maternal = row.maternal_id - sample.paternal = row.paternal_id - sample.case_id = row.case_id + sample.maternal = row.maternal_id + sample.paternal = row.paternal_id + sample.case_id = row.case_id return sample } + +// Function to get a list of metadata (e.g. case id) for the case [ meta ] +def create_case_channel(LinkedHashMap row) { + def case_info = [:] + case_info.id = row.case_id + + return case_info +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 0b4af70c..1ec3da87 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -137,7 +137,7 @@ workflow RAREDISEASE { MAPPING.out.marked_bam.join(MAPPING.out.marked_bai), PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, - INPUT_CHECK.out.sample + INPUT_CHECK.out.ch_case_info ) ch_software_versions = ch_software_versions.mix(DEEPVARIANT_CALLER.out.deepvariant_version.ifEmpty(null)) From b136b2b1eb289886ae70298651385c6abff5e3ac Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 29 Sep 2021 16:53:19 +0200 Subject: [PATCH 0071/1169] update comment --- subworkflows/local/deepvariant_caller.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index eb607ae5..d308d40f 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -10,10 +10,10 @@ include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams workflow DEEPVARIANT_CALLER { take: - bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // path(fasta) - fai // path(fai) - ch_case_info // channel: [ sample, sex, phenotype, paternal_id, maternal_id, case_id ] + bam // channel: [ val(meta), path(bam), path(bai) ] + fasta // path(fasta) + fai // path(fai) + ch_case_info // channel: [ case_id ] main: DEEPVARIANT ( bam, fasta, fai ) From 7e0940175915c29ed246a502d3d7a4a7bbca6f8e Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 30 Sep 2021 13:12:05 +0200 Subject: [PATCH 0072/1169] first commit --- nextflow.config | 4 ++- nextflow_schema.json | 28 ++++++++++++++++--- .../nf-core/{mapping.nf => align_bwamem2.nf} | 3 +- workflows/raredisease.nf | 20 ++++++------- 4 files changed, 38 insertions(+), 17 deletions(-) rename subworkflows/nf-core/{mapping.nf => align_bwamem2.nf} (98%) diff --git a/nextflow.config b/nextflow.config index e9fc931d..6ffb379e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -9,7 +9,6 @@ // Global default params, used in configs params { - // TODO nf-core: Specify your pipeline's command line flags // Input options input = null @@ -20,6 +19,9 @@ params { local_genomes = null save_reference = false + // Alignment + aligner = 'bwamem2' + // MultiQC options multiqc_config = null multiqc_title = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 9dd2d606..b9bf8523 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -87,12 +87,12 @@ "hidden": true, "help_text": "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`." }, - "bwamem2": { + "bwamem2_index": { "type": "string", - "format": "file-path", - "fa_icon": "fas fa-copy", + "format": "path", + "fa_icon": "fas fa-bezier-curve", "description": "Path to directory for pre-built bwamem2 index.", - "help_text": "> **NB** If none provided, will be generated automatically from the FASTA reference." + "help_text": "If none provided, will be generated automatically from the FASTA reference." }, "save_reference": { "type": "boolean", @@ -109,6 +109,23 @@ } } }, + "alignment_options": { + "title": "Alignment options", + "type": "object", + "fa_icon": "fas fa-map-signs", + "description": "Options to adjust parameters and filtering criteria for read alignments.", + "properties": { + "aligner": { + "type": "string", + "default": "bwamem2", + "description": "Specifies the alignment algorithm to use - available options are 'bwamem2'.", + "fa_icon": "fas fa-map-signs", + "enum": [ + "bwamem2" + ] + } + } + }, "institutional_config_options": { "title": "Institutional config options", "type": "object", @@ -305,6 +322,9 @@ { "$ref": "#/definitions/reference_genome_options" }, + { + "$ref": "#/definitions/alignment_options" + }, { "$ref": "#/definitions/institutional_config_options" }, diff --git a/subworkflows/nf-core/mapping.nf b/subworkflows/nf-core/align_bwamem2.nf similarity index 98% rename from subworkflows/nf-core/mapping.nf rename to subworkflows/nf-core/align_bwamem2.nf index c18afd8d..0e97bc95 100644 --- a/subworkflows/nf-core/mapping.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -8,7 +8,6 @@ params.samtools_sort_options = [:] params.samtools_stats_options = [:] params.samtools_merge_options = [:] params.markduplicates_options = [:] -params.samtools_idx_md_options = [:] include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_options ) @@ -18,7 +17,7 @@ include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/ma include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' addParams(options: params.markduplicates_options ) -workflow MAPPING { +workflow ALIGN_BWAMEM2 { take: reads_input // channel: [ val(meta), reads_input ] index // channel: /path/to/bwamem2/index/ diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 0b4af70c..18ebdd67 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -9,7 +9,6 @@ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters WorkflowRaredisease.initialise(params, log) -// TODO nf-core: Add all file path parameters for the pipeline to the list below // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, @@ -78,15 +77,14 @@ include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams samtools_faidx_options: modules['samtools_faidx'] ) -include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( +include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' addParams( bwamem2_idx_options: modules['bwa_mem2_index'], bwamem2_mem_options: modules['bwa_mem2_mem'], samtools_idx_options: modules['samtools_index'], samtools_sort_options: modules['samtools_sort'], samtools_stats_options: modules['samtools_stats'], samtools_merge_options: modules['samtools_merge'], - markduplicates_options: modules['picard_markduplicates'], - samtools_idx_md_options: modules['samtools_index_md'], + markduplicates_options: modules['picard_markduplicates'] ) @@ -125,16 +123,18 @@ workflow RAREDISEASE { // STEP 0: PREPARE GENOME REFERENCES AND INDICES. PREPARE_GENOME ( params.fasta ) - // STEP 1: MAPPING READS, FETCH STATS, AND MERGE. - MAPPING ( INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) - ch_software_versions = ch_software_versions.mix(MAPPING.out.bwamem2_version.ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(MAPPING.out.picard_version.ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(MAPPING.out.samtools_version.ifEmpty(null)) + // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. + if (params.aligner == 'bwamem2') { + ALIGN_BWAMEM2 ( INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) + ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.bwamem2_version.ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.picard_version.ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.samtools_version.ifEmpty(null)) + } // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. DEEPVARIANT_CALLER ( - MAPPING.out.marked_bam.join(MAPPING.out.marked_bai), + ALIGN_BWAMEM2.out.marked_bam.join(ALIGN_BWAMEM2.out.marked_bai), PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, INPUT_CHECK.out.sample From 0ad3e8e2e0e222d0bcc66fc4cdb6c334c0730759 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 30 Sep 2021 13:18:48 +0200 Subject: [PATCH 0073/1169] update bwamem2 param names --- main.nf | 6 +++--- subworkflows/local/prepare_genome.nf | 2 +- workflows/raredisease.nf | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/main.nf b/main.nf index 25ee266b..638f8a87 100644 --- a/main.nf +++ b/main.nf @@ -17,9 +17,9 @@ nextflow.enable.dsl = 2 ======================================================================================== */ -params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') -params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') -params.bwamem2 = WorkflowMain.getGenomeAttribute(params, 'bwamem2') +params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') +params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') +params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') /* ======================================================================================== diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 59fffed7..67f18d6f 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -18,7 +18,7 @@ workflow PREPARE_GENOME { ch_bwamem2_version = Channel.empty() // Fetch BWAMEM2 index or create from scratch if required - if ( params.bwamem2 && file(params.bwamem2, checkIfExists:true) ) { + if ( params.bwamem2_index && file(params.bwamem2_index, checkIfExists:true) ) { ch_bwamem2_index = file(params.bwamem2) } else { ch_bwamem2_index = BWAMEM2_INDEX ( ch_fasta ).index diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 18ebdd67..10e0aaba 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -12,7 +12,7 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, - params.bwamem2, params.fasta_fai + params.bwamem2_index, params.fasta_fai ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } From 423b879d7fe1023a1c780b84beb1be3e1826d07b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 30 Sep 2021 19:04:19 +0200 Subject: [PATCH 0074/1169] add bcftools norm to deepvar subworkflow --- conf/modules.config | 47 ++++++----- modules.json | 3 + .../modules/bcftools/norm/functions.nf | 78 +++++++++++++++++++ modules/nf-core/modules/bcftools/norm/main.nf | 45 +++++++++++ .../nf-core/modules/bcftools/norm/meta.yml | 45 +++++++++++ subworkflows/local/deepvariant_caller.nf | 8 +- workflows/raredisease.nf | 14 +++- 7 files changed, 217 insertions(+), 23 deletions(-) create mode 100644 modules/nf-core/modules/bcftools/norm/functions.nf create mode 100644 modules/nf-core/modules/bcftools/norm/main.nf create mode 100644 modules/nf-core/modules/bcftools/norm/meta.yml diff --git a/conf/modules.config b/conf/modules.config index b00de2c9..12360986 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -22,46 +22,53 @@ params { modules { - 'fastqc' { - args = '--quiet' + 'bcftools_norm_split_multiallelics' { + args = '--output-type z --multiallelics -both' + } + 'bcftools_norm_rm_duplicates' { + args = '--output-type z --rm-dup none' } 'bwa_mem2_index' { - publish_dir = 'references' + publish_dir = 'references' } 'bwa_mem2_mem' { - args = '-M -K 100000000' - publish_files = false + args = '-M -K 100000000' + publish_files = false } 'deepvariant' { - args = '--model_type=WGS' + args = '--model_type=WGS' + suffix = '_deepvar' + } + 'fastqc' { + args = '--quiet' } 'glnexus' { - args = '--config DeepVariant_unfiltered' - publish_dir = 'glnexus' + args = '--config DeepVariant_unfiltered' + publish_dir = 'glnexus' + } + 'multiqc' { + args = '' } 'picard_markduplicates' { - args = '--CREATE_INDEX' - suffix = '.sorted.md' - publish_dir = 'markduplicates' + args = '--CREATE_INDEX' + suffix = '.sorted.md' + publish_dir = 'markduplicates' } 'samtools_faidx' { - publish_dir = 'references' + publish_dir = 'references' } 'samtools_index' { - publish_files = false + publish_files = false } 'samtools_merge' { - publish_files = false + publish_files = false } 'samtools_sort' { - suffix = '.sorted' - publish_files = false + suffix = '.sorted' + publish_files = false } 'samtools_stats' { - args = '-s --remove-overlaps' - } - 'multiqc' { - args = '' + args = '-s --remove-overlaps' } } } diff --git a/modules.json b/modules.json index 45fd3a5f..6b7fb04d 100644 --- a/modules.json +++ b/modules.json @@ -3,6 +3,9 @@ "homePage": "https://github.com/nf-core/raredisease", "repos": { "nf-core/modules": { + "bcftools/norm": { + "git_sha": "906577873b66253b0d244871bfec2eeeaff73053" + }, "bwamem2/index": { "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" }, diff --git a/modules/nf-core/modules/bcftools/norm/functions.nf b/modules/nf-core/modules/bcftools/norm/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/nf-core/modules/bcftools/norm/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/bcftools/norm/main.nf b/modules/nf-core/modules/bcftools/norm/main.nf new file mode 100644 index 00000000..454fc1d2 --- /dev/null +++ b/modules/nf-core/modules/bcftools/norm/main.nf @@ -0,0 +1,45 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process BCFTOOLS_NORM { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::bcftools=1.13" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/bcftools:1.13--h3a49de5_0" + } else { + container "quay.io/biocontainers/bcftools:1.13--h3a49de5_0" + } + + input: + tuple val(meta), path(vcf) + path(fasta) + + output: + tuple val(meta), path("*.gz") , emit: vcf + path "versions.yml" , emit: version + + script: + def software = getSoftwareName(task.process) + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + """ + bcftools norm \\ + --fasta-ref ${fasta} \\ + --output ${prefix}.vcf.gz \\ + $options.args \\ + --threads $task.cpus \\ + ${vcf} + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/bcftools/norm/meta.yml b/modules/nf-core/modules/bcftools/norm/meta.yml new file mode 100644 index 00000000..f2534452 --- /dev/null +++ b/modules/nf-core/modules/bcftools/norm/meta.yml @@ -0,0 +1,45 @@ +name: bcftools_norm +description: Normalize VCF file +keywords: + - normalize + - norm + - variant calling + - VCF +tools: + - norm: + description: | + Normalize VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + The vcf file to be normalized + e.g. 'file1.vcf' + - fasta: + type: file + description: FASTA reference file + pattern: "*.{fasta,fa}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF normalized output file + pattern: "*.{vcf.gz}" + - version: + type: file + description: File containing software version + pattern: "versions.yml" +authors: + - "@abhi18av" diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 2d76b92a..9afff7eb 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -2,9 +2,13 @@ // A variant caller workflow for deepvariant // +params.split_multiallelics_options = [:] +params.rm_duplicates_options = [:] params.deepvariant_options = [:] params.glnexus_options = [:] +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: params.split_multiallelics_options ) +include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: params.rm_duplicates_options ) include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( options: params.deepvariant_options ) include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams( options: params.glnexus_options ) @@ -35,9 +39,11 @@ workflow DEEPVARIANT_CALLER { case_meta.combine(file_list) .set { ch_gvcfs } GLNEXUS ( ch_gvcfs ) + SPLIT_MULTIALLELICS (GLNEXUS.out.bcf, fasta) + REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) emit: - vcf = GLNEXUS.out.bcf + vcf = REMOVE_DUPLICATES.out.vcf // Collect versions deepvariant_version = DEEPVARIANT.out.version diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 0b4af70c..b82c2237 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -93,8 +93,18 @@ include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( // // SUBWORKFLOW: Consists of mix/local modules // - -include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' addParams( deepvariant_options: modules['deepvariant'] ) +def split_multiallelics_deepvar_sub = modules['bcftools_norm_split_multiallelics'].clone() +split_multiallelics_deepvar_sub.publish_dir = "glnexus/" +split_multiallelics_deepvar_sub.suffix = "_split" + +def rm_duplicates_deepvar_sub = modules['bcftools_norm_rm_duplicates'].clone() +rm_duplicates_deepvar_sub.publish_dir = "glnexus/" +rm_duplicates_deepvar_sub.suffix = "_split_rmdup" + +include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' addParams( deepvariant_options: modules['deepvariant'], + glnexus_options: modules['glnexus'], + rm_duplicates_options: rm_duplicates_deepvar_sub, + split_multiallelics_options: split_multiallelics_deepvar_sub ) /* ======================================================================================== From 863d203a2db3c1e8b6af318256e3a098ba91af0b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 30 Sep 2021 19:09:44 +0200 Subject: [PATCH 0075/1169] fix padding --- conf/modules.config | 2 +- workflows/raredisease.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 12360986..9ef3dc8a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -25,7 +25,7 @@ params { 'bcftools_norm_split_multiallelics' { args = '--output-type z --multiallelics -both' } - 'bcftools_norm_rm_duplicates' { + 'bcftools_norm_rm_duplicates' { args = '--output-type z --rm-dup none' } 'bwa_mem2_index' { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index b82c2237..f142b9ba 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -102,9 +102,9 @@ rm_duplicates_deepvar_sub.publish_dir = "glnexus/" rm_duplicates_deepvar_sub.suffix = "_split_rmdup" include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' addParams( deepvariant_options: modules['deepvariant'], - glnexus_options: modules['glnexus'], - rm_duplicates_options: rm_duplicates_deepvar_sub, - split_multiallelics_options: split_multiallelics_deepvar_sub ) + glnexus_options: modules['glnexus'], + rm_duplicates_options: rm_duplicates_deepvar_sub, + split_multiallelics_options: split_multiallelics_deepvar_sub ) /* ======================================================================================== From 2b1610fa80f575fbf730dbc901b1f62e4a06ffbc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 30 Sep 2021 19:47:19 +0200 Subject: [PATCH 0076/1169] update modules --- modules.json | 22 ++++---- .../modules/bwamem2/index/functions.nf | 54 +++++++++++-------- modules/nf-core/modules/bwamem2/index/main.nf | 15 ++++-- .../nf-core/modules/bwamem2/index/meta.yml | 2 +- .../nf-core/modules/bwamem2/mem/functions.nf | 54 +++++++++++-------- modules/nf-core/modules/bwamem2/mem/main.nf | 18 ++++--- modules/nf-core/modules/bwamem2/mem/meta.yml | 2 +- modules/nf-core/modules/fastqc/functions.nf | 54 +++++++++++-------- modules/nf-core/modules/fastqc/main.nf | 17 ++++-- modules/nf-core/modules/fastqc/meta.yml | 2 +- modules/nf-core/modules/glnexus/functions.nf | 54 +++++++++++-------- modules/nf-core/modules/glnexus/main.nf | 10 ++-- modules/nf-core/modules/glnexus/meta.yml | 2 +- modules/nf-core/modules/multiqc/functions.nf | 54 +++++++++++-------- modules/nf-core/modules/multiqc/main.nf | 10 ++-- modules/nf-core/modules/multiqc/meta.yml | 2 +- .../picard/markduplicates/functions.nf | 54 +++++++++++-------- .../modules/picard/markduplicates/main.nf | 9 ++-- .../modules/picard/markduplicates/meta.yml | 2 +- .../modules/samtools/faidx/functions.nf | 54 +++++++++++-------- .../nf-core/modules/samtools/faidx/main.nf | 11 ++-- .../nf-core/modules/samtools/faidx/meta.yml | 2 +- .../modules/samtools/index/functions.nf | 54 +++++++++++-------- .../nf-core/modules/samtools/index/main.nf | 9 ++-- .../nf-core/modules/samtools/index/meta.yml | 2 +- .../modules/samtools/merge/functions.nf | 54 +++++++++++-------- .../nf-core/modules/samtools/merge/main.nf | 9 ++-- .../nf-core/modules/samtools/merge/meta.yml | 2 +- .../modules/samtools/sort/functions.nf | 54 +++++++++++-------- modules/nf-core/modules/samtools/sort/main.nf | 9 ++-- .../nf-core/modules/samtools/sort/meta.yml | 2 +- .../modules/samtools/stats/functions.nf | 54 +++++++++++-------- .../nf-core/modules/samtools/stats/main.nf | 9 ++-- .../nf-core/modules/samtools/stats/meta.yml | 2 +- 34 files changed, 459 insertions(+), 305 deletions(-) diff --git a/modules.json b/modules.json index 45fd3a5f..1ea954b0 100644 --- a/modules.json +++ b/modules.json @@ -4,37 +4,37 @@ "repos": { "nf-core/modules": { "bwamem2/index": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" }, "bwamem2/mem": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "216dc8c984bfc65a5865f9c7b2e0c1bf56c9a973" }, "fastqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "ab67a1d41b63bf52fd7c147f7f8f6e8d167590b5" }, "glnexus": { - "git_sha": "25943a4c23c6ab585e740599df246b66078e966a" + "git_sha": "5c463ca6b46b0a452253f5ae5ce7b8253674cff0" }, "multiqc": { - "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + "git_sha": "ab67a1d41b63bf52fd7c147f7f8f6e8d167590b5" }, "picard/markduplicates": { - "git_sha": "b2a6f5409efa6eb065c8186c606e68ff8004ba51" + "git_sha": "e971f538a99bfa190f36f9303bede205e00b90a4" }, "samtools/faidx": { - "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + "git_sha": "9c31cf1566fa4f8660ac3973e02fe0caebe86235" }, "samtools/index": { - "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" }, "samtools/merge": { - "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" }, "samtools/sort": { - "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" }, "samtools/stats": { - "git_sha": "c5235a983d454787fa0c3247b02086969217163b" + "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" } } } diff --git a/modules/nf-core/modules/bwamem2/index/functions.nf b/modules/nf-core/modules/bwamem2/index/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/bwamem2/index/functions.nf +++ b/modules/nf-core/modules/bwamem2/index/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/bwamem2/index/main.nf b/modules/nf-core/modules/bwamem2/index/main.nf index b667f266..9274ebe8 100644 --- a/modules/nf-core/modules/bwamem2/index/main.nf +++ b/modules/nf-core/modules/bwamem2/index/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -23,13 +23,20 @@ process BWAMEM2_INDEX { output: path "bwamem2" , emit: index - path "*.version.txt", emit: version + path "versions.yml" , emit: version script: def software = getSoftwareName(task.process) """ mkdir bwamem2 - bwa-mem2 index $options.args $fasta -p bwamem2/${fasta} - echo \$(bwa-mem2 version 2>&1) > ${software}.version.txt + bwa-mem2 \\ + index \\ + $options.args \\ + $fasta -p bwamem2/${fasta} + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/bwamem2/index/meta.yml b/modules/nf-core/modules/bwamem2/index/meta.yml index 9d717f73..ee84ccfc 100644 --- a/modules/nf-core/modules/bwamem2/index/meta.yml +++ b/modules/nf-core/modules/bwamem2/index/meta.yml @@ -24,6 +24,6 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@maxulysse" diff --git a/modules/nf-core/modules/bwamem2/mem/functions.nf b/modules/nf-core/modules/bwamem2/mem/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/bwamem2/mem/functions.nf +++ b/modules/nf-core/modules/bwamem2/mem/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/bwamem2/mem/main.nf b/modules/nf-core/modules/bwamem2/mem/main.nf index 5d0ff617..ea584a39 100644 --- a/modules/nf-core/modules/bwamem2/mem/main.nf +++ b/modules/nf-core/modules/bwamem2/mem/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -24,24 +24,28 @@ process BWAMEM2_MEM { output: tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt" , emit: version + path "versions.yml" , emit: version script: - def split_cpus = Math.floor(task.cpus/2) def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" def read_group = meta.read_group ? "-R ${meta.read_group}" : "" """ INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` - bwa-mem2 mem \\ + bwa-mem2 \\ + mem \\ $options.args \\ $read_group \\ - -t ${split_cpus} \\ + -t $task.cpus \\ \$INDEX \\ $reads \\ - | samtools view $options.args2 -@ ${split_cpus} -bhS -o ${prefix}.bam - + | samtools view $options.args2 -@ $task.cpus -bhS -o ${prefix}.bam - - echo \$(bwa-mem2 version 2>&1) > ${software}.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/bwamem2/mem/meta.yml b/modules/nf-core/modules/bwamem2/mem/meta.yml index 2fc7713d..434fc7ca 100644 --- a/modules/nf-core/modules/bwamem2/mem/meta.yml +++ b/modules/nf-core/modules/bwamem2/mem/meta.yml @@ -39,6 +39,6 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@maxulysse" diff --git a/modules/nf-core/modules/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/fastqc/functions.nf +++ b/modules/nf-core/modules/fastqc/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index 39c327b2..88bfbf5b 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -24,24 +24,31 @@ process FASTQC { output: tuple val(meta), path("*.html"), emit: html tuple val(meta), path("*.zip") , emit: zip - path "*.version.txt" , emit: version + path "versions.yml" , emit: version script: // Add soft-links to original FastQs for consistent naming in pipeline - def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index 8eb9953d..48031356 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -43,7 +43,7 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/modules/glnexus/functions.nf b/modules/nf-core/modules/glnexus/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/glnexus/functions.nf +++ b/modules/nf-core/modules/glnexus/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/glnexus/main.nf b/modules/nf-core/modules/glnexus/main.nf index dadb9d60..5cff088b 100644 --- a/modules/nf-core/modules/glnexus/main.nf +++ b/modules/nf-core/modules/glnexus/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -23,7 +23,7 @@ process GLNEXUS { output: tuple val(meta), path("*.bcf"), emit: bcf - path "*.version.txt" , emit: version + path "versions.yml" , emit: version script: def software = getSoftwareName(task.process) @@ -44,6 +44,10 @@ process GLNEXUS { $options.args \\ ${input.join(' ')} \\ > ${prefix}.bcf - echo \$(glnexus_cli 2>&1) | head -n 1 | sed 's/^.*release //; s/ .*\$//' > ${software}.version.txt + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$( echo \$(glnexus_cli 2>&1) | head -n 1 | sed 's/^.*release v//; s/ .*\$//') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/glnexus/meta.yml b/modules/nf-core/modules/glnexus/meta.yml index f64a812e..fd1a407d 100644 --- a/modules/nf-core/modules/glnexus/meta.yml +++ b/modules/nf-core/modules/glnexus/meta.yml @@ -27,7 +27,7 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" - bcf: type: file description: merged BCF file diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/multiqc/functions.nf +++ b/modules/nf-core/modules/multiqc/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 8b6d6f0c..2e7ad932 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -24,12 +24,16 @@ process MULTIQC { path "*multiqc_report.html", emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots - path "*.version.txt" , emit: version + path "versions.yml" , emit: version script: def software = getSoftwareName(task.process) """ multiqc -f $options.args . - multiqc --version | sed -e "s/multiqc, version //g" > ${software}.version.txt + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS """ } diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 532a8bb1..2d99ec0d 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -32,7 +32,7 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/modules/picard/markduplicates/functions.nf b/modules/nf-core/modules/picard/markduplicates/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/picard/markduplicates/functions.nf +++ b/modules/nf-core/modules/picard/markduplicates/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index ac829515..dc8d460b 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -25,7 +25,7 @@ process PICARD_MARKDUPLICATES { tuple val(meta), path("*.bam") , emit: bam tuple val(meta), path("*.bai") , optional:true, emit: bai tuple val(meta), path("*.metrics.txt"), emit: metrics - path "*.version.txt" , emit: version + path "versions.yml" , emit: version script: def software = getSoftwareName(task.process) @@ -45,6 +45,9 @@ process PICARD_MARKDUPLICATES { -O ${prefix}.bam \\ -M ${prefix}.MarkDuplicates.metrics.txt - echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d: > ${software}.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS """ } diff --git a/modules/nf-core/modules/picard/markduplicates/meta.yml b/modules/nf-core/modules/picard/markduplicates/meta.yml index b651b3a0..db72b5c5 100644 --- a/modules/nf-core/modules/picard/markduplicates/meta.yml +++ b/modules/nf-core/modules/picard/markduplicates/meta.yml @@ -45,7 +45,7 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@drpatelh" - "@projectoriented" diff --git a/modules/nf-core/modules/samtools/faidx/functions.nf b/modules/nf-core/modules/samtools/faidx/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/samtools/faidx/functions.nf +++ b/modules/nf-core/modules/samtools/faidx/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/modules/samtools/faidx/main.nf index a89ff2bb..cdbae99b 100644 --- a/modules/nf-core/modules/samtools/faidx/main.nf +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -22,13 +22,16 @@ process SAMTOOLS_FAIDX { path fasta output: - path "*.fai" , emit: fai - path "*.version.txt", emit: version + path "*.fai" , emit: fai + path "versions.yml", emit: version script: def software = getSoftwareName(task.process) """ samtools faidx $fasta - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml index f92234d0..77d21861 100644 --- a/modules/nf-core/modules/samtools/faidx/meta.yml +++ b/modules/nf-core/modules/samtools/faidx/meta.yml @@ -25,7 +25,7 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/modules/samtools/index/functions.nf b/modules/nf-core/modules/samtools/index/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/samtools/index/functions.nf +++ b/modules/nf-core/modules/samtools/index/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index e1966fb3..c2ba4de7 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -24,12 +24,15 @@ process SAMTOOLS_INDEX { output: tuple val(meta), path("*.bai"), optional:true, emit: bai tuple val(meta), path("*.csi"), optional:true, emit: csi - path "*.version.txt" , emit: version + path "versions.yml" , emit: version script: def software = getSoftwareName(task.process) """ samtools index $options.args $bam - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml index 5d076e3b..6f7dc887 100644 --- a/modules/nf-core/modules/samtools/index/meta.yml +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -41,7 +41,7 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/modules/samtools/merge/functions.nf b/modules/nf-core/modules/samtools/merge/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/samtools/merge/functions.nf +++ b/modules/nf-core/modules/samtools/merge/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/samtools/merge/main.nf b/modules/nf-core/modules/samtools/merge/main.nf index 0182b9fd..ec574105 100644 --- a/modules/nf-core/modules/samtools/merge/main.nf +++ b/modules/nf-core/modules/samtools/merge/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -23,13 +23,16 @@ process SAMTOOLS_MERGE { output: tuple val(meta), path("${prefix}.bam"), emit: bam - path "*.version.txt" , emit: version + path "versions.yml" , emit: version script: def software = getSoftwareName(task.process) prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ samtools merge ${prefix}.bam $bams - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/merge/meta.yml b/modules/nf-core/modules/samtools/merge/meta.yml index 9092f22e..c5f15a14 100644 --- a/modules/nf-core/modules/samtools/merge/meta.yml +++ b/modules/nf-core/modules/samtools/merge/meta.yml @@ -37,7 +37,7 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@drpatelh" - "@yuukiiwa " diff --git a/modules/nf-core/modules/samtools/sort/functions.nf b/modules/nf-core/modules/samtools/sort/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/samtools/sort/functions.nf +++ b/modules/nf-core/modules/samtools/sort/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index 0a6b7048..edd558bf 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -23,13 +23,16 @@ process SAMTOOLS_SORT { output: tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt" , emit: version + path "versions.yml" , emit: version script: def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ samtools sort $options.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml index 704e8c1f..d4f70a8e 100644 --- a/modules/nf-core/modules/samtools/sort/meta.yml +++ b/modules/nf-core/modules/samtools/sort/meta.yml @@ -37,7 +37,7 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/modules/samtools/stats/functions.nf b/modules/nf-core/modules/samtools/stats/functions.nf index da9da093..85628ee0 100644 --- a/modules/nf-core/modules/samtools/stats/functions.nf +++ b/modules/nf-core/modules/samtools/stats/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 8c72d725..823b5f31 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -23,12 +23,15 @@ process SAMTOOLS_STATS { output: tuple val(meta), path("*.stats"), emit: stats - path "*.version.txt" , emit: version + path "versions.yml" , emit: version script: def software = getSoftwareName(task.process) """ samtools stats $bam > ${bam}.stats - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/modules/samtools/stats/meta.yml index b549ff5c..1c7dcc8b 100644 --- a/modules/nf-core/modules/samtools/stats/meta.yml +++ b/modules/nf-core/modules/samtools/stats/meta.yml @@ -42,6 +42,6 @@ output: - version: type: file description: File containing software version - pattern: "*.{version.txt}" + pattern: "versions.yml" authors: - "@drpatelh" From 52ba1207ac02ed74f6909e3bef14a61110f659af Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 30 Sep 2021 19:09:44 +0200 Subject: [PATCH 0077/1169] fix padding --- conf/modules.config | 2 +- workflows/raredisease.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 12360986..9ef3dc8a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -25,7 +25,7 @@ params { 'bcftools_norm_split_multiallelics' { args = '--output-type z --multiallelics -both' } - 'bcftools_norm_rm_duplicates' { + 'bcftools_norm_rm_duplicates' { args = '--output-type z --rm-dup none' } 'bwa_mem2_index' { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index b82c2237..f142b9ba 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -102,9 +102,9 @@ rm_duplicates_deepvar_sub.publish_dir = "glnexus/" rm_duplicates_deepvar_sub.suffix = "_split_rmdup" include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' addParams( deepvariant_options: modules['deepvariant'], - glnexus_options: modules['glnexus'], - rm_duplicates_options: rm_duplicates_deepvar_sub, - split_multiallelics_options: split_multiallelics_deepvar_sub ) + glnexus_options: modules['glnexus'], + rm_duplicates_options: rm_duplicates_deepvar_sub, + split_multiallelics_options: split_multiallelics_deepvar_sub ) /* ======================================================================================== From ac1d7bc29a670c1e68a7a7908b9a8f32c8ad600c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Oct 2021 11:30:36 +0200 Subject: [PATCH 0078/1169] move clone to subworkflow --- conf/modules.config | 2 +- subworkflows/local/deepvariant_caller.nf | 12 ++++++++++-- workflows/raredisease.nf | 11 ++--------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9ef3dc8a..69c4bf0a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -44,7 +44,7 @@ params { } 'glnexus' { args = '--config DeepVariant_unfiltered' - publish_dir = 'glnexus' + publish_files = 'false' } 'multiqc' { args = '' diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 9afff7eb..ecb4285b 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -7,8 +7,16 @@ params.rm_duplicates_options = [:] params.deepvariant_options = [:] params.glnexus_options = [:] -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: params.split_multiallelics_options ) -include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: params.rm_duplicates_options ) +def split_multiallelics_glnexus = params.split_multiallelics_options.clone() +split_multiallelics_glnexus.publish_files = "false" + +def rm_duplicates_glnexus = params.rm_duplicates_options.clone() +rm_duplicates_glnexus.publish_dir = "glnexus/" +rm_duplicates_glnexus.suffix = "_split_rmdup" + + +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: split_multiallelics_glnexus ) +include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: rm_duplicates_glnexus ) include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( options: params.deepvariant_options ) include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams( options: params.glnexus_options ) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f142b9ba..9f8a4daf 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -93,18 +93,11 @@ include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( // // SUBWORKFLOW: Consists of mix/local modules // -def split_multiallelics_deepvar_sub = modules['bcftools_norm_split_multiallelics'].clone() -split_multiallelics_deepvar_sub.publish_dir = "glnexus/" -split_multiallelics_deepvar_sub.suffix = "_split" - -def rm_duplicates_deepvar_sub = modules['bcftools_norm_rm_duplicates'].clone() -rm_duplicates_deepvar_sub.publish_dir = "glnexus/" -rm_duplicates_deepvar_sub.suffix = "_split_rmdup" include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' addParams( deepvariant_options: modules['deepvariant'], glnexus_options: modules['glnexus'], - rm_duplicates_options: rm_duplicates_deepvar_sub, - split_multiallelics_options: split_multiallelics_deepvar_sub ) + rm_duplicates_options: modules['bcftools_norm_rm_duplicates'], + split_multiallelics_options: modules['bcftools_norm_split_multiallelics'] ) /* ======================================================================================== From e6e5c59aaf2f8bf2904d51493fde40fedaf1cb71 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Oct 2021 14:32:58 +0200 Subject: [PATCH 0079/1169] revert changes --- subworkflows/local/deepvariant_caller.nf | 32 ++++++++++----------- subworkflows/local/input_check.nf | 36 ++++++++++++------------ 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index d308d40f..e543467a 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -10,27 +10,27 @@ include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams workflow DEEPVARIANT_CALLER { take: - bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // path(fasta) - fai // path(fai) - ch_case_info // channel: [ case_id ] + bam // channel: [ val(meta), path(bam), path(bai) ] + fasta // path(fasta + fai // path(fai) + ch_case_info // channel: [ case_id ] main: - DEEPVARIANT ( bam, fasta, fai ) - DEEPVARIANT.out.gvcf.collect{it[1]} - .toList() - .set { file_list } + DEEPVARIANT ( bam, fasta, fai ) + DEEPVARIANT.out.gvcf.collect{it[1]} + .toList() + .set { file_list } - //Combine case meta with the list of gvcfs - ch_case_info.combine(file_list) - .set { ch_gvcfs } - GLNEXUS ( ch_gvcfs ) + //Combine case meta with the list of gvcfs + ch_case_info.combine(file_list) + .set { ch_gvcfs } + GLNEXUS ( ch_gvcfs ) emit: - vcf = GLNEXUS.out.bcf + vcf = GLNEXUS.out.bcf - // Collect versions - deepvariant_version = DEEPVARIANT.out.version - glnexus_version = GLNEXUS.out.version + // Collect versions + deepvariant_version = DEEPVARIANT.out.version + glnexus_version = GLNEXUS.out.version } diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index b06170b7..b6ae1d38 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -8,45 +8,45 @@ include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addPa workflow INPUT_CHECK { take: - samplesheet // file: /path/to/samplesheet.csv + samplesheet // file: /path/to/samplesheet.csv main: - SAMPLESHEET_CHECK ( samplesheet ) - .splitCsv ( header:true, sep:',' ) - .set { sheet } + SAMPLESHEET_CHECK ( samplesheet ) + .splitCsv ( header:true, sep:',' ) + .set { sheet } - ch_case_info = sheet.first() - .map { create_case_channel(it) } - reads = sheet.map { create_fastq_channel(it) } - samples = sheet.map { create_samples_channel(it) } + ch_case_info = sheet.first() + .map { create_case_channel(it) } + reads = sheet.map { create_fastq_channel(it) } + samples = sheet.map { create_samples_channel(it) } emit: - ch_case_info // channel: [ case_id ] - reads // channel: [ val(meta), [ reads ] ] - samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] + ch_case_info // channel: [ case_id ] + reads // channel: [ val(meta), [ reads ] ] + samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def create_fastq_channel(LinkedHashMap row) { - // create meta map +def create_fastq_channels(LinkedHashMap row) { def meta = [:] meta.id = row.sample meta.single_end = row.single_end.toBoolean() - // add path(s) of the fastq file(s) to the meta map - def fastq_file_meta = [] + // TODO: add read group to the meta map + + def array = [] if (!file(row.fastq_1).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" } if (meta.single_end) { - fastq_file_meta = [ meta, [ file(row.fastq_1) ] ] + array = [ meta, [ file(row.fastq_1) ] ] } else { if (!file(row.fastq_2).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" } - fastq_file_meta = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] + array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] } - return fastq_file_meta + return array } // Function to get a list of metadata (e.g. pedigree, case id) from the sample; [ meta ] From 569974269633ec887b8491b2afbc7523febf8f60 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Oct 2021 14:51:09 +0200 Subject: [PATCH 0080/1169] fix typo --- subworkflows/local/input_check.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index b6ae1d38..2db44ce7 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -17,7 +17,7 @@ workflow INPUT_CHECK { ch_case_info = sheet.first() .map { create_case_channel(it) } - reads = sheet.map { create_fastq_channel(it) } + reads = sheet.map { create_fastq_channels(it) } samples = sheet.map { create_samples_channel(it) } emit: From faa0ef2711766f0bab71cbb89cc3a3a70b0ceda9 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 1 Oct 2021 15:42:15 +0200 Subject: [PATCH 0081/1169] applying suggestions --- subworkflows/local/prepare_genome.nf | 13 ++++++++----- workflows/raredisease.nf | 13 ++++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 67f18d6f..167e4183 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -18,13 +18,16 @@ workflow PREPARE_GENOME { ch_bwamem2_version = Channel.empty() // Fetch BWAMEM2 index or create from scratch if required - if ( params.bwamem2_index && file(params.bwamem2_index, checkIfExists:true) ) { - ch_bwamem2_index = file(params.bwamem2) - } else { - ch_bwamem2_index = BWAMEM2_INDEX ( ch_fasta ).index - ch_bwamem2_version = BWAMEM2_INDEX.out.version + if ( params.aligner == 'bwamem2' ) { + if ( params.bwamem2_index && file(params.bwamem2_index, checkIfExists:true) ) { + ch_bwamem2_index = file(params.bwamem2) + } else { + ch_bwamem2_index = BWAMEM2_INDEX ( ch_fasta ).index + ch_bwamem2_version = BWAMEM2_INDEX.out.version + } } + ch_samtools_version = Channel.empty() if ( params.fasta_fai ) { ch_fai = file(params.fasta_fai) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 10e0aaba..2550a847 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -125,7 +125,14 @@ workflow RAREDISEASE { // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. if (params.aligner == 'bwamem2') { - ALIGN_BWAMEM2 ( INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) + ALIGN_BWAMEM2 ( + INPUT_CHECK.out.reads, + PREPARE_GENOME.out.bwamem2_index + ) + + ch_bwamem2_marked_bam = ALIGN_BWAMEM2.out.marked_bam + ch_bwamem2_marked_bai = ALIGN_BWAMEM2.out.marked_bai + ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.bwamem2_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.picard_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.samtools_version.ifEmpty(null)) @@ -134,11 +141,11 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. DEEPVARIANT_CALLER ( - ALIGN_BWAMEM2.out.marked_bam.join(ALIGN_BWAMEM2.out.marked_bai), + ch_bwamem2_marked_bam.join(ch_bwamem2_marked_bai, by: [0]), PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, INPUT_CHECK.out.sample - ) + ) ch_software_versions = ch_software_versions.mix(DEEPVARIANT_CALLER.out.deepvariant_version.ifEmpty(null)) // From 64a6e5d53dff7b8b26674b901ccf6ec358a560a7 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 1 Oct 2021 15:44:07 +0200 Subject: [PATCH 0082/1169] cast away empty line --- subworkflows/local/prepare_genome.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 167e4183..8401657c 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -27,7 +27,6 @@ workflow PREPARE_GENOME { } } - ch_samtools_version = Channel.empty() if ( params.fasta_fai ) { ch_fai = file(params.fasta_fai) From 7e13e35632cce0efd32d64b0bef383ffdb6ef953 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Oct 2021 15:49:03 +0200 Subject: [PATCH 0083/1169] install module --- modules.json | 3 + .../nf-core/modules/tabix/tabix/functions.nf | 78 +++++++++++++++++++ modules/nf-core/modules/tabix/tabix/main.nf | 37 +++++++++ modules/nf-core/modules/tabix/tabix/meta.yml | 40 ++++++++++ 4 files changed, 158 insertions(+) create mode 100644 modules/nf-core/modules/tabix/tabix/functions.nf create mode 100644 modules/nf-core/modules/tabix/tabix/main.nf create mode 100644 modules/nf-core/modules/tabix/tabix/meta.yml diff --git a/modules.json b/modules.json index c571184a..4d8e37b3 100644 --- a/modules.json +++ b/modules.json @@ -38,6 +38,9 @@ }, "samtools/stats": { "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" + }, + "tabix/tabix": { + "git_sha": "7b3315591a149609e27914965f858c9a7e071564" } } } diff --git a/modules/nf-core/modules/tabix/tabix/functions.nf b/modules/nf-core/modules/tabix/tabix/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/nf-core/modules/tabix/tabix/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/tabix/tabix/main.nf b/modules/nf-core/modules/tabix/tabix/main.nf new file mode 100644 index 00000000..1574c0b5 --- /dev/null +++ b/modules/nf-core/modules/tabix/tabix/main.nf @@ -0,0 +1,37 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process TABIX_TABIX { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0" + } else { + container "quay.io/biocontainers/tabix:1.11--hdfd78af_0" + } + + input: + tuple val(meta), path(tab) + + output: + tuple val(meta), path("*.tbi"), emit: tbi + path "versions.yml" , emit: versions + + script: + """ + tabix $options.args $tab + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/tabix/tabix/meta.yml b/modules/nf-core/modules/tabix/tabix/meta.yml new file mode 100644 index 00000000..1ca58bcf --- /dev/null +++ b/modules/nf-core/modules/tabix/tabix/meta.yml @@ -0,0 +1,40 @@ +name: tabix_tabix +description: create tabix index from a sorted bgzip tab-delimited genome file +keywords: + - index + - tabix + - vcf +tools: + - tabix: + description: Generic indexer for TAB-delimited genome position files. + homepage: https://www.htslib.org/doc/tabix.html + documentation: https://www.htslib.org/doc/tabix.1.html + doi: 10.1093/bioinformatics/btq671 +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - tab: + type: file + description: TAB-delimited genome position file compressed with bgzip + pattern: "*.{bed.gz,gff.gz,sam.gz,vcf.gz}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - tbi: + type: file + description: tabix index file + pattern: "*.{tbi}" + - version: + type: file + description: File containing software version + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" + - "@maxulysse" From 620c84d87bbf8a03b517bbf733b7a54a103bd308 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Oct 2021 16:12:08 +0200 Subject: [PATCH 0084/1169] fix tabix options --- conf/modules.config | 3 +++ subworkflows/local/deepvariant_caller.nf | 8 +++++++- workflows/raredisease.nf | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 69c4bf0a..ac5009c5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -70,5 +70,8 @@ params { 'samtools_stats' { args = '-s --remove-overlaps' } + 'tabix' { + args = '' + } } } diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index dc2f6046..7c84d395 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -6,6 +6,7 @@ params.split_multiallelics_options = [:] params.rm_duplicates_options = [:] params.deepvariant_options = [:] params.glnexus_options = [:] +params.tabix_options = [:] def split_multiallelics_glnexus = params.split_multiallelics_options.clone() split_multiallelics_glnexus.publish_files = "false" @@ -19,6 +20,7 @@ include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/mod include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: rm_duplicates_glnexus ) include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( options: params.deepvariant_options ) include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams( options: params.glnexus_options ) +include { TABIX_TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' addParams( options: params.glnexus_options ) workflow DEEPVARIANT_CALLER { take: @@ -37,9 +39,13 @@ workflow DEEPVARIANT_CALLER { ch_case_info.combine(file_list) .set { ch_gvcfs } GLNEXUS ( ch_gvcfs ) + SPLIT_MULTIALLELICS (GLNEXUS.out.bcf, fasta) + REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) + TABIX_TABIX (REMOVE_DUPLICATES.out.vcf) emit: - vcf = GLNEXUS.out.bcf + vcf = REMOVE_DUPLICATES.out.vcf + tbi = TABIX_TABIX.out.tbi // Collect versions deepvariant_version = DEEPVARIANT.out.version diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 2fa2f73e..24e53d98 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -97,7 +97,8 @@ include { MAPPING } from '../subworkflows/nf-core/mapping' addParams( include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' addParams( deepvariant_options: modules['deepvariant'], glnexus_options: modules['glnexus'], rm_duplicates_options: modules['bcftools_norm_rm_duplicates'], - split_multiallelics_options: modules['bcftools_norm_split_multiallelics'] ) + split_multiallelics_options: modules['bcftools_norm_split_multiallelics'], + tabix_options: modules['tabix'] ) /* ======================================================================================== From ba62c43232c7978d3bf1bf041ac5a93c3b6e938e Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 1 Oct 2021 16:17:23 +0200 Subject: [PATCH 0085/1169] applying the naming hack :sparkles: --- workflows/raredisease.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 2550a847..f1dcd015 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -130,8 +130,8 @@ workflow RAREDISEASE { PREPARE_GENOME.out.bwamem2_index ) - ch_bwamem2_marked_bam = ALIGN_BWAMEM2.out.marked_bam - ch_bwamem2_marked_bai = ALIGN_BWAMEM2.out.marked_bai + ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam + ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.bwamem2_version.ifEmpty(null)) ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.picard_version.ifEmpty(null)) @@ -141,7 +141,7 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. DEEPVARIANT_CALLER ( - ch_bwamem2_marked_bam.join(ch_bwamem2_marked_bai, by: [0]), + ch_marked_bam.join(ch_marked_bai, by: [0]), PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, INPUT_CHECK.out.sample From 4a20a3a49a6adce49c131d27c8ebe6685a37170b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Oct 2021 16:18:34 +0200 Subject: [PATCH 0086/1169] refactor --- subworkflows/local/deepvariant_caller.nf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 7c84d395..1a2ce46c 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -15,12 +15,14 @@ def rm_duplicates_glnexus = params.rm_duplicates_options.clone() rm_duplicates_glnexus.publish_dir = "glnexus/" rm_duplicates_glnexus.suffix = "_split_rmdup" +def tabix_glnexus = params.tabix_options.clone() +tabix_glnexus.publish_dir = "glnexus/" include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: split_multiallelics_glnexus ) include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: rm_duplicates_glnexus ) include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( options: params.deepvariant_options ) include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams( options: params.glnexus_options ) -include { TABIX_TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' addParams( options: params.glnexus_options ) +include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' addParams( options: tabix_glnexus) workflow DEEPVARIANT_CALLER { take: @@ -41,11 +43,11 @@ workflow DEEPVARIANT_CALLER { GLNEXUS ( ch_gvcfs ) SPLIT_MULTIALLELICS (GLNEXUS.out.bcf, fasta) REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) - TABIX_TABIX (REMOVE_DUPLICATES.out.vcf) + TABIX (REMOVE_DUPLICATES.out.vcf) emit: vcf = REMOVE_DUPLICATES.out.vcf - tbi = TABIX_TABIX.out.tbi + tbi = TABIX.out.tbi // Collect versions deepvariant_version = DEEPVARIANT.out.version From 97a2c98acd0d840f6794255982c4aa210d108c1b Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 4 Oct 2021 16:04:23 +0200 Subject: [PATCH 0087/1169] added wes specific resources --- conf/wes.config | 21 +++++++++++++++++++++ nextflow.config | 7 ++++++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 conf/wes.config diff --git a/conf/wes.config b/conf/wes.config new file mode 100644 index 00000000..a5c239d2 --- /dev/null +++ b/conf/wes.config @@ -0,0 +1,21 @@ +/* +======================================================================================== + nf-core/raredisease Nextflow whole-exome sequencing (WES) config file +======================================================================================== + This config file is invoked when `--analysis_type` = 'WES'. + The purpose is to reduce the amount of resources used compared to WGS data. +---------------------------------------------------------------------------------------- +*/ + +process { + withLabel:process_medium { + cpus = { check_max( 3 * task.attempt, 'cpus' ) } + memory = { check_max( 30.GB * task.attempt, 'memory' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } + } + withLabel:process_high { + cpus = { check_max( 6 * task.attempt, 'cpus' ) } + memory = { check_max( 60.GB * task.attempt, 'memory' ) } + time = { check_max( 16.h * task.attempt, 'time' ) } + } +} diff --git a/nextflow.config b/nextflow.config index 9d57bcde..e3bba0bb 100644 --- a/nextflow.config +++ b/nextflow.config @@ -73,13 +73,18 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load igenomes.config if required else load custom genomes.config +// Load igenomes.config if required, else load custom genomes.config if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' } else { includeConfig 'conf/genomes.config' } +// Load wes.config if --analysis_type='WES' +if (params.analysis_type == 'WES') { + includeConfig 'conf/wes.config' +} + profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { From 22613bc55b45d3d5ffb4fc9d8e1e7d224aff36e2 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 5 Oct 2021 10:48:47 +0200 Subject: [PATCH 0088/1169] forgot 2 refactor bwamem2 to bwamem2_index --- subworkflows/local/prepare_genome.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 8401657c..5e9099d0 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -20,7 +20,7 @@ workflow PREPARE_GENOME { // Fetch BWAMEM2 index or create from scratch if required if ( params.aligner == 'bwamem2' ) { if ( params.bwamem2_index && file(params.bwamem2_index, checkIfExists:true) ) { - ch_bwamem2_index = file(params.bwamem2) + ch_bwamem2_index = file(params.bwamem2_index) } else { ch_bwamem2_index = BWAMEM2_INDEX ( ch_fasta ).index ch_bwamem2_version = BWAMEM2_INDEX.out.version From 5640983b3d14413cf0e078bf3b0a5308087012d8 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 5 Oct 2021 15:57:53 +0200 Subject: [PATCH 0089/1169] applying comment suggestions --- nextflow_schema.json | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index ac99771c..951400da 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -43,25 +43,7 @@ "fa_icon": "fas fa-file-signature" } } - }, - "main_options": { - "title": "Main options", - "type": "object", - "fa_icon": "fas fa-user-cog", - "description": "Options used to steer the direction of the pipeline.", - "properties": { - "analysis_type": { - "type": "string", - "default": "WGS", - "description": "Specifies which analysis type for the pipeline- either 'WGS' or 'WES'. It'll mainly change the resources consumed.", - "fa_icon": "fas fa-book", - "enum": [ - "WGS", - "WES" - ] - } - } - }, + }, "reference_genome_options": { "title": "Reference genome options", "type": "object", @@ -129,6 +111,24 @@ } } }, + "analysis_options": { + "title": "Analysis options", + "type": "object", + "fa_icon": "fas fa-user-cog", + "description": "Options used to steer the direction of the pipeline.", + "properties": { + "analysis_type": { + "type": "string", + "default": "WGS", + "description": "Specifies which analysis type for the pipeline- either 'WGS' or 'WES'. It'll mainly change the resources consumed.", + "fa_icon": "fas fa-book", + "enum": [ + "WGS", + "WES" + ] + } + } + }, "alignment_options": { "title": "Alignment options", "type": "object", @@ -340,10 +340,10 @@ "$ref": "#/definitions/input_output_options" }, { - "$ref": "#/definitions/main_options" + "$ref": "#/definitions/reference_genome_options" }, { - "$ref": "#/definitions/reference_genome_options" + "$ref": "#/definitions/analysis_options" }, { "$ref": "#/definitions/alignment_options" @@ -358,4 +358,4 @@ "$ref": "#/definitions/generic_options" } ] -} \ No newline at end of file +} From dc63b9aa32eb0a6f9d0bc42f810d3c7d7a6aa37e Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 6 Oct 2021 13:26:00 +0200 Subject: [PATCH 0090/1169] removed trailing white space --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 951400da..2ca0ffc6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -43,7 +43,7 @@ "fa_icon": "fas fa-file-signature" } } - }, + }, "reference_genome_options": { "title": "Reference genome options", "type": "object", @@ -358,4 +358,4 @@ "$ref": "#/definitions/generic_options" } ] -} +} \ No newline at end of file From 16fb18fedd049b65315ca7a410ac3a9f7acc6c45 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 7 Oct 2021 14:19:33 +0200 Subject: [PATCH 0091/1169] include vcf check --- bin/check_input_vcf.py | 47 +++++++++++++++++++++++++++++++ conf/genomes.config | 2 ++ conf/test.config | 4 ++- main.nf | 1 + modules/local/check_input_vcf.nf | 32 +++++++++++++++++++++ nextflow_schema.json | 6 ++++ subworkflows/local/prepare_vcf.nf | 34 ++++++++++++++++++++++ workflows/raredisease.nf | 8 +++++- 8 files changed, 132 insertions(+), 2 deletions(-) create mode 100755 bin/check_input_vcf.py create mode 100644 modules/local/check_input_vcf.nf create mode 100644 subworkflows/local/prepare_vcf.nf diff --git a/bin/check_input_vcf.py b/bin/check_input_vcf.py new file mode 100755 index 00000000..85405a3e --- /dev/null +++ b/bin/check_input_vcf.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +import sys +import gzip +import argparse + + +def parse_args(args=None): + Description = "Check that input vcf files have been normalized." + Epilog = "Example usage: python check_input_vcf.py --INPUT_VCFS ... --OUTPUT " + + parser = argparse.ArgumentParser(description=Description, epilog=Epilog) + parser.add_argument("--INPUT_VCFS", help="Input vcf files.", nargs= '*') + parser.add_argument("--OUTPUT", help="Output file containing a list of files that need to be normalized.") + return parser.parse_args(args) + + +def check_vcf(files_in, file_out): + """ + This function checks that input vcf files have been normalized with bcftools, and writes the filenames of + those that need to be normalized to a text file + + """ + + with open(file_out,'w') as out: + for file in files_in: + if file.endswith(".gz"): + with gzip.open(file,'rt') as vcf: + for line in vcf: + if line.startswith("##bcftools_norm"): + break + elif not line.startswith("#"): + out.write(file+"\n") + break + else: + print("Please compress %s using bgzip" %file ) + + + + +def main(args=None): + args = parse_args(args) + check_vcf(args.INPUT_VCFS, args.OUTPUT) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/conf/genomes.config b/conf/genomes.config index 4f9835b3..597e61fc 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -14,11 +14,13 @@ params { fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + clinvar = "${params.local_genomes}/grch37_clinvar_-20210415-.vcf.gz" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + clinvar = "${params.local_genomes}/grch38_clinvar_-20210415-.vcf.gz" } } } diff --git a/conf/test.config b/conf/test.config index 136e56ad..dbd212b2 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,5 +26,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/raredisease/dev/assets/samplesheet.csv' // Genome references - fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + clinvar = "${params.local_genomes}/grch38_clinvar_-20210415-.vcf.gz" + } diff --git a/main.nf b/main.nf index 638f8a87..927c1f6c 100644 --- a/main.nf +++ b/main.nf @@ -20,6 +20,7 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') +params.clinvar = WorkflowMain.getGenomeAttribute(params, 'clinvar') /* ======================================================================================== diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf new file mode 100644 index 00000000..15cd1cdf --- /dev/null +++ b/modules/local/check_input_vcf.nf @@ -0,0 +1,32 @@ +// Import generic module functions +include { saveFiles } from './functions' + +params.options = [:] + +process CHECK_INPUT_VCF { + tag "check_vcf" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/python:3.8.3" + } else { + container "quay.io/biocontainers/python:3.8.3" + } + + input: + path vcfs + + output: + path '*.txt' , emit: txt + + script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ + def input = vcfs.collect { it.toString() } + """ + check_input_vcf.py \\ + --INPUT_VCFS ${input.join(' ')} \\ + --OUTPUT unprocessed_vcfs.txt + """ +} diff --git a/nextflow_schema.json b/nextflow_schema.json index b9bf8523..c7e848fc 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -94,6 +94,12 @@ "description": "Path to directory for pre-built bwamem2 index.", "help_text": "If none provided, will be generated automatically from the FASTA reference." }, + "clinvar": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-bezier-curve", + "description": "Path to directory for clinvar vcf." + }, "save_reference": { "type": "boolean", "default": false, diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf new file mode 100644 index 00000000..fee900c8 --- /dev/null +++ b/subworkflows/local/prepare_vcf.nf @@ -0,0 +1,34 @@ +// +// Prepare reference vcf files +// + +params.split_multiallelics_options = [:] +params.rm_duplicates_options = [:] +params.vcf_options = [:] +params.tabix_options = [:] + +def split_multiallelics_vcf_check = params.split_multiallelics_options.clone() +split_multiallelics_vcf_check.publish_files = "false" + +def rm_duplicates_vcf_check = params.rm_duplicates_options.clone() +rm_duplicates_vcf_check.publish_dir = "vcf_check/" +rm_duplicates_vcf_check.suffix = "_split_rmdup" + +def tabix_vcf_check = params.tabix_options.clone() +tabix_vcf_check.publish_dir = "vcf_check/" + +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: split_multiallelics_vcf_check ) +include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: rm_duplicates_vcf_check ) +include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' addParams( options: params.vcf_options ) + +workflow CHECK_VCF { + take: + vcfs // array: [ vcf files ] + + main: + ch_out = CHECK_INPUT_VCF( vcfs ).txt + + + // emit: + // txt = ch_out // path: genome.fasta +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 61bb03e2..21f0083c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -12,8 +12,9 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, - params.bwamem2_index, params.fasta_fai + params.bwamem2_index, params.fasta_fai, params.clinvar ] + for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } // Check mandatory parameters @@ -52,6 +53,7 @@ include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) +include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' addParams( options: [:] ) /* ======================================================================================== @@ -117,6 +119,10 @@ workflow RAREDISEASE { INPUT_CHECK ( ch_input ) + ch_vcfs = Channel.fromPath(params.clinvar) + CHECK_VCF( + ch_vcfs + ) // STEP 0: QUALITY CHECK. FASTQC ( From 3132b37eb537d1552ddc601659b7e49498a52f7a Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 7 Oct 2021 14:26:51 +0200 Subject: [PATCH 0092/1169] added includeconfig for inhouse config --- nextflow.config | 14 ++++++++++++++ nextflow_schema.json | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/nextflow.config b/nextflow.config index 3b0760c3..a7c5b33a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -54,6 +54,8 @@ params { config_profile_url = null config_profile_name = null + local_config_path = null + // Max resource options // Defaults only, expecting to be overwritten max_memory = '128.GB' @@ -75,6 +77,18 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } +// Load nf-core/raredisease custom config +try { + includeConfig "${params.custom_config_base}/pipeline/raredisease.config" +} catch (Exception e) { + System.err.println("WARNING: Could not load nf-core/config/raredisease profiles: ${params.custom_config_base}/pipeline/raredisease.config") +} + +// Load in-house config +if (params.local_config_path) { + includeConfig "${params.local_config_path}" +} + // Load igenomes.config if required, else load custom genomes.config if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' diff --git a/nextflow_schema.json b/nextflow_schema.json index 2ca0ffc6..53f3c6e8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -197,6 +197,11 @@ "description": "Institutional config URL link.", "hidden": true, "fa_icon": "fas fa-users-cog" + }, + "local_config_path": { + "type": "string", + "description": "Path to local config", + "fa_icon": "fas fa-users-cog" } } }, From 28e9dbb5e4daa9083970baa3a298cfc463132a65 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 7 Oct 2021 15:30:20 +0200 Subject: [PATCH 0093/1169] dl'd picard/collectmultiplemetrics module --- modules.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules.json b/modules.json index 4d8e37b3..39b519a2 100644 --- a/modules.json +++ b/modules.json @@ -21,6 +21,9 @@ "multiqc": { "git_sha": "ab67a1d41b63bf52fd7c147f7f8f6e8d167590b5" }, + "picard/collectmultiplemetrics": { + "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + }, "picard/markduplicates": { "git_sha": "e971f538a99bfa190f36f9303bede205e00b90a4" }, From b0b356de64ce95731b33db0e6a89245202824406 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 7 Oct 2021 15:36:40 +0200 Subject: [PATCH 0094/1169] woops! it didn't get pushed in the 1st commit --- .../collectmultiplemetrics/functions.nf | 78 +++++++++++++++++++ .../picard/collectmultiplemetrics/main.nf | 52 +++++++++++++ .../picard/collectmultiplemetrics/meta.yml | 49 ++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf create mode 100644 modules/nf-core/modules/picard/collectmultiplemetrics/main.nf create mode 100644 modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf new file mode 100644 index 00000000..dd8fdaca --- /dev/null +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -0,0 +1,52 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process PICARD_COLLECTMULTIPLEMETRICS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0" + } else { + container "quay.io/biocontainers/picard:2.25.7--hdfd78af_0" + } + + input: + tuple val(meta), path(bam) + path fasta + + output: + tuple val(meta), path("*_metrics"), emit: metrics + tuple val(meta), path("*.pdf") , emit: pdf + path "versions.yml" , emit: versions + + script: + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + CollectMultipleMetrics \\ + $options.args \\ + INPUT=$bam \\ + OUTPUT=${prefix}.CollectMultipleMetrics \\ + REFERENCE_SEQUENCE=$fasta + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(picard CollectMultipleMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml new file mode 100644 index 00000000..587983a1 --- /dev/null +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml @@ -0,0 +1,49 @@ +name: picard_collectmultiplemetrics +description: Collect multiple metrics from a BAM file +keywords: + - alignment + - metrics + - statistics + - insert + - quality + - bam +tools: + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam}" + - fasta: + type: file + description: Genome fasta file +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - metrics: + type: file + description: Alignment metrics files generated by picard + pattern: "*_{metrics}" + - pdf: + type: file + description: PDF plots of metrics + pattern: "*.{pdf}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" From b52fd323d4baaf727d48151c0804d7b6075c1550 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 7 Oct 2021 16:10:53 +0200 Subject: [PATCH 0095/1169] added subworkflow --- conf/modules.config | 4 ++++ subworkflows/nf-core/qc_bam.nf | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 subworkflows/nf-core/qc_bam.nf diff --git a/conf/modules.config b/conf/modules.config index 556000a2..3cdcfb70 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -49,6 +49,10 @@ params { 'multiqc' { args = '' } + 'picard_collectmultiplemetrics' { + args = '' + publish_dir = 'collectmultiplemetrics' + } 'picard_markduplicates' { args = '--CREATE_INDEX' suffix = '.sorted.md' diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf new file mode 100644 index 00000000..1c8a9dda --- /dev/null +++ b/subworkflows/nf-core/qc_bam.nf @@ -0,0 +1,20 @@ +// +// A quality check subworkflow for processed bams. +// + +params.picard_collectmultiplemetrics_options = [:] + +include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: params.picard_collectmultiplemetrics_options ) + +workflow QC_BAM { + + take: + bam // channel: [ val(meta), path(bam) ] + fasta // path: genome.fasta + + main: + PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta ) + + emit: + multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics +} From 4841c88e1ebe6a352ca840266e6fcd7c19013c20 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 7 Oct 2021 16:37:10 +0200 Subject: [PATCH 0096/1169] added subwrkflw into main --- workflows/raredisease.nf | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 61bb03e2..26974812 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -87,6 +87,10 @@ include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' addParam markduplicates_options: modules['picard_markduplicates'] ) +include { QC_BAM } from '../subworkflows/nf-core/qc_bam' addParams ( + picard_collectmultiplemetrics_options: modules['picard_collectmultiplemetrics'] +) + // // SUBWORKFLOW: Consists of mix/local modules @@ -142,6 +146,12 @@ workflow RAREDISEASE { ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.samtools_version.ifEmpty(null)) } + // STEP 1.5: BAM QUALITY CHECK + QC_BAM ( + ch_marked_bam, + PREPARE_GENOME.out.fasta + ) + // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. DEEPVARIANT_CALLER ( From 19733854a37f05faf0e077c211f457565aef59cd Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 7 Oct 2021 17:27:38 +0200 Subject: [PATCH 0097/1169] added subworkflow naming --- .github/CONTRIBUTING.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index b2f28393..57d34b80 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -98,6 +98,10 @@ Please use the following naming schemes, to make it easy to understand what is g * initial process channel: `ch_output_from_` * intermediate and terminal channels: `ch__for_` +For subworkflows: + +* verb_tool or verb_variant_tool: `align_bwamem2.nf` or `call_snv_deepvariant.nf` + ### Nextflow version bumping If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` From 68c7d7d2d0831f4165a8fe96ccd0139c1f60044a Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 7 Oct 2021 17:31:15 +0200 Subject: [PATCH 0098/1169] quick fix --- .github/CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 57d34b80..54a4ae18 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -98,9 +98,9 @@ Please use the following naming schemes, to make it easy to understand what is g * initial process channel: `ch_output_from_` * intermediate and terminal channels: `ch__for_` -For subworkflows: - -* verb_tool or verb_variant_tool: `align_bwamem2.nf` or `call_snv_deepvariant.nf` +* subworkflows: `verb_maintool` or `verb_variant_maintool` + * `verb_maintool` : `align_bwamem2.nf` + * `verb_variant_maintool` : `call_snv_deepvariant.nf` ### Nextflow version bumping From 11572b08dca535bc7c4d43136c7f14d6e1f367ea Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 7 Oct 2021 17:36:29 +0200 Subject: [PATCH 0099/1169] linting magic :sparkles: --- .github/CONTRIBUTING.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 54a4ae18..b2f28393 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -98,10 +98,6 @@ Please use the following naming schemes, to make it easy to understand what is g * initial process channel: `ch_output_from_` * intermediate and terminal channels: `ch__for_` -* subworkflows: `verb_maintool` or `verb_variant_maintool` - * `verb_maintool` : `align_bwamem2.nf` - * `verb_variant_maintool` : `call_snv_deepvariant.nf` - ### Nextflow version bumping If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` From 29fd80015af4c17a3250d4414384ace7d60a8e14 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 13 Oct 2021 10:22:22 +0200 Subject: [PATCH 0100/1169] check input clinvar --- bin/check_input_vcf.py | 5 +++-- subworkflows/local/deepvariant_caller.nf | 2 +- subworkflows/local/prepare_vcf.nf | 21 ++++++++++++++++----- workflows/raredisease.nf | 6 +++--- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/bin/check_input_vcf.py b/bin/check_input_vcf.py index 85405a3e..dd2f87f9 100755 --- a/bin/check_input_vcf.py +++ b/bin/check_input_vcf.py @@ -1,10 +1,10 @@ #!/usr/bin/env python +import os import sys import gzip import argparse - def parse_args(args=None): Description = "Check that input vcf files have been normalized." Epilog = "Example usage: python check_input_vcf.py --INPUT_VCFS ... --OUTPUT " @@ -30,7 +30,8 @@ def check_vcf(files_in, file_out): if line.startswith("##bcftools_norm"): break elif not line.startswith("#"): - out.write(file+"\n") + base = os.path.basename(file).split(".")[0] + out.write(base + "," + os.path.abspath(file) + "\n") break else: print("Please compress %s using bgzip" %file ) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 1a2ce46c..2aba7b53 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -27,7 +27,7 @@ include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix workflow DEEPVARIANT_CALLER { take: bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // path(fasta + fasta // path(fasta) fai // path(fai) ch_case_info // channel: [ case_id ] diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index fee900c8..f854256f 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -12,7 +12,6 @@ split_multiallelics_vcf_check.publish_files = "false" def rm_duplicates_vcf_check = params.rm_duplicates_options.clone() rm_duplicates_vcf_check.publish_dir = "vcf_check/" -rm_duplicates_vcf_check.suffix = "_split_rmdup" def tabix_vcf_check = params.tabix_options.clone() tabix_vcf_check.publish_dir = "vcf_check/" @@ -20,15 +19,27 @@ tabix_vcf_check.publish_dir = "vcf_check/" include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: split_multiallelics_vcf_check ) include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: rm_duplicates_vcf_check ) include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' addParams( options: params.vcf_options ) +include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' addParams( options: tabix_vcf_check ) workflow CHECK_VCF { take: - vcfs // array: [ vcf files ] + vcfs // array: [ vcf files ] + fasta // path(fasta) main: - ch_out = CHECK_INPUT_VCF( vcfs ).txt + CHECK_INPUT_VCF( vcfs ) + .filter { it.size()>0 } + .splitCsv() + .map { [ [ 'id':it[0] ], it[1] ] } + .set{ ch_unprocessed_vcfs } + ch_unprocessed_vcfs.view() - // emit: - // txt = ch_out // path: genome.fasta + SPLIT_MULTIALLELICS (ch_unprocessed_vcfs, fasta) + REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) + TABIX (REMOVE_DUPLICATES.out.vcf) + + emit: + vcf = REMOVE_DUPLICATES.out.vcf // path: genome.fasta + idx = TABIX.out.tbi } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 21f0083c..cb393d68 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -119,10 +119,10 @@ workflow RAREDISEASE { INPUT_CHECK ( ch_input ) - ch_vcfs = Channel.fromPath(params.clinvar) + ch_clinvar_in = Channel.fromPath(params.clinvar) CHECK_VCF( - ch_vcfs - ) + ch_clinvar_in, params.fasta + ).set { ch_clinvar_out } // STEP 0: QUALITY CHECK. FASTQC ( From e45a57c05774e500e77fc200f5622b0b97ed0a45 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 13 Oct 2021 10:38:13 +0200 Subject: [PATCH 0101/1169] remove view --- subworkflows/local/prepare_vcf.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index f854256f..68f52d2c 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -33,8 +33,6 @@ workflow CHECK_VCF { .map { [ [ 'id':it[0] ], it[1] ] } .set{ ch_unprocessed_vcfs } - ch_unprocessed_vcfs.view() - SPLIT_MULTIALLELICS (ch_unprocessed_vcfs, fasta) REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) TABIX (REMOVE_DUPLICATES.out.vcf) From 6fe3173a11e530ad201cec8e87e7a88e0010eb13 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 13 Oct 2021 23:02:39 +0200 Subject: [PATCH 0102/1169] vcf check sans test --- bin/check_input_vcf.py | 1 + conf/test.config | 1 - subworkflows/local/prepare_vcf.nf | 11 ++++++----- workflows/raredisease.nf | 12 ++++++++---- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/bin/check_input_vcf.py b/bin/check_input_vcf.py index dd2f87f9..68f30c96 100755 --- a/bin/check_input_vcf.py +++ b/bin/check_input_vcf.py @@ -31,6 +31,7 @@ def check_vcf(files_in, file_out): break elif not line.startswith("#"): base = os.path.basename(file).split(".")[0] + out.write("id,filepath\n") out.write(base + "," + os.path.abspath(file) + "\n") break else: diff --git a/conf/test.config b/conf/test.config index dbd212b2..11ca6988 100644 --- a/conf/test.config +++ b/conf/test.config @@ -27,6 +27,5 @@ params { // Genome references fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' - clinvar = "${params.local_genomes}/grch38_clinvar_-20210415-.vcf.gz" } diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index 68f52d2c..b67cb083 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -23,15 +23,16 @@ include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix workflow CHECK_VCF { take: - vcfs // array: [ vcf files ] + vcf // channel: [ vcf file ] fasta // path(fasta) main: - CHECK_INPUT_VCF( vcfs ) + CHECK_INPUT_VCF( vcf ) .filter { it.size()>0 } - .splitCsv() - .map { [ [ 'id':it[0] ], it[1] ] } - .set{ ch_unprocessed_vcfs } + .splitCsv( header:true ) + .map { it -> + [ [ id: it['id']], it['filepath'] ] } + .set { ch_unprocessed_vcfs } SPLIT_MULTIALLELICS (ch_unprocessed_vcfs, fasta) REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index bd674194..20c9de6c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -123,10 +123,6 @@ workflow RAREDISEASE { INPUT_CHECK ( ch_input ) - ch_clinvar_in = Channel.fromPath(params.clinvar) - CHECK_VCF( - ch_clinvar_in, params.fasta - ).set { ch_clinvar_out } // STEP 0: QUALITY CHECK. FASTQC ( @@ -137,6 +133,14 @@ workflow RAREDISEASE { // STEP 0: PREPARE GENOME REFERENCES AND INDICES. PREPARE_GENOME ( params.fasta ) + if (params.clinvar != '') + { + ch_clinvar_in = Channel.fromPath(params.clinvar) + CHECK_VCF( + ch_clinvar_in, PREPARE_GENOME.out.fasta, + ).set { ch_clinvar_out } + + } // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. if (params.aligner == 'bwamem2') { ALIGN_BWAMEM2 ( From a43d29c6864e7db61e5c1c89d358cb522da8fe2b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 14 Oct 2021 09:54:21 +0200 Subject: [PATCH 0103/1169] edit python script to process one file at a time and not a list --- bin/check_input_vcf.py | 41 +++++++++++++++----------------- modules/local/check_input_vcf.nf | 2 +- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/bin/check_input_vcf.py b/bin/check_input_vcf.py index 68f30c96..d704b9b5 100755 --- a/bin/check_input_vcf.py +++ b/bin/check_input_vcf.py @@ -6,43 +6,40 @@ import argparse def parse_args(args=None): - Description = "Check that input vcf files have been normalized." - Epilog = "Example usage: python check_input_vcf.py --INPUT_VCFS ... --OUTPUT " + Description = "Check that input vcf file has been normalized." + Epilog = "Example usage: python check_input_vcf.py --INPUT_VCF ... --OUTPUT " parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument("--INPUT_VCFS", help="Input vcf files.", nargs= '*') + parser.add_argument("--INPUT_VCF", help="Input vcf file.") parser.add_argument("--OUTPUT", help="Output file containing a list of files that need to be normalized.") return parser.parse_args(args) -def check_vcf(files_in, file_out): +def check_vcf(file_in, file_out): """ - This function checks that input vcf files have been normalized with bcftools, and writes the filenames of - those that need to be normalized to a text file + This function checks that an input vcf file has been normalized with bcftools, and if not, it writes its basename and the filename + to a text file """ with open(file_out,'w') as out: - for file in files_in: - if file.endswith(".gz"): - with gzip.open(file,'rt') as vcf: - for line in vcf: - if line.startswith("##bcftools_norm"): - break - elif not line.startswith("#"): - base = os.path.basename(file).split(".")[0] - out.write("id,filepath\n") - out.write(base + "," + os.path.abspath(file) + "\n") - break - else: - print("Please compress %s using bgzip" %file ) - - + if file_in.endswith(".gz"): + with gzip.open(file_in,'rt') as vcf: + for line in vcf: + if line.startswith("##bcftools_norm"): + break + elif not line.startswith("#"): + base = os.path.basename(file_in).split(".")[0] + out.write("id,filepath\n") + out.write(base + "," + os.path.abspath(file_in) + "\n") + break + else: + print("Please compress %s using bgzip" %file_in ) def main(args=None): args = parse_args(args) - check_vcf(args.INPUT_VCFS, args.OUTPUT) + check_vcf(args.INPUT_VCF, args.OUTPUT) if __name__ == "__main__": diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index 15cd1cdf..d2c0253a 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -26,7 +26,7 @@ process CHECK_INPUT_VCF { def input = vcfs.collect { it.toString() } """ check_input_vcf.py \\ - --INPUT_VCFS ${input.join(' ')} \\ + --INPUT_VCF ${input.join(' ')} \\ --OUTPUT unprocessed_vcfs.txt """ } From 7726a897aa9253fa456617b0530f7557f48153ee Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 15 Oct 2021 16:30:47 +0200 Subject: [PATCH 0104/1169] fixed extensions --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 3cdcfb70..af6a04b4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -55,7 +55,7 @@ params { } 'picard_markduplicates' { args = '--CREATE_INDEX' - suffix = '.sorted.md' + suffix = '_sorted' publish_dir = 'markduplicates' } 'samtools_faidx' { @@ -68,7 +68,7 @@ params { publish_files = false } 'samtools_sort' { - suffix = '.sorted' + suffix = '_sorted' publish_files = false } 'samtools_stats' { From bd404eff29b7137663668750462685debc461a3c Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 20 Oct 2021 10:07:00 +0200 Subject: [PATCH 0105/1169] removed maintool --- .github/CONTRIBUTING.md | 4 ++++ .nf-core_lint.yml | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 .nf-core_lint.yml diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index b2f28393..d4d3ebb8 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -98,6 +98,10 @@ Please use the following naming schemes, to make it easy to understand what is g * initial process channel: `ch_output_from_` * intermediate and terminal channels: `ch__for_` +* subworkflows: `verb_noun` or `verb_variant_noun` + * `verb_noun` : `align_bwamem2.nf` + * `verb_variant_noun` : `call_snv_deepvariant.nf` + ### Nextflow version bumping If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` diff --git a/.nf-core_lint.yml b/.nf-core_lint.yml new file mode 100644 index 00000000..31a8ef29 --- /dev/null +++ b/.nf-core_lint.yml @@ -0,0 +1,2 @@ +files_unchanged: + - .github/CONTRIBUTING.md From 5ca84c60bace0064da76f5f8b5efb1d82c4f5221 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 22 Oct 2021 15:52:49 +0200 Subject: [PATCH 0106/1169] updated nf-core lint config for dsl2 --- .nf-core.yml | 3 +++ .nf-core_lint.yml | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 .nf-core.yml delete mode 100644 .nf-core_lint.yml diff --git a/.nf-core.yml b/.nf-core.yml new file mode 100644 index 00000000..a9f17e4e --- /dev/null +++ b/.nf-core.yml @@ -0,0 +1,3 @@ +lint: + files_unchanged: + - .github/CONTRIBUTING.md diff --git a/.nf-core_lint.yml b/.nf-core_lint.yml deleted file mode 100644 index 31a8ef29..00000000 --- a/.nf-core_lint.yml +++ /dev/null @@ -1,2 +0,0 @@ -files_unchanged: - - .github/CONTRIBUTING.md From 7a8d64045b357a8241d3644308dd28800b7d1b9a Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 22 Oct 2021 15:56:03 +0200 Subject: [PATCH 0107/1169] added multiqc to bypass lint --- .nf-core.yml | 1 + assets/multiqc_config.yaml | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index a9f17e4e..9ae9fadb 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,3 +1,4 @@ lint: files_unchanged: - .github/CONTRIBUTING.md + - assets/multiqc_config.yaml diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 03969e51..b86d5121 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,11 +1,11 @@ report_comment: > - This report has been generated by the nf-core/raredisease - analysis pipeline. For information about how to interpret these results, please see the - documentation. + This report has been generated by the nf-core/raredisease + analysis pipeline. For information about how to interpret these results, please see the + documentation. report_section_order: - software_versions: - order: -1000 - nf-core-raredisease-summary: - order: -1001 + software_versions: + order: -1000 + nf-core-raredisease-summary: + order: -1001 export_plots: true From e76328751ca5a0e60c0135941270c24ce16ca397 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 22 Oct 2021 16:39:35 +0200 Subject: [PATCH 0108/1169] installed, added module to pipeline --- .../modules/qualimap/bamqc/functions.nf | 78 +++++++++++++++++++ .../nf-core/modules/qualimap/bamqc/main.nf | 63 +++++++++++++++ .../nf-core/modules/qualimap/bamqc/meta.yml | 49 ++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 modules/nf-core/modules/qualimap/bamqc/functions.nf create mode 100644 modules/nf-core/modules/qualimap/bamqc/main.nf create mode 100644 modules/nf-core/modules/qualimap/bamqc/meta.yml diff --git a/modules/nf-core/modules/qualimap/bamqc/functions.nf b/modules/nf-core/modules/qualimap/bamqc/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/nf-core/modules/qualimap/bamqc/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/qualimap/bamqc/main.nf b/modules/nf-core/modules/qualimap/bamqc/main.nf new file mode 100644 index 00000000..d33f1e67 --- /dev/null +++ b/modules/nf-core/modules/qualimap/bamqc/main.nf @@ -0,0 +1,63 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process QUALIMAP_BAMQC { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::qualimap=2.2.2d" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/qualimap:2.2.2d--1" + } else { + container "quay.io/biocontainers/qualimap:2.2.2d--1" + } + + input: + tuple val(meta), path(bam) + path gff + val use_gff + + output: + tuple val(meta), path("${prefix}"), emit: results + path "versions.yml" , emit: versions + + script: + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + + def collect_pairs = meta.single_end ? '' : '--collect-overlap-pairs' + def memory = task.memory.toGiga() + "G" + def regions = use_gff ? "--gff $gff" : '' + + def strandedness = 'non-strand-specific' + if (meta.strandedness == 'forward') { + strandedness = 'strand-specific-forward' + } else if (meta.strandedness == 'reverse') { + strandedness = 'strand-specific-reverse' + } + """ + unset DISPLAY + mkdir tmp + export _JAVA_OPTIONS=-Djava.io.tmpdir=./tmp + qualimap \\ + --java-mem-size=$memory \\ + bamqc \\ + $options.args \\ + -bam $bam \\ + $regions \\ + -p $strandedness \\ + $collect_pairs \\ + -outdir $prefix \\ + -nt $task.cpus + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(qualimap 2>&1) | sed 's/^.*QualiMap v.//; s/Built.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/qualimap/bamqc/meta.yml b/modules/nf-core/modules/qualimap/bamqc/meta.yml new file mode 100644 index 00000000..cc0471fc --- /dev/null +++ b/modules/nf-core/modules/qualimap/bamqc/meta.yml @@ -0,0 +1,49 @@ +name: qualimap_bamqc +description: Evaluate alignment data +keywords: + - quality control + - qc + - bam +tools: + - qualimap: + description: | + Qualimap 2 is a platform-independent application written in + Java and R that provides both a Graphical User Interface and + a command-line interface to facilitate the quality control of + alignment sequencing data and its derivatives like feature counts. + homepage: http://qualimap.bioinfo.cipf.es/ + documentation: http://qualimap.conesalab.org/doc_html/index.html + doi: 10.1093/bioinformatics/bts503 +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam}" + - gff: + type: file + description: Feature file with regions of interest + pattern: "*.{gff,gtf,bed}" + - use_gff: + type: boolean + description: Specifies if feature file should be used or not +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - results: + type: dir + description: Qualimap results dir + pattern: "*/*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@phue" From 50de9f31914b2bad10d99be415711a1b3a5a1228 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Fri, 22 Oct 2021 16:40:22 +0200 Subject: [PATCH 0109/1169] forgot to add the actual files --- conf/modules.config | 3 +++ modules.json | 3 +++ subworkflows/nf-core/qc_bam.nf | 10 ++++++++-- workflows/raredisease.nf | 9 +++++++-- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index af6a04b4..4ac9620c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -77,5 +77,8 @@ params { 'tabix' { args = '' } + 'qualimap_bamqc' { + args = '' + } } } diff --git a/modules.json b/modules.json index 39b519a2..dad321ca 100644 --- a/modules.json +++ b/modules.json @@ -27,6 +27,9 @@ "picard/markduplicates": { "git_sha": "e971f538a99bfa190f36f9303bede205e00b90a4" }, + "qualimap/bamqc": { + "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + }, "samtools/faidx": { "git_sha": "9c31cf1566fa4f8660ac3973e02fe0caebe86235" }, diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 1c8a9dda..168e53bc 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -3,18 +3,24 @@ // params.picard_collectmultiplemetrics_options = [:] +params.qualimap_bamqc_options = [:] include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: params.picard_collectmultiplemetrics_options ) +include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' addParams( options: params.qualimap_bamqc_options ) workflow QC_BAM { take: - bam // channel: [ val(meta), path(bam) ] - fasta // path: genome.fasta + bam // channel: [ val(meta), path(bam) ] + fasta // path: genome.fasta + gff // path: file.gff + use_gff // boolean main: PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta ) + QUALIMAP_BAMQC ( bam, gff, use_gff ) emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics + qualimap_results = QUALIMAP_BAMQC.out.results } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 26974812..53673a33 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -88,7 +88,8 @@ include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' addParam ) include { QC_BAM } from '../subworkflows/nf-core/qc_bam' addParams ( - picard_collectmultiplemetrics_options: modules['picard_collectmultiplemetrics'] + picard_collectmultiplemetrics_options: modules['picard_collectmultiplemetrics'], + qualimap_bamqc_options: modules['qualimap_bamqc'] ) @@ -147,9 +148,13 @@ workflow RAREDISEASE { } // STEP 1.5: BAM QUALITY CHECK + gff = [] + use_gff = false QC_BAM ( ch_marked_bam, - PREPARE_GENOME.out.fasta + PREPARE_GENOME.out.fasta, + gff, + use_gff ) // STEP 2: VARIANT CALLING From 63b3da13a765cd41195af951facfb335a697fe56 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 30 Oct 2021 23:24:17 +0200 Subject: [PATCH 0110/1169] use mix to combine channels --- bin/check_input_vcf.py | 9 +++++--- conf/genomes.config | 4 ++-- main.nf | 2 +- subworkflows/local/prepare_vcf.nf | 34 +++++++++++++++++++++++-------- workflows/raredisease.nf | 12 +++++------ 5 files changed, 40 insertions(+), 21 deletions(-) diff --git a/bin/check_input_vcf.py b/bin/check_input_vcf.py index d704b9b5..94cd5265 100755 --- a/bin/check_input_vcf.py +++ b/bin/check_input_vcf.py @@ -27,11 +27,14 @@ def check_vcf(file_in, file_out): with gzip.open(file_in,'rt') as vcf: for line in vcf: if line.startswith("##bcftools_norm"): + base = os.path.basename(file_in).rsplit(".",2)[0] + out.write("id,filepath,processed\n") + out.write(base + "," + os.path.abspath(file_in) + ",yes\n") break elif not line.startswith("#"): - base = os.path.basename(file_in).split(".")[0] - out.write("id,filepath\n") - out.write(base + "," + os.path.abspath(file_in) + "\n") + base = os.path.basename(file_in).rsplit(".",2)[0] + out.write("id,filepath,processed\n") + out.write(base + "," + os.path.abspath(file_in) + ",no\n") break else: print("Please compress %s using bgzip" %file_in ) diff --git a/conf/genomes.config b/conf/genomes.config index 597e61fc..be6b0aea 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -14,13 +14,13 @@ params { fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - clinvar = "${params.local_genomes}/grch37_clinvar_-20210415-.vcf.gz" + gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - clinvar = "${params.local_genomes}/grch38_clinvar_-20210415-.vcf.gz" + gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" } } } diff --git a/main.nf b/main.nf index 927c1f6c..0328f7db 100644 --- a/main.nf +++ b/main.nf @@ -20,7 +20,7 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') -params.clinvar = WorkflowMain.getGenomeAttribute(params, 'clinvar') +params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') /* ======================================================================================== diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index b67cb083..5bf425a5 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -9,9 +9,11 @@ params.tabix_options = [:] def split_multiallelics_vcf_check = params.split_multiallelics_options.clone() split_multiallelics_vcf_check.publish_files = "false" +split_multiallelics_vcf_check.suffix = "_split" def rm_duplicates_vcf_check = params.rm_duplicates_options.clone() rm_duplicates_vcf_check.publish_dir = "vcf_check/" +rm_duplicates_vcf_check.suffix = "_split_rmdup" def tabix_vcf_check = params.tabix_options.clone() tabix_vcf_check.publish_dir = "vcf_check/" @@ -23,22 +25,36 @@ include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix workflow CHECK_VCF { take: - vcf // channel: [ vcf file ] + vcf // channel: [ vcf file ] fasta // path(fasta) main: CHECK_INPUT_VCF( vcf ) - .filter { it.size()>0 } .splitCsv( header:true ) - .map { it -> - [ [ id: it['id']], it['filepath'] ] } - .set { ch_unprocessed_vcfs } + .map { row -> + def id = "${row.id}" + def filepath = "${row.filepath}" + def processed = "${row.processed}" + tuple(id,filepath,processed) + } + .branch { id, filepath, processed -> + processed: processed == 'yes' + return [['id':id],filepath] + unprocessed: processed == 'no' + return [['id':id],filepath] + } + .set { ch_vcfs_norm } - SPLIT_MULTIALLELICS (ch_unprocessed_vcfs, fasta) - REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) - TABIX (REMOVE_DUPLICATES.out.vcf) + SPLIT_MULTIALLELICS (ch_vcfs_norm.unprocessed, fasta) + + REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta).vcf + .set { ch_vcfs_rmdup } + + vcf_out = ch_vcfs_rmdup.mix( ch_vcfs_norm.processed ) + + TABIX (vcf_out) emit: - vcf = REMOVE_DUPLICATES.out.vcf // path: genome.fasta + vcf = vcf_out // path: normalized_vcf idx = TABIX.out.tbi } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 20c9de6c..4b95cd83 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -12,7 +12,7 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, - params.bwamem2_index, params.fasta_fai, params.clinvar + params.bwamem2_index, params.fasta_fai, params.gnomad ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } @@ -133,14 +133,14 @@ workflow RAREDISEASE { // STEP 0: PREPARE GENOME REFERENCES AND INDICES. PREPARE_GENOME ( params.fasta ) - if (params.clinvar != '') + if (params.gnomad != '') { - ch_clinvar_in = Channel.fromPath(params.clinvar) + ch_gnomad_in = Channel.fromPath(params.gnomad) CHECK_VCF( - ch_clinvar_in, PREPARE_GENOME.out.fasta, - ).set { ch_clinvar_out } - + ch_gnomad_in, PREPARE_GENOME.out.fasta, + ).set { ch_gnomad_out } } + // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. if (params.aligner == 'bwamem2') { ALIGN_BWAMEM2 ( From 842cfb0cb53f1994371fdf13b3c49db48f778954 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 31 Oct 2021 07:57:01 +0100 Subject: [PATCH 0111/1169] update nextflow schema --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 3a5956a0..706ab848 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -95,11 +95,11 @@ "fa_icon": "fas fa-folder-open", "hidden": true }, - "clinvar": { + "gnomad": { "type": "string", "format": "path", "fa_icon": "fas fa-bezier-curve", - "description": "Path to directory for clinvar vcf." + "description": "Path to directory for gnomad vcf." }, "save_reference": { "type": "boolean", From 106a440e26565814feb1885203dad225ef4b4707 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 31 Oct 2021 17:57:24 +0100 Subject: [PATCH 0112/1169] Reusing modules --- .github/CONTRIBUTING.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d4d3ebb8..cc823bdd 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -102,6 +102,10 @@ Please use the following naming schemes, to make it easy to understand what is g * `verb_noun` : `align_bwamem2.nf` * `verb_variant_noun` : `call_snv_deepvariant.nf` +### Reusing modules in the workflow + +Default options for modules should be defined in the `base/modules.config`. If you have a module that you would like to reuse in a subworkflow with non-default options, we recommend modifying the defaults within the context of the subworkflow. For a working example, please have a look at how the default options for bcftools norm tool are modified in both `subworkflows/local/deepvariant_caller.nf` and `subworkflows/local/prepare_vcf.nf` + ### Nextflow version bumping If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` From 94321e7c8af79ecef2771a18824b72f43230c32d Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 8 Nov 2021 11:36:04 +0100 Subject: [PATCH 0113/1169] applying suggestions Co-authored-by: Anders Jemt --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index cc823bdd..65fb5809 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -104,7 +104,7 @@ Please use the following naming schemes, to make it easy to understand what is g ### Reusing modules in the workflow -Default options for modules should be defined in the `base/modules.config`. If you have a module that you would like to reuse in a subworkflow with non-default options, we recommend modifying the defaults within the context of the subworkflow. For a working example, please have a look at how the default options for bcftools norm tool are modified in both `subworkflows/local/deepvariant_caller.nf` and `subworkflows/local/prepare_vcf.nf` +Default options for modules should be defined in the [conf/modules.config](../conf/modules.config). If you have a module that you would like to reuse in a subworkflow with non-default options, we recommend modifying the defaults within the context of the subworkflow. For a working example, please have a look at how the default options for bcftools norm tool are modified in both [subworkflows/local/deepvariant_caller.nf](../subworkflows/local/deepvariant_caller.nf) and [subworkflows/local/prepare_vcf.nf](../subworkflows/local/prepare_vcf.nf) ### Nextflow version bumping From b630ef71d69f172d7ac51708050aa2195bfef715 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 8 Nov 2021 14:35:43 +0100 Subject: [PATCH 0114/1169] qualimap arguments hided away in subwrkflw --- subworkflows/nf-core/qc_bam.nf | 5 +++-- workflows/raredisease.nf | 19 ++++++++----------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 168e53bc..ebd4dc96 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -13,11 +13,12 @@ workflow QC_BAM { take: bam // channel: [ val(meta), path(bam) ] fasta // path: genome.fasta - gff // path: file.gff - use_gff // boolean main: PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta ) + + gff = [] + use_gff = false QUALIMAP_BAMQC ( bam, gff, use_gff ) emit: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 53673a33..adaef056 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -97,12 +97,13 @@ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' addParams ( // SUBWORKFLOW: Consists of mix/local modules // -include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' addParams( deepvariant_options: modules['deepvariant'], - glnexus_options: modules['glnexus'], - rm_duplicates_options: modules['bcftools_norm_rm_duplicates'], - split_multiallelics_options: modules['bcftools_norm_split_multiallelics'], - tabix_options: modules['tabix'] ) - +include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' addParams( + deepvariant_options: modules['deepvariant'], + glnexus_options: modules['glnexus'], + rm_duplicates_options: modules['bcftools_norm_rm_duplicates'], + split_multiallelics_options: modules['bcftools_norm_split_multiallelics'], + tabix_options: modules['tabix'] + ) /* ======================================================================================== RUN MAIN WORKFLOW @@ -148,13 +149,9 @@ workflow RAREDISEASE { } // STEP 1.5: BAM QUALITY CHECK - gff = [] - use_gff = false QC_BAM ( ch_marked_bam, - PREPARE_GENOME.out.fasta, - gff, - use_gff + PREPARE_GENOME.out.fasta ) // STEP 2: VARIANT CALLING From fa36d32e3f5e25684bcde54c95a9d881676d8ba5 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Mon, 8 Nov 2021 17:53:47 +0100 Subject: [PATCH 0115/1169] updated modules, fixed emit version for each subwrkflw --- modules.json | 31 ++--- modules/local/deepvariant/functions.nf | 54 +++++---- modules/local/deepvariant/main.nf | 15 +-- modules/nf-core/modules/bcftools/norm/main.nf | 3 +- .../nf-core/modules/bcftools/norm/meta.yml | 5 +- modules/nf-core/modules/bwamem2/index/main.nf | 3 +- .../nf-core/modules/bwamem2/index/meta.yml | 5 +- modules/nf-core/modules/bwamem2/mem/main.nf | 3 +- modules/nf-core/modules/bwamem2/mem/meta.yml | 5 +- .../custom/dumpsoftwareversions/functions.nf | 78 +++++++++++++ .../custom/dumpsoftwareversions/main.nf | 106 ++++++++++++++++++ .../custom/dumpsoftwareversions/meta.yml | 33 ++++++ modules/nf-core/modules/fastqc/main.nf | 8 +- modules/nf-core/modules/fastqc/meta.yml | 5 +- modules/nf-core/modules/glnexus/main.nf | 3 +- modules/nf-core/modules/glnexus/meta.yml | 6 +- modules/nf-core/modules/multiqc/main.nf | 5 +- modules/nf-core/modules/multiqc/meta.yml | 5 +- .../picard/collectmultiplemetrics/meta.yml | 1 + .../modules/picard/markduplicates/main.nf | 3 +- .../modules/picard/markduplicates/meta.yml | 5 +- .../nf-core/modules/samtools/faidx/main.nf | 3 +- .../nf-core/modules/samtools/faidx/meta.yml | 5 +- .../nf-core/modules/samtools/index/main.nf | 3 +- .../nf-core/modules/samtools/index/meta.yml | 5 +- .../nf-core/modules/samtools/merge/main.nf | 13 ++- .../nf-core/modules/samtools/merge/meta.yml | 22 +++- modules/nf-core/modules/samtools/sort/main.nf | 3 +- .../nf-core/modules/samtools/sort/meta.yml | 5 +- .../nf-core/modules/samtools/stats/main.nf | 9 +- .../nf-core/modules/samtools/stats/meta.yml | 26 +++-- modules/nf-core/modules/tabix/tabix/meta.yml | 5 +- subworkflows/local/deepvariant_caller.nf | 45 ++++---- subworkflows/local/prepare_genome.nf | 12 +- subworkflows/nf-core/align_bwamem2.nf | 17 +-- subworkflows/nf-core/qc_bam.nf | 7 +- workflows/raredisease.nf | 45 +++----- 37 files changed, 429 insertions(+), 178 deletions(-) create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/main.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml diff --git a/modules.json b/modules.json index 39b519a2..0a788c41 100644 --- a/modules.json +++ b/modules.json @@ -4,46 +4,49 @@ "repos": { "nf-core/modules": { "bcftools/norm": { - "git_sha": "906577873b66253b0d244871bfec2eeeaff73053" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "bwamem2/index": { - "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "bwamem2/mem": { - "git_sha": "216dc8c984bfc65a5865f9c7b2e0c1bf56c9a973" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + }, + "custom/dumpsoftwareversions": { + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "fastqc": { - "git_sha": "ab67a1d41b63bf52fd7c147f7f8f6e8d167590b5" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "glnexus": { - "git_sha": "5c463ca6b46b0a452253f5ae5ce7b8253674cff0" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "multiqc": { - "git_sha": "ab67a1d41b63bf52fd7c147f7f8f6e8d167590b5" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "picard/collectmultiplemetrics": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "picard/markduplicates": { - "git_sha": "e971f538a99bfa190f36f9303bede205e00b90a4" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "samtools/faidx": { - "git_sha": "9c31cf1566fa4f8660ac3973e02fe0caebe86235" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "samtools/index": { - "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "samtools/merge": { - "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" + "git_sha": "ac1e6df076195cec553a2079c9cebd94026a0d47" }, "samtools/sort": { - "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "samtools/stats": { - "git_sha": "43c27792583b3db3faedf189adea48939e300cf2" + "git_sha": "ac1e6df076195cec553a2079c9cebd94026a0d47" }, "tabix/tabix": { - "git_sha": "7b3315591a149609e27914965f858c9a7e071564" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" } } } diff --git a/modules/local/deepvariant/functions.nf b/modules/local/deepvariant/functions.nf index da9da093..85628ee0 100644 --- a/modules/local/deepvariant/functions.nf +++ b/modules/local/deepvariant/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/local/deepvariant/main.nf b/modules/local/deepvariant/main.nf index c685c18f..5aa1e368 100644 --- a/modules/local/deepvariant/main.nf +++ b/modules/local/deepvariant/main.nf @@ -1,4 +1,4 @@ -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -23,14 +23,12 @@ process DEEPVARIANT { path(fai) output: - tuple val(meta), path("*.vcf.gz"), emit: vcf - tuple val(meta), path("*g.vcf.gz"), emit: gvcf - path "*.version.txt" , emit: version + tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*g.vcf.gz"), emit: gvcf + path "versions.yml", emit: versions script: - def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" - """ /opt/deepvariant/bin/run_deepvariant \\ --ref=${fasta} \\ @@ -40,7 +38,10 @@ process DEEPVARIANT { ${options.args} \\ --num_shards=${task.cpus} - echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' > ${software}.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/bcftools/norm/main.nf b/modules/nf-core/modules/bcftools/norm/main.nf index 454fc1d2..7e506e49 100644 --- a/modules/nf-core/modules/bcftools/norm/main.nf +++ b/modules/nf-core/modules/bcftools/norm/main.nf @@ -24,10 +24,9 @@ process BCFTOOLS_NORM { output: tuple val(meta), path("*.gz") , emit: vcf - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ bcftools norm \\ diff --git a/modules/nf-core/modules/bcftools/norm/meta.yml b/modules/nf-core/modules/bcftools/norm/meta.yml index f2534452..27978a53 100644 --- a/modules/nf-core/modules/bcftools/norm/meta.yml +++ b/modules/nf-core/modules/bcftools/norm/meta.yml @@ -12,6 +12,7 @@ tools: homepage: http://samtools.github.io/bcftools/bcftools.html documentation: http://www.htslib.org/doc/bcftools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map @@ -37,9 +38,9 @@ output: type: file description: VCF normalized output file pattern: "*.{vcf.gz}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@abhi18av" diff --git a/modules/nf-core/modules/bwamem2/index/main.nf b/modules/nf-core/modules/bwamem2/index/main.nf index 9274ebe8..5732017f 100644 --- a/modules/nf-core/modules/bwamem2/index/main.nf +++ b/modules/nf-core/modules/bwamem2/index/main.nf @@ -23,10 +23,9 @@ process BWAMEM2_INDEX { output: path "bwamem2" , emit: index - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) """ mkdir bwamem2 bwa-mem2 \\ diff --git a/modules/nf-core/modules/bwamem2/index/meta.yml b/modules/nf-core/modules/bwamem2/index/meta.yml index ee84ccfc..e0f6014c 100644 --- a/modules/nf-core/modules/bwamem2/index/meta.yml +++ b/modules/nf-core/modules/bwamem2/index/meta.yml @@ -12,6 +12,7 @@ tools: a large reference genome, such as the human genome. homepage: https://github.com/bwa-mem2/bwa-mem2 documentation: https://github.com/bwa-mem2/bwa-mem2#usage + licence: ['MIT'] input: - fasta: type: file @@ -21,9 +22,9 @@ output: type: file description: BWA genome index files pattern: "*.{0132,amb,ann,bwt.2bit.64,pac}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@maxulysse" diff --git a/modules/nf-core/modules/bwamem2/mem/main.nf b/modules/nf-core/modules/bwamem2/mem/main.nf index ea584a39..f88d840f 100644 --- a/modules/nf-core/modules/bwamem2/mem/main.nf +++ b/modules/nf-core/modules/bwamem2/mem/main.nf @@ -24,10 +24,9 @@ process BWAMEM2_MEM { output: tuple val(meta), path("*.bam"), emit: bam - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" def read_group = meta.read_group ? "-R ${meta.read_group}" : "" """ diff --git a/modules/nf-core/modules/bwamem2/mem/meta.yml b/modules/nf-core/modules/bwamem2/mem/meta.yml index 434fc7ca..58a35e08 100644 --- a/modules/nf-core/modules/bwamem2/mem/meta.yml +++ b/modules/nf-core/modules/bwamem2/mem/meta.yml @@ -16,6 +16,7 @@ tools: homepage: http://bio-bwa.sourceforge.net/ documentation: http://www.htslib.org/doc/samtools.html arxiv: arXiv:1303.3997 + licence: ['MIT'] input: - meta: type: map @@ -36,9 +37,9 @@ output: type: file description: Output BAM file containing read alignments pattern: "*.{bam}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@maxulysse" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf new file mode 100644 index 00000000..faf2073f --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -0,0 +1,106 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process CUSTOM_DUMPSOFTWAREVERSIONS { + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } + + // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container + conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0" + } else { + container "quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0" + } + + input: + path versions + + output: + path "software_versions.yml" , emit: yml + path "software_versions_mqc.yml", emit: mqc_yml + path "versions.yml" , emit: versions + + script: + """ + #!/usr/bin/env python + + import yaml + import platform + from textwrap import dedent + + def _make_versions_html(versions): + html = [ + dedent( + '''\\ + + + + + + + + + + ''' + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f'''\\ + + + + + + ''' + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + module_versions = {} + module_versions["${getProcessName(task.process)}"] = { + 'python': platform.python_version(), + 'yaml': yaml.__version__ + } + + with open("$versions") as f: + workflow_versions = yaml.load(f, Loader=yaml.BaseLoader) | module_versions + + workflow_versions["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version" + } + + versions_mqc = { + 'id': 'software_versions', + 'section_name': '${workflow.manifest.name} Software Versions', + 'section_href': 'https://github.com/${workflow.manifest.name}', + 'plot_type': 'html', + 'description': 'are collected at run time from the software output.', + 'data': _make_versions_html(workflow_versions) + } + + with open("software_versions.yml", 'w') as f: + yaml.dump(workflow_versions, f, default_flow_style=False) + with open("software_versions_mqc.yml", 'w') as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + + with open('versions.yml', 'w') as f: + yaml.dump(module_versions, f, default_flow_style=False) + """ +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 00000000..c8310e35 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,33 @@ +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline template +keywords: + - custom + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + licence: ['MIT'] +input: + - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" + +output: + - yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@drpatelh" diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index 88bfbf5b..9f6cfc55 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -24,11 +24,11 @@ process FASTQC { output: tuple val(meta), path("*.html"), emit: html tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: // Add soft-links to original FastQs for consistent naming in pipeline - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz @@ -36,7 +36,7 @@ process FASTQC { cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + ${getSoftwareName(task.process)}: \$( fastqc --version | sed -e "s/FastQC v//g" ) END_VERSIONS """ } else { @@ -47,7 +47,7 @@ process FASTQC { cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + ${getSoftwareName(task.process)}: \$( fastqc --version | sed -e "s/FastQC v//g" ) END_VERSIONS """ } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index 48031356..b09553a3 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -15,6 +15,7 @@ tools: overrepresented sequences. homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ['GPL-2.0-only'] input: - meta: type: map @@ -40,9 +41,9 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@drpatelh" diff --git a/modules/nf-core/modules/glnexus/main.nf b/modules/nf-core/modules/glnexus/main.nf index 5cff088b..1384334f 100644 --- a/modules/nf-core/modules/glnexus/main.nf +++ b/modules/nf-core/modules/glnexus/main.nf @@ -23,10 +23,9 @@ process GLNEXUS { output: tuple val(meta), path("*.bcf"), emit: bcf - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" // Make list of GVCFs to merge diff --git a/modules/nf-core/modules/glnexus/meta.yml b/modules/nf-core/modules/glnexus/meta.yml index fd1a407d..5ba17cae 100644 --- a/modules/nf-core/modules/glnexus/meta.yml +++ b/modules/nf-core/modules/glnexus/meta.yml @@ -10,7 +10,7 @@ tools: documentation: https://github.com/dnanexus-rnd/GLnexus/wiki/Getting-Started tool_dev_url: None doi: https://doi.org/10.1101/343970 - licence: ['Apache License 2.0'] + licence: ['Apache-2.0'] input: - meta: @@ -24,9 +24,9 @@ input: pattern: "*.{gvcf,gvcf.gz,g.vcf,g.vcf.gz}" output: - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" - bcf: type: file diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 2e7ad932..0861aa59 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -24,16 +24,15 @@ process MULTIQC { path "*multiqc_report.html", emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) """ multiqc -f $options.args . cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + ${getSoftwareName(task.process)}: \$( multiqc --version | sed -e "s/multiqc, version //g" ) END_VERSIONS """ } diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 2d99ec0d..63c75a45 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -11,6 +11,7 @@ tools: It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ + licence: ['GPL-3.0-or-later'] input: - multiqc_files: type: file @@ -29,9 +30,9 @@ output: type: file description: Plots created by MultiQC pattern: "*_data" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@abhi18av" diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml index 587983a1..613afc62 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml @@ -14,6 +14,7 @@ tools: data and formats such as SAM/BAM/CRAM and VCF. homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ + licence: ['MIT'] input: - meta: type: map diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index dc8d460b..37b825d7 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -25,10 +25,9 @@ process PICARD_MARKDUPLICATES { tuple val(meta), path("*.bam") , emit: bam tuple val(meta), path("*.bai") , optional:true, emit: bai tuple val(meta), path("*.metrics.txt"), emit: metrics - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { diff --git a/modules/nf-core/modules/picard/markduplicates/meta.yml b/modules/nf-core/modules/picard/markduplicates/meta.yml index db72b5c5..c9a08b36 100644 --- a/modules/nf-core/modules/picard/markduplicates/meta.yml +++ b/modules/nf-core/modules/picard/markduplicates/meta.yml @@ -14,6 +14,7 @@ tools: data and formats such as SAM/BAM/CRAM and VCF. homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ + licence: ['MIT'] input: - meta: type: map @@ -42,9 +43,9 @@ output: type: file description: Duplicate metrics file generated by picard pattern: "*.{metrics.txt}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@drpatelh" diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/modules/samtools/faidx/main.nf index cdbae99b..80cedeab 100644 --- a/modules/nf-core/modules/samtools/faidx/main.nf +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -23,10 +23,9 @@ process SAMTOOLS_FAIDX { output: path "*.fai" , emit: fai - path "versions.yml", emit: version + path "versions.yml", emit: versions script: - def software = getSoftwareName(task.process) """ samtools faidx $fasta cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml index 77d21861..16c0b334 100644 --- a/modules/nf-core/modules/samtools/faidx/meta.yml +++ b/modules/nf-core/modules/samtools/faidx/meta.yml @@ -12,6 +12,7 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - fasta: type: file @@ -22,9 +23,9 @@ output: type: file description: FASTA index file pattern: "*.{fai}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@drpatelh" diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index c2ba4de7..febbc11c 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -24,10 +24,9 @@ process SAMTOOLS_INDEX { output: tuple val(meta), path("*.bai"), optional:true, emit: bai tuple val(meta), path("*.csi"), optional:true, emit: csi - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) """ samtools index $options.args $bam cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml index 6f7dc887..988e8f53 100644 --- a/modules/nf-core/modules/samtools/index/meta.yml +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -14,6 +14,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map @@ -38,9 +39,9 @@ output: type: file description: CSI index file pattern: "*.{csi}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@drpatelh" diff --git a/modules/nf-core/modules/samtools/merge/main.nf b/modules/nf-core/modules/samtools/merge/main.nf index ec574105..fefb423b 100644 --- a/modules/nf-core/modules/samtools/merge/main.nf +++ b/modules/nf-core/modules/samtools/merge/main.nf @@ -19,17 +19,20 @@ process SAMTOOLS_MERGE { } input: - tuple val(meta), path(bams) + tuple val(meta), path(input_files) + path fasta output: - tuple val(meta), path("${prefix}.bam"), emit: bam - path "versions.yml" , emit: version + tuple val(meta), path("${prefix}.bam"), optional:true, emit: bam + tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def file_type = input_files[0].getExtension() + def reference = fasta ? "--reference ${fasta}" : "" """ - samtools merge ${prefix}.bam $bams + samtools merge ${reference} ${prefix}.${file_type} $input_files cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') diff --git a/modules/nf-core/modules/samtools/merge/meta.yml b/modules/nf-core/modules/samtools/merge/meta.yml index c5f15a14..2576a3a3 100644 --- a/modules/nf-core/modules/samtools/merge/meta.yml +++ b/modules/nf-core/modules/samtools/merge/meta.yml @@ -1,5 +1,5 @@ name: samtools_merge -description: Merge BAM file +description: Merge BAM or CRAM file keywords: - merge - bam @@ -14,31 +14,41 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - bam: + - input_files: type: file - description: BAM file + description: BAM/CRAM file pattern: "*.{bam,cram,sam}" + - fasta: + type: optional file + description: Reference file the CRAM was created with + pattern: "*.{fasta,fa}" output: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - merged_bam: + - bam: type: file description: BAM file pattern: "*.{bam}" - - version: + - cram: + type: file + description: CRAM file + pattern: "*.{cram}" + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@drpatelh" - "@yuukiiwa " - "@maxulysse" + - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index edd558bf..b30f6f45 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -23,10 +23,9 @@ process SAMTOOLS_SORT { output: tuple val(meta), path("*.bam"), emit: bam - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ samtools sort $options.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml index d4f70a8e..3402a068 100644 --- a/modules/nf-core/modules/samtools/sort/meta.yml +++ b/modules/nf-core/modules/samtools/sort/meta.yml @@ -14,6 +14,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map @@ -34,9 +35,9 @@ output: type: file description: Sorted BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@drpatelh" diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 823b5f31..aab43410 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -19,16 +19,17 @@ process SAMTOOLS_STATS { } input: - tuple val(meta), path(bam), path(bai) + tuple val(meta), path(input), path(input_index) + path fasta output: tuple val(meta), path("*.stats"), emit: stats - path "versions.yml" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) + def reference = fasta ? "--reference ${fasta}" : "" """ - samtools stats $bam > ${bam}.stats + samtools stats ${reference} ${input} > ${input}.stats cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/modules/samtools/stats/meta.yml index 1c7dcc8b..869e62e3 100644 --- a/modules/nf-core/modules/samtools/stats/meta.yml +++ b/modules/nf-core/modules/samtools/stats/meta.yml @@ -15,20 +15,25 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: Index for BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + - fasta: + type: optional file + description: Reference file the CRAM was created with + pattern: "*.{fasta,fa}" output: - meta: type: map @@ -39,9 +44,10 @@ output: type: file description: File containing samtools stats output pattern: "*.{stats}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@drpatelh" + - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/tabix/tabix/meta.yml b/modules/nf-core/modules/tabix/tabix/meta.yml index 1ca58bcf..2e37c4ff 100644 --- a/modules/nf-core/modules/tabix/tabix/meta.yml +++ b/modules/nf-core/modules/tabix/tabix/meta.yml @@ -10,6 +10,7 @@ tools: homepage: https://www.htslib.org/doc/tabix.html documentation: https://www.htslib.org/doc/tabix.1.html doi: 10.1093/bioinformatics/btq671 + licence: ['MIT'] input: - meta: type: map @@ -30,9 +31,9 @@ output: type: file description: tabix index file pattern: "*.{tbi}" - - version: + - versions: type: file - description: File containing software version + description: File containing software versions pattern: "versions.yml" authors: - "@joseespinosa" diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 1a2ce46c..577bc5f1 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -26,31 +26,36 @@ include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix workflow DEEPVARIANT_CALLER { take: - bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // path(fasta - fai // path(fai) - ch_case_info // channel: [ case_id ] + bam // channel: [ val(meta), path(bam), path(bai) ] + fasta // path(fasta + fai // path(fai) + ch_case_info // channel: [ case_id ] main: - DEEPVARIANT ( bam, fasta, fai ) - DEEPVARIANT.out.gvcf.collect{it[1]} - .toList() - .set { file_list } + ch_versions = Channel.empty() + + DEEPVARIANT ( bam, fasta, fai ) + DEEPVARIANT.out.gvcf.collect{it[1]} + .toList() + .set { file_list } + ch_versions = ch_versions.mix(DEEPVARIANT.out.versions) //Combine case meta with the list of gvcfs - ch_case_info.combine(file_list) - .set { ch_gvcfs } - GLNEXUS ( ch_gvcfs ) - SPLIT_MULTIALLELICS (GLNEXUS.out.bcf, fasta) - REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) - TABIX (REMOVE_DUPLICATES.out.vcf) + ch_case_info.combine(file_list) + .set { ch_gvcfs } + GLNEXUS ( ch_gvcfs ) + ch_versions = ch_versions.mix(GLNEXUS.out.versions) - emit: - vcf = REMOVE_DUPLICATES.out.vcf - tbi = TABIX.out.tbi + SPLIT_MULTIALLELICS (GLNEXUS.out.bcf, fasta) + REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) + ch_versions = ch_versions.mix(REMOVE_DUPLICATES.out.versions) - // Collect versions - deepvariant_version = DEEPVARIANT.out.version - glnexus_version = GLNEXUS.out.version + TABIX (REMOVE_DUPLICATES.out.vcf) + ch_versions = ch_versions.mix(TABIX.out.versions) + + emit: + vcf = REMOVE_DUPLICATES.out.vcf + tabix = TABIX.out.tbi + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 5e9099d0..2a22006e 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -15,32 +15,30 @@ workflow PREPARE_GENOME { main: ch_fasta = file(fasta) + ch_versions = Channel.empty() - ch_bwamem2_version = Channel.empty() // Fetch BWAMEM2 index or create from scratch if required if ( params.aligner == 'bwamem2' ) { if ( params.bwamem2_index && file(params.bwamem2_index, checkIfExists:true) ) { ch_bwamem2_index = file(params.bwamem2_index) } else { ch_bwamem2_index = BWAMEM2_INDEX ( ch_fasta ).index - ch_bwamem2_version = BWAMEM2_INDEX.out.version + ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) } } - ch_samtools_version = Channel.empty() if ( params.fasta_fai ) { ch_fai = file(params.fasta_fai) } else { ch_fai = SAMTOOLS_FAIDX ( ch_fasta ).fai - ch_samtools_version = SAMTOOLS_FAIDX.out.version + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) } emit: fasta = ch_fasta // path: genome.fasta fai = ch_fai // path: genome.fasta.fai - samtools_version = ch_samtools_version // path: *.version.txt - bwamem2_index = ch_bwamem2_index // path: bwamem2/index - bwamem2_version = ch_bwamem2_version // path: *.version.txt + + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index 0e97bc95..83e64e1d 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -20,18 +20,22 @@ include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/ workflow ALIGN_BWAMEM2 { take: reads_input // channel: [ val(meta), reads_input ] - index // channel: /path/to/bwamem2/index/ + index // channel: [ /path/to/bwamem2/index/ ] main: + ch_versions = Channel.empty() + // Map, sort, and index BWAMEM2_MEM ( reads_input, index ) + ch_versions = ch_versions.mix(BWAMEM2_MEM.out.versions) + SAMTOOLS_SORT ( BWAMEM2_MEM.out.bam ) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) // Join the mapped bam + bai paths by their keys for stats // Get stats for each demultiplexed read pair. bam_sorted_indexed = SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai) - SAMTOOLS_STATS ( bam_sorted_indexed ) + SAMTOOLS_STATS ( bam_sorted_indexed, [] ) // Merge multiple lane samples and index SAMTOOLS_SORT.out.bam @@ -47,11 +51,13 @@ workflow ALIGN_BWAMEM2 { .set{ bams } // create a new multi-channel named bams // TODO: If there are no samples to merge, skip the process - SAMTOOLS_MERGE ( bams.multiple ) + SAMTOOLS_MERGE ( bams.multiple, [] ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) + ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) // Marking duplicates MARKDUPLICATES ( prepared_bam ) + ch_versions = ch_versions.mix(MARKDUPLICATES.out.versions) emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] @@ -59,8 +65,5 @@ workflow ALIGN_BWAMEM2 { marked_bam = MARKDUPLICATES.out.bam // channel: [ val(meta), [ marked_bam ] ] marked_bai = MARKDUPLICATES.out.bai // channel: [ val(meta), [ marked_bai ] ] - // Collect versions - bwamem2_version = BWAMEM2_MEM.out.version // path: *.version.txt - picard_version = MARKDUPLICATES.out.version // path: *.version.txt - samtools_version = SAMTOOLS_SORT.out.version // path: *.version.txt + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 1c8a9dda..a21bc55e 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -13,8 +13,13 @@ workflow QC_BAM { fasta // path: genome.fasta main: + ch_versions = Channel.empty() + PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta ) + ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions) emit: - multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics + multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] + + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 26974812..83ae168f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -43,11 +43,6 @@ if (!params.save_reference) { modules['samtools_faidx'].publish_files = false } -// -// MODULE: Local to the pipeline -// -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) - // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -66,7 +61,9 @@ multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \" // MODULE: Installed directly from nf-core/modules // include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) + // // SUBWORKFLOW: Consists entirely of nf-core/modules @@ -113,7 +110,7 @@ def multiqc_report = [] workflow RAREDISEASE { - ch_software_versions = Channel.empty() + ch_versions = Channel.empty() // // SUBWORKFLOW: Read in samplesheet, validate and stage input files @@ -126,10 +123,11 @@ workflow RAREDISEASE { FASTQC ( INPUT_CHECK.out.reads ) - ch_software_versions = ch_software_versions.mix(FASTQC.out.version.ifEmpty(null)) + ch_versions = ch_versions.mix(FASTQC.out.versions) // STEP 0: PREPARE GENOME REFERENCES AND INDICES. PREPARE_GENOME ( params.fasta ) + ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. if (params.aligner == 'bwamem2') { @@ -141,9 +139,7 @@ workflow RAREDISEASE { ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai - ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.bwamem2_version.ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.picard_version.ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(ALIGN_BWAMEM2.out.samtools_version.ifEmpty(null)) + ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) } // STEP 1.5: BAM QUALITY CHECK @@ -155,26 +151,18 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. DEEPVARIANT_CALLER ( - ch_marked_bam.join(ch_marked_bai, by: [0]), - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, - INPUT_CHECK.out.ch_case_info - ) - ch_software_versions = ch_software_versions.mix(DEEPVARIANT_CALLER.out.deepvariant_version.ifEmpty(null)) + ch_marked_bam.join(ch_marked_bai, by: [0]), + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.fai, + INPUT_CHECK.out.ch_case_info + ) + ch_versions = ch_versions.mix(DEEPVARIANT_CALLER.out.versions) // // MODULE: Pipeline reporting // - ch_software_versions - .map { it -> if (it) [ it.baseName, it ] } - .groupTuple() - .map { it[1][0] } - .flatten() - .collect() - .set { ch_software_versions } - - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect() + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile() ) // @@ -187,14 +175,13 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(GET_SOFTWARE_VERSIONS.out.yaml.collect()) + ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( ch_multiqc_files.collect() ) multiqc_report = MULTIQC.out.report.toList() - ch_software_versions = ch_software_versions.mix(MULTIQC.out.version.ifEmpty(null)) } /* From dc1315179f357f3ce66819625a73d1165fee1387 Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 9 Nov 2021 15:36:51 +0100 Subject: [PATCH 0116/1169] Add variant catalog files --- conf/genomes.config | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 4f9835b3..fc2fc66b 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -11,14 +11,16 @@ params { genomes { 'GRCh37' { - fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" - fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" - bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" + fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" + bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" } 'GRCh38' { - fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" - fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" - bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" + fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" + bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" } } } From 982912816eade8b8c14a0519e77807049de9095e Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 9 Nov 2021 15:37:10 +0100 Subject: [PATCH 0117/1169] Add ExpansionHunter module parameters --- conf/modules.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 4ac9620c..8d6bf888 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -39,6 +39,9 @@ params { args = "--model_type=${params.analysis_type}" suffix = '_deepvar' } + 'expansionhunter' { + args = "" + } 'fastqc' { args = '--quiet' } From 7c735cea021ae36800ede85ed7d14f82e2b1aa6c Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 9 Nov 2021 15:37:54 +0100 Subject: [PATCH 0118/1169] Add paths for test profile --- conf/test.config | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 136e56ad..e8c82ef0 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,5 +26,9 @@ params { input = 'https://raw.githubusercontent.com/nf-core/raredisease/dev/assets/samplesheet.csv' // Genome references - fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + //fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + fasta = "${params.local_genomes}/GRCh38.primary_assembly.genome.fa" + + // Variant catalog file + variant_catalog = 'assets/variant_catalog_grch38.json' } From 1e544040fe6c15988e752981e3dae1f2d0a147d4 Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 9 Nov 2021 15:38:22 +0100 Subject: [PATCH 0119/1169] Install ExpansionHunter module --- .../modules/expansionhunter/functions.nf | 78 +++++++++++++++++++ .../nf-core/modules/expansionhunter/main.nf | 47 +++++++++++ .../nf-core/modules/expansionhunter/meta.yml | 50 ++++++++++++ 3 files changed, 175 insertions(+) create mode 100644 modules/nf-core/modules/expansionhunter/functions.nf create mode 100644 modules/nf-core/modules/expansionhunter/main.nf create mode 100644 modules/nf-core/modules/expansionhunter/meta.yml diff --git a/modules/nf-core/modules/expansionhunter/functions.nf b/modules/nf-core/modules/expansionhunter/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/nf-core/modules/expansionhunter/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/expansionhunter/main.nf b/modules/nf-core/modules/expansionhunter/main.nf new file mode 100644 index 00000000..845de15d --- /dev/null +++ b/modules/nf-core/modules/expansionhunter/main.nf @@ -0,0 +1,47 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process EXPANSIONHUNTER { + tag "$meta.id" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::expansionhunter=4.0.2" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/expansionhunter:4.0.2--he785bd8_0" + } else { + container "quay.io/biocontainers/expansionhunter:4.0.2--he785bd8_0" + } + + input: + tuple val(meta), path(bam), path(bai) + path fasta + path variant_catalog + + output: + tuple val(meta), path("*.vcf"), emit: vcf + path "versions.yml" , emit: versions + + script: + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def gender = (meta.gender == 'male' || meta.gender == 1 || meta.gender == 'XY') ? "male" : "female" + """ + ExpansionHunter \\ + $options.args \\ + --reads $bam \\ + --output-prefix $prefix \\ + --reference $fasta \\ + --variant-catalog $variant_catalog \\ + --sex $gender + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$( echo \$(ExpansionHunter --version 2>&1) | sed 's/^.*ExpansionHunter v//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/expansionhunter/meta.yml b/modules/nf-core/modules/expansionhunter/meta.yml new file mode 100644 index 00000000..17d72bb4 --- /dev/null +++ b/modules/nf-core/modules/expansionhunter/meta.yml @@ -0,0 +1,50 @@ +name: expansionhunter +description: write your description here +keywords: + - STR + - repeat_expansions +tools: + - expansionhunter: + description: A tool for estimating repeat sizes + homepage: https://github.com/Illumina/ExpansionHunter + documentation: https://github.com/Illumina/ExpansionHunter/blob/master/docs/01_Introduction.md + tool_dev_url: None + doi: "10.1093/bioinformatics/btz431" + licence: ['Apache-2.0'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM file + pattern: "*.{bam,cram}" + - fasta: + type: file + description: Reference genome + pattern: "*.{fa,fasta}" + - variant_catalog: + type: file + description: json file with repeat expansion sites to genotype + pattern: "*.{json}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', gender:'female' ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: VCF with repeat expansions + pattern: "*.{vcf}" + +authors: + - "@jemten" From 66fa9d2a8b74b6b70595caf40e4e0a4e14d43bbd Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 9 Nov 2021 15:38:39 +0100 Subject: [PATCH 0120/1169] Add subworkflow for ExpansionHunter module --- subworkflows/local/call_repeat_expansions.nf | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 subworkflows/local/call_repeat_expansions.nf diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf new file mode 100644 index 00000000..c47a81ba --- /dev/null +++ b/subworkflows/local/call_repeat_expansions.nf @@ -0,0 +1,22 @@ +// +// Run ExpansionHunter +// + +params.expansionhunter_options = [:] + +include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/main' addParams( options: params.expansionhunter_options ) + +workflow CALL_REPEAT_EXPANSIONS { + take: + bam // channel: [ val(meta), path(bam), path(bai) ] + fasta // path: genome.fasta + variant_catalog // channel: /path/to/variant_catalog.json + + main: + + EXPANSIONHUNTER( bam, fasta, file(variant_catalog) ) + + emit: + vcf = EXPANSIONHUNTER.out.vcf // path: *.vcf + expansionhunter_version = EXPANSIONHUNTER.out.versions // path: versions.yml +} From 296756184691bf917eb76be41585f2421458a98d Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 9 Nov 2021 15:39:33 +0100 Subject: [PATCH 0121/1169] Include and run subworkflow in the main workflow --- workflows/raredisease.nf | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 090b6549..fea7859c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -89,6 +89,14 @@ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' addParams ( qualimap_bamqc_options: modules['qualimap_bamqc'] ) +// +// SUBWORKFLOW: Consists entirely of nf-core/modules +// + +include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/local/call_repeat_expansions' addParams( + expansionhunter_options: modules['expansionhunter'] +) + // // SUBWORKFLOW: Consists of mix/local modules @@ -150,6 +158,14 @@ workflow RAREDISEASE { PREPARE_GENOME.out.fasta ) + // STEP 1.6: EXPANSIONHUNTER + CALL_REPEAT_EXPANSIONS ( + ch_marked_bam.join(ch_marked_bai, by: [0]), + PREPARE_GENOME.out.fasta, + params.genomes.GRCh38.variant_catalog + ) + ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.expansionhunter_version.ifEmpty(null)) + // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. DEEPVARIANT_CALLER ( From 8a3b6b4e474034a5f6dbbb7b02d5d1a25ef50732 Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 9 Nov 2021 15:40:02 +0100 Subject: [PATCH 0122/1169] Update modules.json with ExpansionHunter git_sha --- modules.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules.json b/modules.json index d5d2f2ad..a82b5a73 100644 --- a/modules.json +++ b/modules.json @@ -15,6 +15,9 @@ "custom/dumpsoftwareversions": { "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, + "expansionhunter": { + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + }, "fastqc": { "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, From f6a4ddac7d36023f6130f5b68ef3e6fc2da4b9c7 Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Wed, 10 Nov 2021 09:46:56 +0100 Subject: [PATCH 0123/1169] Change output bai file name --- subworkflows/nf-core/align_bwamem2.nf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index 83e64e1d..8649b008 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -4,6 +4,7 @@ params.bwamem2_mem_options = [:] params.samtools_idx_options = [:] +params.samtools_idx_md_options = [:] params.samtools_sort_options = [:] params.samtools_stats_options = [:] params.samtools_merge_options = [:] @@ -11,6 +12,7 @@ params.markduplicates_options = [:] include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_options ) +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_md_options ) include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams( options: params.samtools_merge_options ) @@ -57,13 +59,14 @@ workflow ALIGN_BWAMEM2 { // Marking duplicates MARKDUPLICATES ( prepared_bam ) + SAMTOOLS_INDEX_MD ( MARKDUPLICATES.out.bam ) ch_versions = ch_versions.mix(MARKDUPLICATES.out.versions) emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] metrics = MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] marked_bam = MARKDUPLICATES.out.bam // channel: [ val(meta), [ marked_bam ] ] - marked_bai = MARKDUPLICATES.out.bai // channel: [ val(meta), [ marked_bai ] ] + marked_bai = SAMTOOLS_INDEX_MD.out.bai // channel: [ val(meta), [ marked_bai ] ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From d58cd553d9f1b8ee978c6f848f8604160f7d3d33 Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Wed, 10 Nov 2021 10:31:01 +0100 Subject: [PATCH 0124/1169] Change left padding and remove empty line --- subworkflows/local/call_repeat_expansions.nf | 8 ++++---- workflows/raredisease.nf | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index c47a81ba..7e92b202 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -8,15 +8,15 @@ include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/ workflow CALL_REPEAT_EXPANSIONS { take: - bam // channel: [ val(meta), path(bam), path(bai) ] + bam // channel: [ val(meta), path(bam), path(bai) ] fasta // path: genome.fasta - variant_catalog // channel: /path/to/variant_catalog.json + variant_catalog // channel: /path/to/variant_catalog.json main: - EXPANSIONHUNTER( bam, fasta, file(variant_catalog) ) + EXPANSIONHUNTER( bam, fasta, file(variant_catalog) ) emit: vcf = EXPANSIONHUNTER.out.vcf // path: *.vcf - expansionhunter_version = EXPANSIONHUNTER.out.versions // path: versions.yml + expansionhunter_version = EXPANSIONHUNTER.out.versions // path: versions.yml } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index fea7859c..3b5b33e4 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -97,7 +97,6 @@ include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/local/call_repeat_expan expansionhunter_options: modules['expansionhunter'] ) - // // SUBWORKFLOW: Consists of mix/local modules // From 09750377481bf229d0157d8ffb26b5ac10a3b1be Mon Sep 17 00:00:00 2001 From: rannick Date: Fri, 12 Nov 2021 13:53:56 +0100 Subject: [PATCH 0125/1169] Added read group to the meta map --- subworkflows/local/input_check.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 2db44ce7..266c367b 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -31,8 +31,9 @@ def create_fastq_channels(LinkedHashMap row) { def meta = [:] meta.id = row.sample meta.single_end = row.single_end.toBoolean() + //TODO: think about adding LB and PU, make sure only illumina will be used, ID can also contain a flowcell id + meta.read_group = "\'@RG\\tID:"+row.sample + "_" + row.fastq_1.split('/')[0].split('_R1*.fastq')[0] + "_" + row.lane + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" - // TODO: add read group to the meta map def array = [] if (!file(row.fastq_1).exists()) { From f5e821abaa0cb7b296bfbf956d743d216e1b81fe Mon Sep 17 00:00:00 2001 From: Lauri Mesilaakso Date: Wed, 17 Nov 2021 11:47:47 +0200 Subject: [PATCH 0126/1169] Update workflows/raredisease.nf Use utility function to decompose variant_catalog nested dictionary. Co-authored-by: Mei Wu --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3b5b33e4..c5593551 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -161,7 +161,7 @@ workflow RAREDISEASE { CALL_REPEAT_EXPANSIONS ( ch_marked_bam.join(ch_marked_bai, by: [0]), PREPARE_GENOME.out.fasta, - params.genomes.GRCh38.variant_catalog + params.variant_catalog ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.expansionhunter_version.ifEmpty(null)) From 13780d16170fb80fc80db4634aa0995cb3880c52 Mon Sep 17 00:00:00 2001 From: Lauri Mesilaakso Date: Wed, 17 Nov 2021 11:49:34 +0200 Subject: [PATCH 0127/1169] Make comment more human readable Co-authored-by: Mei Wu --- subworkflows/local/call_repeat_expansions.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 7e92b202..2c9f05dc 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -9,7 +9,7 @@ include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/ workflow CALL_REPEAT_EXPANSIONS { take: bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // path: genome.fasta + fasta // channel: /path/to/genome.fasta variant_catalog // channel: /path/to/variant_catalog.json main: From c60f91cde720c8c066fb54ace0b82c6a8758b3c3 Mon Sep 17 00:00:00 2001 From: Lauri Mesilaakso Date: Wed, 17 Nov 2021 11:53:49 +0200 Subject: [PATCH 0128/1169] Create explicitely channel with ExpansionHunter version Co-authored-by: Mei Wu --- subworkflows/local/call_repeat_expansions.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 2c9f05dc..fd39e108 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -14,7 +14,10 @@ workflow CALL_REPEAT_EXPANSIONS { main: + ch_versions = Channel.empty() + EXPANSIONHUNTER( bam, fasta, file(variant_catalog) ) + ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) emit: vcf = EXPANSIONHUNTER.out.vcf // path: *.vcf From 6dff2c1c02ac157138ccd32ba07632b766520e2b Mon Sep 17 00:00:00 2001 From: Lauri Mesilaakso Date: Wed, 17 Nov 2021 11:54:40 +0200 Subject: [PATCH 0129/1169] Refactor versions output and clarify comments Co-authored-by: Mei Wu --- subworkflows/local/call_repeat_expansions.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index fd39e108..fb3cc456 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -20,6 +20,6 @@ workflow CALL_REPEAT_EXPANSIONS { ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) emit: - vcf = EXPANSIONHUNTER.out.vcf // path: *.vcf - expansionhunter_version = EXPANSIONHUNTER.out.versions // path: versions.yml + vcf = EXPANSIONHUNTER.out.vcf // channel: [ val(meta), path(*.vcf) ] + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 68a33020f874e0bb687cd49a16e73f23ac6eb87f Mon Sep 17 00:00:00 2001 From: Lauri Mesilaakso Date: Wed, 17 Nov 2021 12:52:05 +0200 Subject: [PATCH 0130/1169] Refactor subworkflow output channel name Co-authored-by: Mei Wu --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c5593551..808d4b2b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -163,7 +163,7 @@ workflow RAREDISEASE { PREPARE_GENOME.out.fasta, params.variant_catalog ) - ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.expansionhunter_version.ifEmpty(null)) + ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. From 74ae7fba7e3e2adf05d171eb1a3ecb73954f9e0b Mon Sep 17 00:00:00 2001 From: Lauri Mesilaakso Date: Wed, 17 Nov 2021 12:54:19 +0200 Subject: [PATCH 0131/1169] Use custom variant catalog file in testing Co-authored-by: Mei Wu --- conf/test.config | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/conf/test.config b/conf/test.config index e8c82ef0..2e1e03ca 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,9 +26,8 @@ params { input = 'https://raw.githubusercontent.com/nf-core/raredisease/dev/assets/samplesheet.csv' // Genome references - //fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' - fasta = "${params.local_genomes}/GRCh38.primary_assembly.genome.fa" + fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' // Variant catalog file - variant_catalog = 'assets/variant_catalog_grch38.json' + variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' } From d0ccb1414618fbae13e58076aad372767564ce3d Mon Sep 17 00:00:00 2001 From: LJMesi <37740329+ljmesi@users.noreply.github.com> Date: Wed, 17 Nov 2021 11:55:12 +0100 Subject: [PATCH 0132/1169] Access variant catalog in a nested dictionary --- main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/main.nf b/main.nf index 638f8a87..65ead423 100644 --- a/main.nf +++ b/main.nf @@ -20,6 +20,7 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') +params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') /* ======================================================================================== From ce131ba33afd1a836076ff76709c1c2760f840e9 Mon Sep 17 00:00:00 2001 From: Lauri Mesilaakso Date: Wed, 17 Nov 2021 14:02:43 +0200 Subject: [PATCH 0133/1169] Remove tab-character Co-authored-by: Mei Wu --- subworkflows/local/call_repeat_expansions.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index fb3cc456..ba110f86 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -15,7 +15,6 @@ workflow CALL_REPEAT_EXPANSIONS { main: ch_versions = Channel.empty() - EXPANSIONHUNTER( bam, fasta, file(variant_catalog) ) ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) From f4599b6d7fc45f6cd148b424ff76662f52a98fe2 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 17 Nov 2021 15:06:21 +0100 Subject: [PATCH 0134/1169] added subworkflow --- subworkflows/nf-core/call_structural_variants.nf | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 subworkflows/nf-core/call_structural_variants.nf diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf new file mode 100644 index 00000000..3da51460 --- /dev/null +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -0,0 +1,14 @@ +// +// A nested subworkflow to call structural variants. +// + +workflow CALL_STRUCTURAL_VARIANTS { + + take: + bam // channel: [ val(meta), path(bam) ] + fasta // channel: [ path(genome.fasta) ] + fai // channel: [ path(genome.fai) ] + + main: + ch_versions = Channel.empty() +} From 42a263cccbd39e95449ab655397a00d0165181e0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 22 Nov 2021 14:40:08 +0100 Subject: [PATCH 0135/1169] Fix description to reflect taking in a single vcf --- bin/check_input_vcf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/check_input_vcf.py b/bin/check_input_vcf.py index 94cd5265..c0e3b462 100755 --- a/bin/check_input_vcf.py +++ b/bin/check_input_vcf.py @@ -7,7 +7,7 @@ def parse_args(args=None): Description = "Check that input vcf file has been normalized." - Epilog = "Example usage: python check_input_vcf.py --INPUT_VCF ... --OUTPUT " + Epilog = "Example usage: python check_input_vcf.py --INPUT_VCF --OUTPUT " parser = argparse.ArgumentParser(description=Description, epilog=Epilog) parser.add_argument("--INPUT_VCF", help="Input vcf file.") From c6eb8febb0a6ca4f69687a43e6ed5da16e9a569a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 23 Nov 2021 10:37:23 +0100 Subject: [PATCH 0136/1169] Review suggestions --- conf/genomes.config | 2 +- conf/test.config | 2 +- modules/local/check_input_vcf.nf | 5 ++--- workflows/raredisease.nf | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index be6b0aea..923b7dec 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -14,7 +14,7 @@ params { fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" + gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" diff --git a/conf/test.config b/conf/test.config index 11ca6988..767eaca0 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,6 +26,6 @@ params { input = 'https://raw.githubusercontent.com/nf-core/raredisease/dev/assets/samplesheet.csv' // Genome references - fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' } diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index d2c0253a..fb48ef33 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -17,16 +17,15 @@ process CHECK_INPUT_VCF { } input: - path vcfs + path vcf output: path '*.txt' , emit: txt script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ - def input = vcfs.collect { it.toString() } """ check_input_vcf.py \\ - --INPUT_VCF ${input.join(' ')} \\ + --INPUT_VCF $vcf \\ --OUTPUT unprocessed_vcfs.txt """ } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 0bd1f040..ceca3b97 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -133,7 +133,7 @@ workflow RAREDISEASE { PREPARE_GENOME ( params.fasta ) ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) - if (params.gnomad != '') + if (params.gnomad) { ch_gnomad_in = Channel.fromPath(params.gnomad) CHECK_VCF( From a18c42c2d0ac49f2a839d4e5a127b9ccc8f0a238 Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 23 Nov 2021 15:37:20 +0100 Subject: [PATCH 0137/1169] Add variant_catalog parameter --- nextflow_schema.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 53f3c6e8..946564e9 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -95,9 +95,15 @@ "fa_icon": "fas fa-folder-open", "hidden": true }, + "variant_catalog": { + "type": "string", + "format": "file-path", + "description": "Path to variant catalog file", + "help_text": "This parameter is mandatory for use with ExpansionHunter", + "fa_icon": "far fa-file-code" + }, "save_reference": { "type": "boolean", - "default": false, "description": "If generated by the pipeline save the required indices/references in the results directory.", "help_text": "The saved references can be used for future pipeline runs, reducing processing times.", "fa_icon": "fas fa-save" From da520cd05f7c2ae1df0b99108d62c3a4b7e8a685 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 24 Nov 2021 11:24:12 +0100 Subject: [PATCH 0138/1169] added example line to swap out for real content --- subworkflows/nf-core/call_structural_variants.nf | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index 3da51460..96729b66 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -2,6 +2,14 @@ // A nested subworkflow to call structural variants. // +// CHANGE: swap this example line for the real subworkflow +params.bwamem2_idx_options = [:] + +// CHANGE: swap this example line for the real subworkflow +include { PREPARE_GENOME } from './prepare_genome' addParams( + options: params.bwamem2_idx_options +) + workflow CALL_STRUCTURAL_VARIANTS { take: @@ -11,4 +19,7 @@ workflow CALL_STRUCTURAL_VARIANTS { main: ch_versions = Channel.empty() + + emit: + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From a6028920be580e6c54d3e8fa8f6cb36e8cf2ee1b Mon Sep 17 00:00:00 2001 From: rannick Date: Fri, 26 Nov 2021 18:22:58 +0100 Subject: [PATCH 0139/1169] Add read group compatible with samtools merge --- subworkflows/local/input_check.nf | 2 +- subworkflows/nf-core/align_bwamem2.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 266c367b..c43e648f 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -32,7 +32,7 @@ def create_fastq_channels(LinkedHashMap row) { meta.id = row.sample meta.single_end = row.single_end.toBoolean() //TODO: think about adding LB and PU, make sure only illumina will be used, ID can also contain a flowcell id - meta.read_group = "\'@RG\\tID:"+row.sample + "_" + row.fastq_1.split('/')[0].split('_R1*.fastq')[0] + "_" + row.lane + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" + meta.read_group = "\'@RG\\tID:"+ row.sample.split('_')[0] + "_" + row.fastq_1.split('/')[-1].split('_R1_')[0] + "_" + row.lane + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" def array = [] diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index 83e64e1d..59920151 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -40,8 +40,8 @@ workflow ALIGN_BWAMEM2 { // Merge multiple lane samples and index SAMTOOLS_SORT.out.bam .map{ meta, bam -> - new_meta = meta.clone() // clone to avoid overriding the global meta - new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename + new_meta = meta = [:] // to avoid overriding the global meta + new_meta.id = meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename [new_meta, bam]} // end the closure to return newly modified channel .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list From cd2e4982fa2b1169282a07b5f681529a398bf82d Mon Sep 17 00:00:00 2001 From: Annick Renevey <47788523+rannick@users.noreply.github.com> Date: Fri, 26 Nov 2021 18:42:25 +0100 Subject: [PATCH 0140/1169] Correct missassignment --- subworkflows/nf-core/align_bwamem2.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index 59920151..f4c7f1f4 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -40,7 +40,7 @@ workflow ALIGN_BWAMEM2 { // Merge multiple lane samples and index SAMTOOLS_SORT.out.bam .map{ meta, bam -> - new_meta = meta = [:] // to avoid overriding the global meta + new_meta = [:] // to avoid overriding the global meta new_meta.id = meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename [new_meta, bam]} // end the closure to return newly modified channel .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] From 387c79938862c0d7d0d2000e9bd41a14ad136577 Mon Sep 17 00:00:00 2001 From: Annick Renevey <47788523+rannick@users.noreply.github.com> Date: Mon, 29 Nov 2021 10:17:37 +0100 Subject: [PATCH 0141/1169] Update align_bwamem2.nf --- subworkflows/nf-core/align_bwamem2.nf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index f4c7f1f4..d331a8ba 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -40,8 +40,9 @@ workflow ALIGN_BWAMEM2 { // Merge multiple lane samples and index SAMTOOLS_SORT.out.bam .map{ meta, bam -> - new_meta = [:] // to avoid overriding the global meta - new_meta.id = meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename + new_meta = meta.clone() // clone to avoid overriding the global meta + new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename + new_meta.read_group = [] // remove read group from cloned meta to get a single file per sample [new_meta, bam]} // end the closure to return newly modified channel .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list From 5d877082a0f52ada0e14c09ff2e6641e7523bafb Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 30 Nov 2021 15:17:39 +0100 Subject: [PATCH 0142/1169] Template update for nf-core/tools version 2.2.dev0 --- .gitattributes | 2 + .github/ISSUE_TEMPLATE/bug_report.md | 63 ------------- .github/ISSUE_TEMPLATE/bug_report.yml | 52 +++++++++++ .github/ISSUE_TEMPLATE/config.yml | 1 - .github/ISSUE_TEMPLATE/feature_request.md | 32 ------- .github/ISSUE_TEMPLATE/feature_request.yml | 11 +++ .github/workflows/awsfulltest.yml | 6 +- .github/workflows/awstest.yml | 6 +- .github/workflows/ci.yml | 12 +-- .github/workflows/linting_comment.yml | 1 + CITATIONS.md | 2 +- README.md | 11 ++- assets/multiqc_config.yaml | 2 +- bin/scrape_software_versions.py | 36 -------- conf/base.config | 3 + conf/modules.config | 55 +++++++----- docs/output.md | 2 +- docs/usage.md | 36 -------- lib/NfcoreSchema.groovy | 22 +++-- lib/NfcoreTemplate.groovy | 30 ++----- lib/WorkflowMain.groovy | 6 +- modules.json | 9 +- modules/local/functions.nf | 68 -------------- modules/local/get_software_versions.nf | 33 ------- modules/local/samplesheet_check.nf | 24 +++-- .../custom/dumpsoftwareversions/main.nf | 21 +++++ .../custom/dumpsoftwareversions/meta.yml | 34 +++++++ .../templates/dumpsoftwareversions.py | 89 +++++++++++++++++++ modules/nf-core/modules/fastqc/functions.nf | 68 -------------- modules/nf-core/modules/fastqc/main.nf | 39 ++++---- modules/nf-core/modules/fastqc/meta.yml | 7 +- modules/nf-core/modules/multiqc/functions.nf | 68 -------------- modules/nf-core/modules/multiqc/main.nf | 31 +++---- modules/nf-core/modules/multiqc/meta.yml | 7 +- nextflow.config | 27 +++--- nextflow_schema.json | 29 ------ subworkflows/local/input_check.nf | 8 +- workflows/raredisease.nf | 44 +++------ 38 files changed, 378 insertions(+), 619 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml delete mode 100755 bin/scrape_software_versions.py delete mode 100644 modules/local/functions.nf delete mode 100644 modules/local/get_software_versions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/main.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py delete mode 100644 modules/nf-core/modules/fastqc/functions.nf delete mode 100644 modules/nf-core/modules/multiqc/functions.nf diff --git a/.gitattributes b/.gitattributes index 7fe55006..050bb120 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ *.config linguist-language=nextflow +modules/nf-core/** linguist-generated +subworkflows/nf-core/** linguist-generated diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index e4a6be5b..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -name: Bug report -about: Report something that is broken or incorrect -labels: bug ---- - - - -## Check Documentation - -I have checked the following places for your error: - -- [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) -- [ ] [nf-core/raredisease pipeline documentation](https://nf-co.re/raredisease/usage) - -## Description of the bug - - - -## Steps to reproduce - -Steps to reproduce the behaviour: - -1. Command line: -2. See error: - -## Expected behaviour - - - -## Log files - -Have you provided the following extra information/files: - -- [ ] The command used to run the pipeline -- [ ] The `.nextflow.log` file - -## System - -- Hardware: -- Executor: -- OS: -- Version - -## Nextflow Installation - -- Version: - -## Container engine - -- Engine: -- version: - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..4c482b24 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,52 @@ + +name: Bug report +description: Report something that is broken or incorrect +labels: bug +body: + + - type: markdown + attributes: + value: | + Before you post this issue, please check the documentation: + + - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) + - [nf-core/raredisease pipeline documentation](https://nf-co.re/raredisease/usage) + + - type: textarea + id: description + attributes: + label: Description of the bug + description: A clear and concise description of what the bug is. + validations: + required: true + + - type: textarea + id: command_used + attributes: + label: Command used and terminal output + description: Steps to reproduce the behaviour. Please paste the command you used to launch the pipeline and the output from your terminal. + render: console + placeholder: | + $ nextflow run ... + + Some output where something broke + + - type: textarea + id: files + attributes: + label: Relevant files + description: | + Please upload (drag and drop) and relevant files. Make into a `.zip` file if the extension is not allowed. + Your verbose log file `.nextflow.log` is often useful _(this is a hidden file in the directory where you launched the pipeline)_ as well as custom Nextflow configuration files. + + - type: textarea + id: system + attributes: + label: System information + description: | + * Nextflow version _(eg. 21.10.3)_ + * Hardware _(eg. HPC, Desktop, Cloud)_ + * Executor _(eg. slurm, local, awsbatch)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + * OS _(eg. CentOS Linux, macOS, Linux Mint)_ + * Version of nf-core/raredisease _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index cf826800..ff53045d 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,3 @@ -blank_issues_enabled: false contact_links: - name: Join nf-core url: https://nf-co.re/join diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index ec0309f3..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for the nf-core/raredisease pipeline -labels: enhancement ---- - - - -## Is your feature request related to a problem? Please describe - - - - - -## Describe the solution you'd like - - - -## Describe alternatives you've considered - - - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..1ce939e3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,11 @@ +name: Feature request +description: Suggest an idea for the nf-core/raredisease pipeline +labels: enhancement +body: + - type: textarea + id: description + attributes: + label: Description of feature + description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. + validations: + required: true diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 2ca44198..cb5dba0e 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,14 +14,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} @@ -30,5 +30,5 @@ jobs: { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" } - profiles: '[ "test_full", "aws_tower" ]' + profiles: test_full,aws_tower diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index c072e483..d3317389 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,11 +11,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} @@ -24,5 +24,5 @@ jobs: { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" } - profiles: '[ "test", "aws_tower" ]' + profiles: test,aws_tower diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f139f7c3..3ea1ca62 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,9 +8,6 @@ on: release: types: [published] -# Uncomment if we need an edge release of Nextflow again -# env: NXF_EDGE: 1 - jobs: test: name: Run workflow tests @@ -18,12 +15,13 @@ jobs: if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/raredisease') }} runs-on: ubuntu-latest env: - NXF_VER: ${{ matrix.nxf_ver }} NXF_ANSI_LOG: false strategy: matrix: - # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['21.04.0', ''] + # Nextflow versions: check pipeline minimum and latest edge version + nxf_ver: + - 'NXF_VER=21.10.3' + # - 'NXF_EDGE=1' steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -34,6 +32,8 @@ jobs: run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ + export ${{ matrix.nxf_ver }} + nextflow self-update - name: Run pipeline with test data # TODO nf-core: You can customise CI pipeline run tests as required diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 90f03c6f..44d72994 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -15,6 +15,7 @@ jobs: uses: dawidd6/action-download-artifact@v2 with: workflow: linting.yml + workflow_conclusion: completed - name: Get PR number id: pr_number diff --git a/CITATIONS.md b/CITATIONS.md index b4dad89b..2bc54565 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,7 +12,7 @@ * [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) +* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index 9d27eeec..2f0c8a3a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/raredisease/results) [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -33,18 +33,21 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/raredisease -profile test, + nextflow run nf-core/raredisease -profile test,YOURPROFILE ``` + Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. + + > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs. + > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 03969e51..03b23126 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,7 +1,7 @@ report_comment: > This report has been generated by the nf-core/raredisease analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: software_versions: order: -1000 diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py deleted file mode 100755 index 4cbbae3a..00000000 --- a/bin/scrape_software_versions.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import os - -results = {} -version_files = [x for x in os.listdir(".") if x.endswith(".version.txt")] -for version_file in version_files: - - software = version_file.replace(".version.txt", "") - if software == "pipeline": - software = "nf-core/raredisease" - - with open(version_file) as fin: - version = fin.read().strip() - results[software] = version - -# Dump to YAML -print( - """ -id: 'software_versions' -section_name: 'nf-core/raredisease Software Versions' -section_href: 'https://github.com/nf-core/raredisease' -plot_type: 'html' -description: 'are collected at run time from the software output.' -data: | -
-""" -) -for k, v in sorted(results.items()): - print("
{}
{}
".format(k, v)) -print("
") - -# Write out as tsv file: -with open("software_versions.tsv", "w") as f: - for k, v in sorted(results.items()): - f.write("{}\t{}\n".format(k, v)) diff --git a/conf/base.config b/conf/base.config index 03546f26..14979165 100644 --- a/conf/base.config +++ b/conf/base.config @@ -54,4 +54,7 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withName:CUSTOM_DUMPSOFTWAREVERSIONS { + cache = false + } } diff --git a/conf/modules.config b/conf/modules.config index 0b1bfdec..47886995 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,32 +1,41 @@ /* ======================================================================================== - Config file for defining DSL2 per module options + Config file for defining DSL2 per module options and publishing paths ======================================================================================== Available keys to override module options: - args = Additional arguments appended to command in module. - args2 = Second set of arguments appended to command in module (multi-tool modules). - args3 = Third set of arguments appended to command in module (multi-tool modules). - publish_dir = Directory to publish results. - publish_by_meta = Groovy list of keys available in meta map to append as directories to "publish_dir" path - If publish_by_meta = true - Value of ${meta['id']} is appended as a directory to "publish_dir" path - If publish_by_meta = ['id', 'custompath'] - If "id" is in meta map and "custompath" isn't then "${meta['id']}/custompath/" - is appended as a directory to "publish_dir" path - If publish_by_meta = false / null - No directories are appended to "publish_dir" path - publish_files = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension - The value of "directory" is appended to the standard "publish_dir" path as defined above. - If publish_files = null (unspecified) - All files are published. - If publish_files = false - No files are published. - suffix = File name suffix for output files. + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.suffix = File name suffix for output files. ---------------------------------------------------------------------------------------- */ -params { - modules { - 'fastqc' { - args = "--quiet" - } - 'multiqc' { - args = "" - } +process { + + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + withName: SAMPLESHEET_CHECK { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: FASTQC { + ext.args = '--quiet' } + + withName: CUSTOM_DUMPSOFTWAREVERSIONS { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + pattern: '*_versions.yml' + ] + } + } diff --git a/docs/output.md b/docs/output.md index 0a26e7be..8e94226e 100644 --- a/docs/output.md +++ b/docs/output.md @@ -60,7 +60,7 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ * `pipeline_info/` * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.tsv`. + * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. diff --git a/docs/usage.md b/docs/usage.md index 8d3aaaa3..1f94372c 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -181,42 +181,6 @@ process { > **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. -### Tool-specific options - -For the ultimate flexibility, we have implemented and are using Nextflow DSL2 modules in a way where it is possible for both developers and users to change tool-specific command-line arguments (e.g. providing an additional command-line argument to the `STAR_ALIGN` process) as well as publishing options (e.g. saving files produced by the `STAR_ALIGN` process that aren't saved by default by the pipeline). In the majority of instances, as a user you won't have to change the default options set by the pipeline developer(s), however, there may be edge cases where creating a simple custom config file can improve the behaviour of the pipeline if for example it is failing due to a weird error that requires setting a tool-specific parameter to deal with smaller / larger genomes. - -The command-line arguments passed to STAR in the `STAR_ALIGN` module are a combination of: - -* Mandatory arguments or those that need to be evaluated within the scope of the module, as supplied in the [`script`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L49-L55) section of the module file. - -* An [`options.args`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L56) string of non-mandatory parameters that is set to be empty by default in the module but can be overwritten when including the module in the sub-workflow / workflow context via the `addParams` Nextflow option. - -The nf-core/rnaseq pipeline has a sub-workflow (see [terminology](https://github.com/nf-core/modules#terminology)) specifically to align reads with STAR and to sort, index and generate some basic stats on the resulting BAM files using SAMtools. At the top of this file we import the `STAR_ALIGN` module via the Nextflow [`include`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L10) keyword and by default the options passed to the module via the `addParams` option are set as an empty Groovy map [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L5); this in turn means `options.args` will be set to empty by default in the module file too. This is an intentional design choice and allows us to implement well-written sub-workflows composed of a chain of tools that by default run with the bare minimum parameter set for any given tool in order to make it much easier to share across pipelines and to provide the flexibility for users and developers to customise any non-mandatory arguments. - -When including the sub-workflow above in the main pipeline workflow we use the same `include` statement, however, we now have the ability to overwrite options for each of the tools in the sub-workflow including the [`align_options`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L225) variable that will be used specifically to overwrite the optional arguments passed to the `STAR_ALIGN` module. In this case, the options to be provided to `STAR_ALIGN` have been assigned sensible defaults by the developer(s) in the pipeline's [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L70-L74) and can be accessed and customised in the [workflow context](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L201-L204) too before eventually passing them to the sub-workflow as a Groovy map called `star_align_options`. These options will then be propagated from `workflow -> sub-workflow -> module`. - -As mentioned at the beginning of this section it may also be necessary for users to overwrite the options passed to modules to be able to customise specific aspects of the way in which a particular tool is executed by the pipeline. Given that all of the default module options are stored in the pipeline's `modules.config` as a [`params` variable](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L24-L25) it is also possible to overwrite any of these options via a custom config file. - -Say for example we want to append an additional, non-mandatory parameter (i.e. `--outFilterMismatchNmax 16`) to the arguments passed to the `STAR_ALIGN` module. Firstly, we need to copy across the default `args` specified in the [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L71) and create a custom config file that is a composite of the default `args` as well as the additional options you would like to provide. This is very important because Nextflow will overwrite the default value of `args` that you provide via the custom config. - -As you will see in the example below, we have: - -* appended `--outFilterMismatchNmax 16` to the default `args` used by the module. -* changed the default `publish_dir` value to where the files will eventually be published in the main results directory. -* appended `'bam':''` to the default value of `publish_files` so that the BAM files generated by the process will also be saved in the top-level results directory for the module. Note: `'out':'log'` means any file/directory ending in `out` will now be saved in a separate directory called `my_star_directory/log/`. - -```nextflow -params { - modules { - 'star_align' { - args = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16" - publish_dir = "my_star_directory" - publish_files = ['out':'log', 'tab':'log', 'bam':''] - } - } -} -``` - ### Updating containers The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 8d6920dd..5f681078 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -105,9 +105,13 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] + def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) + if (group.value['properties'][p.key].containsKey('enum')) { + enums[p.key] = group.value['properties'][p.key]['enum'] + } } } @@ -155,7 +159,7 @@ class NfcoreSchema { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log) + printExceptions(exceptionJSON, params_json, log, enums) println '' has_error = true } @@ -260,13 +264,12 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] - def blacklist = ['hostnames'] def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param) && !blacklist.contains(param)) { + if (params.containsKey(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type @@ -330,7 +333,7 @@ class NfcoreSchema { // // Loop over nested exceptions and print the causingException // - private static void printExceptions(ex_json, params_json, log) { + private static void printExceptions(ex_json, params_json, log, enums, limit=5) { def causingExceptions = ex_json['causingExceptions'] if (causingExceptions.length() == 0) { def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ @@ -346,7 +349,16 @@ class NfcoreSchema { else { def param = ex_json['pointerToViolation'] - ~/^#\// def param_val = params_json[param].toString() - log.error "* --${param}: ${ex_json['message']} (${param_val})" + if (enums.containsKey(param)) { + def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" + if (enums[param].size() > limit) { + log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" + } else { + log.error "${error_msg}: ${enums[param].join(', ')})" + } + } else { + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } } } for (ex in causingExceptions) { diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 44551e0a..06499409 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -19,27 +19,16 @@ class NfcoreTemplate { } // - // Check params.hostnames + // Warn if a -profile or Nextflow config has not been provided to run the pipeline // - public static void hostName(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (params.hostnames) { - try { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" - } - } - } - } catch (Exception e) { - log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." - } + public static void checkConfigProvided(workflow, log) { + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute enviroment but can be acheived via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " } } @@ -168,7 +157,6 @@ class NfcoreTemplate { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { - hostName(workflow, params, log) log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 089c7f7d..730a0565 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -61,6 +61,9 @@ class WorkflowMain { // Print parameter summary log to screen log.info paramsSummaryLog(workflow, params, log) + // Check that a -profile or Nextflow config has been provided to run the pipeline + NfcoreTemplate.checkConfigProvided(workflow, log) + // Check that conda channels are set-up correctly if (params.enable_conda) { Utils.checkCondaChannels(log) @@ -69,9 +72,6 @@ class WorkflowMain { // Check AWS batch settings NfcoreTemplate.awsBatch(workflow, params) - // Check the hostnames against configured profiles - NfcoreTemplate.hostName(workflow, params, log) - // Check input has been provided if (!params.input) { log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" diff --git a/modules.json b/modules.json index 0494c19e..3a3ca7b1 100644 --- a/modules.json +++ b/modules.json @@ -3,12 +3,15 @@ "homePage": "https://github.com/nf-core/raredisease", "repos": { "nf-core/modules": { + "custom/dumpsoftwareversions": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, "fastqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "multiqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } -} +} \ No newline at end of file diff --git a/modules/local/functions.nf b/modules/local/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/local/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf deleted file mode 100644 index 7961d64b..00000000 --- a/modules/local/get_software_versions.nf +++ /dev/null @@ -1,33 +0,0 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - -process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } - - cache false - - input: - path versions - - output: - path "software_versions.tsv" , emit: tsv - path 'software_versions_mqc.yaml', emit: yaml - - script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ - """ - echo $workflow.manifest.version > pipeline.version.txt - echo $workflow.nextflow.version > nextflow.version.txt - scrape_software_versions.py &> software_versions_mqc.yaml - """ -} diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 1e1f8350..d2c6d889 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,31 +1,27 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - process SAMPLESHEET_CHECK { tag "$samplesheet" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + 'quay.io/biocontainers/python:3.8.3' }" input: path samplesheet output: - path '*.csv' + path '*.csv' , emit: csv + path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ """ check_samplesheet.py \\ $samplesheet \\ samplesheet.valid.csv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf new file mode 100644 index 00000000..934bb467 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -0,0 +1,21 @@ +process CUSTOM_DUMPSOFTWAREVERSIONS { + label 'process_low' + + // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container + conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + + input: + path versions + + output: + path "software_versions.yml" , emit: yml + path "software_versions_mqc.yml", emit: mqc_yml + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + template 'dumpsoftwareversions.py' +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 00000000..5b5b8a60 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,34 @@ +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline template +keywords: + - custom + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + licence: ['MIT'] +input: + - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" + +output: + - yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py new file mode 100644 index 00000000..d1390392 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import yaml +import platform +from textwrap import dedent + + +def _make_versions_html(versions): + html = [ + dedent( + """\\ + + + + + + + + + + """ + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f"""\\ + + + + + + """ + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + +versions_this_module = {} +versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, +} + +with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + +# aggregate versions by the module name (derived from fully-qualified process name) +versions_by_module = {} +for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + assert versions_by_module[module] == process_versions, ( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + +versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", +} + +versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), +} + +with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) +with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + +with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) diff --git a/modules/nf-core/modules/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/nf-core/modules/fastqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index 39c327b2..673a00b8 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process FASTQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" - } else { - container "quay.io/biocontainers/fastqc:0.11.9--0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : + 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: tuple val(meta), path(reads) @@ -24,24 +13,32 @@ process FASTQC { output: tuple val(meta), path("*.html"), emit: html tuple val(meta), path("*.zip") , emit: zip - path "*.version.txt" , emit: version + path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline - def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index 8eb9953d..b09553a3 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -15,6 +15,7 @@ tools: overrepresented sequences. homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ['GPL-2.0-only'] input: - meta: type: map @@ -40,10 +41,10 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/nf-core/modules/multiqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index da780800..3dceb162 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,21 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process MULTIQC { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0" - } else { - container "quay.io/biocontainers/multiqc:1.10.1--py_0" - } + conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" input: path multiqc_files @@ -24,12 +13,16 @@ process MULTIQC { path "*multiqc_report.html", emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots - path "*.version.txt" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) + def args = task.ext.args ?: '' """ - multiqc -f $options.args . - multiqc --version | sed -e "s/multiqc, version //g" > ${software}.version.txt + multiqc -f $args . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS """ } diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 532a8bb1..63c75a45 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -11,6 +11,7 @@ tools: It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ + licence: ['GPL-3.0-or-later'] input: - multiqc_files: type: file @@ -29,10 +30,10 @@ output: type: file description: Plots created by MultiQC pattern: "*_data" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@abhi18av" - "@bunop" diff --git a/nextflow.config b/nextflow.config index 329e093e..efc8e013 100644 --- a/nextflow.config +++ b/nextflow.config @@ -26,7 +26,6 @@ params { // Boilerplate options outdir = './results' tracedir = "${params.outdir}/pipeline_info" - publish_dir_mode = 'copy' email = null email_on_fail = null plaintext_email = false @@ -34,14 +33,12 @@ params { help = false validate_params = true show_hidden_params = false - schema_ignore_params = 'genomes,modules' + schema_ignore_params = 'genomes' enable_conda = false - singularity_pull_docker_container = false // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - hostnames = [:] config_profile_description = null config_profile_contact = null config_profile_url = null @@ -58,9 +55,6 @@ params { // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' - // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" @@ -68,13 +62,6 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} - profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -126,6 +113,13 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } +// Load igenomes.config if required +if (!params.igenomes_ignore) { + includeConfig 'conf/igenomes.config' +} else { + params.genomes = [:] +} + // Export these variables to prevent local Python/R libraries from conflicting with those in the container env { PYTHONNOUSERSITE = 1 @@ -160,10 +154,13 @@ manifest { homePage = 'https://github.com/nf-core/raredisease' description = 'call and score variants from WGS/WES of rare disease patients' mainScript = 'main.nf' - nextflowVersion = '!>=21.04.0' + nextflowVersion = '!>=21.10.3' version = '1.0dev' } +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' + // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { diff --git a/nextflow_schema.json b/nextflow_schema.json index 60fdb051..068a9809 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -104,12 +104,6 @@ "help_text": "If you're running offline, Nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.", "fa_icon": "fas fa-users-cog" }, - "hostnames": { - "type": "string", - "description": "Institutional configs hostname.", - "hidden": true, - "fa_icon": "fas fa-users-cog" - }, "config_profile_name": { "type": "string", "description": "Institutional config name.", @@ -184,22 +178,6 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, - "publish_dir_mode": { - "type": "string", - "default": "copy", - "description": "Method used to save pipeline results to output directory.", - "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", - "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], - "hidden": true - }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", @@ -260,13 +238,6 @@ "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", "hidden": true, "fa_icon": "fas fa-bacon" - }, - "singularity_pull_docker_container": { - "type": "boolean", - "description": "Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead.", - "hidden": true, - "fa_icon": "fas fa-toolbox", - "help_text": "This may be useful for example if you are unable to directly pull Singularity containers to run the pipeline due to http/https proxy issues." } } } diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index b664bc8c..cddcbb3c 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -2,9 +2,7 @@ // Check input samplesheet and get read channels // -params.options = [:] - -include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) +include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow INPUT_CHECK { take: @@ -12,12 +10,14 @@ workflow INPUT_CHECK { main: SAMPLESHEET_CHECK ( samplesheet ) + .csv .splitCsv ( header:true, sep:',' ) .map { create_fastq_channels(it) } .set { reads } emit: - reads // channel: [ val(meta), [ reads ] ] + reads // channel: [ val(meta), [ reads ] ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3b6af916..f6369ff6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -32,18 +32,10 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi ======================================================================================== */ -// Don't overwrite global params.modules, create a copy instead and use that within the main script. -def modules = params.modules.clone() - -// -// MODULE: Local to the pipeline -// -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) - // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) +include { INPUT_CHECK } from '../subworkflows/local/input_check' /* ======================================================================================== @@ -51,14 +43,12 @@ include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( opti ======================================================================================== */ -def multiqc_options = modules['multiqc'] -multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' - // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* ======================================================================================== @@ -71,7 +61,7 @@ def multiqc_report = [] workflow RAREDISEASE { - ch_software_versions = Channel.empty() + ch_versions = Channel.empty() // // SUBWORKFLOW: Read in samplesheet, validate and stage input files @@ -79,6 +69,7 @@ workflow RAREDISEASE { INPUT_CHECK ( ch_input ) + ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) // // MODULE: Run FastQC @@ -86,21 +77,10 @@ workflow RAREDISEASE { FASTQC ( INPUT_CHECK.out.reads ) - ch_software_versions = ch_software_versions.mix(FASTQC.out.version.first().ifEmpty(null)) + ch_versions = ch_versions.mix(FASTQC.out.versions.first()) - // - // MODULE: Pipeline reporting - // - ch_software_versions - .map { it -> if (it) [ it.baseName, it ] } - .groupTuple() - .map { it[1][0] } - .flatten() - .collect() - .set { ch_software_versions } - - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect() + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile(name: 'collated_versions.yml') ) // @@ -113,14 +93,14 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(GET_SOFTWARE_VERSIONS.out.yaml.collect()) + ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( ch_multiqc_files.collect() ) - multiqc_report = MULTIQC.out.report.toList() - ch_software_versions = ch_software_versions.mix(MULTIQC.out.version.ifEmpty(null)) + multiqc_report = MULTIQC.out.report.toList() + ch_versions = ch_versions.mix(MULTIQC.out.versions) } /* From f44fec85382c57db5ff3bdbbbcf95ae2ddc48cd4 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 3 Dec 2021 14:17:01 +0100 Subject: [PATCH 0143/1169] Refactor check_input_vcf.py --- bin/check_input_vcf.py | 6 ++---- modules/local/check_input_vcf.nf | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/bin/check_input_vcf.py b/bin/check_input_vcf.py index c0e3b462..9109605a 100755 --- a/bin/check_input_vcf.py +++ b/bin/check_input_vcf.py @@ -24,16 +24,14 @@ def check_vcf(file_in, file_out): with open(file_out,'w') as out: if file_in.endswith(".gz"): + base = os.path.basename(file_in).rsplit(".",2)[0] + out.write("id,filepath,processed\n") with gzip.open(file_in,'rt') as vcf: for line in vcf: if line.startswith("##bcftools_norm"): - base = os.path.basename(file_in).rsplit(".",2)[0] - out.write("id,filepath,processed\n") out.write(base + "," + os.path.abspath(file_in) + ",yes\n") break elif not line.startswith("#"): - base = os.path.basename(file_in).rsplit(".",2)[0] - out.write("id,filepath,processed\n") out.write(base + "," + os.path.abspath(file_in) + ",no\n") break else: diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index fb48ef33..b9bb2f0e 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -26,6 +26,6 @@ process CHECK_INPUT_VCF { """ check_input_vcf.py \\ --INPUT_VCF $vcf \\ - --OUTPUT unprocessed_vcfs.txt + --OUTPUT checked_vcfs.txt """ } From e7b6eede62bdfd7e1cf07c9f61ea7738a872c429 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 7 Dec 2021 12:01:02 +0100 Subject: [PATCH 0144/1169] soooomewhat updated subworkflws --- conf/modules.config | 31 +++------------ modules/nf-core/modules/multiqc/main.nf | 26 ------------- subworkflows/local/call_repeat_expansions.nf | 2 +- subworkflows/local/deepvariant_caller.nf | 24 ++++++------ subworkflows/local/input_check.nf | 5 +-- subworkflows/local/prepare_genome.nf | 8 ++-- subworkflows/local/prepare_vcf.nf | 40 ++++++++++---------- subworkflows/nf-core/align_bwamem2.nf | 28 +++++++------- subworkflows/nf-core/qc_bam.nf | 8 ++-- 9 files changed, 61 insertions(+), 111 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 690e5608..4f0d378e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -12,7 +12,6 @@ process { - // Generic process options for all workflows publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, mode: 'copy', @@ -26,11 +25,7 @@ process { pattern: '*_versions.yml' ] } - - // raredisease.nf includes - // Local Subworkflows - // INPUT_CHECK withName: SAMPLESHEET_CHECK { publishDir = [ @@ -39,28 +34,25 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - // PREPARE_GENOME withName: BWAMEM2_INDEX { publishDir = [ path: { "${params.outdir}/references" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference, pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" ] } - withName: SAMTOOLS_FAIDX { publishDir = [ path: { "${params.outdir}/references" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference, pattern: "*fai" ] } - // CALL_SNV_DEEPVARIANT withName: DEEPVARIANT { ext.args = "--model_type=${params.analysis_type}" @@ -71,7 +63,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: SPLIT_MULTIALLELICS { ext.args = '--output-type z --multiallelics -both' publishDir = [ @@ -80,7 +71,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: REMOVE_DUPLICATES { ext.args = '--output-type z --rm-dup none' publishDir = [ @@ -89,7 +79,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: GLNEXUS { ext.args = '--config DeepVariant_unfiltered' publishDir = [ @@ -97,14 +86,12 @@ process { enabled: false ] } - withName: TABIX { publishDir = [ path: { "${params.outdir}/deepvariant" }, enabled: false ] } - // CALL_REPEAT_EXPANSIONS withName: EXPANSIONHUNTER { publishDir = [ @@ -113,9 +100,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - // NF-CORE Subworkflows - // ALIGN_BWAMEM2 withName: BWAMEM2_MEM { ext.args = '-M -K 100000000' @@ -126,14 +111,12 @@ process { enabled: false ] } - withName: SAMTOOLS_INDEX { publishDir = [ path: { "${params.outdir}/samtools" }, enabled: false ] } - withName: SAMTOOLS_INDEX_MD { publishDir = [ path: { "${params.outdir}/markduplicates" }, @@ -141,7 +124,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: SAMTOOLS_SORT { ext.suffix = '_sorted' publishDir = [ @@ -149,7 +131,6 @@ process { enabled: false ] } - withName: SAMTOOLS_STATS { ext.args = '-s --remove-overlaps' publishDir = [ @@ -158,14 +139,12 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: SAMTOOLS_MERGE { publishDir = [ path: { "${params.outdir}/samtools" }, enabled: false ] } - withName: '*MARKDUPLICATES' { ext.args = '--CREATE_INDEX' ext.suffix = '_sorted' @@ -175,7 +154,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - // QC_BAM withName: '*COLLECTMULTIPLEMETRICS' { publish_dir = [ @@ -184,7 +162,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'QUALIMAP_BAMQC' { publish_dir = [ path: { "${params.outdir}/bamqc_qualimap" }, @@ -192,9 +169,11 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - // nf-core modules withName: FASTQC { ext.args = '--quiet' + publishDir = [ + path: { "${params.outdir}/reports/fastqc/${meta.id}" } + ] } } diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index c3682e42..3dceb162 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,27 +1,10 @@ -<<<<<<< HEAD -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -======= ->>>>>>> TEMPLATE process MULTIQC { label 'process_medium' conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) -<<<<<<< HEAD - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0" - } else { - container "quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0" - } -======= container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" ->>>>>>> TEMPLATE input: path multiqc_files @@ -33,14 +16,6 @@ process MULTIQC { path "versions.yml" , emit: versions script: -<<<<<<< HEAD - """ - multiqc -f $options.args . - - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( multiqc --version | sed -e "s/multiqc, version //g" ) -======= def args = task.ext.args ?: '' """ multiqc -f $args . @@ -48,7 +23,6 @@ process MULTIQC { cat <<-END_VERSIONS > versions.yml "${task.process}": multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) ->>>>>>> TEMPLATE END_VERSIONS """ } diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index ba110f86..ec5e573f 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -2,7 +2,7 @@ // Run ExpansionHunter // -params.expansionhunter_options = [:] +//params.expansionhunter_options = [:] include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/main' addParams( options: params.expansionhunter_options ) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/deepvariant_caller.nf index 9cc273e5..c7621d7e 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/deepvariant_caller.nf @@ -2,21 +2,21 @@ // A variant caller workflow for deepvariant // -params.split_multiallelics_options = [:] -params.rm_duplicates_options = [:] -params.deepvariant_options = [:] -params.glnexus_options = [:] -params.tabix_options = [:] +// params.split_multiallelics_options = [:] +// params.rm_duplicates_options = [:] +// params.deepvariant_options = [:] +// params.glnexus_options = [:] +// params.tabix_options = [:] -def split_multiallelics_glnexus = params.split_multiallelics_options.clone() -split_multiallelics_glnexus.publish_files = "false" +// def split_multiallelics_glnexus = params.split_multiallelics_options.clone() +// split_multiallelics_glnexus.publish_files = "false" -def rm_duplicates_glnexus = params.rm_duplicates_options.clone() -rm_duplicates_glnexus.publish_dir = "glnexus/" -rm_duplicates_glnexus.suffix = "_split_rmdup" +// def rm_duplicates_glnexus = params.rm_duplicates_options.clone() +// rm_duplicates_glnexus.publish_dir = "glnexus/" +// rm_duplicates_glnexus.suffix = "_split_rmdup" -def tabix_glnexus = params.tabix_options.clone() -tabix_glnexus.publish_dir = "glnexus/" +// def tabix_glnexus = params.tabix_options.clone() +// tabix_glnexus.publish_dir = "glnexus/" include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: split_multiallelics_glnexus ) include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: rm_duplicates_glnexus ) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 0fbbb948..146cc93b 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -20,14 +20,11 @@ workflow INPUT_CHECK { samples = sheet.map { create_samples_channel(it) } emit: -<<<<<<< HEAD ch_case_info // channel: [ case_id ] reads // channel: [ val(meta), [ reads ] ] samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] -======= - reads // channel: [ val(meta), [ reads ] ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] ->>>>>>> TEMPLATE } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 2a22006e..28405f03 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -3,11 +3,11 @@ // -params.bwamem2_idx_options = [:] -params.samtools_faidx_options = [:] +// params.bwamem2_idx_options = [:] +// params.samtools_faidx_options = [:] -include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' addParams( options: params.bwamem2_idx_options ) -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' addParams( options: params.samtools_faidx_options ) +include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' //addParams( options: params.bwamem2_idx_options ) +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' //addParams( options: params.samtools_faidx_options ) workflow PREPARE_GENOME { take: diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index 5bf425a5..b8b7f481 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -2,26 +2,26 @@ // Prepare reference vcf files // -params.split_multiallelics_options = [:] -params.rm_duplicates_options = [:] -params.vcf_options = [:] -params.tabix_options = [:] - -def split_multiallelics_vcf_check = params.split_multiallelics_options.clone() -split_multiallelics_vcf_check.publish_files = "false" -split_multiallelics_vcf_check.suffix = "_split" - -def rm_duplicates_vcf_check = params.rm_duplicates_options.clone() -rm_duplicates_vcf_check.publish_dir = "vcf_check/" -rm_duplicates_vcf_check.suffix = "_split_rmdup" - -def tabix_vcf_check = params.tabix_options.clone() -tabix_vcf_check.publish_dir = "vcf_check/" - -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: split_multiallelics_vcf_check ) -include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: rm_duplicates_vcf_check ) -include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' addParams( options: params.vcf_options ) -include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' addParams( options: tabix_vcf_check ) +// params.split_multiallelics_options = [:] +// params.rm_duplicates_options = [:] +// params.vcf_options = [:] +// params.tabix_options = [:] + +// def split_multiallelics_vcf_check = params.split_multiallelics_options.clone() +// split_multiallelics_vcf_check.publish_files = "false" +// split_multiallelics_vcf_check.suffix = "_split" + +// def rm_duplicates_vcf_check = params.rm_duplicates_options.clone() +// rm_duplicates_vcf_check.publish_dir = "vcf_check/" +// rm_duplicates_vcf_check.suffix = "_split_rmdup" + +// def tabix_vcf_check = params.tabix_options.clone() +// tabix_vcf_check.publish_dir = "vcf_check/" + +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: split_multiallelics_vcf_check ) +include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: rm_duplicates_vcf_check ) +include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' //addParams( options: params.vcf_options ) +include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' //addParams( options: tabix_vcf_check ) workflow CHECK_VCF { take: diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index 8649b008..adbbe27b 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -2,21 +2,21 @@ // Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // -params.bwamem2_mem_options = [:] -params.samtools_idx_options = [:] -params.samtools_idx_md_options = [:] -params.samtools_sort_options = [:] -params.samtools_stats_options = [:] -params.samtools_merge_options = [:] -params.markduplicates_options = [:] +// params.bwamem2_mem_options = [:] +// params.samtools_idx_options = [:] +// params.samtools_idx_md_options = [:] +// params.samtools_sort_options = [:] +// params.samtools_stats_options = [:] +// params.samtools_merge_options = [:] +// params.markduplicates_options = [:] -include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' addParams( options: params.bwamem2_mem_options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_options ) -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_idx_md_options ) -include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams(options: params.samtools_sort_options ) -include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams(options: params.samtools_stats_options ) -include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' addParams( options: params.samtools_merge_options ) -include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' addParams(options: params.markduplicates_options ) +include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' //addParams( options: params.bwamem2_mem_options ) +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' //addParams( options: params.samtools_idx_options ) +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' //addParams( options: params.samtools_idx_md_options ) +include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' //addParams(options: params.samtools_sort_options ) +include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' //addParams(options: params.samtools_stats_options ) +include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' //addParams( options: params.samtools_merge_options ) +include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' //addParams(options: params.markduplicates_options ) workflow ALIGN_BWAMEM2 { diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index f2437872..2e00c3bc 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -2,11 +2,11 @@ // A quality check subworkflow for processed bams. // -params.picard_collectmultiplemetrics_options = [:] -params.qualimap_bamqc_options = [:] +// params.picard_collectmultiplemetrics_options = [:] +// params.qualimap_bamqc_options = [:] -include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: params.picard_collectmultiplemetrics_options ) -include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' addParams( options: params.qualimap_bamqc_options ) +include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' //addParams( options: params.picard_collectmultiplemetrics_options ) +include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' //addParams( options: params.qualimap_bamqc_options ) workflow QC_BAM { From 86e7c29c8e217d1790549fdfe5cee24a9b1dadf3 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 7 Dec 2021 12:02:54 +0100 Subject: [PATCH 0145/1169] updated modules --- modules.json | 34 ++++---- .../modules/bcftools/norm/functions.nf | 78 ------------------- modules/nf-core/modules/bcftools/norm/main.nf | 26 ++----- .../modules/bwamem2/index/functions.nf | 78 ------------------- modules/nf-core/modules/bwamem2/index/main.nf | 24 ++---- .../nf-core/modules/bwamem2/mem/functions.nf | 78 ------------------- modules/nf-core/modules/bwamem2/mem/main.nf | 29 +++---- .../custom/dumpsoftwareversions/functions.nf | 78 ------------------- .../custom/dumpsoftwareversions/meta.yml | 2 +- .../modules/expansionhunter/functions.nf | 78 ------------------- .../nf-core/modules/expansionhunter/main.nf | 26 ++----- modules/nf-core/modules/fastqc/functions.nf | 78 ------------------- modules/nf-core/modules/fastqc/main.nf | 2 +- modules/nf-core/modules/glnexus/functions.nf | 78 ------------------- modules/nf-core/modules/glnexus/main.nf | 26 ++----- modules/nf-core/modules/multiqc/functions.nf | 78 ------------------- .../collectmultiplemetrics/functions.nf | 78 ------------------- .../picard/collectmultiplemetrics/main.nf | 26 ++----- .../picard/markduplicates/functions.nf | 78 ------------------- .../modules/picard/markduplicates/main.nf | 32 +++----- .../modules/qualimap/bamqc/functions.nf | 78 ------------------- .../nf-core/modules/qualimap/bamqc/main.nf | 26 ++----- .../nf-core/modules/qualimap/bamqc/meta.yml | 1 + .../modules/samtools/faidx/functions.nf | 78 ------------------- .../nf-core/modules/samtools/faidx/main.nf | 30 +++---- .../nf-core/modules/samtools/faidx/meta.yml | 10 +++ .../modules/samtools/index/functions.nf | 78 ------------------- .../nf-core/modules/samtools/index/main.nf | 36 ++++----- .../nf-core/modules/samtools/index/meta.yml | 5 ++ .../modules/samtools/merge/functions.nf | 78 ------------------- .../nf-core/modules/samtools/merge/main.nf | 29 +++---- .../modules/samtools/sort/functions.nf | 78 ------------------- modules/nf-core/modules/samtools/sort/main.nf | 28 +++---- .../modules/samtools/stats/functions.nf | 78 ------------------- .../nf-core/modules/samtools/stats/main.nf | 27 +++---- .../nf-core/modules/tabix/tabix/functions.nf | 78 ------------------- modules/nf-core/modules/tabix/tabix/main.nf | 24 ++---- 37 files changed, 162 insertions(+), 1607 deletions(-) delete mode 100644 modules/nf-core/modules/bcftools/norm/functions.nf delete mode 100644 modules/nf-core/modules/bwamem2/index/functions.nf delete mode 100644 modules/nf-core/modules/bwamem2/mem/functions.nf delete mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf delete mode 100644 modules/nf-core/modules/expansionhunter/functions.nf delete mode 100644 modules/nf-core/modules/fastqc/functions.nf delete mode 100644 modules/nf-core/modules/glnexus/functions.nf delete mode 100644 modules/nf-core/modules/multiqc/functions.nf delete mode 100644 modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf delete mode 100644 modules/nf-core/modules/picard/markduplicates/functions.nf delete mode 100644 modules/nf-core/modules/qualimap/bamqc/functions.nf delete mode 100644 modules/nf-core/modules/samtools/faidx/functions.nf delete mode 100644 modules/nf-core/modules/samtools/index/functions.nf delete mode 100644 modules/nf-core/modules/samtools/merge/functions.nf delete mode 100644 modules/nf-core/modules/samtools/sort/functions.nf delete mode 100644 modules/nf-core/modules/samtools/stats/functions.nf delete mode 100644 modules/nf-core/modules/tabix/tabix/functions.nf diff --git a/modules.json b/modules.json index a82b5a73..1cb4dd18 100644 --- a/modules.json +++ b/modules.json @@ -4,55 +4,55 @@ "repos": { "nf-core/modules": { "bcftools/norm": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "bwamem2/index": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "bwamem2/mem": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "custom/dumpsoftwareversions": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "expansionhunter": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "fastqc": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "glnexus": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "multiqc": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "picard/collectmultiplemetrics": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "picard/markduplicates": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "qualimap/bamqc": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "samtools/faidx": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "e0aa89141ffecb5f54d230f7ea46de242b74e084" }, "samtools/index": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "samtools/merge": { - "git_sha": "ac1e6df076195cec553a2079c9cebd94026a0d47" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "samtools/sort": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "samtools/stats": { - "git_sha": "ac1e6df076195cec553a2079c9cebd94026a0d47" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "tabix/tabix": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } diff --git a/modules/nf-core/modules/bcftools/norm/functions.nf b/modules/nf-core/modules/bcftools/norm/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/bcftools/norm/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/bcftools/norm/main.nf b/modules/nf-core/modules/bcftools/norm/main.nf index 7e506e49..95da56db 100644 --- a/modules/nf-core/modules/bcftools/norm/main.nf +++ b/modules/nf-core/modules/bcftools/norm/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process BCFTOOLS_NORM { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::bcftools=1.13" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/bcftools:1.13--h3a49de5_0" - } else { - container "quay.io/biocontainers/bcftools:1.13--h3a49de5_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.13--h3a49de5_0' : + 'quay.io/biocontainers/bcftools:1.13--h3a49de5_0' }" input: tuple val(meta), path(vcf) @@ -27,18 +16,19 @@ process BCFTOOLS_NORM { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ bcftools norm \\ --fasta-ref ${fasta} \\ --output ${prefix}.vcf.gz \\ - $options.args \\ + $args \\ --threads $task.cpus \\ ${vcf} cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/bwamem2/index/functions.nf b/modules/nf-core/modules/bwamem2/index/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/bwamem2/index/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/bwamem2/index/main.nf b/modules/nf-core/modules/bwamem2/index/main.nf index 5732017f..e00538c9 100644 --- a/modules/nf-core/modules/bwamem2/index/main.nf +++ b/modules/nf-core/modules/bwamem2/index/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process BWAMEM2_INDEX { tag "$fasta" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'index', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/bwa-mem2:2.2.1--he513fc3_0" - } else { - container "quay.io/biocontainers/bwa-mem2:2.2.1--he513fc3_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bwa-mem2:2.2.1--he513fc3_0' : + 'quay.io/biocontainers/bwa-mem2:2.2.1--he513fc3_0' }" input: path fasta @@ -26,16 +15,17 @@ process BWAMEM2_INDEX { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ mkdir bwamem2 bwa-mem2 \\ index \\ - $options.args \\ + $args \\ $fasta -p bwamem2/${fasta} cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') + "${task.process}": + bwamem2: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') END_VERSIONS """ } diff --git a/modules/nf-core/modules/bwamem2/mem/functions.nf b/modules/nf-core/modules/bwamem2/mem/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/bwamem2/mem/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/bwamem2/mem/main.nf b/modules/nf-core/modules/bwamem2/mem/main.nf index f88d840f..81b4b8ab 100644 --- a/modules/nf-core/modules/bwamem2/mem/main.nf +++ b/modules/nf-core/modules/bwamem2/mem/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process BWAMEM2_MEM { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.12" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:cf603b12db30ec91daa04ba45a8ee0f35bbcd1e2-0" - } else { - container "quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:cf603b12db30ec91daa04ba45a8ee0f35bbcd1e2-0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:cf603b12db30ec91daa04ba45a8ee0f35bbcd1e2-0' : + 'quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:cf603b12db30ec91daa04ba45a8ee0f35bbcd1e2-0' }" input: tuple val(meta), path(reads) @@ -27,23 +16,25 @@ process BWAMEM2_MEM { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def read_group = meta.read_group ? "-R ${meta.read_group}" : "" """ INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` bwa-mem2 \\ mem \\ - $options.args \\ + $args \\ $read_group \\ -t $task.cpus \\ \$INDEX \\ $reads \\ - | samtools view $options.args2 -@ $task.cpus -bhS -o ${prefix}.bam - + | samtools view $args2 -@ $task.cpus -bhS -o ${prefix}.bam - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') + "${task.process}": + bwamem2: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index 60b546a0..5b5b8a60 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -8,7 +8,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - licence: ["MIT"] + licence: ['MIT'] input: - versions: type: file diff --git a/modules/nf-core/modules/expansionhunter/functions.nf b/modules/nf-core/modules/expansionhunter/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/expansionhunter/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/expansionhunter/main.nf b/modules/nf-core/modules/expansionhunter/main.nf index 845de15d..4db78230 100644 --- a/modules/nf-core/modules/expansionhunter/main.nf +++ b/modules/nf-core/modules/expansionhunter/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process EXPANSIONHUNTER { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::expansionhunter=4.0.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/expansionhunter:4.0.2--he785bd8_0" - } else { - container "quay.io/biocontainers/expansionhunter:4.0.2--he785bd8_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/expansionhunter:4.0.2--he785bd8_0' : + 'quay.io/biocontainers/expansionhunter:4.0.2--he785bd8_0' }" input: tuple val(meta), path(bam), path(bai) @@ -28,11 +17,12 @@ process EXPANSIONHUNTER { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def gender = (meta.gender == 'male' || meta.gender == 1 || meta.gender == 'XY') ? "male" : "female" """ ExpansionHunter \\ - $options.args \\ + $args \\ --reads $bam \\ --output-prefix $prefix \\ --reference $fasta \\ @@ -40,8 +30,8 @@ process EXPANSIONHUNTER { --sex $gender cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(ExpansionHunter --version 2>&1) | sed 's/^.*ExpansionHunter v//') + "${task.process}": + expansionhunter: \$( echo \$(ExpansionHunter --version 2>&1) | sed 's/^.*ExpansionHunter v//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/fastqc/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index 673a00b8..d250eca0 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -18,7 +18,7 @@ process FASTQC { script: def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline - def prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz diff --git a/modules/nf-core/modules/glnexus/functions.nf b/modules/nf-core/modules/glnexus/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/glnexus/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/glnexus/main.nf b/modules/nf-core/modules/glnexus/main.nf index 1384334f..b8afca22 100644 --- a/modules/nf-core/modules/glnexus/main.nf +++ b/modules/nf-core/modules/glnexus/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process GLNEXUS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::glnexus=1.4.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/glnexus:1.4.1--h40d77a6_0" - } else { - container "quay.io/biocontainers/glnexus:1.4.1--h40d77a6_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/glnexus:1.4.1--h40d77a6_0' : + 'quay.io/biocontainers/glnexus:1.4.1--h40d77a6_0' }" input: tuple val(meta), path(gvcfs) @@ -26,7 +15,8 @@ process GLNEXUS { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" // Make list of GVCFs to merge def input = gvcfs.collect { it.toString() } @@ -40,13 +30,13 @@ process GLNEXUS { glnexus_cli \\ --threads $task.cpus \\ --mem-gbytes $avail_mem \\ - $options.args \\ + $args \\ ${input.join(' ')} \\ > ${prefix}.bcf cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(glnexus_cli 2>&1) | head -n 1 | sed 's/^.*release v//; s/ .*\$//') + "${task.process}": + glnexus: \$( echo \$(glnexus_cli 2>&1) | head -n 1 | sed 's/^.*release v//; s/ .*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/multiqc/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index dd8fdaca..6b292534 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0" - } else { - container "quay.io/biocontainers/picard:2.25.7--hdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -28,7 +17,8 @@ process PICARD_COLLECTMULTIPLEMETRICS { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -39,14 +29,14 @@ process PICARD_COLLECTMULTIPLEMETRICS { picard \\ -Xmx${avail_mem}g \\ CollectMultipleMetrics \\ - $options.args \\ + $args \\ INPUT=$bam \\ OUTPUT=${prefix}.CollectMultipleMetrics \\ REFERENCE_SEQUENCE=$fasta cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(picard CollectMultipleMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) + "${task.process}": + picard: \$(picard CollectMultipleMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) END_VERSIONS """ } diff --git a/modules/nf-core/modules/picard/markduplicates/functions.nf b/modules/nf-core/modules/picard/markduplicates/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/picard/markduplicates/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index 37b825d7..d3bf6938 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0" - } else { - container "quay.io/biocontainers/picard:2.25.7--hdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -28,7 +17,8 @@ process PICARD_MARKDUPLICATES { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -39,14 +29,14 @@ process PICARD_MARKDUPLICATES { picard \\ -Xmx${avail_mem}g \\ MarkDuplicates \\ - $options.args \\ - -I $bam \\ - -O ${prefix}.bam \\ - -M ${prefix}.MarkDuplicates.metrics.txt + $args \\ + I=$bam \\ + O=${prefix}.bam \\ + M=${prefix}.MarkDuplicates.metrics.txt cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + "${task.process}": + picard: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ } diff --git a/modules/nf-core/modules/qualimap/bamqc/functions.nf b/modules/nf-core/modules/qualimap/bamqc/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/qualimap/bamqc/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/qualimap/bamqc/main.nf b/modules/nf-core/modules/qualimap/bamqc/main.nf index d33f1e67..a47fde7e 100644 --- a/modules/nf-core/modules/qualimap/bamqc/main.nf +++ b/modules/nf-core/modules/qualimap/bamqc/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process QUALIMAP_BAMQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::qualimap=2.2.2d" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/qualimap:2.2.2d--1" - } else { - container "quay.io/biocontainers/qualimap:2.2.2d--1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/qualimap:2.2.2d--1' : + 'quay.io/biocontainers/qualimap:2.2.2d--1' }" input: tuple val(meta), path(bam) @@ -28,7 +17,8 @@ process QUALIMAP_BAMQC { path "versions.yml" , emit: versions script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" def collect_pairs = meta.single_end ? '' : '--collect-overlap-pairs' def memory = task.memory.toGiga() + "G" @@ -47,7 +37,7 @@ process QUALIMAP_BAMQC { qualimap \\ --java-mem-size=$memory \\ bamqc \\ - $options.args \\ + $args \\ -bam $bam \\ $regions \\ -p $strandedness \\ @@ -56,8 +46,8 @@ process QUALIMAP_BAMQC { -nt $task.cpus cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(qualimap 2>&1) | sed 's/^.*QualiMap v.//; s/Built.*\$//') + "${task.process}": + qualimap: \$(echo \$(qualimap 2>&1) | sed 's/^.*QualiMap v.//; s/Built.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/qualimap/bamqc/meta.yml b/modules/nf-core/modules/qualimap/bamqc/meta.yml index cc0471fc..6888d30e 100644 --- a/modules/nf-core/modules/qualimap/bamqc/meta.yml +++ b/modules/nf-core/modules/qualimap/bamqc/meta.yml @@ -14,6 +14,7 @@ tools: homepage: http://qualimap.bioinfo.cipf.es/ documentation: http://qualimap.conesalab.org/doc_html/index.html doi: 10.1093/bioinformatics/bts503 + licence: ['GPL-2.0-only'] input: - meta: type: map diff --git a/modules/nf-core/modules/samtools/faidx/functions.nf b/modules/nf-core/modules/samtools/faidx/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/samtools/faidx/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/modules/samtools/faidx/main.nf index 80cedeab..d8308b03 100644 --- a/modules/nf-core/modules/samtools/faidx/main.nf +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -1,36 +1,26 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_FAIDX { tag "$fasta" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: - path fasta + tuple val(meta), path(fasta) output: - path "*.fai" , emit: fai - path "versions.yml", emit: versions + tuple val(meta), path ("*.fai") , emit: fai + path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ samtools faidx $fasta cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml index 16c0b334..bae97a39 100644 --- a/modules/nf-core/modules/samtools/faidx/meta.yml +++ b/modules/nf-core/modules/samtools/faidx/meta.yml @@ -14,11 +14,21 @@ tools: doi: 10.1093/bioinformatics/btp352 licence: ['MIT'] input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - fasta: type: file description: FASTA file pattern: "*.{fa,fasta}" output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - fai: type: file description: FASTA index file diff --git a/modules/nf-core/modules/samtools/index/functions.nf b/modules/nf-core/modules/samtools/index/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/samtools/index/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index febbc11c..b033e225 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -1,37 +1,29 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: - tuple val(meta), path(bam) + tuple val(meta), path(input) output: - tuple val(meta), path("*.bai"), optional:true, emit: bai - tuple val(meta), path("*.csi"), optional:true, emit: csi - path "versions.yml" , emit: versions + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.crai"), optional:true, emit: crai + tuple val(meta), path("*.csi") , optional:true, emit: csi + path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ - samtools index $options.args $bam + samtools index -@ ${task.cpus-1} $args $input + cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml index 988e8f53..0905b3cd 100644 --- a/modules/nf-core/modules/samtools/index/meta.yml +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -35,6 +35,10 @@ output: type: file description: BAM/CRAM/SAM index file pattern: "*.{bai,crai,sai}" + - crai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" - csi: type: file description: CSI index file @@ -46,3 +50,4 @@ output: authors: - "@drpatelh" - "@ewels" + - "@maxulysse" diff --git a/modules/nf-core/modules/samtools/merge/functions.nf b/modules/nf-core/modules/samtools/merge/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/samtools/merge/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/merge/main.nf b/modules/nf-core/modules/samtools/merge/main.nf index fefb423b..8eeb64a2 100644 --- a/modules/nf-core/modules/samtools/merge/main.nf +++ b/modules/nf-core/modules/samtools/merge/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_MERGE { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(input_files) @@ -28,14 +17,16 @@ process SAMTOOLS_MERGE { path "versions.yml" , emit: versions script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" def file_type = input_files[0].getExtension() def reference = fasta ? "--reference ${fasta}" : "" """ - samtools merge ${reference} ${prefix}.${file_type} $input_files + samtools merge --threads ${task.cpus-1} $args ${reference} ${prefix}.${file_type} $input_files + cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/sort/functions.nf b/modules/nf-core/modules/samtools/sort/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/samtools/sort/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index b30f6f45..0c2cf25e 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(bam) @@ -26,12 +15,13 @@ process SAMTOOLS_SORT { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ - samtools sort $options.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + samtools sort $args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/stats/functions.nf b/modules/nf-core/modules/samtools/stats/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/samtools/stats/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index aab43410..83c87002 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_STATS { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(input), path(input_index) @@ -27,12 +16,14 @@ process SAMTOOLS_STATS { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' def reference = fasta ? "--reference ${fasta}" : "" """ - samtools stats ${reference} ${input} > ${input}.stats + samtools stats --threads ${task.cpus-1} ${reference} ${input} > ${input}.stats + cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/tabix/tabix/functions.nf b/modules/nf-core/modules/tabix/tabix/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/tabix/tabix/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/tabix/tabix/main.nf b/modules/nf-core/modules/tabix/tabix/main.nf index 1574c0b5..c721a554 100644 --- a/modules/nf-core/modules/tabix/tabix/main.nf +++ b/modules/nf-core/modules/tabix/tabix/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process TABIX_TABIX { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0" - } else { - container "quay.io/biocontainers/tabix:1.11--hdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : + 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" input: tuple val(meta), path(tab) @@ -26,12 +15,13 @@ process TABIX_TABIX { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ - tabix $options.args $tab + tabix $args $tab cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + "${task.process}": + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') END_VERSIONS """ } From 7f015fbece2bbac4c84ced245a2aa1b3483e27d8 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 7 Dec 2021 19:17:53 +0100 Subject: [PATCH 0146/1169] fixed errors from subwrkflws and commenting out vcf_check and deepvariant for now --- conf/modules.config | 30 ++++--- modules/local/check_input_vcf.nf | 4 +- modules/local/deepvariant/functions.nf | 78 ------------------- modules/local/deepvariant/main.nf | 33 +++----- subworkflows/local/call_repeat_expansions.nf | 10 +-- ...iant_caller.nf => call_snv_deepvariant.nf} | 12 +-- subworkflows/local/prepare_genome.nf | 10 +-- subworkflows/nf-core/align_bwamem2.nf | 22 ++---- subworkflows/nf-core/qc_bam.nf | 7 +- workflows/raredisease.nf | 32 ++++---- 10 files changed, 64 insertions(+), 174 deletions(-) delete mode 100644 modules/local/deepvariant/functions.nf rename subworkflows/local/{deepvariant_caller.nf => call_snv_deepvariant.nf} (84%) diff --git a/conf/modules.config b/conf/modules.config index 4f0d378e..287582ba 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -6,7 +6,7 @@ ext.args = Additional arguments appended to command in module. ext.args2 = Second set of arguments appended to command in module (multi-tool modules). ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.suffix = File name suffix for output files. + ext.prefix = File name prefix for output files. ---------------------------------------------------------------------------------------- */ @@ -55,8 +55,8 @@ process { } // CALL_SNV_DEEPVARIANT withName: DEEPVARIANT { - ext.args = "--model_type=${params.analysis_type}" - ext.suffix = '_deepvar' + ext.args = "--model_type=$params.analysis_type" + ext.prefix = { "${meta.id}_deepvar" } publishDir = [ path: { "${params.outdir}/deepvariant" }, mode: 'copy', @@ -106,8 +106,6 @@ process { ext.args = '-M -K 100000000' publishDir = [ path: { "${params.outdir}/bwamem2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: false ] } @@ -124,8 +122,8 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: SAMTOOLS_SORT { - ext.suffix = '_sorted' + withName: '.*:ALIGN_BWAMEM2:SAMTOOLS_SORT' { + ext.prefix = { "${meta.id}_sorted" } publishDir = [ path: { "${params.outdir}/samtools" }, enabled: false @@ -134,20 +132,18 @@ process { withName: SAMTOOLS_STATS { ext.args = '-s --remove-overlaps' publishDir = [ - path: { "${params.outdir}/samtools/stats" }, + path: { "${params.outdir}/samtools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: SAMTOOLS_MERGE { publishDir = [ - path: { "${params.outdir}/samtools" }, - enabled: false + path: { "${params.outdir}/samtools" } ] } - withName: '*MARKDUPLICATES' { - ext.args = '--CREATE_INDEX' - ext.suffix = '_sorted' + withName: '.*MARKDUPLICATES' { + ext.prefix = { "${meta.id}_sorted_md" } publishDir = [ path: { "${params.outdir}/markduplicates" }, mode: 'copy', @@ -155,15 +151,15 @@ process { ] } // QC_BAM - withName: '*COLLECTMULTIPLEMETRICS' { - publish_dir = [ + withName: '.*COLLECTMULTIPLEMETRICS' { + publishDir = [ path: { "${params.outdir}/bamqc_collectmultiplemetrics" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'QUALIMAP_BAMQC' { - publish_dir = [ + withName: QUALIMAP_BAMQC { + publishDir = [ path: { "${params.outdir}/bamqc_qualimap" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index b9bb2f0e..63d96d77 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -1,7 +1,7 @@ // Import generic module functions -include { saveFiles } from './functions' +// include { saveFiles } from './functions' -params.options = [:] +// params.options = [:] process CHECK_INPUT_VCF { tag "check_vcf" diff --git a/modules/local/deepvariant/functions.nf b/modules/local/deepvariant/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/local/deepvariant/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/local/deepvariant/main.nf b/modules/local/deepvariant/main.nf index 5aa1e368..7b1c34a4 100644 --- a/modules/local/deepvariant/main.nf +++ b/modules/local/deepvariant/main.nf @@ -1,34 +1,24 @@ -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process DEEPVARIANT { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? "bioconda::deepvariant=1.2.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "docker://google/deepvariant:1.2.0" - } else { - container "google/deepvariant:1.2.0" - } + conda (params.enable_conda ? 'bioconda::deepvariant=1.2.0' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'docker://google/deepvariant:1.2.0' : + 'google/deepvariant:1.2.0' }" input: tuple val(meta), path(bam), path(bai) - path(fasta) - path(fai) + path fasta + path fasta_fai output: - tuple val(meta), path("*.vcf.gz"), emit: vcf - tuple val(meta), path("*g.vcf.gz"), emit: gvcf - path "versions.yml", emit: versions + tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*g.vcf.gz"), emit: gvcf + path "versions.yml", emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ /opt/deepvariant/bin/run_deepvariant \\ --ref=${fasta} \\ @@ -37,9 +27,8 @@ process DEEPVARIANT { --output_gvcf=${prefix}.g.vcf.gz \\ ${options.args} \\ --num_shards=${task.cpus} - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//') END_VERSIONS """ diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index ec5e573f..5530e447 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -2,19 +2,17 @@ // Run ExpansionHunter // -//params.expansionhunter_options = [:] - -include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/main' addParams( options: params.expansionhunter_options ) +include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/main' workflow CALL_REPEAT_EXPANSIONS { take: - bam // channel: [ val(meta), path(bam), path(bai) ] + bam // channel: [ val(meta), path(bam), path(bai) ] fasta // channel: /path/to/genome.fasta - variant_catalog // channel: /path/to/variant_catalog.json + variant_catalog // channel: /path/to/variant_catalog.json main: - ch_versions = Channel.empty() + EXPANSIONHUNTER( bam, fasta, file(variant_catalog) ) ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) diff --git a/subworkflows/local/deepvariant_caller.nf b/subworkflows/local/call_snv_deepvariant.nf similarity index 84% rename from subworkflows/local/deepvariant_caller.nf rename to subworkflows/local/call_snv_deepvariant.nf index c7621d7e..86eaf6cf 100644 --- a/subworkflows/local/deepvariant_caller.nf +++ b/subworkflows/local/call_snv_deepvariant.nf @@ -18,13 +18,13 @@ // def tabix_glnexus = params.tabix_options.clone() // tabix_glnexus.publish_dir = "glnexus/" -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: split_multiallelics_glnexus ) -include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' addParams( options: rm_duplicates_glnexus ) -include { DEEPVARIANT } from '../../modules/local/deepvariant/main' addParams( options: params.deepvariant_options ) -include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' addParams( options: params.glnexus_options ) -include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' addParams( options: tabix_glnexus) +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: split_multiallelics_glnexus ) +include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: rm_duplicates_glnexus ) +include { DEEPVARIANT } from '../../modules/local/deepvariant/main' //addParams( options: params.deepvariant_options ) +include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' //addParams( options: params.glnexus_options ) +include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' //addParams( options: tabix_glnexus) -workflow DEEPVARIANT_CALLER { +workflow CALL_SNV_DEEPVARIANT { take: bam // channel: [ val(meta), path(bam), path(bai) ] fasta // path(fasta) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 28405f03..0b6f4138 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -2,12 +2,8 @@ // Prepare reference genome files // - -// params.bwamem2_idx_options = [:] -// params.samtools_faidx_options = [:] - -include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' //addParams( options: params.bwamem2_idx_options ) -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' //addParams( options: params.samtools_faidx_options ) +include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' workflow PREPARE_GENOME { take: @@ -30,7 +26,7 @@ workflow PREPARE_GENOME { if ( params.fasta_fai ) { ch_fai = file(params.fasta_fai) } else { - ch_fai = SAMTOOLS_FAIDX ( ch_fasta ).fai + ch_fai = SAMTOOLS_FAIDX ( [[], ch_fasta] ).fai // TODO: faidx now requires meta info for fasta due to pipelines with multi references e.g. de novo ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) } diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index adbbe27b..03c8c3bf 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -2,21 +2,13 @@ // Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // -// params.bwamem2_mem_options = [:] -// params.samtools_idx_options = [:] -// params.samtools_idx_md_options = [:] -// params.samtools_sort_options = [:] -// params.samtools_stats_options = [:] -// params.samtools_merge_options = [:] -// params.markduplicates_options = [:] - -include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' //addParams( options: params.bwamem2_mem_options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' //addParams( options: params.samtools_idx_options ) -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' //addParams( options: params.samtools_idx_md_options ) -include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' //addParams(options: params.samtools_sort_options ) -include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' //addParams(options: params.samtools_stats_options ) -include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' //addParams( options: params.samtools_merge_options ) -include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' //addParams(options: params.markduplicates_options ) +include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' +include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' +include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' +include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' workflow ALIGN_BWAMEM2 { diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 2e00c3bc..c14bb364 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -2,11 +2,8 @@ // A quality check subworkflow for processed bams. // -// params.picard_collectmultiplemetrics_options = [:] -// params.qualimap_bamqc_options = [:] - -include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' //addParams( options: params.picard_collectmultiplemetrics_options ) -include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' //addParams( options: params.qualimap_bamqc_options ) +include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' +include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' workflow QC_BAM { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 73836137..f0cdd79e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -39,7 +39,7 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // include { INPUT_CHECK } from '../subworkflows/local/input_check' -include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' //addParams( options: [:] ) +// include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' //addParams( options: [:] ) /* ======================================================================================== @@ -69,7 +69,7 @@ include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/local/call_repeat_expan // SUBWORKFLOW: Consists of mix/local modules // -include { DEEPVARIANT_CALLER } from '../subworkflows/local/deepvariant_caller' //addParams( deepvariant_options: modules['deepvariant'], glnexus_options: modules['glnexus'], rm_duplicates_options: modules['bcftools_norm_rm_duplicates'], split_multiallelics_options: modules['bcftools_norm_split_multiallelics'], tabix_options: modules['tabix'] ) +include { CALL_SNV_DEEPVARIANT } from '../subworkflows/local/call_snv_deepvariant' //addParams( deepvariant_options: modules['deepvariant'], glnexus_options: modules['glnexus'], rm_duplicates_options: modules['bcftools_norm_rm_duplicates'], split_multiallelics_options: modules['bcftools_norm_split_multiallelics'], tabix_options: modules['tabix'] ) /* ======================================================================================== @@ -102,13 +102,13 @@ workflow RAREDISEASE { PREPARE_GENOME ( params.fasta ) ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) - if (params.gnomad) - { - ch_gnomad_in = Channel.fromPath(params.gnomad) - CHECK_VCF( - ch_gnomad_in, PREPARE_GENOME.out.fasta, - ).set { ch_gnomad_out } - } + // if (params.gnomad) + // { + // ch_gnomad_in = Channel.fromPath(params.gnomad) + // CHECK_VCF( + // ch_gnomad_in, PREPARE_GENOME.out.fasta, + // ).set { ch_gnomad_out } + // } // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. if (params.aligner == 'bwamem2') { @@ -139,13 +139,13 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. - DEEPVARIANT_CALLER ( - ch_marked_bam.join(ch_marked_bai, by: [0]), - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, - INPUT_CHECK.out.ch_case_info - ) - ch_versions = ch_versions.mix(DEEPVARIANT_CALLER.out.versions) + // CALL_SNV_DEEPVARIANT ( + // ch_marked_bam.join(ch_marked_bai, by: [0]), + // PREPARE_GENOME.out.fasta, + // PREPARE_GENOME.out.fai, + // INPUT_CHECK.out.ch_case_info + // ) + // ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) // // MODULE: Pipeline reporting From e185c1dc754d5484f0048746ca7a3fe57f87bb3e Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Tue, 7 Dec 2021 19:29:49 +0100 Subject: [PATCH 0147/1169] fix eclint error :sparkles: --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ea1ca62..aa3cc6db 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: matrix: # Nextflow versions: check pipeline minimum and latest edge version nxf_ver: - - 'NXF_VER=21.10.3' + - "NXF_VER=21.10.3" # - 'NXF_EDGE=1' steps: - name: Check out pipeline code From 7d4d01c477f45b7801bd62370aaa572094ed28d7 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 8 Dec 2021 12:23:50 +0100 Subject: [PATCH 0148/1169] modified lint to pass actions --- .github/workflows/linting.yml | 14 ++++++-------- .nf-core.yml | 2 ++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 3b448773..8959a335 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: - node-version: '10' + node-version: "10" - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint @@ -53,7 +53,7 @@ jobs: - uses: actions/setup-node@v1 with: - node-version: '10' + node-version: "10" - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -67,7 +67,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: - node-version: '10' + node-version: "10" - name: Install yaml-lint run: npm install -g yaml-lint - name: Run yaml-lint @@ -101,7 +101,6 @@ jobs: nf-core: runs-on: ubuntu-latest steps: - - name: Check out pipeline code uses: actions/checkout@v2 @@ -114,13 +113,13 @@ jobs: - uses: actions/setup-python@v1 with: - python-version: '3.6' - architecture: 'x64' + python-version: "3.6" + architecture: "x64" - name: Install dependencies run: | python -m pip install --upgrade pip - pip install nf-core + pip install --force-reinstall git+https://github.com/nf-core/tools.git@dev - name: Run nf-core lint env: @@ -142,4 +141,3 @@ jobs: lint_log.txt lint_results.md PR_number.txt - diff --git a/.nf-core.yml b/.nf-core.yml index 9ae9fadb..010ab9c0 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,3 +2,5 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - assets/multiqc_config.yaml + - .github/workflows/linting.yml + - lib/NfcoreTemplate.groovy From 32a21ba030cc4bec9e8ac9c2d27e3620860590d2 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 8 Dec 2021 13:55:25 +0100 Subject: [PATCH 0149/1169] okay this should temporarily fix the mismatched tool versions :crossed_fingers: --- .github/workflows/ci.yml | 17 ++++++++++++----- .nf-core.yml | 5 +++++ ... => nf-core-raredisease_logo_light.png.png} | Bin assets/sendmail_template.txt | 4 ++-- ... => nf-core-raredisease_logo_light.png.png} | Bin 5 files changed, 19 insertions(+), 7 deletions(-) rename assets/{nf-core-raredisease_logo.png => nf-core-raredisease_logo_light.png.png} (100%) rename docs/images/{nf-core-raredisease_logo.png => nf-core-raredisease_logo_light.png.png} (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa3cc6db..a694ccfe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,10 +18,14 @@ jobs: NXF_ANSI_LOG: false strategy: matrix: - # Nextflow versions: check pipeline minimum and latest edge version - nxf_ver: - - "NXF_VER=21.10.3" - # - 'NXF_EDGE=1' + # Nextflow versions + include: + # Test pipeline minimum Nextflow version + - NXF_VER: "21.10.3" + NXF_EDGE: "" + # Test latest edge release of Nextflow + - NXF_VER: "" + NXF_EDGE: "1" steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -29,10 +33,13 @@ jobs: - name: Install Nextflow env: CAPSULE_LOG: none + NXF_VER: ${{ matrix.NXF_VER }} + # Uncomment only if the edge release is more recent than the latest stable release + # See https://github.com/nextflow-io/nextflow/issues/2467 + # NXF_EDGE: ${{ matrix.NXF_EDGE }} run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ - export ${{ matrix.nxf_ver }} nextflow self-update - name: Run pipeline with test data diff --git a/.nf-core.yml b/.nf-core.yml index 010ab9c0..e6a2f5b9 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -4,3 +4,8 @@ lint: - assets/multiqc_config.yaml - .github/workflows/linting.yml - lib/NfcoreTemplate.groovy + - assets/sendmail_template.txt + files_exist: + - docs/images/nf-core-raredisease_logo_dark.png + - assets/nf-core-raredisease_logo.png + - docs/images/nf-core-raredisease_logo.png diff --git a/assets/nf-core-raredisease_logo.png b/assets/nf-core-raredisease_logo_light.png.png similarity index 100% rename from assets/nf-core-raredisease_logo.png rename to assets/nf-core-raredisease_logo_light.png.png diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index b727a8f5..9d3538dc 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -12,9 +12,9 @@ $email_html Content-Type: image/png;name="nf-core-raredisease_logo.png" Content-Transfer-Encoding: base64 Content-ID: -Content-Disposition: inline; filename="nf-core-raredisease_logo.png" +Content-Disposition: inline; filename="nf-core-raredisease_logo_light.png" -<% out << new File("$projectDir/assets/nf-core-raredisease_logo.png"). +<% out << new File("$projectDir/assets/nf-core-raredisease_logo_light.png"). bytes. encodeBase64(). toString(). diff --git a/docs/images/nf-core-raredisease_logo.png b/docs/images/nf-core-raredisease_logo_light.png.png similarity index 100% rename from docs/images/nf-core-raredisease_logo.png rename to docs/images/nf-core-raredisease_logo_light.png.png From a9bfcad4e3f931d7e8450615c31897e82319cdab Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 8 Dec 2021 13:57:54 +0100 Subject: [PATCH 0150/1169] lol had woopsie on image name --- ...t.png.png => nf-core-raredisease_logo_light.png} | Bin ...t.png.png => nf-core-raredisease_logo_light.png} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename assets/{nf-core-raredisease_logo_light.png.png => nf-core-raredisease_logo_light.png} (100%) rename docs/images/{nf-core-raredisease_logo_light.png.png => nf-core-raredisease_logo_light.png} (100%) diff --git a/assets/nf-core-raredisease_logo_light.png.png b/assets/nf-core-raredisease_logo_light.png similarity index 100% rename from assets/nf-core-raredisease_logo_light.png.png rename to assets/nf-core-raredisease_logo_light.png diff --git a/docs/images/nf-core-raredisease_logo_light.png.png b/docs/images/nf-core-raredisease_logo_light.png similarity index 100% rename from docs/images/nf-core-raredisease_logo_light.png.png rename to docs/images/nf-core-raredisease_logo_light.png From 8b0c2b5eb7af783ea49592ee4bf9832d559b5a24 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 8 Dec 2021 14:02:13 +0100 Subject: [PATCH 0151/1169] ignore png --- .nf-core.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index e6a2f5b9..c692867e 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,6 +5,8 @@ lint: - .github/workflows/linting.yml - lib/NfcoreTemplate.groovy - assets/sendmail_template.txt + - assets/nf-core-raredisease_logo_light.png + - docs/images/nf-core-raredisease_logo_light.png files_exist: - docs/images/nf-core-raredisease_logo_dark.png - assets/nf-core-raredisease_logo.png From 0cc19ed8f93d84e4714c9f7b06bea91f57e0b43f Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 9 Dec 2021 09:44:31 +0100 Subject: [PATCH 0152/1169] update image url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 66f3713f..0d9329f7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![nf-core/raredisease](docs/images/nf-core-raredisease_logo.png) +# ![nf-core/raredisease](docs/images/nf-core-raredisease_logo_light.png) [![GitHub Actions CI Status](https://github.com/nf-core/raredisease/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/raredisease/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+linting%22) From 412c387fe9647b46f88f4ae887774c476a5d9718 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Dec 2021 22:16:42 +0100 Subject: [PATCH 0153/1169] deepvariant --- conf/modules.config | 19 ++++++------ modules/local/deepvariant/main.nf | 11 ++++--- subworkflows/local/call_snv_deepvariant.nf | 36 ++++++---------------- workflows/raredisease.nf | 14 ++++----- 4 files changed, 33 insertions(+), 47 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 287582ba..2fd12572 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -63,18 +63,17 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: SPLIT_MULTIALLELICS { + withName: SPLIT_MULTIALLELICS_GL { ext.args = '--output-type z --multiallelics -both' publishDir = [ - path: { "${params.outdir}/deepvariant" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } - withName: REMOVE_DUPLICATES { + withName: REMOVE_DUPLICATES_GL { ext.args = '--output-type z --rm-dup none' + ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ - path: { "${params.outdir}/deepvariant" }, + path: { "${params.outdir}/glnexus" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -82,14 +81,14 @@ process { withName: GLNEXUS { ext.args = '--config DeepVariant_unfiltered' publishDir = [ - path: { "${params.outdir}/deepvariant" }, enabled: false ] } - withName: TABIX { + withName: TABIX_GL { publishDir = [ - path: { "${params.outdir}/deepvariant" }, - enabled: false + path: { "${params.outdir}/glnexus" }, + mode: 'copy', + ] } // CALL_REPEAT_EXPANSIONS diff --git a/modules/local/deepvariant/main.nf b/modules/local/deepvariant/main.nf index 7b1c34a4..04a2de79 100644 --- a/modules/local/deepvariant/main.nf +++ b/modules/local/deepvariant/main.nf @@ -10,7 +10,7 @@ process DEEPVARIANT { input: tuple val(meta), path(bam), path(bai) path fasta - path fasta_fai + tuple val(fai_meta), path(fasta_fai) output: tuple val(meta), path("*.vcf.gz"), emit: vcf @@ -18,15 +18,18 @@ process DEEPVARIANT { path "versions.yml", emit: versions script: + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + """ /opt/deepvariant/bin/run_deepvariant \\ - --ref=${fasta} \\ - --reads=${bam} \\ + --ref=$fasta \\ + --reads=$bam \\ --output_vcf=${prefix}.vcf.gz \\ --output_gvcf=${prefix}.g.vcf.gz \\ - ${options.args} \\ + $args \\ --num_shards=${task.cpus} + cat <<-END_VERSIONS > versions.yml "${task.process}": deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//') diff --git a/subworkflows/local/call_snv_deepvariant.nf b/subworkflows/local/call_snv_deepvariant.nf index 86eaf6cf..687fa551 100644 --- a/subworkflows/local/call_snv_deepvariant.nf +++ b/subworkflows/local/call_snv_deepvariant.nf @@ -2,27 +2,11 @@ // A variant caller workflow for deepvariant // -// params.split_multiallelics_options = [:] -// params.rm_duplicates_options = [:] -// params.deepvariant_options = [:] -// params.glnexus_options = [:] -// params.tabix_options = [:] - -// def split_multiallelics_glnexus = params.split_multiallelics_options.clone() -// split_multiallelics_glnexus.publish_files = "false" - -// def rm_duplicates_glnexus = params.rm_duplicates_options.clone() -// rm_duplicates_glnexus.publish_dir = "glnexus/" -// rm_duplicates_glnexus.suffix = "_split_rmdup" - -// def tabix_glnexus = params.tabix_options.clone() -// tabix_glnexus.publish_dir = "glnexus/" - -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: split_multiallelics_glnexus ) -include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: rm_duplicates_glnexus ) +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_GL } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: split_multiallelics_glnexus ) +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: rm_duplicates_glnexus ) include { DEEPVARIANT } from '../../modules/local/deepvariant/main' //addParams( options: params.deepvariant_options ) include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' //addParams( options: params.glnexus_options ) -include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' //addParams( options: tabix_glnexus) +include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/modules/tabix/tabix/main' //addParams( options: tabix_glnexus) workflow CALL_SNV_DEEPVARIANT { take: @@ -46,16 +30,16 @@ workflow CALL_SNV_DEEPVARIANT { GLNEXUS ( ch_gvcfs ) ch_versions = ch_versions.mix(GLNEXUS.out.versions) - SPLIT_MULTIALLELICS (GLNEXUS.out.bcf, fasta) - REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta) - ch_versions = ch_versions.mix(REMOVE_DUPLICATES.out.versions) + SPLIT_MULTIALLELICS_GL (GLNEXUS.out.bcf, fasta) + REMOVE_DUPLICATES_GL (SPLIT_MULTIALLELICS_GL.out.vcf, fasta) + ch_versions = ch_versions.mix(REMOVE_DUPLICATES_GL.out.versions) - TABIX (REMOVE_DUPLICATES.out.vcf) - ch_versions = ch_versions.mix(TABIX.out.versions) + TABIX_GL (REMOVE_DUPLICATES_GL.out.vcf) + ch_versions = ch_versions.mix(TABIX_GL.out.versions) emit: - vcf = REMOVE_DUPLICATES.out.vcf - tabix = TABIX.out.tbi + vcf = REMOVE_DUPLICATES_GL.out.vcf + tabix = TABIX_GL.out.tbi versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f0cdd79e..403489fa 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -139,13 +139,13 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. - // CALL_SNV_DEEPVARIANT ( - // ch_marked_bam.join(ch_marked_bai, by: [0]), - // PREPARE_GENOME.out.fasta, - // PREPARE_GENOME.out.fai, - // INPUT_CHECK.out.ch_case_info - // ) - // ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) + CALL_SNV_DEEPVARIANT ( + ch_marked_bam.join(ch_marked_bai, by: [0]), + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.fai, + INPUT_CHECK.out.ch_case_info + ) + ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) // // MODULE: Pipeline reporting From 7a62d83057a12c4ce90471fd8f4158510a728ff3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 10 Dec 2021 00:36:02 +0100 Subject: [PATCH 0154/1169] Update check vcf subworkflow --- conf/modules.config | 29 +++++++++++++++++++ modules/local/check_input_vcf.nf | 8 ------ subworkflows/local/call_snv_deepvariant.nf | 10 +++---- subworkflows/local/prepare_vcf.nf | 33 ++++++---------------- workflows/raredisease.nf | 15 +++++----- 5 files changed, 50 insertions(+), 45 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 2fd12572..45a68577 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -53,6 +53,35 @@ process { pattern: "*fai" ] } + // PREPARE_VCF + withName: CHECK_INPUT_VCF { + publishDir = [ + enabled: false, + ] + } + withName: SPLIT_MULTIALLELICS_PV { + ext.args = '--output-type z --multiallelics -both' + ext.prefix = { "${meta.id}_split" } + publishDir = [ + enabled: false + ] + } + withName: REMOVE_DUPLICATES_PV { + ext.args = '--output-type z --rm-dup none' + ext.prefix = { "${meta.id}_split_rmdup" } + publishDir = [ + path: { "${params.outdir}/vcf_check" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: TABIX_PV { + publishDir = [ + path: { "${params.outdir}/vcf_check" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } // CALL_SNV_DEEPVARIANT withName: DEEPVARIANT { ext.args = "--model_type=$params.analysis_type" diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index 63d96d77..9cb063f8 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -1,13 +1,5 @@ -// Import generic module functions -// include { saveFiles } from './functions' - -// params.options = [:] - process CHECK_INPUT_VCF { tag "check_vcf" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { diff --git a/subworkflows/local/call_snv_deepvariant.nf b/subworkflows/local/call_snv_deepvariant.nf index 687fa551..ee34f618 100644 --- a/subworkflows/local/call_snv_deepvariant.nf +++ b/subworkflows/local/call_snv_deepvariant.nf @@ -2,11 +2,11 @@ // A variant caller workflow for deepvariant // -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_GL } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: split_multiallelics_glnexus ) -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: rm_duplicates_glnexus ) -include { DEEPVARIANT } from '../../modules/local/deepvariant/main' //addParams( options: params.deepvariant_options ) -include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' //addParams( options: params.glnexus_options ) -include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/modules/tabix/tabix/main' //addParams( options: tabix_glnexus) +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_GL } from '../../modules/nf-core/modules/bcftools/norm/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../modules/nf-core/modules/bcftools/norm/main' +include { DEEPVARIANT } from '../../modules/local/deepvariant/main' +include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' +include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/modules/tabix/tabix/main' workflow CALL_SNV_DEEPVARIANT { take: diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index b8b7f481..bf526327 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -2,26 +2,10 @@ // Prepare reference vcf files // -// params.split_multiallelics_options = [:] -// params.rm_duplicates_options = [:] -// params.vcf_options = [:] -// params.tabix_options = [:] - -// def split_multiallelics_vcf_check = params.split_multiallelics_options.clone() -// split_multiallelics_vcf_check.publish_files = "false" -// split_multiallelics_vcf_check.suffix = "_split" - -// def rm_duplicates_vcf_check = params.rm_duplicates_options.clone() -// rm_duplicates_vcf_check.publish_dir = "vcf_check/" -// rm_duplicates_vcf_check.suffix = "_split_rmdup" - -// def tabix_vcf_check = params.tabix_options.clone() -// tabix_vcf_check.publish_dir = "vcf_check/" - -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: split_multiallelics_vcf_check ) -include { BCFTOOLS_NORM as REMOVE_DUPLICATES } from '../../modules/nf-core/modules/bcftools/norm/main' //addParams( options: rm_duplicates_vcf_check ) -include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' //addParams( options: params.vcf_options ) -include { TABIX_TABIX as TABIX } from '../../modules/nf-core/modules/tabix/tabix/main' //addParams( options: tabix_vcf_check ) +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_PV } from '../../modules/nf-core/modules/bcftools/norm/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_PV } from '../../modules/nf-core/modules/bcftools/norm/main' +include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' +include { TABIX_TABIX as TABIX_PV } from '../../modules/nf-core/modules/tabix/tabix/main' workflow CHECK_VCF { take: @@ -45,16 +29,17 @@ workflow CHECK_VCF { } .set { ch_vcfs_norm } - SPLIT_MULTIALLELICS (ch_vcfs_norm.unprocessed, fasta) + ch_vcfs_norm.unprocessed.view() + SPLIT_MULTIALLELICS_PV (ch_vcfs_norm.unprocessed, fasta) - REMOVE_DUPLICATES (SPLIT_MULTIALLELICS.out.vcf, fasta).vcf + REMOVE_DUPLICATES_PV (SPLIT_MULTIALLELICS_PV.out.vcf, fasta).vcf .set { ch_vcfs_rmdup } vcf_out = ch_vcfs_rmdup.mix( ch_vcfs_norm.processed ) - TABIX (vcf_out) + TABIX_PV (vcf_out) emit: vcf = vcf_out // path: normalized_vcf - idx = TABIX.out.tbi + idx = TABIX_PV.out.tbi } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 403489fa..6377954b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -39,7 +39,7 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // include { INPUT_CHECK } from '../subworkflows/local/input_check' -// include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' //addParams( options: [:] ) +include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' //addParams( options: [:] ) /* ======================================================================================== @@ -102,13 +102,12 @@ workflow RAREDISEASE { PREPARE_GENOME ( params.fasta ) ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) - // if (params.gnomad) - // { - // ch_gnomad_in = Channel.fromPath(params.gnomad) - // CHECK_VCF( - // ch_gnomad_in, PREPARE_GENOME.out.fasta, - // ).set { ch_gnomad_out } - // } + if (params.gnomad) { + ch_gnomad_in = Channel.fromPath(params.gnomad) + CHECK_VCF( + ch_gnomad_in, PREPARE_GENOME.out.fasta, + ).set { ch_gnomad_out } + } // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. if (params.aligner == 'bwamem2') { From cf130050b080650c79384eace178742dbe98eca0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 10 Dec 2021 01:24:31 +0100 Subject: [PATCH 0155/1169] fix lint errors --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6377954b..51b37e52 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -105,7 +105,7 @@ workflow RAREDISEASE { if (params.gnomad) { ch_gnomad_in = Channel.fromPath(params.gnomad) CHECK_VCF( - ch_gnomad_in, PREPARE_GENOME.out.fasta, + ch_gnomad_in, PREPARE_GENOME.out.fasta, ).set { ch_gnomad_out } } From 867d10fc6bda52c12ad149e9b6555a3709250757 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 10 Dec 2021 02:08:13 +0100 Subject: [PATCH 0156/1169] fix file unchanged lint error --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index c692867e..e37041b3 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -4,6 +4,7 @@ lint: - assets/multiqc_config.yaml - .github/workflows/linting.yml - lib/NfcoreTemplate.groovy + - lib/NfcoreSchema.groovy - assets/sendmail_template.txt - assets/nf-core-raredisease_logo_light.png - docs/images/nf-core-raredisease_logo_light.png From bdd6cf58a52e3db40a8283249a66ea2a6bcf45fd Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 10 Dec 2021 20:17:52 +0100 Subject: [PATCH 0157/1169] review suggestions --- subworkflows/local/prepare_vcf.nf | 1 - workflows/raredisease.nf | 18 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index bf526327..f19b9095 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -29,7 +29,6 @@ workflow CHECK_VCF { } .set { ch_vcfs_norm } - ch_vcfs_norm.unprocessed.view() SPLIT_MULTIALLELICS_PV (ch_vcfs_norm.unprocessed, fasta) REMOVE_DUPLICATES_PV (SPLIT_MULTIALLELICS_PV.out.vcf, fasta).vcf diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 51b37e52..db8741c8 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -39,7 +39,7 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // include { INPUT_CHECK } from '../subworkflows/local/input_check' -include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' //addParams( options: [:] ) +include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' /* ======================================================================================== @@ -51,25 +51,25 @@ include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' //addParams( opti // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' //addParams( options: modules['fastqc'] ) -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' //addParams( options: multiqc_options ) -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' //addParams( options: [publish_files : ['_versions.yml':'']] ) +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' // // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' //addParams( bwamem2_idx_options: modules['bwa_mem2_index'], samtools_faidx_options: modules['samtools_faidx'] ) -include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' //addParams( bwamem2_idx_options: modules['bwa_mem2_index'], bwamem2_mem_options: modules['bwa_mem2_mem'], samtools_idx_options: modules['samtools_index'], samtools_sort_options: modules['samtools_sort'], samtools_stats_options: modules['samtools_stats'], samtools_merge_options: modules['samtools_merge'], markduplicates_options: modules['picard_markduplicates'] ) +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' +include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' //addParams ( picard_collectmultiplemetrics_options: modules['picard_collectmultiplemetrics'], qualimap_bamqc_options: modules['qualimap_bamqc'] ) -include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/local/call_repeat_expansions' //addParams( expansionhunter_options: modules['expansionhunter'] ) +include { QC_BAM } from '../subworkflows/nf-core/qc_bam' +include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/local/call_repeat_expansions' // // SUBWORKFLOW: Consists of mix/local modules // -include { CALL_SNV_DEEPVARIANT } from '../subworkflows/local/call_snv_deepvariant' //addParams( deepvariant_options: modules['deepvariant'], glnexus_options: modules['glnexus'], rm_duplicates_options: modules['bcftools_norm_rm_duplicates'], split_multiallelics_options: modules['bcftools_norm_split_multiallelics'], tabix_options: modules['tabix'] ) +include { CALL_SNV_DEEPVARIANT } from '../subworkflows/local/call_snv_deepvariant' /* ======================================================================================== From bd5314b874e9f33729b5829b933158bfb1f73552 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 13 Dec 2021 10:18:22 +0100 Subject: [PATCH 0158/1169] refactor - simplify if block --- modules/local/check_input_vcf.nf | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index 9cb063f8..471e052f 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -2,11 +2,9 @@ process CHECK_INPUT_VCF { tag "check_vcf" conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + 'quay.io/biocontainers/python:3.8.3' }" input: path vcf From 5082b426a88d2de1ab0bed89aad557e2d0af02cc Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 14 Dec 2021 16:42:51 +0000 Subject: [PATCH 0159/1169] Template update for nf-core/tools version 2.2 --- .gitattributes | 2 + .github/CONTRIBUTING.md | 38 ++------ .github/ISSUE_TEMPLATE/bug_report.md | 63 ------------- .github/ISSUE_TEMPLATE/bug_report.yml | 52 ++++++++++ .github/ISSUE_TEMPLATE/config.yml | 1 - .github/ISSUE_TEMPLATE/feature_request.md | 32 ------- .github/ISSUE_TEMPLATE/feature_request.yml | 11 +++ .github/workflows/awsfulltest.yml | 8 +- .github/workflows/awstest.yml | 10 +- .github/workflows/ci.yml | 23 +++-- .github/workflows/linting_comment.yml | 1 + CITATIONS.md | 2 +- README.md | 13 ++- assets/multiqc_config.yaml | 2 +- assets/nf-core-raredisease_logo.png | Bin 27416 -> 0 bytes assets/nf-core-raredisease_logo_light.png | Bin 0 -> 12342 bytes assets/sendmail_template.txt | 4 +- bin/scrape_software_versions.py | 36 ------- conf/base.config | 3 + conf/modules.config | 55 ++++++----- conf/test.config | 4 +- docs/images/nf-core-raredisease_logo.png | Bin 65627 -> 0 bytes docs/images/nf-core-raredisease_logo_dark.png | Bin 0 -> 75872 bytes .../images/nf-core-raredisease_logo_light.png | Bin 0 -> 75763 bytes docs/output.md | 2 +- docs/usage.md | 36 ------- lib/NfcoreSchema.groovy | 26 +++-- lib/NfcoreTemplate.groovy | 30 ++---- lib/Utils.groovy | 7 -- lib/WorkflowMain.groovy | 6 +- modules.json | 9 +- modules/local/functions.nf | 68 ------------- modules/local/get_software_versions.nf | 33 ------- modules/local/samplesheet_check.nf | 24 ++--- .../custom/dumpsoftwareversions/main.nf | 21 +++++ .../custom/dumpsoftwareversions/meta.yml | 34 +++++++ .../templates/dumpsoftwareversions.py | 89 ++++++++++++++++++ modules/nf-core/modules/fastqc/functions.nf | 68 ------------- modules/nf-core/modules/fastqc/main.nf | 39 ++++---- modules/nf-core/modules/fastqc/meta.yml | 7 +- modules/nf-core/modules/multiqc/functions.nf | 68 ------------- modules/nf-core/modules/multiqc/main.nf | 31 +++--- modules/nf-core/modules/multiqc/meta.yml | 7 +- nextflow.config | 31 +++--- nextflow_schema.json | 29 ------ subworkflows/local/input_check.nf | 8 +- workflows/raredisease.nf | 44 +++------ 47 files changed, 408 insertions(+), 669 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml delete mode 100644 assets/nf-core-raredisease_logo.png create mode 100644 assets/nf-core-raredisease_logo_light.png delete mode 100755 bin/scrape_software_versions.py delete mode 100644 docs/images/nf-core-raredisease_logo.png create mode 100644 docs/images/nf-core-raredisease_logo_dark.png create mode 100644 docs/images/nf-core-raredisease_logo_light.png delete mode 100644 modules/local/functions.nf delete mode 100644 modules/local/get_software_versions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/main.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py delete mode 100644 modules/nf-core/modules/fastqc/functions.nf delete mode 100644 modules/nf-core/modules/multiqc/functions.nf diff --git a/.gitattributes b/.gitattributes index 7fe55006..050bb120 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ *.config linguist-language=nextflow +modules/nf-core/** linguist-generated +subworkflows/nf-core/** linguist-generated diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index b2f28393..e8aed2df 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -68,16 +68,13 @@ If you wish to contribute a new step, please use the following coding standards: 1. Define the corresponding input channel into your new process from the expected previous process channel 2. Write the process block (see below). 3. Define the output channel if needed (see below). -4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). -6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). -7. Add sanity checks for all relevant parameters. -8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. -9. Do local tests that the new code works properly and as expected. -10. Add a new test command in `.github/workflow/ci.yml`. -11. If applicable add a [MultiQC](https://https://multiqc.info/) module. -12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. -13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. +4. Add any new parameters to `nextflow.config` with a default (see below). +5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core schema build` tool). +6. Add sanity checks and validation for all relevant parameters. +7. Perform local tests to validate that the new code works as expected. +8. If applicable, add a new test command in `.github/workflow/ci.yml`. +9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values @@ -102,27 +99,6 @@ Please use the following naming schemes, to make it easy to understand what is g If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` -### Software version reporting - -If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. - -Add to the script block of the process, something like the following: - -```bash - --version &> v_.txt 2>&1 || true -``` - -or - -```bash - --help | head -n 1 &> v_.txt 2>&1 || true -``` - -You then need to edit the script `bin/scrape_software_versions.py` to: - -1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` -2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. - ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index e4a6be5b..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -name: Bug report -about: Report something that is broken or incorrect -labels: bug ---- - - - -## Check Documentation - -I have checked the following places for your error: - -- [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) -- [ ] [nf-core/raredisease pipeline documentation](https://nf-co.re/raredisease/usage) - -## Description of the bug - - - -## Steps to reproduce - -Steps to reproduce the behaviour: - -1. Command line: -2. See error: - -## Expected behaviour - - - -## Log files - -Have you provided the following extra information/files: - -- [ ] The command used to run the pipeline -- [ ] The `.nextflow.log` file - -## System - -- Hardware: -- Executor: -- OS: -- Version - -## Nextflow Installation - -- Version: - -## Container engine - -- Engine: -- version: - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..2ca71ec3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,52 @@ + +name: Bug report +description: Report something that is broken or incorrect +labels: bug +body: + + - type: markdown + attributes: + value: | + Before you post this issue, please check the documentation: + + - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) + - [nf-core/raredisease pipeline documentation](https://nf-co.re/raredisease/usage) + + - type: textarea + id: description + attributes: + label: Description of the bug + description: A clear and concise description of what the bug is. + validations: + required: true + + - type: textarea + id: command_used + attributes: + label: Command used and terminal output + description: Steps to reproduce the behaviour. Please paste the command you used to launch the pipeline and the output from your terminal. + render: console + placeholder: | + $ nextflow run ... + + Some output where something broke + + - type: textarea + id: files + attributes: + label: Relevant files + description: | + Please drag and drop the relevant files here. Create a `.zip` archive if the extension is not allowed. + Your verbose log file `.nextflow.log` is often useful _(this is a hidden file in the directory where you launched the pipeline)_ as well as custom Nextflow configuration files. + + - type: textarea + id: system + attributes: + label: System information + description: | + * Nextflow version _(eg. 21.10.3)_ + * Hardware _(eg. HPC, Desktop, Cloud)_ + * Executor _(eg. slurm, local, awsbatch)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + * OS _(eg. CentOS Linux, macOS, Linux Mint)_ + * Version of nf-core/raredisease _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index cf826800..ff53045d 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,3 @@ -blank_issues_enabled: false contact_links: - name: Join nf-core url: https://nf-co.re/join diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index ec0309f3..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for the nf-core/raredisease pipeline -labels: enhancement ---- - - - -## Is your feature request related to a problem? Please describe - - - - - -## Describe the solution you'd like - - - -## Describe alternatives you've considered - - - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..1ce939e3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,11 @@ +name: Feature request +description: Suggest an idea for the nf-core/raredisease pipeline +labels: enhancement +body: + - type: textarea + id: description + attributes: + label: Description of feature + description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. + validations: + required: true diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 2ca44198..073f3e48 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,14 +14,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} @@ -30,5 +30,5 @@ jobs: { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" } - profiles: '[ "test_full", "aws_tower" ]' - + profiles: test_full,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index c072e483..ced685df 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,18 +11,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test-${{ github.sha }}" } - profiles: '[ "test", "aws_tower" ]' - + profiles: test,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f139f7c3..97c32da7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,8 +8,9 @@ on: release: types: [published] -# Uncomment if we need an edge release of Nextflow again -# env: NXF_EDGE: 1 +env: + NXF_ANSI_LOG: false + CAPSULE_LOG: none jobs: test: @@ -17,20 +18,26 @@ jobs: # Only run on push if this is the nf-core dev branch (merged PRs) if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/raredisease') }} runs-on: ubuntu-latest - env: - NXF_VER: ${{ matrix.nxf_ver }} - NXF_ANSI_LOG: false strategy: matrix: - # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['21.04.0', ''] + # Nextflow versions + include: + # Test pipeline minimum Nextflow version + - NXF_VER: '21.10.3' + NXF_EDGE: '' + # Test latest edge release of Nextflow + - NXF_VER: '' + NXF_EDGE: '1' steps: - name: Check out pipeline code uses: actions/checkout@v2 - name: Install Nextflow env: - CAPSULE_LOG: none + NXF_VER: ${{ matrix.NXF_VER }} + # Uncomment only if the edge release is more recent than the latest stable release + # See https://github.com/nextflow-io/nextflow/issues/2467 + # NXF_EDGE: ${{ matrix.NXF_EDGE }} run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 90f03c6f..44d72994 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -15,6 +15,7 @@ jobs: uses: dawidd6/action-download-artifact@v2 with: workflow: linting.yml + workflow_conclusion: completed - name: Get PR number id: pr_number diff --git a/CITATIONS.md b/CITATIONS.md index b4dad89b..2bc54565 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,7 +12,7 @@ * [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) +* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index 9d27eeec..ae41107b 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# ![nf-core/raredisease](docs/images/nf-core-raredisease_logo.png) +# ![nf-core/raredisease](docs/images/nf-core-raredisease_logo_light.png#gh-light-mode-only) ![nf-core/raredisease](docs/images/nf-core-raredisease_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/raredisease/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/raredisease/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/raredisease/results) [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -33,18 +33,21 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/raredisease -profile test, + nextflow run nf-core/raredisease -profile test,YOURPROFILE ``` + Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. + + > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs. + > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 03969e51..03b23126 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,7 +1,7 @@ report_comment: > This report has been generated by the nf-core/raredisease analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: software_versions: order: -1000 diff --git a/assets/nf-core-raredisease_logo.png b/assets/nf-core-raredisease_logo.png deleted file mode 100644 index 0605a7520f7e6ce5d66d3554b9ff94e463bd8492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27416 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 -Content-Disposition: inline; filename="nf-core-raredisease_logo.png" +Content-Disposition: inline; filename="nf-core-raredisease_logo_light.png" -<% out << new File("$projectDir/assets/nf-core-raredisease_logo.png"). +<% out << new File("$projectDir/assets/nf-core-raredisease_logo_light.png"). bytes. encodeBase64(). toString(). diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py deleted file mode 100755 index 4cbbae3a..00000000 --- a/bin/scrape_software_versions.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import os - -results = {} -version_files = [x for x in os.listdir(".") if x.endswith(".version.txt")] -for version_file in version_files: - - software = version_file.replace(".version.txt", "") - if software == "pipeline": - software = "nf-core/raredisease" - - with open(version_file) as fin: - version = fin.read().strip() - results[software] = version - -# Dump to YAML -print( - """ -id: 'software_versions' -section_name: 'nf-core/raredisease Software Versions' -section_href: 'https://github.com/nf-core/raredisease' -plot_type: 'html' -description: 'are collected at run time from the software output.' -data: | -
-""" -) -for k, v in sorted(results.items()): - print("
{}
{}
".format(k, v)) -print("
") - -# Write out as tsv file: -with open("software_versions.tsv", "w") as f: - for k, v in sorted(results.items()): - f.write("{}\t{}\n".format(k, v)) diff --git a/conf/base.config b/conf/base.config index 03546f26..14979165 100644 --- a/conf/base.config +++ b/conf/base.config @@ -54,4 +54,7 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withName:CUSTOM_DUMPSOFTWAREVERSIONS { + cache = false + } } diff --git a/conf/modules.config b/conf/modules.config index 0b1bfdec..a0506a4d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,32 +1,41 @@ /* ======================================================================================== - Config file for defining DSL2 per module options + Config file for defining DSL2 per module options and publishing paths ======================================================================================== Available keys to override module options: - args = Additional arguments appended to command in module. - args2 = Second set of arguments appended to command in module (multi-tool modules). - args3 = Third set of arguments appended to command in module (multi-tool modules). - publish_dir = Directory to publish results. - publish_by_meta = Groovy list of keys available in meta map to append as directories to "publish_dir" path - If publish_by_meta = true - Value of ${meta['id']} is appended as a directory to "publish_dir" path - If publish_by_meta = ['id', 'custompath'] - If "id" is in meta map and "custompath" isn't then "${meta['id']}/custompath/" - is appended as a directory to "publish_dir" path - If publish_by_meta = false / null - No directories are appended to "publish_dir" path - publish_files = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension - The value of "directory" is appended to the standard "publish_dir" path as defined above. - If publish_files = null (unspecified) - All files are published. - If publish_files = false - No files are published. - suffix = File name suffix for output files. + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. ---------------------------------------------------------------------------------------- */ -params { - modules { - 'fastqc' { - args = "--quiet" - } - 'multiqc' { - args = "" - } +process { + + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + withName: SAMPLESHEET_CHECK { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: FASTQC { + ext.args = '--quiet' } + + withName: CUSTOM_DUMPSOFTWAREVERSIONS { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + pattern: '*_versions.yml' + ] + } + } diff --git a/conf/test.config b/conf/test.config index ff4c6c82..18d4d65e 100644 --- a/conf/test.config +++ b/conf/test.config @@ -16,8 +16,8 @@ params { // Limit resources so that this can run on GitHub Actions max_cpus = 2 - max_memory = 6.GB - max_time = 6.h + max_memory = '6.GB' + max_time = '6.h' // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets diff --git a/docs/images/nf-core-raredisease_logo.png b/docs/images/nf-core-raredisease_logo.png deleted file mode 100644 index 9bbc68dcf9f99bb96ba2605f28d4ef1fae38d9a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65627 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

n<> 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 L(>>Y0+MoMhsb=rF literal 0 HcmV?d00001 diff --git a/docs/images/nf-core-raredisease_logo_light.png b/docs/images/nf-core-raredisease_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3e1c6ec69ad091015a8df756efd4bfee1d337628 GIT binary patch literal 75763 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

jx_Ry)!8|d-JebNGaGDW1#(O_I4hx;bM}V(| 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%0DMRcN%I3ej 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
Ny@#;ub(G0pgS20!Drf=pqZi>HaJYFB*OTOOgj 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 diff --git a/docs/usage.md b/docs/usage.md index 8d3aaaa3..1f94372c 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -181,42 +181,6 @@ process { > **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. -### Tool-specific options - -For the ultimate flexibility, we have implemented and are using Nextflow DSL2 modules in a way where it is possible for both developers and users to change tool-specific command-line arguments (e.g. providing an additional command-line argument to the `STAR_ALIGN` process) as well as publishing options (e.g. saving files produced by the `STAR_ALIGN` process that aren't saved by default by the pipeline). In the majority of instances, as a user you won't have to change the default options set by the pipeline developer(s), however, there may be edge cases where creating a simple custom config file can improve the behaviour of the pipeline if for example it is failing due to a weird error that requires setting a tool-specific parameter to deal with smaller / larger genomes. - -The command-line arguments passed to STAR in the `STAR_ALIGN` module are a combination of: - -* Mandatory arguments or those that need to be evaluated within the scope of the module, as supplied in the [`script`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L49-L55) section of the module file. - -* An [`options.args`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L56) string of non-mandatory parameters that is set to be empty by default in the module but can be overwritten when including the module in the sub-workflow / workflow context via the `addParams` Nextflow option. - -The nf-core/rnaseq pipeline has a sub-workflow (see [terminology](https://github.com/nf-core/modules#terminology)) specifically to align reads with STAR and to sort, index and generate some basic stats on the resulting BAM files using SAMtools. At the top of this file we import the `STAR_ALIGN` module via the Nextflow [`include`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L10) keyword and by default the options passed to the module via the `addParams` option are set as an empty Groovy map [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L5); this in turn means `options.args` will be set to empty by default in the module file too. This is an intentional design choice and allows us to implement well-written sub-workflows composed of a chain of tools that by default run with the bare minimum parameter set for any given tool in order to make it much easier to share across pipelines and to provide the flexibility for users and developers to customise any non-mandatory arguments. - -When including the sub-workflow above in the main pipeline workflow we use the same `include` statement, however, we now have the ability to overwrite options for each of the tools in the sub-workflow including the [`align_options`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L225) variable that will be used specifically to overwrite the optional arguments passed to the `STAR_ALIGN` module. In this case, the options to be provided to `STAR_ALIGN` have been assigned sensible defaults by the developer(s) in the pipeline's [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L70-L74) and can be accessed and customised in the [workflow context](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L201-L204) too before eventually passing them to the sub-workflow as a Groovy map called `star_align_options`. These options will then be propagated from `workflow -> sub-workflow -> module`. - -As mentioned at the beginning of this section it may also be necessary for users to overwrite the options passed to modules to be able to customise specific aspects of the way in which a particular tool is executed by the pipeline. Given that all of the default module options are stored in the pipeline's `modules.config` as a [`params` variable](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L24-L25) it is also possible to overwrite any of these options via a custom config file. - -Say for example we want to append an additional, non-mandatory parameter (i.e. `--outFilterMismatchNmax 16`) to the arguments passed to the `STAR_ALIGN` module. Firstly, we need to copy across the default `args` specified in the [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L71) and create a custom config file that is a composite of the default `args` as well as the additional options you would like to provide. This is very important because Nextflow will overwrite the default value of `args` that you provide via the custom config. - -As you will see in the example below, we have: - -* appended `--outFilterMismatchNmax 16` to the default `args` used by the module. -* changed the default `publish_dir` value to where the files will eventually be published in the main results directory. -* appended `'bam':''` to the default value of `publish_files` so that the BAM files generated by the process will also be saved in the top-level results directory for the module. Note: `'out':'log'` means any file/directory ending in `out` will now be saved in a separate directory called `my_star_directory/log/`. - -```nextflow -params { - modules { - 'star_align' { - args = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16" - publish_dir = "my_star_directory" - publish_files = ['out':'log', 'tab':'log', 'bam':''] - } - } -} -``` - ### Updating containers The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 8d6920dd..40ab65f2 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -105,9 +105,13 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] + def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) + if (group.value['properties'][p.key].containsKey('enum')) { + enums[p.key] = group.value['properties'][p.key]['enum'] + } } } @@ -155,7 +159,7 @@ class NfcoreSchema { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log) + printExceptions(exceptionJSON, params_json, log, enums) println '' has_error = true } @@ -202,7 +206,7 @@ class NfcoreSchema { } def type = '[' + group_params.get(param).type + ']' def description = group_params.get(param).description - def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' def description_default = description + colors.dim + defaultValue + colors.reset // Wrap long description texts // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap @@ -260,13 +264,12 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] - def blacklist = ['hostnames'] def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param) && !blacklist.contains(param)) { + if (params.containsKey(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type @@ -330,7 +333,7 @@ class NfcoreSchema { // // Loop over nested exceptions and print the causingException // - private static void printExceptions(ex_json, params_json, log) { + private static void printExceptions(ex_json, params_json, log, enums, limit=5) { def causingExceptions = ex_json['causingExceptions'] if (causingExceptions.length() == 0) { def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ @@ -346,11 +349,20 @@ class NfcoreSchema { else { def param = ex_json['pointerToViolation'] - ~/^#\// def param_val = params_json[param].toString() - log.error "* --${param}: ${ex_json['message']} (${param_val})" + if (enums.containsKey(param)) { + def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" + if (enums[param].size() > limit) { + log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" + } else { + log.error "${error_msg}: ${enums[param].join(', ')})" + } + } else { + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } } } for (ex in causingExceptions) { - printExceptions(ex, params_json, log) + printExceptions(ex, params_json, log, enums) } } diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 44551e0a..2fc0a9b9 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -19,27 +19,16 @@ class NfcoreTemplate { } // - // Check params.hostnames + // Warn if a -profile or Nextflow config has not been provided to run the pipeline // - public static void hostName(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (params.hostnames) { - try { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" - } - } - } - } catch (Exception e) { - log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." - } + public static void checkConfigProvided(workflow, log) { + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " } } @@ -168,7 +157,6 @@ class NfcoreTemplate { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { - hostName(workflow, params, log) log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" } } diff --git a/lib/Utils.groovy b/lib/Utils.groovy index 18173e98..1b88aec0 100755 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -37,11 +37,4 @@ class Utils { "===================================================================================" } } - - // - // Join module args with appropriate spacing - // - public static String joinModuleArgs(args_list) { - return ' ' + args_list.join(' ') - } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 089c7f7d..730a0565 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -61,6 +61,9 @@ class WorkflowMain { // Print parameter summary log to screen log.info paramsSummaryLog(workflow, params, log) + // Check that a -profile or Nextflow config has been provided to run the pipeline + NfcoreTemplate.checkConfigProvided(workflow, log) + // Check that conda channels are set-up correctly if (params.enable_conda) { Utils.checkCondaChannels(log) @@ -69,9 +72,6 @@ class WorkflowMain { // Check AWS batch settings NfcoreTemplate.awsBatch(workflow, params) - // Check the hostnames against configured profiles - NfcoreTemplate.hostName(workflow, params, log) - // Check input has been provided if (!params.input) { log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" diff --git a/modules.json b/modules.json index 0494c19e..6af82ab6 100644 --- a/modules.json +++ b/modules.json @@ -3,12 +3,15 @@ "homePage": "https://github.com/nf-core/raredisease", "repos": { "nf-core/modules": { + "custom/dumpsoftwareversions": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, "fastqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "multiqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } -} +} \ No newline at end of file diff --git a/modules/local/functions.nf b/modules/local/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/local/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf deleted file mode 100644 index 7961d64b..00000000 --- a/modules/local/get_software_versions.nf +++ /dev/null @@ -1,33 +0,0 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - -process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } - - cache false - - input: - path versions - - output: - path "software_versions.tsv" , emit: tsv - path 'software_versions_mqc.yaml', emit: yaml - - script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ - """ - echo $workflow.manifest.version > pipeline.version.txt - echo $workflow.nextflow.version > nextflow.version.txt - scrape_software_versions.py &> software_versions_mqc.yaml - """ -} diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 1e1f8350..d2c6d889 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,31 +1,27 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - process SAMPLESHEET_CHECK { tag "$samplesheet" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + 'quay.io/biocontainers/python:3.8.3' }" input: path samplesheet output: - path '*.csv' + path '*.csv' , emit: csv + path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ """ check_samplesheet.py \\ $samplesheet \\ samplesheet.valid.csv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf new file mode 100644 index 00000000..934bb467 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -0,0 +1,21 @@ +process CUSTOM_DUMPSOFTWAREVERSIONS { + label 'process_low' + + // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container + conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + + input: + path versions + + output: + path "software_versions.yml" , emit: yml + path "software_versions_mqc.yml", emit: mqc_yml + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + template 'dumpsoftwareversions.py' +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 00000000..5b5b8a60 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,34 @@ +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline template +keywords: + - custom + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + licence: ['MIT'] +input: + - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" + +output: + - yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py new file mode 100644 index 00000000..d1390392 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import yaml +import platform +from textwrap import dedent + + +def _make_versions_html(versions): + html = [ + dedent( + """\\ + + + + + + + + + + """ + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f"""\\ + + + + + + """ + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + +versions_this_module = {} +versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, +} + +with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + +# aggregate versions by the module name (derived from fully-qualified process name) +versions_by_module = {} +for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + assert versions_by_module[module] == process_versions, ( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + +versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", +} + +versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), +} + +with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) +with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + +with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) diff --git a/modules/nf-core/modules/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/nf-core/modules/fastqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index 39c327b2..d250eca0 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process FASTQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" - } else { - container "quay.io/biocontainers/fastqc:0.11.9--0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : + 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: tuple val(meta), path(reads) @@ -24,24 +13,32 @@ process FASTQC { output: tuple val(meta), path("*.html"), emit: html tuple val(meta), path("*.zip") , emit: zip - path "*.version.txt" , emit: version + path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline - def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index 8eb9953d..b09553a3 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -15,6 +15,7 @@ tools: overrepresented sequences. homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ['GPL-2.0-only'] input: - meta: type: map @@ -40,10 +41,10 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/nf-core/modules/multiqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index da780800..3dceb162 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,21 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process MULTIQC { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0" - } else { - container "quay.io/biocontainers/multiqc:1.10.1--py_0" - } + conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" input: path multiqc_files @@ -24,12 +13,16 @@ process MULTIQC { path "*multiqc_report.html", emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots - path "*.version.txt" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) + def args = task.ext.args ?: '' """ - multiqc -f $options.args . - multiqc --version | sed -e "s/multiqc, version //g" > ${software}.version.txt + multiqc -f $args . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS """ } diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 532a8bb1..63c75a45 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -11,6 +11,7 @@ tools: It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ + licence: ['GPL-3.0-or-later'] input: - multiqc_files: type: file @@ -29,10 +30,10 @@ output: type: file description: Plots created by MultiQC pattern: "*_data" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@abhi18av" - "@bunop" diff --git a/nextflow.config b/nextflow.config index 329e093e..0eaaf845 100644 --- a/nextflow.config +++ b/nextflow.config @@ -26,7 +26,6 @@ params { // Boilerplate options outdir = './results' tracedir = "${params.outdir}/pipeline_info" - publish_dir_mode = 'copy' email = null email_on_fail = null plaintext_email = false @@ -34,14 +33,12 @@ params { help = false validate_params = true show_hidden_params = false - schema_ignore_params = 'genomes,modules' + schema_ignore_params = 'genomes' enable_conda = false - singularity_pull_docker_container = false // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - hostnames = [:] config_profile_description = null config_profile_contact = null config_profile_url = null @@ -58,9 +55,6 @@ params { // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' - // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" @@ -68,13 +62,6 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} - profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -126,11 +113,22 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } +// Load igenomes.config if required +if (!params.igenomes_ignore) { + includeConfig 'conf/igenomes.config' +} else { + params.genomes = [:] +} + // Export these variables to prevent local Python/R libraries from conflicting with those in the container +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. + env { PYTHONNOUSERSITE = 1 R_PROFILE_USER = "/.Rprofile" R_ENVIRON_USER = "/.Renviron" + JULIA_DEPOT_PATH = "/usr/local/share/julia" } // Capture exit codes from upstream processes when piping @@ -160,10 +158,13 @@ manifest { homePage = 'https://github.com/nf-core/raredisease' description = 'call and score variants from WGS/WES of rare disease patients' mainScript = 'main.nf' - nextflowVersion = '!>=21.04.0' + nextflowVersion = '!>=21.10.3' version = '1.0dev' } +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' + // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { diff --git a/nextflow_schema.json b/nextflow_schema.json index 60fdb051..068a9809 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -104,12 +104,6 @@ "help_text": "If you're running offline, Nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.", "fa_icon": "fas fa-users-cog" }, - "hostnames": { - "type": "string", - "description": "Institutional configs hostname.", - "hidden": true, - "fa_icon": "fas fa-users-cog" - }, "config_profile_name": { "type": "string", "description": "Institutional config name.", @@ -184,22 +178,6 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, - "publish_dir_mode": { - "type": "string", - "default": "copy", - "description": "Method used to save pipeline results to output directory.", - "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", - "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], - "hidden": true - }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", @@ -260,13 +238,6 @@ "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", "hidden": true, "fa_icon": "fas fa-bacon" - }, - "singularity_pull_docker_container": { - "type": "boolean", - "description": "Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead.", - "hidden": true, - "fa_icon": "fas fa-toolbox", - "help_text": "This may be useful for example if you are unable to directly pull Singularity containers to run the pipeline due to http/https proxy issues." } } } diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index b664bc8c..cddcbb3c 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -2,9 +2,7 @@ // Check input samplesheet and get read channels // -params.options = [:] - -include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) +include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow INPUT_CHECK { take: @@ -12,12 +10,14 @@ workflow INPUT_CHECK { main: SAMPLESHEET_CHECK ( samplesheet ) + .csv .splitCsv ( header:true, sep:',' ) .map { create_fastq_channels(it) } .set { reads } emit: - reads // channel: [ val(meta), [ reads ] ] + reads // channel: [ val(meta), [ reads ] ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3b6af916..ab9e9810 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -32,18 +32,10 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi ======================================================================================== */ -// Don't overwrite global params.modules, create a copy instead and use that within the main script. -def modules = params.modules.clone() - -// -// MODULE: Local to the pipeline -// -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) - // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) +include { INPUT_CHECK } from '../subworkflows/local/input_check' /* ======================================================================================== @@ -51,14 +43,12 @@ include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( opti ======================================================================================== */ -def multiqc_options = modules['multiqc'] -multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' - // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* ======================================================================================== @@ -71,7 +61,7 @@ def multiqc_report = [] workflow RAREDISEASE { - ch_software_versions = Channel.empty() + ch_versions = Channel.empty() // // SUBWORKFLOW: Read in samplesheet, validate and stage input files @@ -79,6 +69,7 @@ workflow RAREDISEASE { INPUT_CHECK ( ch_input ) + ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) // // MODULE: Run FastQC @@ -86,21 +77,10 @@ workflow RAREDISEASE { FASTQC ( INPUT_CHECK.out.reads ) - ch_software_versions = ch_software_versions.mix(FASTQC.out.version.first().ifEmpty(null)) + ch_versions = ch_versions.mix(FASTQC.out.versions.first()) - // - // MODULE: Pipeline reporting - // - ch_software_versions - .map { it -> if (it) [ it.baseName, it ] } - .groupTuple() - .map { it[1][0] } - .flatten() - .collect() - .set { ch_software_versions } - - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect() + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile(name: 'collated_versions.yml') ) // @@ -113,14 +93,14 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(GET_SOFTWARE_VERSIONS.out.yaml.collect()) + ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( ch_multiqc_files.collect() ) - multiqc_report = MULTIQC.out.report.toList() - ch_software_versions = ch_software_versions.mix(MULTIQC.out.version.ifEmpty(null)) + multiqc_report = MULTIQC.out.report.toList() + ch_versions = ch_versions.mix(MULTIQC.out.versions) } /* From ea29fffd933ebc270373df4701fa46948db50f67 Mon Sep 17 00:00:00 2001 From: rannick Date: Tue, 14 Dec 2021 18:31:50 +0100 Subject: [PATCH 0160/1169] remove hardcoding of _R1_;ID is now just the fastq_1 filename --- subworkflows/local/input_check.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 725c569a..e634c99e 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -33,7 +33,7 @@ def create_fastq_channels(LinkedHashMap row) { meta.id = row.sample meta.single_end = row.single_end.toBoolean() //TODO: think about adding LB and PU, make sure only illumina will be used, ID can also contain a flowcell id - meta.read_group = "\'@RG\\tID:"+ row.sample.split('_')[0] + "_" + row.fastq_1.split('/')[-1].split('_R1_')[0] + "_" + row.lane + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" + meta.read_group = "\'@RG\\tID:"+ row.fastq_1.split('/')[-1] + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" def array = [] From b038c862d4f30425bed4b6250c656ee349dc5016 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:00:30 +0100 Subject: [PATCH 0161/1169] Update resuing modules section --- .github/CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 65fb5809..9ef34fe8 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -104,7 +104,9 @@ Please use the following naming schemes, to make it easy to understand what is g ### Reusing modules in the workflow -Default options for modules should be defined in the [conf/modules.config](../conf/modules.config). If you have a module that you would like to reuse in a subworkflow with non-default options, we recommend modifying the defaults within the context of the subworkflow. For a working example, please have a look at how the default options for bcftools norm tool are modified in both [subworkflows/local/deepvariant_caller.nf](../subworkflows/local/deepvariant_caller.nf) and [subworkflows/local/prepare_vcf.nf](../subworkflows/local/prepare_vcf.nf) +Occasionally, you might find yourself wanting to reuse a module with options that are different from what has already been defined in [conf/modules.config](../conf/modules.config). In that case, we recommend importing the module using an unique alias within the subworkflow, and then defining the options for the alias in [conf/modules.config](../conf/modules.config). + +For a working example, please have a look at how we have reused `bcftools norm` in both [subworkflows/local/call_snv_deepvariant.nf](../subworkflows/local/call_snv_deepvariant.nf) and [subworkflows/local/prepare_vcf.nf](../subworkflows/local/prepare_vcf.nf), and defined subworkflow-specific options in [conf/modules.config](../conf/modules.config). ### Nextflow version bumping From 8740b19f75b4c645573626f67c5e47a575eb1c26 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:10:36 +0100 Subject: [PATCH 0162/1169] small fix --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 9ef34fe8..f29a1d9a 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -106,7 +106,7 @@ Please use the following naming schemes, to make it easy to understand what is g Occasionally, you might find yourself wanting to reuse a module with options that are different from what has already been defined in [conf/modules.config](../conf/modules.config). In that case, we recommend importing the module using an unique alias within the subworkflow, and then defining the options for the alias in [conf/modules.config](../conf/modules.config). -For a working example, please have a look at how we have reused `bcftools norm` in both [subworkflows/local/call_snv_deepvariant.nf](../subworkflows/local/call_snv_deepvariant.nf) and [subworkflows/local/prepare_vcf.nf](../subworkflows/local/prepare_vcf.nf), and defined subworkflow-specific options in [conf/modules.config](../conf/modules.config). +For a working example, please have a look at how we have reused `bcftools norm` in both [subworkflows/local/call_snv_deepvariant.nf](../subworkflows/local/call_snv_deepvariant.nf) and [subworkflows/local/prepare_vcf.nf](../subworkflows/local/prepare_vcf.nf), and defined its subworkflow-specific options in [conf/modules.config](../conf/modules.config). ### Nextflow version bumping From 535c07704b184c6441186e543fabf142e5e1ef74 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:17:07 +0100 Subject: [PATCH 0163/1169] fix lint error --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index e37041b3..73f02d8f 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,6 +1,7 @@ lint: files_unchanged: - .github/CONTRIBUTING.md + - .github/ISSUE_TEMPLATE/bug_report.yml - assets/multiqc_config.yaml - .github/workflows/linting.yml - lib/NfcoreTemplate.groovy From 8d575f8f8fef216f21931b7dcb87d24a65e302dd Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 15 Dec 2021 12:05:05 +0100 Subject: [PATCH 0164/1169] moved subworkflows right folder --- .../nf-core/call_repeat_expansions.nf | 22 ++++++++++ subworkflows/nf-core/prepare_genome.nf | 40 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 subworkflows/nf-core/call_repeat_expansions.nf create mode 100644 subworkflows/nf-core/prepare_genome.nf diff --git a/subworkflows/nf-core/call_repeat_expansions.nf b/subworkflows/nf-core/call_repeat_expansions.nf new file mode 100644 index 00000000..5530e447 --- /dev/null +++ b/subworkflows/nf-core/call_repeat_expansions.nf @@ -0,0 +1,22 @@ +// +// Run ExpansionHunter +// + +include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/main' + +workflow CALL_REPEAT_EXPANSIONS { + take: + bam // channel: [ val(meta), path(bam), path(bai) ] + fasta // channel: /path/to/genome.fasta + variant_catalog // channel: /path/to/variant_catalog.json + + main: + ch_versions = Channel.empty() + + EXPANSIONHUNTER( bam, fasta, file(variant_catalog) ) + ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) + + emit: + vcf = EXPANSIONHUNTER.out.vcf // channel: [ val(meta), path(*.vcf) ] + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/subworkflows/nf-core/prepare_genome.nf b/subworkflows/nf-core/prepare_genome.nf new file mode 100644 index 00000000..0b6f4138 --- /dev/null +++ b/subworkflows/nf-core/prepare_genome.nf @@ -0,0 +1,40 @@ +// +// Prepare reference genome files +// + +include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' + +workflow PREPARE_GENOME { + take: + fasta // path: genome.fasta + + main: + ch_fasta = file(fasta) + ch_versions = Channel.empty() + + // Fetch BWAMEM2 index or create from scratch if required + if ( params.aligner == 'bwamem2' ) { + if ( params.bwamem2_index && file(params.bwamem2_index, checkIfExists:true) ) { + ch_bwamem2_index = file(params.bwamem2_index) + } else { + ch_bwamem2_index = BWAMEM2_INDEX ( ch_fasta ).index + ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) + } + } + + if ( params.fasta_fai ) { + ch_fai = file(params.fasta_fai) + } else { + ch_fai = SAMTOOLS_FAIDX ( [[], ch_fasta] ).fai // TODO: faidx now requires meta info for fasta due to pipelines with multi references e.g. de novo + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) + } + + + emit: + fasta = ch_fasta // path: genome.fasta + fai = ch_fai // path: genome.fasta.fai + bwamem2_index = ch_bwamem2_index // path: bwamem2/index + + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} From 98a56cc2e661fa46436eacf06c4691d4e3d5b6ed Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 15 Dec 2021 12:05:52 +0100 Subject: [PATCH 0165/1169] deleted misplaced files --- subworkflows/local/call_repeat_expansions.nf | 22 ----------- subworkflows/local/prepare_genome.nf | 40 -------------------- 2 files changed, 62 deletions(-) delete mode 100644 subworkflows/local/call_repeat_expansions.nf delete mode 100644 subworkflows/local/prepare_genome.nf diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf deleted file mode 100644 index 5530e447..00000000 --- a/subworkflows/local/call_repeat_expansions.nf +++ /dev/null @@ -1,22 +0,0 @@ -// -// Run ExpansionHunter -// - -include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/main' - -workflow CALL_REPEAT_EXPANSIONS { - take: - bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // channel: /path/to/genome.fasta - variant_catalog // channel: /path/to/variant_catalog.json - - main: - ch_versions = Channel.empty() - - EXPANSIONHUNTER( bam, fasta, file(variant_catalog) ) - ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) - - emit: - vcf = EXPANSIONHUNTER.out.vcf // channel: [ val(meta), path(*.vcf) ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] -} diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf deleted file mode 100644 index 0b6f4138..00000000 --- a/subworkflows/local/prepare_genome.nf +++ /dev/null @@ -1,40 +0,0 @@ -// -// Prepare reference genome files -// - -include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' - -workflow PREPARE_GENOME { - take: - fasta // path: genome.fasta - - main: - ch_fasta = file(fasta) - ch_versions = Channel.empty() - - // Fetch BWAMEM2 index or create from scratch if required - if ( params.aligner == 'bwamem2' ) { - if ( params.bwamem2_index && file(params.bwamem2_index, checkIfExists:true) ) { - ch_bwamem2_index = file(params.bwamem2_index) - } else { - ch_bwamem2_index = BWAMEM2_INDEX ( ch_fasta ).index - ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) - } - } - - if ( params.fasta_fai ) { - ch_fai = file(params.fasta_fai) - } else { - ch_fai = SAMTOOLS_FAIDX ( [[], ch_fasta] ).fai // TODO: faidx now requires meta info for fasta due to pipelines with multi references e.g. de novo - ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) - } - - - emit: - fasta = ch_fasta // path: genome.fasta - fai = ch_fai // path: genome.fasta.fai - bwamem2_index = ch_bwamem2_index // path: bwamem2/index - - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] -} From 7bceb80e07551271f228f65e8ef8469da22284e8 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 15 Dec 2021 12:08:08 +0100 Subject: [PATCH 0166/1169] :arrow_down: module --- modules.json | 3 ++ modules/nf-core/modules/tiddit/cov/main.nf | 36 ++++++++++++++ modules/nf-core/modules/tiddit/cov/meta.yml | 52 +++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 modules/nf-core/modules/tiddit/cov/main.nf create mode 100644 modules/nf-core/modules/tiddit/cov/meta.yml diff --git a/modules.json b/modules.json index 1cb4dd18..2ef01f77 100644 --- a/modules.json +++ b/modules.json @@ -53,6 +53,9 @@ }, "tabix/tabix": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, + "tiddit/cov": { + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" } } } diff --git a/modules/nf-core/modules/tiddit/cov/main.nf b/modules/nf-core/modules/tiddit/cov/main.nf new file mode 100644 index 00000000..c5a1ca0f --- /dev/null +++ b/modules/nf-core/modules/tiddit/cov/main.nf @@ -0,0 +1,36 @@ +process TIDDIT_COV { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::tiddit=2.12.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tiddit:2.12.1--py38h1773678_0' : + 'quay.io/biocontainers/tiddit:2.12.1--py38h1773678_0' }" + + input: + tuple val(meta), path(bam) + path fasta + + output: + tuple val(meta), path("*.tab"), optional: true, emit: cov + tuple val(meta), path("*.wig"), optional: true, emit: wig + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--ref $fasta" : "" + """ + tiddit \\ + --cov \\ + -o $prefix \\ + $args \\ + --bam $bam \\ + $reference + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/tiddit/cov/meta.yml b/modules/nf-core/modules/tiddit/cov/meta.yml new file mode 100644 index 00000000..d925b783 --- /dev/null +++ b/modules/nf-core/modules/tiddit/cov/meta.yml @@ -0,0 +1,52 @@ +name: tiddit_cov +description: Computes the coverage of different regions from the bam file. +keywords: + - coverage + - bam + - statistics + - chromosomal rearrangements +tools: + - tiddit: + description: TIDDIT - structural variant calling. + homepage: https://github.com/SciLifeLab/TIDDIT + documentation: https://github.com/SciLifeLab/TIDDIT/blob/master/README.md + doi: "10.12688/f1000research.11168.1" + licence: ["GPL v3"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM file + pattern: "*.{bam,cram}" + - fasta: + type: file + description: | + Reference genome file. Only needed when passing in CRAM instead of BAM. + If not using CRAM, please pass an empty file instead. + pattern: "*.fasta" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - cov: + type: file + description: The coverage of different regions. Optional. + pattern: "*.tab" + - wig: + type: file + description: The coverage of different regions in WIG format. Optional. + pattern: "*.wig" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@projectoriented" From 32cccbf54792744f9f0fa73d8e1edb075f567c43 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 15 Dec 2021 12:29:55 +0100 Subject: [PATCH 0167/1169] integrated tiddit coverage --- conf/modules.config | 13 +++++++++---- subworkflows/nf-core/qc_bam.nf | 8 ++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 45a68577..a9f0a1f6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -182,15 +182,20 @@ process { withName: '.*COLLECTMULTIPLEMETRICS' { publishDir = [ path: { "${params.outdir}/bamqc_collectmultiplemetrics" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + mode: 'copy' ] } withName: QUALIMAP_BAMQC { publishDir = [ path: { "${params.outdir}/bamqc_qualimap" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + mode: 'copy' + ] + } + withName: TIDDIT_COV { + ext.args = '-z 500 -w -u' + publishDir = [ + path: { "${params.outdir}/tiddit_coverage" }, + mode: 'copy' ] } // nf-core modules diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index c14bb364..edcb910a 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -4,6 +4,7 @@ include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' +include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' workflow QC_BAM { @@ -14,14 +15,21 @@ workflow QC_BAM { main: ch_versions = Channel.empty() + // COLLECT MULTIPLE METRICS PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta ) ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions) + // QUALIMAP BAMQC gff = [] use_gff = false QUALIMAP_BAMQC ( bam, gff, use_gff ) ch_versions = ch_versions.mix(QUALIMAP_BAMQC.out.versions) + // TIDDIT COVERAGE + TIDDIT_COV ( bam, [] ) // 2nd pos. arg is req. only for cram input + ch_versions = ch_versions.mix(TIDDIT_COV.out.versions) + + emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] From 7d761a7de8d03a4e31d4eda5aa71f5293d8622f8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:30:02 +0100 Subject: [PATCH 0168/1169] install manta module --- modules.json | 3 + .../nf-core/modules/manta/germline/main.nf | 57 ++++++++++++ .../nf-core/modules/manta/germline/meta.yml | 87 +++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 modules/nf-core/modules/manta/germline/main.nf create mode 100644 modules/nf-core/modules/manta/germline/meta.yml diff --git a/modules.json b/modules.json index 1cb4dd18..de598741 100644 --- a/modules.json +++ b/modules.json @@ -24,6 +24,9 @@ "glnexus": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, + "manta/germline": { + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + }, "multiqc": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, diff --git a/modules/nf-core/modules/manta/germline/main.nf b/modules/nf-core/modules/manta/germline/main.nf new file mode 100644 index 00000000..2a8c0acc --- /dev/null +++ b/modules/nf-core/modules/manta/germline/main.nf @@ -0,0 +1,57 @@ +process MANTA_GERMLINE { + tag "$meta.id" + label 'process_high' + + conda (params.enable_conda ? "bioconda::manta=1.6.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/manta:1.6.0--h9ee0642_1' : + 'quay.io/biocontainers/manta:1.6.0--h9ee0642_1' }" + + input: + tuple val(meta), path(input), path(input_index) + path fasta + path fai + path target_bed + path target_bed_tbi + + output: + tuple val(meta), path("*candidate_small_indels.vcf.gz") , emit: candidate_small_indels_vcf + tuple val(meta), path("*candidate_small_indels.vcf.gz.tbi"), emit: candidate_small_indels_vcf_tbi + tuple val(meta), path("*candidate_sv.vcf.gz") , emit: candidate_sv_vcf + tuple val(meta), path("*candidate_sv.vcf.gz.tbi") , emit: candidate_sv_vcf_tbi + tuple val(meta), path("*diploid_sv.vcf.gz") , emit: diploid_sv_vcf + tuple val(meta), path("*diploid_sv.vcf.gz.tbi") , emit: diploid_sv_vcf_tbi + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def options_manta = target_bed ? "--exome --callRegions $target_bed" : "" + """ + configManta.py \ + --bam $input \ + --reference $fasta \ + $options_manta \ + --runDir manta + + python manta/runWorkflow.py -m local -j $task.cpus + + mv manta/results/variants/candidateSmallIndels.vcf.gz \ + ${prefix}.candidate_small_indels.vcf.gz + mv manta/results/variants/candidateSmallIndels.vcf.gz.tbi \ + ${prefix}.candidate_small_indels.vcf.gz.tbi + mv manta/results/variants/candidateSV.vcf.gz \ + ${prefix}.candidate_sv.vcf.gz + mv manta/results/variants/candidateSV.vcf.gz.tbi \ + ${prefix}.candidate_sv.vcf.gz.tbi + mv manta/results/variants/diploidSV.vcf.gz \ + ${prefix}.diploid_sv.vcf.gz + mv manta/results/variants/diploidSV.vcf.gz.tbi \ + ${prefix}.diploid_sv.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + manta: \$( configManta.py --version ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/manta/germline/meta.yml b/modules/nf-core/modules/manta/germline/meta.yml new file mode 100644 index 00000000..3bdb8264 --- /dev/null +++ b/modules/nf-core/modules/manta/germline/meta.yml @@ -0,0 +1,87 @@ +name: manta_germline +description: 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. +keywords: + - somatic + - wgs + - wxs + - panel + - vcf + - structural variants + - small indels +tools: + - manta: + description: Structural variant and indel caller for mapped sequencing data + homepage: https://github.com/Illumina/manta + documentation: https://github.com/Illumina/manta/blob/v1.6.0/docs/userGuide/README.md + tool_dev_url: https://github.com/Illumina/manta + doi: "10.1093/bioinformatics/btv710" + licence: ['GPL v3'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - input_index: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - fasta: + type: file + description: Genome reference FASTA file + pattern: "*.{fa,fasta}" + - fai: + type: file + description: Genome reference FASTA index file + pattern: "*.{fa.fai,fasta.fai}" + - target_bed: + type: file + description: BED file containing target regions for variant calling + pattern: "*.{bed}" + - target_bed_tbi: + type: file + description: Index for BED file containing target regions for variant calling + pattern: "*.{bed.tbi}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - candidate_small_indels_vcf: + type: file + description: Gzipped VCF file containing variants + pattern: "*.{vcf.gz}" + - candidate_small_indels_vcf_tbi: + type: file + description: Index for gzipped VCF file containing variants + pattern: "*.{vcf.gz.tbi}" + - candidate_sv_vcf: + type: file + description: Gzipped VCF file containing variants + pattern: "*.{vcf.gz}" + - candidate_sv_vcf_tbi: + type: file + description: Index for gzipped VCF file containing variants + pattern: "*.{vcf.gz.tbi}" + - diploid_sv_vcf: + type: file + description: Gzipped VCF file containing variants + pattern: "*.{vcf.gz}" + - diploid_sv_vcf_tbi: + type: file + description: Index for gzipped VCF file containing variants + pattern: "*.{vcf.gz.tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@maxulysse" From 2aaf64926ab3dbbcfa1cb5e5746df6d48c0d2ef4 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 15 Dec 2021 13:33:54 +0100 Subject: [PATCH 0169/1169] installed wigtobigwig --- modules.json | 3 ++ .../nf-core/modules/ucsc/wigtobigwig/main.nf | 34 +++++++++++++++++ .../nf-core/modules/ucsc/wigtobigwig/meta.yml | 37 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 modules/nf-core/modules/ucsc/wigtobigwig/main.nf create mode 100644 modules/nf-core/modules/ucsc/wigtobigwig/meta.yml diff --git a/modules.json b/modules.json index 2ef01f77..bac77406 100644 --- a/modules.json +++ b/modules.json @@ -56,6 +56,9 @@ }, "tiddit/cov": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + }, + "ucsc/wigtobigwig": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf new file mode 100644 index 00000000..4c596c9a --- /dev/null +++ b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf @@ -0,0 +1,34 @@ +def VERSION = '377' // Version information not provided by tool on CLI + +process UCSC_WIGTOBIGWIG { + tag '$wig' + label 'process_medium' + + conda (params.enable_conda ? "bioconda::ucsc-wigtobigwig=377" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ucsc-wigtobigwig:377--h0b8a92a_2' : + 'quay.io/biocontainers/ucsc-wigtobigwig:377--h0b8a92a_2' }" + + input: + path wig + path sizes + + output: + path "*.bw" , emit: bw + path "versions.yml", emit: versions + + script: + def args = task.ext.args ?: '' + """ + wigToBigWig \\ + $args \\ + $wig \\ + $sizes \\ + ${wig.getSimpleName()}.bw + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ucsc: $VERSION + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml b/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml new file mode 100644 index 00000000..4723ff2b --- /dev/null +++ b/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml @@ -0,0 +1,37 @@ +name: ucsc_wigtobigwig +description: Convert ascii format wig file to binary big wig format +keywords: + - wig + - bigwig +tools: + - ucsc: + description: | + Convert ascii format wig file (in fixedStep, variableStep + or bedGraph format) to binary big wig format + homepage: None + documentation: None + tool_dev_url: None + doi: "" + licence: ['varies; see http://genome.ucsc.edu/license'] + +input: + - wig: + type: file + description: wig file + pattern: "*.{wig}" + - chromsizes: + type: file + description: chromosome sizes file + +output: + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - bw: + type: file + description: bigwig file + pattern: "*.{bw}" + +authors: + - "@jianhong" From 134a721143b3e80ebc94cd3913c768c28946cc6e Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Wed, 15 Dec 2021 15:38:20 +0100 Subject: [PATCH 0170/1169] let's see if this works :stuck_out_tongue_closed_eyes: --- .github/workflows/ci.yml | 4 ---- .github/workflows/linting.yml | 2 +- .nf-core.yml | 7 ------- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a694ccfe..fa39ed37 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,8 +14,6 @@ jobs: # Only run on push if this is the nf-core dev branch (merged PRs) if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/raredisease') }} runs-on: ubuntu-latest - env: - NXF_ANSI_LOG: false strategy: matrix: # Nextflow versions @@ -32,7 +30,6 @@ jobs: - name: Install Nextflow env: - CAPSULE_LOG: none NXF_VER: ${{ matrix.NXF_VER }} # Uncomment only if the edge release is more recent than the latest stable release # See https://github.com/nextflow-io/nextflow/issues/2467 @@ -40,7 +37,6 @@ jobs: run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ - nextflow self-update - name: Run pipeline with test data # TODO nf-core: You can customise CI pipeline run tests as required diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 8959a335..bce21ecf 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -119,7 +119,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install --force-reinstall git+https://github.com/nf-core/tools.git@dev + pip install nf-core - name: Run nf-core lint env: diff --git a/.nf-core.yml b/.nf-core.yml index e37041b3..29578b29 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,13 +2,6 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - assets/multiqc_config.yaml - - .github/workflows/linting.yml - lib/NfcoreTemplate.groovy - lib/NfcoreSchema.groovy - assets/sendmail_template.txt - - assets/nf-core-raredisease_logo_light.png - - docs/images/nf-core-raredisease_logo_light.png - files_exist: - - docs/images/nf-core-raredisease_logo_dark.png - - assets/nf-core-raredisease_logo.png - - docs/images/nf-core-raredisease_logo.png From 573df3378e31e70cf3b0db294bc8a73c92d8f1e4 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Dec 2021 16:24:17 +0100 Subject: [PATCH 0171/1169] manta subworkflow --- conf/modules.config | 8 ++++ .../modules => local}/manta/germline/main.nf | 11 ++---- .../modules => local}/manta/germline/meta.yml | 11 ------ subworkflows/local/call_sv_manta.nf | 39 +++++++++++++++++++ subworkflows/local/prepare_genome.nf | 4 +- workflows/raredisease.nf | 10 +++++ 6 files changed, 64 insertions(+), 19 deletions(-) rename modules/{nf-core/modules => local}/manta/germline/main.nf (89%) rename modules/{nf-core/modules => local}/manta/germline/meta.yml (88%) create mode 100644 subworkflows/local/call_sv_manta.nf diff --git a/conf/modules.config b/conf/modules.config index 45a68577..d0fda88d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -128,6 +128,14 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + // CALL_SV_MANTA + withName: MANTA { + publishDir = [ + path: { "${params.outdir}/manta" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } // NF-CORE Subworkflows // ALIGN_BWAMEM2 withName: BWAMEM2_MEM { diff --git a/modules/nf-core/modules/manta/germline/main.nf b/modules/local/manta/germline/main.nf similarity index 89% rename from modules/nf-core/modules/manta/germline/main.nf rename to modules/local/manta/germline/main.nf index 2a8c0acc..e40a87df 100644 --- a/modules/nf-core/modules/manta/germline/main.nf +++ b/modules/local/manta/germline/main.nf @@ -8,11 +8,10 @@ process MANTA_GERMLINE { 'quay.io/biocontainers/manta:1.6.0--h9ee0642_1' }" input: - tuple val(meta), path(input), path(input_index) + tuple val(meta), path(bams) + path bam_index path fasta - path fai - path target_bed - path target_bed_tbi + path fasta_fai output: tuple val(meta), path("*candidate_small_indels.vcf.gz") , emit: candidate_small_indels_vcf @@ -26,12 +25,10 @@ process MANTA_GERMLINE { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def options_manta = target_bed ? "--exome --callRegions $target_bed" : "" """ configManta.py \ - --bam $input \ + --bam ${bams.join(' --bam ')} \ --reference $fasta \ - $options_manta \ --runDir manta python manta/runWorkflow.py -m local -j $task.cpus diff --git a/modules/nf-core/modules/manta/germline/meta.yml b/modules/local/manta/germline/meta.yml similarity index 88% rename from modules/nf-core/modules/manta/germline/meta.yml rename to modules/local/manta/germline/meta.yml index 3bdb8264..7f8d0f66 100644 --- a/modules/nf-core/modules/manta/germline/meta.yml +++ b/modules/local/manta/germline/meta.yml @@ -39,14 +39,6 @@ input: type: file description: Genome reference FASTA index file pattern: "*.{fa.fai,fasta.fai}" - - target_bed: - type: file - description: BED file containing target regions for variant calling - pattern: "*.{bed}" - - target_bed_tbi: - type: file - description: Index for BED file containing target regions for variant calling - pattern: "*.{bed.tbi}" output: - meta: @@ -82,6 +74,3 @@ output: type: file description: File containing software versions pattern: "versions.yml" - -authors: - - "@maxulysse" diff --git a/subworkflows/local/call_sv_manta.nf b/subworkflows/local/call_sv_manta.nf new file mode 100644 index 00000000..9cba6660 --- /dev/null +++ b/subworkflows/local/call_sv_manta.nf @@ -0,0 +1,39 @@ +// +// A structural variant caller workflow for manta +// + +include { MANTA_GERMLINE as MANTA } from '../../modules/local/manta/germline/main' + +workflow CALL_SV_MANTA { + take: + bam // channel: [ val(meta), path(bam) ] + bai // channel: [ val(meta), path(bai) ] + fasta // path(fasta) + fai // path(fai) + ch_case_info // channel: [ case_id ] + + main: + ch_versions = Channel.empty() + + bam.collect{it[1]} + .toList() + .set { bam_file_list } + + bai.collect{it[1]} + .set { bai_file_list } + + ch_case_info.combine(bam_file_list) + .set { manta_input_bams } + + MANTA ( manta_input_bams, bai_file_list, fasta, fai ) + ch_versions = ch_versions.mix(MANTA.out.versions) + + emit: + candidate_small_indels_vcf = MANTA.out.candidate_small_indels_vcf + candidate_small_indels_vcf_tbi = MANTA.out.candidate_small_indels_vcf_tbi + candidate_sv_vcf = MANTA.out.candidate_sv_vcf + candidate_sv_vcf_tbi = MANTA.out.candidate_sv_vcf_tbi + diploid_sv_vcf = MANTA.out.diploid_sv_vcf + diploid_sv_vcf_tbi = MANTA.out.diploid_sv_vcf_tbi + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 0b6f4138..a4b88c54 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -26,7 +26,9 @@ workflow PREPARE_GENOME { if ( params.fasta_fai ) { ch_fai = file(params.fasta_fai) } else { - ch_fai = SAMTOOLS_FAIDX ( [[], ch_fasta] ).fai // TODO: faidx now requires meta info for fasta due to pipelines with multi references e.g. de novo + ch_fai = SAMTOOLS_FAIDX ( [[], ch_fasta] ) + .fai + .collect{it[1]} // TODO: faidx now requires meta info for fasta due to pipelines with multi references e.g. de novo ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index db8741c8..5b4ca877 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -70,6 +70,7 @@ include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/local/call_repeat_expan // include { CALL_SNV_DEEPVARIANT } from '../subworkflows/local/call_snv_deepvariant' +include { CALL_SV_MANTA } from '../subworkflows/local/call_sv_manta' /* ======================================================================================== @@ -146,6 +147,15 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) + CALL_SV_MANTA ( + ch_marked_bam, + ch_marked_bai, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.fai, + INPUT_CHECK.out.ch_case_info + ) + ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) + // // MODULE: Pipeline reporting // From 13835bc1cecfb637613a0d6cd46aa55b63d6bacf Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 16 Dec 2021 09:34:05 +0100 Subject: [PATCH 0172/1169] should be fifinal --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- assets/nf-core-raredisease_logo_light.png | Bin 27416 -> 12342 bytes docs/images/nf-core-raredisease_logo_dark.png | Bin 0 -> 75872 bytes .../images/nf-core-raredisease_logo_light.png | Bin 65627 -> 75763 bytes 4 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/images/nf-core-raredisease_logo_dark.png diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4c482b24..2ca71ec3 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -36,7 +36,7 @@ body: attributes: label: Relevant files description: | - Please upload (drag and drop) and relevant files. Make into a `.zip` file if the extension is not allowed. + Please drag and drop the relevant files here. Create a `.zip` archive if the extension is not allowed. Your verbose log file `.nextflow.log` is often useful _(this is a hidden file in the directory where you launched the pipeline)_ as well as custom Nextflow configuration files. - type: textarea diff --git a/assets/nf-core-raredisease_logo_light.png b/assets/nf-core-raredisease_logo_light.png index 0605a7520f7e6ce5d66d3554b9ff94e463bd8492..0b66df05f45385dd4da8e4b17bf78e71a001f259 100644 GIT binary patch literal 12342 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
cn7;K0 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 L(>>Y0+MoMhsb=rF literal 0 HcmV?d00001 diff --git a/docs/images/nf-core-raredisease_logo_light.png b/docs/images/nf-core-raredisease_logo_light.png index 9bbc68dcf9f99bb96ba2605f28d4ef1fae38d9a1..3e1c6ec69ad091015a8df756efd4bfee1d337628 100644 GIT binary patch literal 75763 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

jx_Ry)!8|d-JebNGaGDW1#(O_I4hx;bM}V(| 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%0DMRcN%I3ej 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
Ny@#;ub(G0pgS20!Drf=pqZi>HaJYFB*OTOOgj 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

n<> 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 Date: Thu, 16 Dec 2021 09:38:53 +0100 Subject: [PATCH 0173/1169] forgot to add the lint yml --- .github/workflows/linting.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index bce21ecf..3b448773 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: - node-version: "10" + node-version: '10' - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint @@ -53,7 +53,7 @@ jobs: - uses: actions/setup-node@v1 with: - node-version: "10" + node-version: '10' - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -67,7 +67,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: - node-version: "10" + node-version: '10' - name: Install yaml-lint run: npm install -g yaml-lint - name: Run yaml-lint @@ -101,6 +101,7 @@ jobs: nf-core: runs-on: ubuntu-latest steps: + - name: Check out pipeline code uses: actions/checkout@v2 @@ -113,8 +114,8 @@ jobs: - uses: actions/setup-python@v1 with: - python-version: "3.6" - architecture: "x64" + python-version: '3.6' + architecture: 'x64' - name: Install dependencies run: | @@ -141,3 +142,4 @@ jobs: lint_log.txt lint_results.md PR_number.txt + From 86374440dbb329a869ef3ec5d6546bbd32f42b37 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 16 Dec 2021 11:03:05 +0100 Subject: [PATCH 0174/1169] applying suggestions --- .nf-core.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 29578b29..9ae9fadb 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,6 +2,3 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - assets/multiqc_config.yaml - - lib/NfcoreTemplate.groovy - - lib/NfcoreSchema.groovy - - assets/sendmail_template.txt From f64c3e419a9ba1a4d60424b2c21c3caea8f3d0e2 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 16 Dec 2021 11:08:23 +0100 Subject: [PATCH 0175/1169] copied failed files from template branch --- lib/NfcoreSchema.groovy | 4 ++-- lib/NfcoreTemplate.groovy | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 5f681078..40ab65f2 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -206,7 +206,7 @@ class NfcoreSchema { } def type = '[' + group_params.get(param).type + ']' def description = group_params.get(param).description - def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' def description_default = description + colors.dim + defaultValue + colors.reset // Wrap long description texts // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap @@ -362,7 +362,7 @@ class NfcoreSchema { } } for (ex in causingExceptions) { - printExceptions(ex, params_json, log) + printExceptions(ex, params_json, log, enums) } } diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 06499409..2fc0a9b9 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -24,7 +24,7 @@ class NfcoreTemplate { public static void checkConfigProvided(workflow, log) { if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + - "This will be dependent on your local compute enviroment but can be acheived via one or more of the following:\n" + + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + From 126e3fb510aa6e5a96ad9e3a6df81b8b020726e7 Mon Sep 17 00:00:00 2001 From: Mei Wu Date: Thu, 16 Dec 2021 12:12:28 +0100 Subject: [PATCH 0176/1169] removing trailing space --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 2e7ae4a5..24d1c0b1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -147,7 +147,7 @@ if (params.analysis_type == 'WES') { } // Export these variables to prevent local Python/R libraries from conflicting with those in the container -// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. env { From 8a4d852b710316404031acf724005bd8307ca1a3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Dec 2021 13:30:29 +0100 Subject: [PATCH 0177/1169] check and create tbi index for bed files --- conf/genomes.config | 2 + conf/modules.config | 4 +- main.nf | 1 + modules.json | 3 ++ modules/nf-core/modules/tabix/bgzip/main.nf | 28 ++++++++++++ modules/nf-core/modules/tabix/bgzip/meta.yml | 41 +++++++++++++++++ .../nf-core/modules/tabix/bgziptabix/main.nf | 30 +++++++++++++ .../nf-core/modules/tabix/bgziptabix/meta.yml | 45 +++++++++++++++++++ nextflow_schema.json | 6 +++ subworkflows/local/prepare_bed.nf | 29 ++++++++++++ workflows/raredisease.nf | 7 +++ 11 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 modules/nf-core/modules/tabix/bgzip/main.nf create mode 100644 modules/nf-core/modules/tabix/bgzip/meta.yml create mode 100644 modules/nf-core/modules/tabix/bgziptabix/main.nf create mode 100644 modules/nf-core/modules/tabix/bgziptabix/meta.yml create mode 100644 subworkflows/local/prepare_bed.nf diff --git a/conf/genomes.config b/conf/genomes.config index f99de8be..fc8c4aa6 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -16,6 +16,7 @@ params { bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" + target_bed = "" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" @@ -23,6 +24,7 @@ params { bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" + target_bed = "${params.local_genomes}/twistexomerefseq_9.1_hg19_design.bed.gz" } } } diff --git a/conf/modules.config b/conf/modules.config index 45a68577..aad67837 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -53,7 +53,7 @@ process { pattern: "*fai" ] } - // PREPARE_VCF + // PREPARE_VCF && PREPARE_BED withName: CHECK_INPUT_VCF { publishDir = [ enabled: false, @@ -75,7 +75,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: TABIX_PV { + withName: 'TABIX_PV|TABIX_PB' { publishDir = [ path: { "${params.outdir}/vcf_check" }, mode: 'copy', diff --git a/main.nf b/main.nf index dcbc2046..d9ff2c5e 100644 --- a/main.nf +++ b/main.nf @@ -21,6 +21,7 @@ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') +params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') /* diff --git a/modules.json b/modules.json index 1cb4dd18..bb9c5cfc 100644 --- a/modules.json +++ b/modules.json @@ -51,6 +51,9 @@ "samtools/stats": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, + "tabix/bgzip": { + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + }, "tabix/tabix": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } diff --git a/modules/nf-core/modules/tabix/bgzip/main.nf b/modules/nf-core/modules/tabix/bgzip/main.nf new file mode 100644 index 00000000..ed9362b2 --- /dev/null +++ b/modules/nf-core/modules/tabix/bgzip/main.nf @@ -0,0 +1,28 @@ +process TABIX_BGZIP { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : + 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" + + input: + tuple val(meta), path(input) + + output: + tuple val(meta), path("*.gz"), emit: gz + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + bgzip -c $args $input > ${prefix}.${input.getExtension()}.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/tabix/bgzip/meta.yml b/modules/nf-core/modules/tabix/bgzip/meta.yml new file mode 100644 index 00000000..f8318c7c --- /dev/null +++ b/modules/nf-core/modules/tabix/bgzip/meta.yml @@ -0,0 +1,41 @@ +name: tabix_bgzip +description: Compresses files +keywords: + - compress + - bgzip + - tabix +tools: + - bgzip: + description: | + Bgzip compresses files in a similar manner to, and compatible with, gzip. + homepage: https://www.htslib.org/doc/tabix.html + documentation: http://www.htslib.org/doc/bgzip.html + doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - file: + type: file + description: text file +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - file: + type: file + description: Output compressed file + pattern: "*.{gz}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" + - "@maxulysse" diff --git a/modules/nf-core/modules/tabix/bgziptabix/main.nf b/modules/nf-core/modules/tabix/bgziptabix/main.nf new file mode 100644 index 00000000..20b47a9f --- /dev/null +++ b/modules/nf-core/modules/tabix/bgziptabix/main.nf @@ -0,0 +1,30 @@ +process TABIX_BGZIPTABIX { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : + 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" + + input: + tuple val(meta), path(input) + + output: + tuple val(meta), path("*.gz"), path("*.tbi"), emit: tbi + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + bgzip -c $args $input > ${prefix}.gz + tabix $args2 ${prefix}.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/tabix/bgziptabix/meta.yml b/modules/nf-core/modules/tabix/bgziptabix/meta.yml new file mode 100644 index 00000000..f2aed84d --- /dev/null +++ b/modules/nf-core/modules/tabix/bgziptabix/meta.yml @@ -0,0 +1,45 @@ +name: tabix_bgziptabix +description: bgzip a sorted tab-delimited genome file and then create tabix index +keywords: + - bgzip + - compress + - index + - tabix + - vcf +tools: + - tabix: + description: Generic indexer for TAB-delimited genome position files. + homepage: https://www.htslib.org/doc/tabix.html + documentation: https://www.htslib.org/doc/tabix.1.html + doi: 10.1093/bioinformatics/btq671 + licence: ['MIT'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - tab: + type: file + description: TAB-delimited genome position file + pattern: "*.{bed,gff,sam,vcf}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - gz: + type: file + description: Output compressed file + pattern: "*.{gz}" + - tbi: + type: file + description: tabix index file + pattern: "*.{gz.tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@maxulysse" diff --git a/nextflow_schema.json b/nextflow_schema.json index 94f875cc..d3695fe2 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -101,6 +101,12 @@ "fa_icon": "fas fa-bezier-curve", "description": "Path to directory for gnomad vcf." }, + "target_bed": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-bezier-curve", + "description": "Path to directory for target bed file." + }, "variant_catalog": { "type": "string", "format": "file-path", diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf new file mode 100644 index 00000000..51540db6 --- /dev/null +++ b/subworkflows/local/prepare_bed.nf @@ -0,0 +1,29 @@ +// +// Prepare reference bed files +// + +include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/modules/tabix/tabix/main' +include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/modules/tabix/bgziptabix/main' + +workflow CHECK_BED { + take: + bed // file: bed file + + main: + tab_out = Channel.empty() + if (bed) { + bed_file = file(bed) + id = bed.split('/')[-1] + ch_bed = Channel.fromList([[['id':id], bed_file]]) + + if ( bed.endsWith(".gz") && file(bed, checkIfExists:true) ) { + tbi_out = TABIX_PT (ch_bed).tbi + tab_out = ch_bed.join(tbi_out) + } else if ( file(bed, checkIfExists:true) ) { + tab_out = TABIX_PBT (ch_bed).tbi + } + } + + emit: + idx = tab_out +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index db8741c8..47de6919 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -40,6 +40,7 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // include { INPUT_CHECK } from '../subworkflows/local/input_check' include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' +include { CHECK_BED } from '../subworkflows/local/prepare_bed' /* ======================================================================================== @@ -109,6 +110,12 @@ workflow RAREDISEASE { ).set { ch_gnomad_out } } + if (params.target_bed) { + CHECK_BED( + params.target_bed + ).set { ch_target_bed_out } + } + // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. if (params.aligner == 'bwamem2') { ALIGN_BWAMEM2 ( From 4a912c48456cc670f9fb7160036654088b647523 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Dec 2021 13:41:51 +0100 Subject: [PATCH 0178/1169] update subworkflow --- modules.json | 4 +- modules/nf-core/modules/tabix/bgzip/main.nf | 28 ------------- modules/nf-core/modules/tabix/bgzip/meta.yml | 41 ------------------- .../nf-core/modules/tabix/bgziptabix/main.nf | 2 +- subworkflows/local/prepare_bed.nf | 2 +- 5 files changed, 4 insertions(+), 73 deletions(-) delete mode 100644 modules/nf-core/modules/tabix/bgzip/main.nf delete mode 100644 modules/nf-core/modules/tabix/bgzip/meta.yml diff --git a/modules.json b/modules.json index bb9c5cfc..e4e9b445 100644 --- a/modules.json +++ b/modules.json @@ -51,8 +51,8 @@ "samtools/stats": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, - "tabix/bgzip": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "tabix/bgziptabix": { + "git_sha": "e22966ce74340cb671576143e5fdbbd71670cffa" }, "tabix/tabix": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" diff --git a/modules/nf-core/modules/tabix/bgzip/main.nf b/modules/nf-core/modules/tabix/bgzip/main.nf deleted file mode 100644 index ed9362b2..00000000 --- a/modules/nf-core/modules/tabix/bgzip/main.nf +++ /dev/null @@ -1,28 +0,0 @@ -process TABIX_BGZIP { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : - 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" - - input: - tuple val(meta), path(input) - - output: - tuple val(meta), path("*.gz"), emit: gz - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - """ - bgzip -c $args $input > ${prefix}.${input.getExtension()}.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/tabix/bgzip/meta.yml b/modules/nf-core/modules/tabix/bgzip/meta.yml deleted file mode 100644 index f8318c7c..00000000 --- a/modules/nf-core/modules/tabix/bgzip/meta.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: tabix_bgzip -description: Compresses files -keywords: - - compress - - bgzip - - tabix -tools: - - bgzip: - description: | - Bgzip compresses files in a similar manner to, and compatible with, gzip. - homepage: https://www.htslib.org/doc/tabix.html - documentation: http://www.htslib.org/doc/bgzip.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - file: - type: file - description: text file -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - file: - type: file - description: Output compressed file - pattern: "*.{gz}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@joseespinosa" - - "@drpatelh" - - "@maxulysse" diff --git a/modules/nf-core/modules/tabix/bgziptabix/main.nf b/modules/nf-core/modules/tabix/bgziptabix/main.nf index 20b47a9f..e419d153 100644 --- a/modules/nf-core/modules/tabix/bgziptabix/main.nf +++ b/modules/nf-core/modules/tabix/bgziptabix/main.nf @@ -11,7 +11,7 @@ process TABIX_BGZIPTABIX { tuple val(meta), path(input) output: - tuple val(meta), path("*.gz"), path("*.tbi"), emit: tbi + tuple val(meta), path("*.gz"), path("*.tbi"), emit: gz_tbi path "versions.yml" , emit: versions script: diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index 51540db6..e855373f 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -20,7 +20,7 @@ workflow CHECK_BED { tbi_out = TABIX_PT (ch_bed).tbi tab_out = ch_bed.join(tbi_out) } else if ( file(bed, checkIfExists:true) ) { - tab_out = TABIX_PBT (ch_bed).tbi + tab_out = TABIX_PBT (ch_bed).gz_tbi } } From f0632b2cff0c02619a29b7fa5247ac8f59887626 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Dec 2021 14:05:34 +0100 Subject: [PATCH 0179/1169] add link --- .github/CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f29a1d9a..6ce415b8 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -108,6 +108,8 @@ Occasionally, you might find yourself wanting to reuse a module with options tha For a working example, please have a look at how we have reused `bcftools norm` in both [subworkflows/local/call_snv_deepvariant.nf](../subworkflows/local/call_snv_deepvariant.nf) and [subworkflows/local/prepare_vcf.nf](../subworkflows/local/prepare_vcf.nf), and defined its subworkflow-specific options in [conf/modules.config](../conf/modules.config). +You can find more information about aliases in the nextflow documentation [here](https://www.nextflow.io/docs/edge/dsl2.html#module-aliases). + ### Nextflow version bumping If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` From 3e216df4ffba79af9fd326c619ffa8e8ae51c6e0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Dec 2021 15:38:14 +0100 Subject: [PATCH 0180/1169] add target bed to module --- modules/local/manta/germline/main.nf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/local/manta/germline/main.nf b/modules/local/manta/germline/main.nf index e40a87df..a4535f57 100644 --- a/modules/local/manta/germline/main.nf +++ b/modules/local/manta/germline/main.nf @@ -12,6 +12,8 @@ process MANTA_GERMLINE { path bam_index path fasta path fasta_fai + tuple val(meta), path(target_bed), path(target_bed_tbi) + output: tuple val(meta), path("*candidate_small_indels.vcf.gz") , emit: candidate_small_indels_vcf @@ -25,10 +27,12 @@ process MANTA_GERMLINE { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def options_manta = target_bed ? "--exome --callRegions $target_bed" : "" """ configManta.py \ --bam ${bams.join(' --bam ')} \ --reference $fasta \ + $options_manta \ --runDir manta python manta/runWorkflow.py -m local -j $task.cpus From 4ed92b6037838e6305fb84a2bd8a68dbe3054215 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Dec 2021 18:17:32 +0100 Subject: [PATCH 0181/1169] Update manta subworkflow to work with bed file --- modules/local/deepvariant/main.nf | 2 +- modules/local/manta/germline/main.nf | 2 +- subworkflows/local/call_sv_manta.nf | 15 +++++++++------ workflows/raredisease.nf | 6 ++++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/modules/local/deepvariant/main.nf b/modules/local/deepvariant/main.nf index 04a2de79..82979984 100644 --- a/modules/local/deepvariant/main.nf +++ b/modules/local/deepvariant/main.nf @@ -10,7 +10,7 @@ process DEEPVARIANT { input: tuple val(meta), path(bam), path(bai) path fasta - tuple val(fai_meta), path(fasta_fai) + path fasta_fai output: tuple val(meta), path("*.vcf.gz"), emit: vcf diff --git a/modules/local/manta/germline/main.nf b/modules/local/manta/germline/main.nf index a4535f57..db221453 100644 --- a/modules/local/manta/germline/main.nf +++ b/modules/local/manta/germline/main.nf @@ -12,7 +12,7 @@ process MANTA_GERMLINE { path bam_index path fasta path fasta_fai - tuple val(meta), path(target_bed), path(target_bed_tbi) + tuple val(bed_meta), path(target_bed), path(target_bed_tbi) output: diff --git a/subworkflows/local/call_sv_manta.nf b/subworkflows/local/call_sv_manta.nf index 9cba6660..f65aada4 100644 --- a/subworkflows/local/call_sv_manta.nf +++ b/subworkflows/local/call_sv_manta.nf @@ -6,11 +6,12 @@ include { MANTA_GERMLINE as MANTA } from '../../modules/local/manta/germline/mai workflow CALL_SV_MANTA { take: - bam // channel: [ val(meta), path(bam) ] - bai // channel: [ val(meta), path(bai) ] - fasta // path(fasta) - fai // path(fai) - ch_case_info // channel: [ case_id ] + bam // channel: [ val(meta), path(bam) ] + bai // channel: [ val(meta), path(bai) ] + fasta // path(fasta) + fai // path(fai) + ch_case_info // channel: [ case_id ] + ch_bed // channel: [ val(meta), path(bed), path(bed_tbi) ] main: ch_versions = Channel.empty() @@ -25,7 +26,9 @@ workflow CALL_SV_MANTA { ch_case_info.combine(bam_file_list) .set { manta_input_bams } - MANTA ( manta_input_bams, bai_file_list, fasta, fai ) + ch_target_bed = ch_bed.ifEmpty([[],[],[]]) + + MANTA ( manta_input_bams, bai_file_list, fasta, fai, ch_target_bed ) ch_versions = ch_versions.mix(MANTA.out.versions) emit: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4676fee5..33473832 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -111,10 +111,11 @@ workflow RAREDISEASE { ).set { ch_gnomad_out } } + ch_bed = Channel.empty() if (params.target_bed) { CHECK_BED( params.target_bed - ).set { ch_target_bed_out } + ).set { ch_target_bed } } // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. @@ -159,7 +160,8 @@ workflow RAREDISEASE { ch_marked_bai, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, - INPUT_CHECK.out.ch_case_info + INPUT_CHECK.out.ch_case_info, + ch_target_bed ) ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) From da7b5be4769171d89feaa0ed01dcd0c5b8118ea5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Dec 2021 18:21:49 +0100 Subject: [PATCH 0182/1169] Fix variable name --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 33473832..ba75eb10 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -161,7 +161,7 @@ workflow RAREDISEASE { PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, INPUT_CHECK.out.ch_case_info, - ch_target_bed + ch_bed ) ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) From 560327f830251633de7b827f43a45ccd07cfc549 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Dec 2021 18:48:39 +0100 Subject: [PATCH 0183/1169] update modules.json --- modules.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules.json b/modules.json index 2d244fd5..e4e9b445 100644 --- a/modules.json +++ b/modules.json @@ -24,9 +24,6 @@ "glnexus": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, - "manta/germline": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" - }, "multiqc": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, From 789224f27abf250c2d6d5b2d980abf7fbca587d3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:52:32 +0100 Subject: [PATCH 0184/1169] fix modules_config --- conf/modules.config | 2 +- subworkflows/local/prepare_genome.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 69fa8fcb..3afa801b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -68,7 +68,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'TABIX_PV|TABIX_PB' { + withName: 'TABIX_PV|TABIX_PT|TABIX_PBT' { publishDir = [ path: { "${params.outdir}/vcf_check" }, mode: 'copy', diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index a4b88c54..7310a41e 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -28,7 +28,7 @@ workflow PREPARE_GENOME { } else { ch_fai = SAMTOOLS_FAIDX ( [[], ch_fasta] ) .fai - .collect{it[1]} // TODO: faidx now requires meta info for fasta due to pipelines with multi references e.g. de novo + .collect{it[1]} ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) } From 09aefc00ae9a4839595e808010ecb8ed71ddd2c7 Mon Sep 17 00:00:00 2001 From: Annick Renevey <47788523+rannick@users.noreply.github.com> Date: Mon, 20 Dec 2021 13:25:05 +0100 Subject: [PATCH 0185/1169] Use stubs when present to run tests --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97c32da7..ef641d7a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,4 +47,4 @@ jobs: # For example: adding multiple test runs with different parameters # Remember that you can parallelise this by using strategy.matrix run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker + nextflow run ${GITHUB_WORKSPACE} -profile test,docker -stub From ca82c61edf01d3ba4524c89bab7a96ce0c0c88ac Mon Sep 17 00:00:00 2001 From: Annick Renevey <47788523+rannick@users.noreply.github.com> Date: Mon, 20 Dec 2021 13:33:36 +0100 Subject: [PATCH 0186/1169] Modify pull request template to use -stub as test command --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 94c01b6c..6d0e73dd 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -19,7 +19,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker -stub`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. From a8330c4a76d455aaa9f60ce259e9438017873420 Mon Sep 17 00:00:00 2001 From: Annick Renevey <47788523+rannick@users.noreply.github.com> Date: Mon, 20 Dec 2021 14:45:59 +0100 Subject: [PATCH 0187/1169] PULL_REQUEST_TEMPLATE.md in file unchanged --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index b49bcbf1..99e8d5c3 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,4 +2,5 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - .github/ISSUE_TEMPLATE/bug_report.yml + - .github/PULL_REQUEST_TEMPLATE.md - assets/multiqc_config.yaml From 0ccdfedb503eac42c6c4a46b4a6a10c13e266b29 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Dec 2021 18:11:26 +0100 Subject: [PATCH 0188/1169] review suggestions --- modules/local/manta/germline/main.nf | 6 +++--- modules/local/manta/germline/meta.yml | 4 ++-- subworkflows/local/call_sv_manta.nf | 4 +--- workflows/raredisease.nf | 4 ++-- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/modules/local/manta/germline/main.nf b/modules/local/manta/germline/main.nf index db221453..87512e08 100644 --- a/modules/local/manta/germline/main.nf +++ b/modules/local/manta/germline/main.nf @@ -8,8 +8,8 @@ process MANTA_GERMLINE { 'quay.io/biocontainers/manta:1.6.0--h9ee0642_1' }" input: - tuple val(meta), path(bams) - path bam_index + tuple val(meta), path(inputs) + path indices path fasta path fasta_fai tuple val(bed_meta), path(target_bed), path(target_bed_tbi) @@ -30,7 +30,7 @@ process MANTA_GERMLINE { def options_manta = target_bed ? "--exome --callRegions $target_bed" : "" """ configManta.py \ - --bam ${bams.join(' --bam ')} \ + --bam ${inputs.join(' --bam ')} \ --reference $fasta \ $options_manta \ --runDir manta diff --git a/modules/local/manta/germline/meta.yml b/modules/local/manta/germline/meta.yml index 7f8d0f66..60d46201 100644 --- a/modules/local/manta/germline/meta.yml +++ b/modules/local/manta/germline/meta.yml @@ -21,8 +21,8 @@ input: - meta: type: map description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing case information + e.g. [ id:'case_id' ] - input: type: file description: BAM/CRAM/SAM file diff --git a/subworkflows/local/call_sv_manta.nf b/subworkflows/local/call_sv_manta.nf index f65aada4..29f595d1 100644 --- a/subworkflows/local/call_sv_manta.nf +++ b/subworkflows/local/call_sv_manta.nf @@ -14,8 +14,6 @@ workflow CALL_SV_MANTA { ch_bed // channel: [ val(meta), path(bed), path(bed_tbi) ] main: - ch_versions = Channel.empty() - bam.collect{it[1]} .toList() .set { bam_file_list } @@ -29,7 +27,7 @@ workflow CALL_SV_MANTA { ch_target_bed = ch_bed.ifEmpty([[],[],[]]) MANTA ( manta_input_bams, bai_file_list, fasta, fai, ch_target_bed ) - ch_versions = ch_versions.mix(MANTA.out.versions) + ch_versions = MANTA.out.versions emit: candidate_small_indels_vcf = MANTA.out.candidate_small_indels_vcf diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index ba75eb10..eaebd23a 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -111,7 +111,7 @@ workflow RAREDISEASE { ).set { ch_gnomad_out } } - ch_bed = Channel.empty() + ch_target_bed = Channel.empty() if (params.target_bed) { CHECK_BED( params.target_bed @@ -161,7 +161,7 @@ workflow RAREDISEASE { PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, INPUT_CHECK.out.ch_case_info, - ch_bed + ch_target_bed ) ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) From a47f069cf629a06ecf4adb5aa502f82ae0bcbaaf Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Dec 2021 22:32:01 +0100 Subject: [PATCH 0189/1169] add analysis type if block --- conf/test.config | 3 +++ subworkflows/local/call_sv_manta.nf | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/conf/test.config b/conf/test.config index 13545420..2eb27673 100644 --- a/conf/test.config +++ b/conf/test.config @@ -30,4 +30,7 @@ params { // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' + + target_bed = "${params.local_genomes}/twistexomerefseq_9.1_hg19_chr20.design.bed" + } diff --git a/subworkflows/local/call_sv_manta.nf b/subworkflows/local/call_sv_manta.nf index 29f595d1..86de5daf 100644 --- a/subworkflows/local/call_sv_manta.nf +++ b/subworkflows/local/call_sv_manta.nf @@ -24,9 +24,12 @@ workflow CALL_SV_MANTA { ch_case_info.combine(bam_file_list) .set { manta_input_bams } - ch_target_bed = ch_bed.ifEmpty([[],[],[]]) - - MANTA ( manta_input_bams, bai_file_list, fasta, fai, ch_target_bed ) + if (params.analysis_type == "WGS") { + MANTA ( manta_input_bams, bai_file_list, fasta, fai, [[],[],[]] ) + } else { + ch_target_bed = ch_bed.ifEmpty([[],[],[]]) + MANTA ( manta_input_bams, bai_file_list, fasta, fai, ch_target_bed ) + } ch_versions = MANTA.out.versions emit: From f1f9afe633f0501c6a0c7fa3a39c1ea0050b4a3e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Dec 2021 22:33:07 +0100 Subject: [PATCH 0190/1169] update test config --- conf/test.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index 2eb27673..12b3c1f9 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,6 +31,4 @@ params { // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' - target_bed = "${params.local_genomes}/twistexomerefseq_9.1_hg19_chr20.design.bed" - } From 1acf71709e7fde474e9558e098f26157d84578d2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 21 Dec 2021 16:12:26 +0100 Subject: [PATCH 0191/1169] update comment --- workflows/raredisease.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index eaebd23a..e5581ac7 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -155,6 +155,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) + // TODO: Move this to a SV calling workflow CALL_SV_MANTA ( ch_marked_bam, ch_marked_bai, From 8d8fb4a5a6d23185ec64a42a5c82ee141fd5463f Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 3 Jan 2022 17:35:21 +0100 Subject: [PATCH 0192/1169] first edits --- subworkflows/nf-core/call_structural_variants.nf | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index 96729b66..c88109bb 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -3,19 +3,14 @@ // // CHANGE: swap this example line for the real subworkflow -params.bwamem2_idx_options = [:] - -// CHANGE: swap this example line for the real subworkflow -include { PREPARE_GENOME } from './prepare_genome' addParams( - options: params.bwamem2_idx_options -) +include { CALL_SV_MANTA } from '../local/call_sv_manta' workflow CALL_STRUCTURAL_VARIANTS { take: bam // channel: [ val(meta), path(bam) ] fasta // channel: [ path(genome.fasta) ] - fai // channel: [ path(genome.fai) ] + fai // channel: [ path(genome.fai) ] main: ch_versions = Channel.empty() From 63239e1f51814cbbfd8862ce9e5d7dc87c519599 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 10 Jan 2022 11:52:55 +0100 Subject: [PATCH 0193/1169] awaiting chrom_sizes process --- subworkflows/nf-core/qc_bam.nf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index edcb910a..2fc72189 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -4,7 +4,9 @@ include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' + include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' +include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' workflow QC_BAM { @@ -27,6 +29,8 @@ workflow QC_BAM { // TIDDIT COVERAGE TIDDIT_COV ( bam, [] ) // 2nd pos. arg is req. only for cram input + UCSC_WIGTOBIGWIG ( TIDDIT_COV.out.wig ) + ch_wig = TIDDIT_COV.out.wig ch_versions = ch_versions.mix(TIDDIT_COV.out.versions) From d03d2262f7793bde713b05c52be6a89ad5b9cc5c Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 10 Jan 2022 13:51:24 +0100 Subject: [PATCH 0194/1169] we can emit chrom sizes --- conf/modules.config | 5 +++++ modules/local/get_chrom_sizes.nf | 24 ++++++++++++++++++++++++ subworkflows/local/prepare_genome.nf | 8 +++++++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 modules/local/get_chrom_sizes.nf diff --git a/conf/modules.config b/conf/modules.config index 3afa801b..bb84d936 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -46,6 +46,11 @@ process { pattern: "*fai" ] } + withName: GET_CHROM_SIZES { + publishDir = [ + enabled: false, + ] + } // PREPARE_VCF && PREPARE_BED withName: CHECK_INPUT_VCF { publishDir = [ diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf new file mode 100644 index 00000000..b7f4c3fc --- /dev/null +++ b/modules/local/get_chrom_sizes.nf @@ -0,0 +1,24 @@ +process GET_CHROM_SIZES { + tag "$fai" + + conda (params.enable_conda ? "conda-forge::coreutils=8.31" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gnu-wget:1.18--0' : + 'quay.io/biocontainers/gnu-wget:1.18--0' }" + + input: + path fai + + output: + path '*.sizes' , emit: sizes + path "versions.yml", emit: versions + + script: + """ + cut -f 1,2 $fai > ${fai}.sizes + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cut: \$(echo \$(cut --help 2>&1 | head -n 1 | cut -f1,2 -d' ')) + END_VERSIONS + """ +} \ No newline at end of file diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 7310a41e..8985678d 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -5,12 +5,14 @@ include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' +include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' + workflow PREPARE_GENOME { take: fasta // path: genome.fasta main: - ch_fasta = file(fasta) + ch_fasta = file(fasta) ch_versions = Channel.empty() // Fetch BWAMEM2 index or create from scratch if required @@ -32,11 +34,15 @@ workflow PREPARE_GENOME { ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) } + ch_chrom_sizes = GET_CHROM_SIZES ( ch_fai ).sizes + ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) + emit: fasta = ch_fasta // path: genome.fasta fai = ch_fai // path: genome.fasta.fai bwamem2_index = ch_bwamem2_index // path: bwamem2/index + chrom_sizes = ch_chrom_sizes // path: chrom.sizes versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From f8fddb8c2a3cf56adf85c1781a120a2f86f62a4c Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 10 Jan 2022 14:01:12 +0100 Subject: [PATCH 0195/1169] attmpt 1: fix lint fail --- modules/local/get_chrom_sizes.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index b7f4c3fc..44824b89 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -21,4 +21,4 @@ process GET_CHROM_SIZES { cut: \$(echo \$(cut --help 2>&1 | head -n 1 | cut -f1,2 -d' ')) END_VERSIONS """ -} \ No newline at end of file +} From adfb3d94d32604c79b35f28fe322d6d8a0a0f33b Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 10 Jan 2022 14:20:04 +0100 Subject: [PATCH 0196/1169] applying suggestions Co-authored-by: Anders Jemt --- modules/local/get_chrom_sizes.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index 44824b89..b4aff702 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -16,6 +16,7 @@ process GET_CHROM_SIZES { script: """ cut -f 1,2 $fai > ${fai}.sizes + cat <<-END_VERSIONS > versions.yml "${task.process}": cut: \$(echo \$(cut --help 2>&1 | head -n 1 | cut -f1,2 -d' ')) From 9b17b2a675c1c2c9f57f2aa7bfbce06d96fbd622 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 10 Jan 2022 14:21:47 +0100 Subject: [PATCH 0197/1169] attmpt2: fix lint fails --- modules/local/get_chrom_sizes.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index b4aff702..d87b3e39 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -16,7 +16,7 @@ process GET_CHROM_SIZES { script: """ cut -f 1,2 $fai > ${fai}.sizes - + cat <<-END_VERSIONS > versions.yml "${task.process}": cut: \$(echo \$(cut --help 2>&1 | head -n 1 | cut -f1,2 -d' ')) From e50431ab786856e0bb83c94730964b7a86a3cd1a Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Mon, 10 Jan 2022 15:41:09 +0100 Subject: [PATCH 0198/1169] Add default variant catalog --- subworkflows/local/call_repeat_expansions.nf | 2 +- subworkflows/local/prepare_genome.nf | 12 ++++++++++++ workflows/raredisease.nf | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 5530e447..936340f5 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -13,7 +13,7 @@ workflow CALL_REPEAT_EXPANSIONS { main: ch_versions = Channel.empty() - EXPANSIONHUNTER( bam, fasta, file(variant_catalog) ) + EXPANSIONHUNTER( bam, fasta, variant_catalog ) ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) emit: diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 7310a41e..2204c3f0 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -8,6 +8,7 @@ include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/ma workflow PREPARE_GENOME { take: fasta // path: genome.fasta + variant_catalog // path: variant_catalog.json main: ch_fasta = file(fasta) @@ -32,11 +33,22 @@ workflow PREPARE_GENOME { ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) } + if ( params.variant_catalog && file(params.variant_catalog, checkIfExists:true) ) { + ch_variant_catalog = file(params.variant_catalog) + } else { + if ( params.genome == 'GRCh38' ) { + ch_variant_catalog = file("https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/reference/variant_catalog_grch38.json") + } else { + ch_variant_catalog = file("https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/reference/variant_catalog_grch37.json") + } + } + emit: fasta = ch_fasta // path: genome.fasta fai = ch_fai // path: genome.fasta.fai bwamem2_index = ch_bwamem2_index // path: bwamem2/index + variant_catalog = ch_variant_catalog // path: variant_catalog.json versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e5581ac7..816fc5c9 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -101,7 +101,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(FASTQC.out.versions.first()) // STEP 0: PREPARE GENOME REFERENCES AND INDICES. - PREPARE_GENOME ( params.fasta ) + PREPARE_GENOME ( params.fasta, params.variant_catalog ) ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) if (params.gnomad) { @@ -141,7 +141,7 @@ workflow RAREDISEASE { CALL_REPEAT_EXPANSIONS ( ch_marked_bam.join(ch_marked_bai, by: [0]), PREPARE_GENOME.out.fasta, - params.variant_catalog + PREPARE_GENOME.out.variant_catalog ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) From dac7f3ec1dde1bd3569a47f172179fbe2400db11 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 10 Jan 2022 16:20:15 +0100 Subject: [PATCH 0199/1169] made ucsc/wig2bw into local for now --- conf/modules.config | 7 ++++ modules.json | 3 -- modules/local/ucsc/wigtobigwig/main.nf | 35 ++++++++++++++++++ .../ucsc/wigtobigwig/meta.yml | 0 .../modules/ucsc/wigtobigwig/main.nf | 0 nf-core/modules/ucsc/wigtobigwig/meta.yml | 37 +++++++++++++++++++ .../{nf-core => local}/prepare_genome.nf | 0 subworkflows/{nf-core => local}/qc_bam.nf | 12 +++--- workflows/raredisease.nf | 12 +++--- 9 files changed, 93 insertions(+), 13 deletions(-) create mode 100644 modules/local/ucsc/wigtobigwig/main.nf rename modules/{nf-core/modules => local}/ucsc/wigtobigwig/meta.yml (100%) rename {modules/nf-core => nf-core}/modules/ucsc/wigtobigwig/main.nf (100%) create mode 100644 nf-core/modules/ucsc/wigtobigwig/meta.yml rename subworkflows/{nf-core => local}/prepare_genome.nf (100%) rename subworkflows/{nf-core => local}/qc_bam.nf (72%) diff --git a/conf/modules.config b/conf/modules.config index 56d20434..15b89cef 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -204,6 +204,13 @@ process { mode: 'copy' ] } + withName: .*QC_BAM:UCSC_WIGTOBIGWIG { + ext.args = '-clip' + publishDir = [ + path: { "${params.outdir}/tiddit_coverage" }, + mode: 'copy' + ] + } // nf-core modules withName: FASTQC { ext.args = '--quiet' diff --git a/modules.json b/modules.json index ae1ae6cc..c2a7e55c 100644 --- a/modules.json +++ b/modules.json @@ -59,9 +59,6 @@ }, "tiddit/cov": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" - }, - "ucsc/wigtobigwig": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } diff --git a/modules/local/ucsc/wigtobigwig/main.nf b/modules/local/ucsc/wigtobigwig/main.nf new file mode 100644 index 00000000..f37d4a3d --- /dev/null +++ b/modules/local/ucsc/wigtobigwig/main.nf @@ -0,0 +1,35 @@ +def VERSION = '377' // Version information not provided by tool on CLI + +process UCSC_WIGTOBIGWIG { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::ucsc-wigtobigwig=377" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ucsc-wigtobigwig:377--h0b8a92a_2' : + 'quay.io/biocontainers/ucsc-wigtobigwig:377--h0b8a92a_2' }" + + input: + tuple val(meta), path(wig) + path sizes + + output: + tuple val(meta), path("*.bw") , emit: bw + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + wigToBigWig \\ + $args \\ + $wig \\ + $sizes \\ + ${prefix}.bw + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ucsc: $VERSION + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml b/modules/local/ucsc/wigtobigwig/meta.yml similarity index 100% rename from modules/nf-core/modules/ucsc/wigtobigwig/meta.yml rename to modules/local/ucsc/wigtobigwig/meta.yml diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf b/nf-core/modules/ucsc/wigtobigwig/main.nf similarity index 100% rename from modules/nf-core/modules/ucsc/wigtobigwig/main.nf rename to nf-core/modules/ucsc/wigtobigwig/main.nf diff --git a/nf-core/modules/ucsc/wigtobigwig/meta.yml b/nf-core/modules/ucsc/wigtobigwig/meta.yml new file mode 100644 index 00000000..4723ff2b --- /dev/null +++ b/nf-core/modules/ucsc/wigtobigwig/meta.yml @@ -0,0 +1,37 @@ +name: ucsc_wigtobigwig +description: Convert ascii format wig file to binary big wig format +keywords: + - wig + - bigwig +tools: + - ucsc: + description: | + Convert ascii format wig file (in fixedStep, variableStep + or bedGraph format) to binary big wig format + homepage: None + documentation: None + tool_dev_url: None + doi: "" + licence: ['varies; see http://genome.ucsc.edu/license'] + +input: + - wig: + type: file + description: wig file + pattern: "*.{wig}" + - chromsizes: + type: file + description: chromosome sizes file + +output: + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - bw: + type: file + description: bigwig file + pattern: "*.{bw}" + +authors: + - "@jianhong" diff --git a/subworkflows/nf-core/prepare_genome.nf b/subworkflows/local/prepare_genome.nf similarity index 100% rename from subworkflows/nf-core/prepare_genome.nf rename to subworkflows/local/prepare_genome.nf diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/local/qc_bam.nf similarity index 72% rename from subworkflows/nf-core/qc_bam.nf rename to subworkflows/local/qc_bam.nf index 2fc72189..d71807a7 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -6,13 +6,14 @@ include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/pi include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' -include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' +include { UCSC_WIGTOBIGWIG } from '../../modules/local/ucsc/wigtobigwig/main' workflow QC_BAM { take: - bam // channel: [ val(meta), path(bam) ] - fasta // path: genome.fasta + bam // channel: [ val(meta), path(bam) ] + fasta // path: genome.fasta + chrom_sizes // path: chrom.sizes main: ch_versions = Channel.empty() @@ -29,14 +30,15 @@ workflow QC_BAM { // TIDDIT COVERAGE TIDDIT_COV ( bam, [] ) // 2nd pos. arg is req. only for cram input - UCSC_WIGTOBIGWIG ( TIDDIT_COV.out.wig ) - ch_wig = TIDDIT_COV.out.wig + UCSC_WIGTOBIGWIG ( TIDDIT_COV.out.wig, chrom_sizes ) ch_versions = ch_versions.mix(TIDDIT_COV.out.versions) emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] + tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] + bigwig = UCSC_WIGTOBIGWIG.out.bw // path: *.bigwig versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e5581ac7..ba438aa6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -60,16 +60,16 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' - -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' -include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/local/call_repeat_expansions' +include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' +include { QC_BAM } from '../subworkflows/local/qc_bam' // // SUBWORKFLOW: Consists of mix/local modules // +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' + include { CALL_SNV_DEEPVARIANT } from '../subworkflows/local/call_snv_deepvariant' include { CALL_SV_MANTA } from '../subworkflows/local/call_sv_manta' @@ -134,8 +134,10 @@ workflow RAREDISEASE { // STEP 1.5: BAM QUALITY CHECK QC_BAM ( ch_marked_bam, - PREPARE_GENOME.out.fasta + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.chrom_sizes ) + ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) // STEP 1.6: EXPANSIONHUNTER CALL_REPEAT_EXPANSIONS ( From 210717603705c24cebe574dd6b9bf198a3ea3b7f Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 10 Jan 2022 16:25:10 +0100 Subject: [PATCH 0200/1169] attmpt 1: fix lint fail --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 15b89cef..5fca4864 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -204,7 +204,7 @@ process { mode: 'copy' ] } - withName: .*QC_BAM:UCSC_WIGTOBIGWIG { + withName: ".*QC_BAM:UCSC_WIGTOBIGWIG" { ext.args = '-clip' publishDir = [ path: { "${params.outdir}/tiddit_coverage" }, From 53a8db35dd9276f70651db75ea82ac693e35fb9c Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 10 Jan 2022 16:30:28 +0100 Subject: [PATCH 0201/1169] delete clingy files --- nf-core/modules/ucsc/wigtobigwig/main.nf | 34 --------------------- nf-core/modules/ucsc/wigtobigwig/meta.yml | 37 ----------------------- 2 files changed, 71 deletions(-) delete mode 100644 nf-core/modules/ucsc/wigtobigwig/main.nf delete mode 100644 nf-core/modules/ucsc/wigtobigwig/meta.yml diff --git a/nf-core/modules/ucsc/wigtobigwig/main.nf b/nf-core/modules/ucsc/wigtobigwig/main.nf deleted file mode 100644 index 4c596c9a..00000000 --- a/nf-core/modules/ucsc/wigtobigwig/main.nf +++ /dev/null @@ -1,34 +0,0 @@ -def VERSION = '377' // Version information not provided by tool on CLI - -process UCSC_WIGTOBIGWIG { - tag '$wig' - label 'process_medium' - - conda (params.enable_conda ? "bioconda::ucsc-wigtobigwig=377" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ucsc-wigtobigwig:377--h0b8a92a_2' : - 'quay.io/biocontainers/ucsc-wigtobigwig:377--h0b8a92a_2' }" - - input: - path wig - path sizes - - output: - path "*.bw" , emit: bw - path "versions.yml", emit: versions - - script: - def args = task.ext.args ?: '' - """ - wigToBigWig \\ - $args \\ - $wig \\ - $sizes \\ - ${wig.getSimpleName()}.bw - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ucsc: $VERSION - END_VERSIONS - """ -} diff --git a/nf-core/modules/ucsc/wigtobigwig/meta.yml b/nf-core/modules/ucsc/wigtobigwig/meta.yml deleted file mode 100644 index 4723ff2b..00000000 --- a/nf-core/modules/ucsc/wigtobigwig/meta.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: ucsc_wigtobigwig -description: Convert ascii format wig file to binary big wig format -keywords: - - wig - - bigwig -tools: - - ucsc: - description: | - Convert ascii format wig file (in fixedStep, variableStep - or bedGraph format) to binary big wig format - homepage: None - documentation: None - tool_dev_url: None - doi: "" - licence: ['varies; see http://genome.ucsc.edu/license'] - -input: - - wig: - type: file - description: wig file - pattern: "*.{wig}" - - chromsizes: - type: file - description: chromosome sizes file - -output: - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - bw: - type: file - description: bigwig file - pattern: "*.{bw}" - -authors: - - "@jianhong" From 6c44ecd865bef3cc57dd0c158d36cc3f085becba Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 10 Jan 2022 17:19:18 +0100 Subject: [PATCH 0202/1169] small typo to comment --- subworkflows/local/qc_bam.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index d71807a7..c18603cd 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -38,7 +38,7 @@ workflow QC_BAM { multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] - bigwig = UCSC_WIGTOBIGWIG.out.bw // path: *.bigwig + bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 1ed78b6be5150467503945650cd3d85fa027473c Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 12 Jan 2022 09:46:00 +0100 Subject: [PATCH 0203/1169] reversed module --- modules.json | 3 +++ modules/{local => nf-core/modules}/ucsc/wigtobigwig/main.nf | 4 ++-- .../{local => nf-core/modules}/ucsc/wigtobigwig/meta.yml | 6 ++++++ subworkflows/{local => nf-core}/qc_bam.nf | 2 +- workflows/raredisease.nf | 2 +- 5 files changed, 13 insertions(+), 4 deletions(-) rename modules/{local => nf-core/modules}/ucsc/wigtobigwig/main.nf (89%) rename modules/{local => nf-core/modules}/ucsc/wigtobigwig/meta.yml (83%) rename subworkflows/{local => nf-core}/qc_bam.nf (95%) diff --git a/modules.json b/modules.json index c2a7e55c..c03c6521 100644 --- a/modules.json +++ b/modules.json @@ -59,6 +59,9 @@ }, "tiddit/cov": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + }, + "ucsc/wigtobigwig": { + "git_sha": "30e64becaa1e6c807a09a49a6d3d457ff3cf7251" } } } diff --git a/modules/local/ucsc/wigtobigwig/main.nf b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf similarity index 89% rename from modules/local/ucsc/wigtobigwig/main.nf rename to modules/nf-core/modules/ucsc/wigtobigwig/main.nf index f37d4a3d..6a1847b6 100644 --- a/modules/local/ucsc/wigtobigwig/main.nf +++ b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf @@ -14,8 +14,8 @@ process UCSC_WIGTOBIGWIG { path sizes output: - tuple val(meta), path("*.bw") , emit: bw - path "versions.yml" , emit: versions + tuple val(meta), path("*.bw"), emit: bw + path "versions.yml" , emit: versions script: def args = task.ext.args ?: '' diff --git a/modules/local/ucsc/wigtobigwig/meta.yml b/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml similarity index 83% rename from modules/local/ucsc/wigtobigwig/meta.yml rename to modules/nf-core/modules/ucsc/wigtobigwig/meta.yml index 4723ff2b..5ca94bb4 100644 --- a/modules/local/ucsc/wigtobigwig/meta.yml +++ b/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml @@ -15,6 +15,11 @@ tools: licence: ['varies; see http://genome.ucsc.edu/license'] input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - wig: type: file description: wig file @@ -35,3 +40,4 @@ output: authors: - "@jianhong" + - "@projectoriented" diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf similarity index 95% rename from subworkflows/local/qc_bam.nf rename to subworkflows/nf-core/qc_bam.nf index c18603cd..791ffe8e 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -6,7 +6,7 @@ include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/pi include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' -include { UCSC_WIGTOBIGWIG } from '../../modules/local/ucsc/wigtobigwig/main' +include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/ucsc/wigtobigwig/main' workflow QC_BAM { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index ba438aa6..4be26c05 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -62,7 +62,7 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { QC_BAM } from '../subworkflows/local/qc_bam' +include { QC_BAM } from '../subworkflows/nf-core/qc_bam' // // SUBWORKFLOW: Consists of mix/local modules From 8cf6a587d47c082ebd28ebd37e8ca86c7afcd15a Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 12 Jan 2022 09:58:19 +0100 Subject: [PATCH 0204/1169] woops, fixed path --- subworkflows/nf-core/qc_bam.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 791ffe8e..3ed2ce78 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -6,7 +6,7 @@ include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/pi include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' -include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/ucsc/wigtobigwig/main' +include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' workflow QC_BAM { From d5adf410caaef1367a25f6fc83491144ebb6f1aa Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 17 Jan 2022 17:05:59 +0100 Subject: [PATCH 0205/1169] add collecthsmetrics --- conf/genomes.config | 4 +- conf/modules.config | 32 ++++++++- modules.json | 15 +++++ modules/nf-core/modules/cat/cat/main.nf | 45 +++++++++++++ modules/nf-core/modules/cat/cat/meta.yml | 34 ++++++++++ .../modules/gatk4/bedtointervallist/main.nf | 39 +++++++++++ .../modules/gatk4/bedtointervallist/meta.yml | 40 +++++++++++ .../gatk4/createsequencedictionary/main.nf | 37 +++++++++++ .../gatk4/createsequencedictionary/meta.yml | 32 +++++++++ .../modules/gatk4/intervallisttools/main.nf | 51 ++++++++++++++ .../modules/gatk4/intervallisttools/meta.yml | 47 +++++++++++++ .../modules/picard/collecthsmetrics/main.nf | 48 ++++++++++++++ .../modules/picard/collecthsmetrics/meta.yml | 66 +++++++++++++++++++ subworkflows/local/prepare_bed.nf | 11 +++- subworkflows/local/prepare_genome.nf | 9 +-- subworkflows/nf-core/qc_bam.nf | 17 ++++- workflows/raredisease.nf | 8 ++- 17 files changed, 522 insertions(+), 13 deletions(-) create mode 100644 modules/nf-core/modules/cat/cat/main.nf create mode 100644 modules/nf-core/modules/cat/cat/meta.yml create mode 100644 modules/nf-core/modules/gatk4/bedtointervallist/main.nf create mode 100644 modules/nf-core/modules/gatk4/bedtointervallist/meta.yml create mode 100644 modules/nf-core/modules/gatk4/createsequencedictionary/main.nf create mode 100644 modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml create mode 100644 modules/nf-core/modules/gatk4/intervallisttools/main.nf create mode 100644 modules/nf-core/modules/gatk4/intervallisttools/meta.yml create mode 100644 modules/nf-core/modules/picard/collecthsmetrics/main.nf create mode 100644 modules/nf-core/modules/picard/collecthsmetrics/meta.yml diff --git a/conf/genomes.config b/conf/genomes.config index fc8c4aa6..3a72deb5 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -16,7 +16,7 @@ params { bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" - target_bed = "" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" @@ -24,7 +24,7 @@ params { bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" - target_bed = "${params.local_genomes}/twistexomerefseq_9.1_hg19_design.bed.gz" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" } } } diff --git a/conf/modules.config b/conf/modules.config index 5fca4864..180e786c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -73,13 +73,43 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'TABIX_PV|TABIX_PT|TABIX_PBT' { + withName: TABIX_PV { publishDir = [ path: { "${params.outdir}/vcf_check" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: 'TABIX_PT|TABIX_PBT' { + publishDir = [ + path: { "${params.outdir}/bed_check" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'GATK_BILT' { + publishDir = [ + path: { "${params.outdir}/bed_check" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'GATK_ILT' { + ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' + publishDir = [ + path: { "${params.outdir}/bed_check" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'CAT_CAT_BAIT' { + ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' + publishDir = [ + path: { "${params.outdir}/bed_check" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } // CALL_SNV_DEEPVARIANT withName: DEEPVARIANT { ext.args = "--model_type=$params.analysis_type" diff --git a/modules.json b/modules.json index c03c6521..a4b7aa00 100644 --- a/modules.json +++ b/modules.json @@ -12,6 +12,9 @@ "bwamem2/mem": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, + "cat/cat": { + "git_sha": "c4549c0ecd1b02473471b507fd88a9fd5289d91c" + }, "custom/dumpsoftwareversions": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, @@ -21,12 +24,24 @@ "fastqc": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, + "gatk4/bedtointervallist": { + "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" + }, + "gatk4/createsequencedictionary": { + "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" + }, + "gatk4/intervallisttools": { + "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" + }, "glnexus": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "multiqc": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, + "picard/collecthsmetrics": { + "git_sha": "e751e5040af57e1b4e06ed4e0f3efe6de25c1683" + }, "picard/collectmultiplemetrics": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, diff --git a/modules/nf-core/modules/cat/cat/main.nf b/modules/nf-core/modules/cat/cat/main.nf new file mode 100644 index 00000000..2efe20a5 --- /dev/null +++ b/modules/nf-core/modules/cat/cat/main.nf @@ -0,0 +1,45 @@ +process CAT_CAT { + label 'process_low' + + conda (params.enable_conda ? "conda-forge::pigz=2.3.4" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/pigz:2.3.4' : + 'quay.io/biocontainers/pigz:2.3.4' }" + + input: + path files_in + val file_out + + output: + path "${file_out}*" , emit: file_out + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def file_list = files_in.collect { it.toString() } + + // | input | output | command1 | command2 | + // |-----------|------------|----------|----------| + // | gzipped | gzipped | cat | | + // | ungzipped | ungzipped | cat | | + // | gzipped | ungzipped | zcat | | + // | ungzipped | gzipped | cat | pigz | + + def in_zip = file_list[0].endsWith('.gz') + def out_zip = file_out.endsWith('.gz') + def command1 = (in_zip && !out_zip) ? 'zcat' : 'cat' + def command2 = (!in_zip && out_zip) ? "| pigz -c -p $task.cpus $args2" : '' + """ + $command1 \\ + $args \\ + ${file_list.join(' ')} \\ + $command2 \\ + > $file_out + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/cat/cat/meta.yml b/modules/nf-core/modules/cat/cat/meta.yml new file mode 100644 index 00000000..b3f370ee --- /dev/null +++ b/modules/nf-core/modules/cat/cat/meta.yml @@ -0,0 +1,34 @@ +name: cat_cat +description: A module for concatenation of gzipped or uncompressed files +keywords: + - concatenate + - gzip + - cat +tools: + - cat: + description: Just concatenation + homepage: None + documentation: https://man7.org/linux/man-pages/man1/cat.1.html + tool_dev_url: None + licence: ['GPL-3.0-or-later'] +input: + - files_in: + type: file + description: List of compressed / uncompressed files + pattern: "*" + - file_out: + type: value + description: Full name of output file with or without .gz extension + +output: + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - file_out: + type: file + description: Concatenated file. Will be gzipped if file_out ends with ".gz" + pattern: "${file_out}" + +authors: + - "@erikrikarddaniel" diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf new file mode 100644 index 00000000..37f46f48 --- /dev/null +++ b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf @@ -0,0 +1,39 @@ +process GATK4_BEDTOINTERVALLIST { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + + input: + tuple val(meta), path(bed) + path sequence_dict + + output: + tuple val(meta), path('*.interval_list'), emit: interval_list + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK BedToIntervalList] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" BedToIntervalList \\ + -I $bed \\ + -SD $sequence_dict \\ + -O ${prefix}.interval_list \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml b/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml new file mode 100644 index 00000000..910f9552 --- /dev/null +++ b/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml @@ -0,0 +1,40 @@ +name: gatk4_bedtointervallist +description: Creates an interval list from a bed file and a reference dict +keywords: + - bed + - interval list +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ['Apache-2.0'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - bed: + type: file + description: Input bed file + pattern: "*.bed" + - dict: + type: file + description: Sequence dictionary + pattern: "*.dict" +output: + - interval_list: + type: file + description: gatk interval list file + pattern: "*.interval_list" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@kevinmenden" diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf new file mode 100644 index 00000000..2cbd8948 --- /dev/null +++ b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf @@ -0,0 +1,37 @@ +process GATK4_CREATESEQUENCEDICTIONARY { + tag "$fasta" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + + input: + path fasta + + output: + path "*.dict" , emit: dict + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def avail_mem = 6 + if (!task.memory) { + log.info '[GATK CreateSequenceDictionary] Available memory not known - defaulting to 6GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" \\ + CreateSequenceDictionary \\ + --REFERENCE $fasta \\ + --URI $fasta \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml b/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml new file mode 100644 index 00000000..54f479b3 --- /dev/null +++ b/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml @@ -0,0 +1,32 @@ +name: gatk4_createsequencedictionary +description: Creates a sequence dictionary for a reference sequence +keywords: + - dictionary + - fasta +tools: + - gatk: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ['Apache-2.0'] + +input: + - fasta: + type: file + description: Input fasta file + pattern: "*.{fasta,fa}" +output: + - dict: + type: file + description: gatk dictionary file + pattern: "*.{dict}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@maxulysse" diff --git a/modules/nf-core/modules/gatk4/intervallisttools/main.nf b/modules/nf-core/modules/gatk4/intervallisttools/main.nf new file mode 100644 index 00000000..17412160 --- /dev/null +++ b/modules/nf-core/modules/gatk4/intervallisttools/main.nf @@ -0,0 +1,51 @@ +process GATK4_INTERVALLISTTOOLS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + + input: + tuple val(meta), path(interval_list) + + output: + tuple val(meta), path("*_split/*/*.interval_list"), emit: interval_list + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK IntervalListTools] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + + mkdir ${prefix}_split + + gatk --java-options "-Xmx${avail_mem}g" \\ + IntervalListTools \\ + -I ${interval_list} \\ + -O ${prefix}_split \\ + $args + + python3 < versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/intervallisttools/meta.yml b/modules/nf-core/modules/gatk4/intervallisttools/meta.yml new file mode 100644 index 00000000..9e2d994f --- /dev/null +++ b/modules/nf-core/modules/gatk4/intervallisttools/meta.yml @@ -0,0 +1,47 @@ +name: gatk4_intervallisttools + +description: Splits the interval list file into unique, equally-sized interval files and place it under a directory +keywords: + - sort + - bed + - interval list +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ['Apache-2.0'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + + - interval_list: + type: file + description: Interval list file + pattern: "*.interval_list" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - interval_list: + type: file + description: Interval list files + pattern: "*.interval_list" + +authors: + - "@praveenraj2018" diff --git a/modules/nf-core/modules/picard/collecthsmetrics/main.nf b/modules/nf-core/modules/picard/collecthsmetrics/main.nf new file mode 100644 index 00000000..ae3e4d96 --- /dev/null +++ b/modules/nf-core/modules/picard/collecthsmetrics/main.nf @@ -0,0 +1,48 @@ +process PICARD_COLLECTHSMETRICS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + + input: + tuple val(meta), path(bam) + path fasta + path fai + path bait_intervals + path target_intervals + + output: + tuple val(meta), path("*collecthsmetrics.txt"), emit: hs_metrics + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "-R $fasta" : "" + + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard CollectHsMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + CollectHsMetrics \\ + $args \\ + $reference \\ + -BAIT_INTERVALS $bait_intervals \\ + -TARGET_INTERVALS $target_intervals \\ + -INPUT $bam \\ + -OUTPUT ${prefix}_collecthsmetrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard CollectHsMetrics --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/picard/collecthsmetrics/meta.yml b/modules/nf-core/modules/picard/collecthsmetrics/meta.yml new file mode 100644 index 00000000..4b94909f --- /dev/null +++ b/modules/nf-core/modules/picard/collecthsmetrics/meta.yml @@ -0,0 +1,66 @@ +name: picard_collecthsmetrics +description: Collects hybrid-selection (HS) metrics for a SAM or BAM file. +keywords: + - alignment + - metrics + - statistics + - insert + - hybrid-selection + - quality + - bam +tools: + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ + tool_dev_url: https://github.com/broadinstitute/picard/ + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: An aligned BAM/SAM file + pattern: "*.{bam,sam}" + - fasta: + type: file + description: | + A reference file to calculate dropout metrics measuring reduced representation of reads. + Optional input. + pattern: "*.fasta" + - fai: + type: file + description: Index of FASTA file. Only needed when fasta is supplied. + pattern: "*.fai" + - bait_intervals: + type: file + description: An interval list file that contains the locations of the baits used. + pattern: "baits.interval_list" + - target_intervals: + type: file + description: An interval list file that contains the locations of the targets. + pattern: "targets.interval_list" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - hs_metrics: + type: file + description: The metrics file. + pattern: "*_collecthsmetrics.txt" + +authors: + - "@projectoriented" diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index e855373f..c999dbe2 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -2,12 +2,15 @@ // Prepare reference bed files // +include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/modules/gatk4/bedtointervallist/main' +include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/modules/gatk4/intervallisttools/main' include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/modules/tabix/tabix/main' include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/modules/tabix/bgziptabix/main' workflow CHECK_BED { take: bed // file: bed file + sd // path: sequence_dictionary main: tab_out = Channel.empty() @@ -22,8 +25,14 @@ workflow CHECK_BED { } else if ( file(bed, checkIfExists:true) ) { tab_out = TABIX_PBT (ch_bed).gz_tbi } + if (sd) { + interval_list = GATK_BILT (ch_bed, sd).interval_list + GATK_ILT(interval_list) + } } emit: - idx = tab_out + bed = tab_out + target_intervals = interval_list.collect{it[1]} + bait_intervals = GATK_ILT.out.interval_list.collect{it[1]} } diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 8985678d..ce506449 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -4,7 +4,7 @@ include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' - +include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD} from '../../modules/nf-core/modules/gatk4/createsequencedictionary/main' include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' workflow PREPARE_GENOME { @@ -34,8 +34,9 @@ workflow PREPARE_GENOME { ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) } - ch_chrom_sizes = GET_CHROM_SIZES ( ch_fai ).sizes - ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) + ch_sequence_dict = GATK_SD ( ch_fasta ).dict + ch_chrom_sizes = GET_CHROM_SIZES ( ch_fai ).sizes + ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) emit: @@ -43,6 +44,6 @@ workflow PREPARE_GENOME { fai = ch_fai // path: genome.fasta.fai bwamem2_index = ch_bwamem2_index // path: bwamem2/index chrom_sizes = ch_chrom_sizes // path: chrom.sizes - + sequence_dict = ch_sequence_dict versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 3ed2ce78..a5d729b3 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -3,7 +3,9 @@ // include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' +include { PICARD_COLLECTHSMETRICS } from '../../modules/nf-core/modules/picard/collecthsmetrics/main' include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' +include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/modules/cat/cat/main' include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' @@ -11,9 +13,12 @@ include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwi workflow QC_BAM { take: - bam // channel: [ val(meta), path(bam) ] - fasta // path: genome.fasta - chrom_sizes // path: chrom.sizes + bam // channel: [ val(meta), path(bam) ] + fasta // path: genome.fasta + fai // path: genome.fasta.fai + bait_intervals // path: bait.intervals_list + target_intervals // path: target.intervals_list + chrom_sizes // path: chrom.sizes main: ch_versions = Channel.empty() @@ -22,6 +27,11 @@ workflow QC_BAM { PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta ) ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions) + // COLLECT HS METRICS + CAT_CAT_BAIT ( bait_intervals, "bait.intervals_list" ) + PICARD_COLLECTHSMETRICS ( bam, fasta, fai, CAT_CAT.out.file_out, target_intervals ) + ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions) + // QUALIMAP BAMQC gff = [] use_gff = false @@ -36,6 +46,7 @@ workflow QC_BAM { emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] + hs_metrics = PICARD_COLLECTHSMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4be26c05..edca817d 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -114,7 +114,8 @@ workflow RAREDISEASE { ch_target_bed = Channel.empty() if (params.target_bed) { CHECK_BED( - params.target_bed + params.target_bed, + PREPARE_GENOME.out.sequence_dict ).set { ch_target_bed } } @@ -135,6 +136,9 @@ workflow RAREDISEASE { QC_BAM ( ch_marked_bam, PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.fai, + CHECK_BED.out.bait_intervals, + CHECK_BED.out.target_intervals, PREPARE_GENOME.out.chrom_sizes ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) @@ -164,7 +168,7 @@ workflow RAREDISEASE { PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, INPUT_CHECK.out.ch_case_info, - ch_target_bed + ch_target_bed.bed ) ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) From 0b58bca2184b518850ee6b89430d791892f6b1eb Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 17 Jan 2022 17:17:59 +0100 Subject: [PATCH 0206/1169] fix cat error --- subworkflows/nf-core/qc_bam.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index a5d729b3..7eb70393 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -29,7 +29,7 @@ workflow QC_BAM { // COLLECT HS METRICS CAT_CAT_BAIT ( bait_intervals, "bait.intervals_list" ) - PICARD_COLLECTHSMETRICS ( bam, fasta, fai, CAT_CAT.out.file_out, target_intervals ) + PICARD_COLLECTHSMETRICS ( bam, fasta, fai, CAT_CAT_BAIT.out.file_out, target_intervals ) ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions) // QUALIMAP BAMQC From 8ed4593ea8fa7f4aa501388516828a7d34796631 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 17 Jan 2022 17:33:09 +0100 Subject: [PATCH 0207/1169] add deepvariant from nf-core --- modules.json | 3 + modules/nf-core/modules/deepvariant/main.nf | 44 ++++++++++++++ modules/nf-core/modules/deepvariant/meta.yml | 62 ++++++++++++++++++++ subworkflows/local/call_snv_deepvariant.nf | 2 +- 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/modules/deepvariant/main.nf create mode 100644 modules/nf-core/modules/deepvariant/meta.yml diff --git a/modules.json b/modules.json index c03c6521..29d225d7 100644 --- a/modules.json +++ b/modules.json @@ -15,6 +15,9 @@ "custom/dumpsoftwareversions": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, + "deepvariant": { + "git_sha": "1287ba48fe6b2acb7449cfca387c91dc2ddf6538" + }, "expansionhunter": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, diff --git a/modules/nf-core/modules/deepvariant/main.nf b/modules/nf-core/modules/deepvariant/main.nf new file mode 100644 index 00000000..98345c83 --- /dev/null +++ b/modules/nf-core/modules/deepvariant/main.nf @@ -0,0 +1,44 @@ +process DEEPVARIANT { + tag "$meta.id" + label 'process_medium' + + + if (params.enable_conda) { + exit 1, "Conda environments cannot be used when using the DeepVariant tool. Please use docker or singularity containers." + } + + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'google/deepvariant:1.3.0' : + 'google/deepvariant:1.3.0' }" + + input: + tuple val(meta), path(input), path(index), path(intervals) + path(fasta) + path(fai) + + output: + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*g.vcf.gz"), emit: gvcf + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def regions = intervals ? "--regions ${intervals}" : "" + + """ + /opt/deepvariant/bin/run_deepvariant \\ + --ref=${fasta} \\ + --reads=${input} \\ + --output_vcf=${prefix}.vcf.gz \\ + --output_gvcf=${prefix}.g.vcf.gz \\ + ${args} \\ + ${regions} \\ + --num_shards=${task.cpus} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/deepvariant/meta.yml b/modules/nf-core/modules/deepvariant/meta.yml new file mode 100644 index 00000000..d4423d69 --- /dev/null +++ b/modules/nf-core/modules/deepvariant/meta.yml @@ -0,0 +1,62 @@ +name: deepvariant +description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data +keywords: + - variant calling + - machine learning +tools: + - deepvariant: + description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data + homepage: https://github.com/google/deepvariant + documentation: https://github.com/google/deepvariant + tool_dev_url: https://github.com/google/deepvariant + doi: "https://doi.org/10.1038/nbt.4235" + licence: ['BSD-3-clause'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file + pattern: "*.bam/cram" + - index: + type: file + description: Index of BAM/CRAM file + pattern: "*.bai/crai" + - interval: + type: file + description: Interval file for targeted regions + pattern: "*.bed" + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fai" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: Compressed VCF file + pattern: "*.vcf.gz" + - gvcf: + type: file + description: Compressed GVCF file + pattern: "*.g.vcf.gz" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" + +authors: + - "@abhi18av" diff --git a/subworkflows/local/call_snv_deepvariant.nf b/subworkflows/local/call_snv_deepvariant.nf index ee34f618..f9765063 100644 --- a/subworkflows/local/call_snv_deepvariant.nf +++ b/subworkflows/local/call_snv_deepvariant.nf @@ -4,7 +4,7 @@ include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_GL } from '../../modules/nf-core/modules/bcftools/norm/main' include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../modules/nf-core/modules/bcftools/norm/main' -include { DEEPVARIANT } from '../../modules/local/deepvariant/main' +include { DEEPVARIANT } from '../../modules/nf-core/modules/deepvariant/main' include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/modules/tabix/tabix/main' From 4696654ac4aba0ce2c7c34162becca138e768084 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 18 Jan 2022 13:25:48 +0100 Subject: [PATCH 0208/1169] update deepvariant subworkflow --- modules/local/deepvariant/main.nf | 39 --------------- modules/local/deepvariant/meta.yml | 58 ---------------------- subworkflows/local/call_snv_deepvariant.nf | 6 ++- 3 files changed, 5 insertions(+), 98 deletions(-) delete mode 100644 modules/local/deepvariant/main.nf delete mode 100644 modules/local/deepvariant/meta.yml diff --git a/modules/local/deepvariant/main.nf b/modules/local/deepvariant/main.nf deleted file mode 100644 index 82979984..00000000 --- a/modules/local/deepvariant/main.nf +++ /dev/null @@ -1,39 +0,0 @@ -process DEEPVARIANT { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? 'bioconda::deepvariant=1.2.0' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker://google/deepvariant:1.2.0' : - 'google/deepvariant:1.2.0' }" - - input: - tuple val(meta), path(bam), path(bai) - path fasta - path fasta_fai - - output: - tuple val(meta), path("*.vcf.gz"), emit: vcf - tuple val(meta), path("*g.vcf.gz"), emit: gvcf - path "versions.yml", emit: versions - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - /opt/deepvariant/bin/run_deepvariant \\ - --ref=$fasta \\ - --reads=$bam \\ - --output_vcf=${prefix}.vcf.gz \\ - --output_gvcf=${prefix}.g.vcf.gz \\ - $args \\ - --num_shards=${task.cpus} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//') - END_VERSIONS - """ - -} diff --git a/modules/local/deepvariant/meta.yml b/modules/local/deepvariant/meta.yml deleted file mode 100644 index 05269a3b..00000000 --- a/modules/local/deepvariant/meta.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: deepvariant -description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data -keywords: - - variant calling - - machine learning -tools: - - deepvariant: - description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data - homepage: https://github.com/google/deepvariant - documentation: https://github.com/google/deepvariant - tool_dev_url: https://github.com/google/deepvariant - doi: "https://doi.org/10.1038/nbt.4235" - licence: ['BSD-3-clause'] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file - pattern: "*.bam" - - bai: - type: file - description: Index of BAM file - pattern: "*.bai" - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - - fai: - type: file - description: Index of reference fasta file - pattern: "*.fai" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: Compressed VCF file - pattern: "*.vcf.gz" - - gvcf: - type: file - description: Compressed GVCF file - pattern: "*.g.vcf.gz" - - version: - type: file - description: File containing software version - pattern: "*.{version.txt}" - -authors: - - "@abhi18av" diff --git a/subworkflows/local/call_snv_deepvariant.nf b/subworkflows/local/call_snv_deepvariant.nf index f9765063..e14958e8 100644 --- a/subworkflows/local/call_snv_deepvariant.nf +++ b/subworkflows/local/call_snv_deepvariant.nf @@ -17,8 +17,12 @@ workflow CALL_SNV_DEEPVARIANT { main: ch_versions = Channel.empty() + bam.map { meta, bam, bai -> + return [meta, bam, bai, []] + } + .set { ch_bam } - DEEPVARIANT ( bam, fasta, fai ) + DEEPVARIANT ( ch_bam, fasta, fai ) DEEPVARIANT.out.gvcf.collect{it[1]} .toList() .set { file_list } From bdb8759d3b746a93506c09ad36316964302a755f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 18 Jan 2022 14:39:36 +0100 Subject: [PATCH 0209/1169] add target bed file --- conf/test.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/test.config b/conf/test.config index 12b3c1f9..06857741 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,4 +31,5 @@ params { // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' + target_bed = 'https://www.twistbioscience.com/sites/default/files/resources/2020-09/Twist_ComprehensiveExome_targets_hg38.bed' } From 5436a30c1cca0618aa3959423a6eeca6a38ab772 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 18 Jan 2022 14:58:42 +0100 Subject: [PATCH 0210/1169] fix variable name --- subworkflows/nf-core/qc_bam.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 7eb70393..7dbc6991 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -46,7 +46,7 @@ workflow QC_BAM { emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] - hs_metrics = PICARD_COLLECTHSMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] + hs_metrics = PICARD_COLLECTHSMETRICS.out.hs_metrics // channel: [ val(meta), path(metrics) ] qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] From 7f7f403b4180f99f85d2680891131c6e61de2266 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 18 Jan 2022 15:26:01 +0100 Subject: [PATCH 0211/1169] update test target bed --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 06857741..6a105c49 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,5 +31,5 @@ params { // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' - target_bed = 'https://www.twistbioscience.com/sites/default/files/resources/2020-09/Twist_ComprehensiveExome_targets_hg38.bed' + target_bed = 'https://github.com/nf-core/test-datasets/blob/raredisease/testdata/target_chr20.bed' } From a23f491f4ca7b1e6065127ea4b146c5955ba31c2 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 18 Jan 2022 15:32:48 +0100 Subject: [PATCH 0212/1169] refactored manta --- .../local/call_structural_variants.nf | 25 +++++++++++++++++++ .../nf-core/call_structural_variants.nf | 20 --------------- 2 files changed, 25 insertions(+), 20 deletions(-) create mode 100644 subworkflows/local/call_structural_variants.nf delete mode 100644 subworkflows/nf-core/call_structural_variants.nf diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf new file mode 100644 index 00000000..baaa02ad --- /dev/null +++ b/subworkflows/local/call_structural_variants.nf @@ -0,0 +1,25 @@ +// +// A nested subworkflow to call structural variants. +// + +include { CALL_SV_MANTA } from './call_sv_manta' + +workflow CALL_STRUCTURAL_VARIANTS { + + take: + bam // channel: [ val(meta), path(bam) ] + bai // channel: [ val(meta), path(bai) ] + fasta // channel: [ path(genome.fasta) ] + fai // channel: [ path(genome.fai) ] + case_info // channel: [ val(case_info) ] + target_bed // channel: [ path(target.bed) ] + + main: + ch_versions = Channel.empty() + + CALL_SV_MANTA( bam, bai, fasta, fai, case_info, target_bed ) + ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) + + emit: + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf deleted file mode 100644 index c88109bb..00000000 --- a/subworkflows/nf-core/call_structural_variants.nf +++ /dev/null @@ -1,20 +0,0 @@ -// -// A nested subworkflow to call structural variants. -// - -// CHANGE: swap this example line for the real subworkflow -include { CALL_SV_MANTA } from '../local/call_sv_manta' - -workflow CALL_STRUCTURAL_VARIANTS { - - take: - bam // channel: [ val(meta), path(bam) ] - fasta // channel: [ path(genome.fasta) ] - fai // channel: [ path(genome.fai) ] - - main: - ch_versions = Channel.empty() - - emit: - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] -} From 3a95d56055c464a248ab23fd164e18e87f5b9c32 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 18 Jan 2022 15:33:33 +0100 Subject: [PATCH 0213/1169] --amend --- workflows/raredisease.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4be26c05..8effbb44 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -71,7 +71,7 @@ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' include { CALL_SNV_DEEPVARIANT } from '../subworkflows/local/call_snv_deepvariant' -include { CALL_SV_MANTA } from '../subworkflows/local/call_sv_manta' +include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/local/call_structural_variants' /* ======================================================================================== @@ -157,8 +157,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) - // TODO: Move this to a SV calling workflow - CALL_SV_MANTA ( + CALL_STRUCTURAL_VARIANTS ( ch_marked_bam, ch_marked_bai, PREPARE_GENOME.out.fasta, @@ -166,7 +165,7 @@ workflow RAREDISEASE { INPUT_CHECK.out.ch_case_info, ch_target_bed ) - ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) + ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) // // MODULE: Pipeline reporting From bd72a11dd713429cfaa8d5c95188e16114d4ea9a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 18 Jan 2022 15:37:27 +0100 Subject: [PATCH 0214/1169] update links --- conf/modules.config | 1 - conf/test.config | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 180e786c..29cab033 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -103,7 +103,6 @@ process { ] } withName: 'CAT_CAT_BAIT' { - ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' publishDir = [ path: { "${params.outdir}/bed_check" }, mode: 'copy', diff --git a/conf/test.config b/conf/test.config index 6a105c49..fa041a02 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,5 +31,5 @@ params { // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' - target_bed = 'https://github.com/nf-core/test-datasets/blob/raredisease/testdata/target_chr20.bed' + target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/target_chr20.bed' } From af4cd0b1deff64add6c621e3577ba4f1a541afda Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 18 Jan 2022 16:05:00 +0100 Subject: [PATCH 0215/1169] update modules config --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5fca4864..102d38be 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -126,8 +126,8 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - // CALL_SV_MANTA - withName: MANTA { + // CALL_STRUCTURAL_VARIANTS + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA" { publishDir = [ path: { "${params.outdir}/manta" }, mode: 'copy', From bb69e8061ad9690d2592f47a56b36832d72eee6d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 19 Jan 2022 00:16:09 +0100 Subject: [PATCH 0216/1169] check vcf refactor --- bin/check_input_vcf.py | 47 ------------------------------- modules/local/check_input_vcf.nf | 25 ++++++++++++++-- subworkflows/local/prepare_vcf.nf | 5 ++-- workflows/raredisease.nf | 6 ++-- 4 files changed, 28 insertions(+), 55 deletions(-) delete mode 100755 bin/check_input_vcf.py diff --git a/bin/check_input_vcf.py b/bin/check_input_vcf.py deleted file mode 100755 index 9109605a..00000000 --- a/bin/check_input_vcf.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import gzip -import argparse - -def parse_args(args=None): - Description = "Check that input vcf file has been normalized." - Epilog = "Example usage: python check_input_vcf.py --INPUT_VCF --OUTPUT " - - parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument("--INPUT_VCF", help="Input vcf file.") - parser.add_argument("--OUTPUT", help="Output file containing a list of files that need to be normalized.") - return parser.parse_args(args) - - -def check_vcf(file_in, file_out): - """ - This function checks that an input vcf file has been normalized with bcftools, and if not, it writes its basename and the filename - to a text file - - """ - - with open(file_out,'w') as out: - if file_in.endswith(".gz"): - base = os.path.basename(file_in).rsplit(".",2)[0] - out.write("id,filepath,processed\n") - with gzip.open(file_in,'rt') as vcf: - for line in vcf: - if line.startswith("##bcftools_norm"): - out.write(base + "," + os.path.abspath(file_in) + ",yes\n") - break - elif not line.startswith("#"): - out.write(base + "," + os.path.abspath(file_in) + ",no\n") - break - else: - print("Please compress %s using bgzip" %file_in ) - - -def main(args=None): - args = parse_args(args) - check_vcf(args.INPUT_VCF, args.OUTPUT) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index 471e052f..8afcb4b3 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -14,8 +14,27 @@ process CHECK_INPUT_VCF { script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ """ - check_input_vcf.py \\ - --INPUT_VCF $vcf \\ - --OUTPUT checked_vcfs.txt + export INPUT_FILE=${vcf} + export OUTPUT_FILE="checked_vcfs.txt" + + python3 < def id = "${row.id}" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4be26c05..61d8c027 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -104,11 +104,11 @@ workflow RAREDISEASE { PREPARE_GENOME ( params.fasta ) ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) + ch_gnomad = Channel.empty() if (params.gnomad) { - ch_gnomad_in = Channel.fromPath(params.gnomad) CHECK_VCF( - ch_gnomad_in, PREPARE_GENOME.out.fasta, - ).set { ch_gnomad_out } + params.gnomad, PREPARE_GENOME.out.fasta, + ).set { ch_gnomad } } ch_target_bed = Channel.empty() From 0fd04e429e0cd0c754ed8a55e8482011c2a5655f Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 19 Jan 2022 10:15:42 +0100 Subject: [PATCH 0217/1169] :arrow_down: sv module --- modules.json | 3 ++ modules/nf-core/modules/tiddit/sv/main.nf | 38 ++++++++++++++++ modules/nf-core/modules/tiddit/sv/meta.yml | 51 ++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 modules/nf-core/modules/tiddit/sv/main.nf create mode 100644 modules/nf-core/modules/tiddit/sv/meta.yml diff --git a/modules.json b/modules.json index c03c6521..c7b9aa38 100644 --- a/modules.json +++ b/modules.json @@ -60,6 +60,9 @@ "tiddit/cov": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, + "tiddit/sv": { + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + }, "ucsc/wigtobigwig": { "git_sha": "30e64becaa1e6c807a09a49a6d3d457ff3cf7251" } diff --git a/modules/nf-core/modules/tiddit/sv/main.nf b/modules/nf-core/modules/tiddit/sv/main.nf new file mode 100644 index 00000000..08eecc01 --- /dev/null +++ b/modules/nf-core/modules/tiddit/sv/main.nf @@ -0,0 +1,38 @@ +process TIDDIT_SV { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::tiddit=2.12.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tiddit:2.12.1--py38h1773678_0' : + 'quay.io/biocontainers/tiddit:2.12.1--py38h1773678_0' }" + + input: + tuple val(meta), path(bam) + path fasta + path fai + + output: + tuple val(meta), path("*.vcf") , emit: vcf + tuple val(meta), path("*.ploidy.tab") , emit: ploidy + tuple val(meta), path("*.signals.tab"), emit: signals + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta == "dummy_file.txt" ? "--ref $fasta" : "" + """ + tiddit \\ + --sv \\ + $args \\ + --bam $bam \\ + $reference \\ + -o $prefix + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/tiddit/sv/meta.yml b/modules/nf-core/modules/tiddit/sv/meta.yml new file mode 100644 index 00000000..f788ffa6 --- /dev/null +++ b/modules/nf-core/modules/tiddit/sv/meta.yml @@ -0,0 +1,51 @@ +name: tiddit_sv +description: Identify chromosomal rearrangements. +keywords: + - structural + - variants + - vcf +tools: + - sv: + description: Search for structural variants. + homepage: https://github.com/SciLifeLab/TIDDIT + documentation: https://github.com/SciLifeLab/TIDDIT/blob/master/README.md + doi: 10.12688/f1000research.11168.1 + licence: ['GPL-3.0-or-later'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: Input FASTA file + pattern: "*.{fasta,fa}" + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: vcf + pattern: "*.{vcf}" + - ploidy: + type: file + description: tab + pattern: "*.{ploidy.tab}" + - signals: + type: file + description: tab + pattern: "*.{signals.tab}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@maxulysse" From d5673c3139f9c56140b938afae2a92a453812e57 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 19 Jan 2022 11:17:40 +0100 Subject: [PATCH 0218/1169] integrated tiddit --- conf/modules.config | 9 +++++++-- subworkflows/local/call_structural_variants.nf | 6 +++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 102d38be..4c0bedc8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -129,9 +129,14 @@ process { // CALL_STRUCTURAL_VARIANTS withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA" { publishDir = [ - path: { "${params.outdir}/manta" }, + path: { "${params.outdir}/sv_caller" }, + mode: 'copy', + ] + } + withName: ".*CALL_STRUCTURAL_VARIANTS:TIDDIT_SV" { + publishDir = [ + path: { "${params.outdir}/sv_caller" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } // NF-CORE Subworkflows diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index baaa02ad..217ea9cf 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -4,6 +4,8 @@ include { CALL_SV_MANTA } from './call_sv_manta' +include { TIDDIT_SV } from '../../modules/nf-core/modules/tiddit/sv/main' + workflow CALL_STRUCTURAL_VARIANTS { take: @@ -17,9 +19,11 @@ workflow CALL_STRUCTURAL_VARIANTS { main: ch_versions = Channel.empty() - CALL_SV_MANTA( bam, bai, fasta, fai, case_info, target_bed ) + CALL_SV_MANTA ( bam, bai, fasta, fai, case_info, target_bed ) ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) + TIDDIT_SV ( bam, fasta, fai ) + emit: versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From c2392a51e9f521f03ac40991cb583d74cc0e172b Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 19 Jan 2022 11:23:13 +0100 Subject: [PATCH 0219/1169] forgot to add arg --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 4c0bedc8..28af55eb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -134,6 +134,7 @@ process { ] } withName: ".*CALL_STRUCTURAL_VARIANTS:TIDDIT_SV" { + ext.args = '-p 6' publishDir = [ path: { "${params.outdir}/sv_caller" }, mode: 'copy', From 4b711429ce0f3e64055ded333e1bb7dfb4b644d5 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 19 Jan 2022 11:28:38 +0100 Subject: [PATCH 0220/1169] atmpt 1: fix lint --- subworkflows/local/call_structural_variants.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index 217ea9cf..5a1e6830 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -23,7 +23,7 @@ workflow CALL_STRUCTURAL_VARIANTS { ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) TIDDIT_SV ( bam, fasta, fai ) - + emit: versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 13074bb6d90363c3ee17bab9a45605c494a2b91d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 19 Jan 2022 12:51:23 +0100 Subject: [PATCH 0221/1169] remove conditional for sd --- subworkflows/local/prepare_bed.nf | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index c999dbe2..c706f50d 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -9,8 +9,8 @@ include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/modules/ta workflow CHECK_BED { take: - bed // file: bed file - sd // path: sequence_dictionary + bed // file: bed file + seq_dictionary // path: sequence_dictionary main: tab_out = Channel.empty() @@ -25,10 +25,9 @@ workflow CHECK_BED { } else if ( file(bed, checkIfExists:true) ) { tab_out = TABIX_PBT (ch_bed).gz_tbi } - if (sd) { - interval_list = GATK_BILT (ch_bed, sd).interval_list - GATK_ILT(interval_list) - } + + interval_list = GATK_BILT (ch_bed, seq_dictionary).interval_list + GATK_ILT(interval_list) } emit: From cc0a1263a0aa8cf7b42eece9bbcf87398376ccdd Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 21 Jan 2022 00:03:20 +0100 Subject: [PATCH 0222/1169] rename bait intervals filename --- conf/modules.config | 15 +++++++-------- subworkflows/nf-core/qc_bam.nf | 10 +++++++++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index a0305e46..7fee2cd0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -68,28 +68,29 @@ process { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ - path: { "${params.outdir}/vcf_check" }, + path: { "${params.outdir}/processed_references" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: TABIX_PV { publishDir = [ - path: { "${params.outdir}/vcf_check" }, + path: { "${params.outdir}/processed_references" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: 'TABIX_PT|TABIX_PBT' { publishDir = [ - path: { "${params.outdir}/bed_check" }, + path: { "${params.outdir}/processed_references" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: 'GATK_BILT' { + ext.prefix = { "${meta.id}_target" } publishDir = [ - path: { "${params.outdir}/bed_check" }, + path: { "${params.outdir}/processed_references" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -97,14 +98,12 @@ process { withName: 'GATK_ILT' { ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' publishDir = [ - path: { "${params.outdir}/bed_check" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } withName: 'CAT_CAT_BAIT' { publishDir = [ - path: { "${params.outdir}/bed_check" }, + path: { "${params.outdir}/processed_references" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 7dbc6991..576b509a 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -28,7 +28,15 @@ workflow QC_BAM { ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions) // COLLECT HS METRICS - CAT_CAT_BAIT ( bait_intervals, "bait.intervals_list" ) + bait_intervals_out = bait_intervals + .collect { it[0] + .toString() + .split("_split")[0] + .split("/")[-1] + "_bait.intervals_list" + } + .flatten() + + CAT_CAT_BAIT ( bait_intervals, bait_intervals_out ) PICARD_COLLECTHSMETRICS ( bam, fasta, fai, CAT_CAT_BAIT.out.file_out, target_intervals ) ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions) From bd9c81dd319b6b84ba0058a41e30a5a835600ff0 Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Mon, 24 Jan 2022 13:27:28 +0100 Subject: [PATCH 0223/1169] Merge remote-tracking branch 'upstream/dev' into add_default_variant_catalog --- bin/check_input_vcf.py | 47 ------------- conf/genomes.config | 4 +- conf/modules.config | 34 +++++++++- conf/test.config | 1 + modules.json | 15 +++++ modules/local/check_input_vcf.nf | 25 ++++++- modules/nf-core/modules/cat/cat/main.nf | 45 +++++++++++++ modules/nf-core/modules/cat/cat/meta.yml | 34 ++++++++++ .../modules/gatk4/bedtointervallist/main.nf | 39 +++++++++++ .../modules/gatk4/bedtointervallist/meta.yml | 40 +++++++++++ .../gatk4/createsequencedictionary/main.nf | 37 +++++++++++ .../gatk4/createsequencedictionary/meta.yml | 32 +++++++++ .../modules/gatk4/intervallisttools/main.nf | 51 ++++++++++++++ .../modules/gatk4/intervallisttools/meta.yml | 47 +++++++++++++ .../modules/picard/collecthsmetrics/main.nf | 48 ++++++++++++++ .../modules/picard/collecthsmetrics/meta.yml | 66 +++++++++++++++++++ subworkflows/local/prepare_bed.nf | 12 +++- subworkflows/local/prepare_genome.nf | 5 +- subworkflows/local/prepare_vcf.nf | 5 +- subworkflows/nf-core/qc_bam.nf | 25 ++++++- workflows/raredisease.nf | 14 ++-- 21 files changed, 557 insertions(+), 69 deletions(-) delete mode 100755 bin/check_input_vcf.py create mode 100644 modules/nf-core/modules/cat/cat/main.nf create mode 100644 modules/nf-core/modules/cat/cat/meta.yml create mode 100644 modules/nf-core/modules/gatk4/bedtointervallist/main.nf create mode 100644 modules/nf-core/modules/gatk4/bedtointervallist/meta.yml create mode 100644 modules/nf-core/modules/gatk4/createsequencedictionary/main.nf create mode 100644 modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml create mode 100644 modules/nf-core/modules/gatk4/intervallisttools/main.nf create mode 100644 modules/nf-core/modules/gatk4/intervallisttools/meta.yml create mode 100644 modules/nf-core/modules/picard/collecthsmetrics/main.nf create mode 100644 modules/nf-core/modules/picard/collecthsmetrics/meta.yml diff --git a/bin/check_input_vcf.py b/bin/check_input_vcf.py deleted file mode 100755 index 9109605a..00000000 --- a/bin/check_input_vcf.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import gzip -import argparse - -def parse_args(args=None): - Description = "Check that input vcf file has been normalized." - Epilog = "Example usage: python check_input_vcf.py --INPUT_VCF --OUTPUT " - - parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument("--INPUT_VCF", help="Input vcf file.") - parser.add_argument("--OUTPUT", help="Output file containing a list of files that need to be normalized.") - return parser.parse_args(args) - - -def check_vcf(file_in, file_out): - """ - This function checks that an input vcf file has been normalized with bcftools, and if not, it writes its basename and the filename - to a text file - - """ - - with open(file_out,'w') as out: - if file_in.endswith(".gz"): - base = os.path.basename(file_in).rsplit(".",2)[0] - out.write("id,filepath,processed\n") - with gzip.open(file_in,'rt') as vcf: - for line in vcf: - if line.startswith("##bcftools_norm"): - out.write(base + "," + os.path.abspath(file_in) + ",yes\n") - break - elif not line.startswith("#"): - out.write(base + "," + os.path.abspath(file_in) + ",no\n") - break - else: - print("Please compress %s using bgzip" %file_in ) - - -def main(args=None): - args = parse_args(args) - check_vcf(args.INPUT_VCF, args.OUTPUT) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/conf/genomes.config b/conf/genomes.config index fc8c4aa6..3a72deb5 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -16,7 +16,7 @@ params { bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" - target_bed = "" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" @@ -24,7 +24,7 @@ params { bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" - target_bed = "${params.local_genomes}/twistexomerefseq_9.1_hg19_design.bed.gz" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" } } } diff --git a/conf/modules.config b/conf/modules.config index 102d38be..7fee2cd0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -68,14 +68,42 @@ process { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ - path: { "${params.outdir}/vcf_check" }, + path: { "${params.outdir}/processed_references" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'TABIX_PV|TABIX_PT|TABIX_PBT' { + withName: TABIX_PV { publishDir = [ - path: { "${params.outdir}/vcf_check" }, + path: { "${params.outdir}/processed_references" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'TABIX_PT|TABIX_PBT' { + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'GATK_BILT' { + ext.prefix = { "${meta.id}_target" } + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'GATK_ILT' { + ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' + publishDir = [ + enabled: false + ] + } + withName: 'CAT_CAT_BAIT' { + publishDir = [ + path: { "${params.outdir}/processed_references" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/conf/test.config b/conf/test.config index 12b3c1f9..fa041a02 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,4 +31,5 @@ params { // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' + target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/target_chr20.bed' } diff --git a/modules.json b/modules.json index 29d225d7..bcc0692f 100644 --- a/modules.json +++ b/modules.json @@ -12,6 +12,9 @@ "bwamem2/mem": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, + "cat/cat": { + "git_sha": "c4549c0ecd1b02473471b507fd88a9fd5289d91c" + }, "custom/dumpsoftwareversions": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, @@ -24,12 +27,24 @@ "fastqc": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, + "gatk4/bedtointervallist": { + "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" + }, + "gatk4/createsequencedictionary": { + "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" + }, + "gatk4/intervallisttools": { + "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" + }, "glnexus": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "multiqc": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, + "picard/collecthsmetrics": { + "git_sha": "e751e5040af57e1b4e06ed4e0f3efe6de25c1683" + }, "picard/collectmultiplemetrics": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index 471e052f..8afcb4b3 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -14,8 +14,27 @@ process CHECK_INPUT_VCF { script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ """ - check_input_vcf.py \\ - --INPUT_VCF $vcf \\ - --OUTPUT checked_vcfs.txt + export INPUT_FILE=${vcf} + export OUTPUT_FILE="checked_vcfs.txt" + + python3 < $file_out + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/cat/cat/meta.yml b/modules/nf-core/modules/cat/cat/meta.yml new file mode 100644 index 00000000..b3f370ee --- /dev/null +++ b/modules/nf-core/modules/cat/cat/meta.yml @@ -0,0 +1,34 @@ +name: cat_cat +description: A module for concatenation of gzipped or uncompressed files +keywords: + - concatenate + - gzip + - cat +tools: + - cat: + description: Just concatenation + homepage: None + documentation: https://man7.org/linux/man-pages/man1/cat.1.html + tool_dev_url: None + licence: ['GPL-3.0-or-later'] +input: + - files_in: + type: file + description: List of compressed / uncompressed files + pattern: "*" + - file_out: + type: value + description: Full name of output file with or without .gz extension + +output: + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - file_out: + type: file + description: Concatenated file. Will be gzipped if file_out ends with ".gz" + pattern: "${file_out}" + +authors: + - "@erikrikarddaniel" diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf new file mode 100644 index 00000000..37f46f48 --- /dev/null +++ b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf @@ -0,0 +1,39 @@ +process GATK4_BEDTOINTERVALLIST { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + + input: + tuple val(meta), path(bed) + path sequence_dict + + output: + tuple val(meta), path('*.interval_list'), emit: interval_list + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK BedToIntervalList] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" BedToIntervalList \\ + -I $bed \\ + -SD $sequence_dict \\ + -O ${prefix}.interval_list \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml b/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml new file mode 100644 index 00000000..910f9552 --- /dev/null +++ b/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml @@ -0,0 +1,40 @@ +name: gatk4_bedtointervallist +description: Creates an interval list from a bed file and a reference dict +keywords: + - bed + - interval list +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ['Apache-2.0'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - bed: + type: file + description: Input bed file + pattern: "*.bed" + - dict: + type: file + description: Sequence dictionary + pattern: "*.dict" +output: + - interval_list: + type: file + description: gatk interval list file + pattern: "*.interval_list" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@kevinmenden" diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf new file mode 100644 index 00000000..2cbd8948 --- /dev/null +++ b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf @@ -0,0 +1,37 @@ +process GATK4_CREATESEQUENCEDICTIONARY { + tag "$fasta" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + + input: + path fasta + + output: + path "*.dict" , emit: dict + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def avail_mem = 6 + if (!task.memory) { + log.info '[GATK CreateSequenceDictionary] Available memory not known - defaulting to 6GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" \\ + CreateSequenceDictionary \\ + --REFERENCE $fasta \\ + --URI $fasta \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml b/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml new file mode 100644 index 00000000..54f479b3 --- /dev/null +++ b/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml @@ -0,0 +1,32 @@ +name: gatk4_createsequencedictionary +description: Creates a sequence dictionary for a reference sequence +keywords: + - dictionary + - fasta +tools: + - gatk: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ['Apache-2.0'] + +input: + - fasta: + type: file + description: Input fasta file + pattern: "*.{fasta,fa}" +output: + - dict: + type: file + description: gatk dictionary file + pattern: "*.{dict}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@maxulysse" diff --git a/modules/nf-core/modules/gatk4/intervallisttools/main.nf b/modules/nf-core/modules/gatk4/intervallisttools/main.nf new file mode 100644 index 00000000..17412160 --- /dev/null +++ b/modules/nf-core/modules/gatk4/intervallisttools/main.nf @@ -0,0 +1,51 @@ +process GATK4_INTERVALLISTTOOLS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + + input: + tuple val(meta), path(interval_list) + + output: + tuple val(meta), path("*_split/*/*.interval_list"), emit: interval_list + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK IntervalListTools] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + + mkdir ${prefix}_split + + gatk --java-options "-Xmx${avail_mem}g" \\ + IntervalListTools \\ + -I ${interval_list} \\ + -O ${prefix}_split \\ + $args + + python3 < versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/intervallisttools/meta.yml b/modules/nf-core/modules/gatk4/intervallisttools/meta.yml new file mode 100644 index 00000000..9e2d994f --- /dev/null +++ b/modules/nf-core/modules/gatk4/intervallisttools/meta.yml @@ -0,0 +1,47 @@ +name: gatk4_intervallisttools + +description: Splits the interval list file into unique, equally-sized interval files and place it under a directory +keywords: + - sort + - bed + - interval list +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ['Apache-2.0'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + + - interval_list: + type: file + description: Interval list file + pattern: "*.interval_list" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - interval_list: + type: file + description: Interval list files + pattern: "*.interval_list" + +authors: + - "@praveenraj2018" diff --git a/modules/nf-core/modules/picard/collecthsmetrics/main.nf b/modules/nf-core/modules/picard/collecthsmetrics/main.nf new file mode 100644 index 00000000..ae3e4d96 --- /dev/null +++ b/modules/nf-core/modules/picard/collecthsmetrics/main.nf @@ -0,0 +1,48 @@ +process PICARD_COLLECTHSMETRICS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + + input: + tuple val(meta), path(bam) + path fasta + path fai + path bait_intervals + path target_intervals + + output: + tuple val(meta), path("*collecthsmetrics.txt"), emit: hs_metrics + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "-R $fasta" : "" + + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard CollectHsMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + CollectHsMetrics \\ + $args \\ + $reference \\ + -BAIT_INTERVALS $bait_intervals \\ + -TARGET_INTERVALS $target_intervals \\ + -INPUT $bam \\ + -OUTPUT ${prefix}_collecthsmetrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard CollectHsMetrics --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/picard/collecthsmetrics/meta.yml b/modules/nf-core/modules/picard/collecthsmetrics/meta.yml new file mode 100644 index 00000000..4b94909f --- /dev/null +++ b/modules/nf-core/modules/picard/collecthsmetrics/meta.yml @@ -0,0 +1,66 @@ +name: picard_collecthsmetrics +description: Collects hybrid-selection (HS) metrics for a SAM or BAM file. +keywords: + - alignment + - metrics + - statistics + - insert + - hybrid-selection + - quality + - bam +tools: + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ + tool_dev_url: https://github.com/broadinstitute/picard/ + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: An aligned BAM/SAM file + pattern: "*.{bam,sam}" + - fasta: + type: file + description: | + A reference file to calculate dropout metrics measuring reduced representation of reads. + Optional input. + pattern: "*.fasta" + - fai: + type: file + description: Index of FASTA file. Only needed when fasta is supplied. + pattern: "*.fai" + - bait_intervals: + type: file + description: An interval list file that contains the locations of the baits used. + pattern: "baits.interval_list" + - target_intervals: + type: file + description: An interval list file that contains the locations of the targets. + pattern: "targets.interval_list" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - hs_metrics: + type: file + description: The metrics file. + pattern: "*_collecthsmetrics.txt" + +authors: + - "@projectoriented" diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index e855373f..c706f50d 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -2,12 +2,15 @@ // Prepare reference bed files // +include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/modules/gatk4/bedtointervallist/main' +include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/modules/gatk4/intervallisttools/main' include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/modules/tabix/tabix/main' include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/modules/tabix/bgziptabix/main' workflow CHECK_BED { take: - bed // file: bed file + bed // file: bed file + seq_dictionary // path: sequence_dictionary main: tab_out = Channel.empty() @@ -22,8 +25,13 @@ workflow CHECK_BED { } else if ( file(bed, checkIfExists:true) ) { tab_out = TABIX_PBT (ch_bed).gz_tbi } + + interval_list = GATK_BILT (ch_bed, seq_dictionary).interval_list + GATK_ILT(interval_list) } emit: - idx = tab_out + bed = tab_out + target_intervals = interval_list.collect{it[1]} + bait_intervals = GATK_ILT.out.interval_list.collect{it[1]} } diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 37dffdc5..22fd0082 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -4,7 +4,7 @@ include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' - +include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD} from '../../modules/nf-core/modules/gatk4/createsequencedictionary/main' include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' workflow PREPARE_GENOME { @@ -47,6 +47,7 @@ workflow PREPARE_GENOME { ch_chrom_sizes = GET_CHROM_SIZES ( ch_fai ).sizes ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) + ch_sequence_dict = GATK_SD ( ch_fasta ).dict emit: @@ -55,6 +56,6 @@ workflow PREPARE_GENOME { bwamem2_index = ch_bwamem2_index // path: bwamem2/index variant_catalog = ch_variant_catalog // path: variant_catalog.json chrom_sizes = ch_chrom_sizes // path: chrom.sizes - + sequence_dict = ch_sequence_dict versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index f19b9095..0fc8471a 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -9,11 +9,12 @@ include { TABIX_TABIX as TABIX_PV } from '../../modules/nf-core/modules/tabix/ta workflow CHECK_VCF { take: - vcf // channel: [ vcf file ] + vcf // file: vcf file fasta // path(fasta) main: - CHECK_INPUT_VCF( vcf ) + vcf_file = file(vcf) + CHECK_INPUT_VCF( vcf_file ) .splitCsv( header:true ) .map { row -> def id = "${row.id}" diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 3ed2ce78..576b509a 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -3,7 +3,9 @@ // include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' +include { PICARD_COLLECTHSMETRICS } from '../../modules/nf-core/modules/picard/collecthsmetrics/main' include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' +include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/modules/cat/cat/main' include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' @@ -11,9 +13,12 @@ include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwi workflow QC_BAM { take: - bam // channel: [ val(meta), path(bam) ] - fasta // path: genome.fasta - chrom_sizes // path: chrom.sizes + bam // channel: [ val(meta), path(bam) ] + fasta // path: genome.fasta + fai // path: genome.fasta.fai + bait_intervals // path: bait.intervals_list + target_intervals // path: target.intervals_list + chrom_sizes // path: chrom.sizes main: ch_versions = Channel.empty() @@ -22,6 +27,19 @@ workflow QC_BAM { PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta ) ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions) + // COLLECT HS METRICS + bait_intervals_out = bait_intervals + .collect { it[0] + .toString() + .split("_split")[0] + .split("/")[-1] + "_bait.intervals_list" + } + .flatten() + + CAT_CAT_BAIT ( bait_intervals, bait_intervals_out ) + PICARD_COLLECTHSMETRICS ( bam, fasta, fai, CAT_CAT_BAIT.out.file_out, target_intervals ) + ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions) + // QUALIMAP BAMQC gff = [] use_gff = false @@ -36,6 +54,7 @@ workflow QC_BAM { emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] + hs_metrics = PICARD_COLLECTHSMETRICS.out.hs_metrics // channel: [ val(meta), path(metrics) ] qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5f90650e..fcb333d5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -104,17 +104,18 @@ workflow RAREDISEASE { PREPARE_GENOME ( params.fasta, params.variant_catalog ) ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) + ch_gnomad = Channel.empty() if (params.gnomad) { - ch_gnomad_in = Channel.fromPath(params.gnomad) CHECK_VCF( - ch_gnomad_in, PREPARE_GENOME.out.fasta, - ).set { ch_gnomad_out } + params.gnomad, PREPARE_GENOME.out.fasta, + ).set { ch_gnomad } } ch_target_bed = Channel.empty() if (params.target_bed) { CHECK_BED( - params.target_bed + params.target_bed, + PREPARE_GENOME.out.sequence_dict ).set { ch_target_bed } } @@ -135,6 +136,9 @@ workflow RAREDISEASE { QC_BAM ( ch_marked_bam, PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.fai, + CHECK_BED.out.bait_intervals, + CHECK_BED.out.target_intervals, PREPARE_GENOME.out.chrom_sizes ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) @@ -163,7 +167,7 @@ workflow RAREDISEASE { PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, INPUT_CHECK.out.ch_case_info, - ch_target_bed + ch_target_bed.bed ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) From 9e714937c0502b9745f9231bc569e2cab54a90b9 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 25 Jan 2022 13:16:56 +0100 Subject: [PATCH 0224/1169] :arrow_down: module --- modules.json | 3 ++ modules/nf-core/modules/vcfanno/main.nf | 34 ++++++++++++++ modules/nf-core/modules/vcfanno/meta.yml | 56 ++++++++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 modules/nf-core/modules/vcfanno/main.nf create mode 100644 modules/nf-core/modules/vcfanno/meta.yml diff --git a/modules.json b/modules.json index 57a14a4a..df322e74 100644 --- a/modules.json +++ b/modules.json @@ -83,6 +83,9 @@ }, "ucsc/wigtobigwig": { "git_sha": "30e64becaa1e6c807a09a49a6d3d457ff3cf7251" + }, + "vcfanno": { + "git_sha": "435ca4100ac07d1932cd0cb38226b7c4b2109fc1" } } } diff --git a/modules/nf-core/modules/vcfanno/main.nf b/modules/nf-core/modules/vcfanno/main.nf new file mode 100644 index 00000000..421fc0fa --- /dev/null +++ b/modules/nf-core/modules/vcfanno/main.nf @@ -0,0 +1,34 @@ +process VCFANNO { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::vcfanno=0.3.3" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/vcfanno:0.3.3--h9ee0642_0': + 'quay.io/biocontainers/vcfanno:0.3.3--h9ee0642_0' }" + + input: + tuple val(meta), path(vcf), path(tbi) + path vcfanno_config + + output: + tuple val(meta), path("*.vcf"), emit: vcf + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + vcfanno \\ + -p $task.cpus \\ + $args \\ + $vcfanno_config \\ + $vcf \\ + > ${prefix}_annotated.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + vcfanno: \$(echo \$(vcfanno 2>&1 | grep version | cut -f3 -d' ' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/vcfanno/meta.yml b/modules/nf-core/modules/vcfanno/meta.yml new file mode 100644 index 00000000..bbd2ab16 --- /dev/null +++ b/modules/nf-core/modules/vcfanno/meta.yml @@ -0,0 +1,56 @@ +name: vcfanno +description: quickly annotate your VCF with any number of INFO fields from any number of VCFs or BED files +keywords: + - vcf + - bed + - annotate + - variant +tools: + - vcfanno: + description: annotate a VCF with other VCFs/BEDs/tabixed files + homepage: None + documentation: https://github.com/brentp/vcfanno#vcfanno + tool_dev_url: https://github.com/brentp/vcfanno + doi: "10.1186/s13059-016-0973-5" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: query VCF file + pattern: "*.{vcf.gz}" + - vcf.tbi: + type: file + description: query VCF file index + pattern: "*.{vcf.gz.tbi}" + - vcfanno_config: + type: file + description: | + A simple configuration file is used to specify both the source files + and the set of attributes (in the case of VCF) + or columns (in the case of BED or other tab-delimited formats) + that should be added to the query file. + pattern: "*.{toml}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: Annotated VCF file + pattern: "*.{vcf}" + +authors: + - "@projectoriented" From 724b4b0c586817c59f764b1dce351364746fb256 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 26 Jan 2022 09:48:10 +0100 Subject: [PATCH 0225/1169] :arrow_down: bcftools/view, boilerplate --- modules.json | 3 + modules/nf-core/modules/bcftools/view/main.nf | 41 ++++++++++++ .../nf-core/modules/bcftools/view/meta.yml | 63 +++++++++++++++++++ subworkflows/nf-core/annotation_vcfanno.nf | 14 +++++ 4 files changed, 121 insertions(+) create mode 100644 modules/nf-core/modules/bcftools/view/main.nf create mode 100644 modules/nf-core/modules/bcftools/view/meta.yml create mode 100644 subworkflows/nf-core/annotation_vcfanno.nf diff --git a/modules.json b/modules.json index df322e74..907800ab 100644 --- a/modules.json +++ b/modules.json @@ -6,6 +6,9 @@ "bcftools/norm": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, + "bcftools/view": { + "git_sha": "e751e5040af57e1b4e06ed4e0f3efe6de25c1683" + }, "bwamem2/index": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, diff --git a/modules/nf-core/modules/bcftools/view/main.nf b/modules/nf-core/modules/bcftools/view/main.nf new file mode 100644 index 00000000..7056ecdb --- /dev/null +++ b/modules/nf-core/modules/bcftools/view/main.nf @@ -0,0 +1,41 @@ +process BCFTOOLS_VIEW { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? 'bioconda::bcftools=1.14' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0' : + 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" + + input: + tuple val(meta), path(vcf), path(index) + path(regions) + path(targets) + path(samples) + + output: + tuple val(meta), path("*.gz") , emit: vcf + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def regions_file = regions ? "--regions-file ${regions}" : "" + def targets_file = targets ? "--targets-file ${targets}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" + """ + bcftools view \\ + --output ${prefix}.vcf.gz \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + $args \\ + --threads $task.cpus \\ + ${vcf} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/bcftools/view/meta.yml b/modules/nf-core/modules/bcftools/view/meta.yml new file mode 100644 index 00000000..df5b0f8f --- /dev/null +++ b/modules/nf-core/modules/bcftools/view/meta.yml @@ -0,0 +1,63 @@ +name: bcftools_view +description: View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF +keywords: + - variant calling + - view + - bcftools + - VCF + +tools: + - view: + description: | + View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + The vcf file to be inspected. + e.g. 'file.vcf' + - index: + type: file + description: | + The tab index for the VCF file to be inspected. + e.g. 'file.tbi' + - regions: + type: file + description: | + Optionally, restrict the operation to regions listed in this file. + e.g. 'file.vcf' + - targets: + type: file + description: | + Optionally, restrict the operation to regions listed in this file (doesn't rely upon index files) + e.g. 'file.vcf' + - samples: + type: file + description: | + Optional, file of sample names to be included or excluded. + e.g. 'file.tsv' +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF normalized output file + pattern: "*.{vcf.gz}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@abhi18av" diff --git a/subworkflows/nf-core/annotation_vcfanno.nf b/subworkflows/nf-core/annotation_vcfanno.nf new file mode 100644 index 00000000..c3b6d235 --- /dev/null +++ b/subworkflows/nf-core/annotation_vcfanno.nf @@ -0,0 +1,14 @@ +// +// Annotate with VCFanno +// + +include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' +include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' + +workflow ANNOTATION_VCFANNO { + take: + main: + ch_versions = Channel.empty() + emit: + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} \ No newline at end of file From db987c64c72f189f07a56b57aa7bdc9590bde728 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 26 Jan 2022 09:52:51 +0100 Subject: [PATCH 0226/1169] dv no longer local --- subworkflows/{local => nf-core}/call_snv_deepvariant.nf | 8 ++++---- workflows/raredisease.nf | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) rename subworkflows/{local => nf-core}/call_snv_deepvariant.nf (89%) diff --git a/subworkflows/local/call_snv_deepvariant.nf b/subworkflows/nf-core/call_snv_deepvariant.nf similarity index 89% rename from subworkflows/local/call_snv_deepvariant.nf rename to subworkflows/nf-core/call_snv_deepvariant.nf index e14958e8..efcbd495 100644 --- a/subworkflows/local/call_snv_deepvariant.nf +++ b/subworkflows/nf-core/call_snv_deepvariant.nf @@ -10,10 +10,10 @@ include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/modules/tabix/ta workflow CALL_SNV_DEEPVARIANT { take: - bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // path(fasta) - fai // path(fai) - ch_case_info // channel: [ case_id ] + bam // channel: [ val(meta), path(bam), path(bai) ] + fasta // path(fasta) + fai // path(fai) + ch_case_info // channel: [ case_id ] main: ch_versions = Channel.empty() diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8e0b524e..a19abb1f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -62,6 +62,7 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' +include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' include { QC_BAM } from '../subworkflows/nf-core/qc_bam' // @@ -70,7 +71,6 @@ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' -include { CALL_SNV_DEEPVARIANT } from '../subworkflows/local/call_snv_deepvariant' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/local/call_structural_variants' /* From c317e02056ec107524271aa3f2a1a5fd4a82e165 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 7 Feb 2022 10:08:58 +0100 Subject: [PATCH 0227/1169] populate take directive --- subworkflows/nf-core/annotation_vcfanno.nf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/subworkflows/nf-core/annotation_vcfanno.nf b/subworkflows/nf-core/annotation_vcfanno.nf index c3b6d235..a288aa35 100644 --- a/subworkflows/nf-core/annotation_vcfanno.nf +++ b/subworkflows/nf-core/annotation_vcfanno.nf @@ -7,8 +7,12 @@ include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main workflow ANNOTATION_VCFANNO { take: + vcf // channel: [ val(meta), path(vcf), path(tbi) ] + toml_config // channel: path(.toml) + main: ch_versions = Channel.empty() + emit: versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } \ No newline at end of file From 07fb5f8c299f3b135a34586ed9383d0de3cb2954 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 8 Feb 2022 14:39:45 +0100 Subject: [PATCH 0228/1169] using vcfanno local --- modules.json | 3 --- .../{nf-core/modules => local}/vcfanno/main.nf | 10 ++++++++-- .../{nf-core/modules => local}/vcfanno/meta.yml | 16 ++++++++-------- subworkflows/nf-core/annotation_vcfanno.nf | 5 +++-- 4 files changed, 19 insertions(+), 15 deletions(-) rename modules/{nf-core/modules => local}/vcfanno/main.nf (85%) rename modules/{nf-core/modules => local}/vcfanno/meta.yml (76%) diff --git a/modules.json b/modules.json index 907800ab..bc3d8e7e 100644 --- a/modules.json +++ b/modules.json @@ -86,9 +86,6 @@ }, "ucsc/wigtobigwig": { "git_sha": "30e64becaa1e6c807a09a49a6d3d457ff3cf7251" - }, - "vcfanno": { - "git_sha": "435ca4100ac07d1932cd0cb38226b7c4b2109fc1" } } } diff --git a/modules/nf-core/modules/vcfanno/main.nf b/modules/local/vcfanno/main.nf similarity index 85% rename from modules/nf-core/modules/vcfanno/main.nf rename to modules/local/vcfanno/main.nf index 421fc0fa..6608d22e 100644 --- a/modules/nf-core/modules/vcfanno/main.nf +++ b/modules/local/vcfanno/main.nf @@ -9,20 +9,26 @@ process VCFANNO { input: tuple val(meta), path(vcf), path(tbi) - path vcfanno_config + path resource_dir output: tuple val(meta), path("*.vcf"), emit: vcf path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ + ln -s $resource_dir/* \$(pwd) + toml=\$(echo *.toml) + vcfanno \\ -p $task.cpus \\ $args \\ - $vcfanno_config \\ + \$toml \\ $vcf \\ > ${prefix}_annotated.vcf diff --git a/modules/nf-core/modules/vcfanno/meta.yml b/modules/local/vcfanno/meta.yml similarity index 76% rename from modules/nf-core/modules/vcfanno/meta.yml rename to modules/local/vcfanno/meta.yml index bbd2ab16..b2caaefc 100644 --- a/modules/nf-core/modules/vcfanno/meta.yml +++ b/modules/local/vcfanno/meta.yml @@ -5,6 +5,8 @@ keywords: - bed - annotate - variant + - lua + - toml tools: - vcfanno: description: annotate a VCF with other VCFs/BEDs/tabixed files @@ -24,18 +26,16 @@ input: type: file description: query VCF file pattern: "*.{vcf.gz}" - - vcf.tbi: + - vcf_tabix: type: file - description: query VCF file index + description: tabix index of query VCF pattern: "*.{vcf.gz.tbi}" - - vcfanno_config: + - resource_dir: type: file description: | - A simple configuration file is used to specify both the source files - and the set of attributes (in the case of VCF) - or columns (in the case of BED or other tab-delimited formats) - that should be added to the query file. - pattern: "*.{toml}" + This directory must contain one TOML config and referenced files in that config, + and the corresponding indicies e.g. exac.vcf.gz + exac.vcf.gz.tbi, + with exception to the lua file. output: - meta: diff --git a/subworkflows/nf-core/annotation_vcfanno.nf b/subworkflows/nf-core/annotation_vcfanno.nf index a288aa35..0227d695 100644 --- a/subworkflows/nf-core/annotation_vcfanno.nf +++ b/subworkflows/nf-core/annotation_vcfanno.nf @@ -2,13 +2,14 @@ // Annotate with VCFanno // -include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' +include { VCFANNO } from '../../modules/local/vcfanno/main' + include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' workflow ANNOTATION_VCFANNO { take: vcf // channel: [ val(meta), path(vcf), path(tbi) ] - toml_config // channel: path(.toml) + resource_dir // channel: path(resource_dir) main: ch_versions = Channel.empty() From 980f85b195f8e93c2e4ce2e24f8da7b7e07f5222 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 8 Feb 2022 17:19:55 +0100 Subject: [PATCH 0229/1169] vcfanno works but waiting for bcftools annot and figure solution for resource_dir --- conf/modules.config | 6 ++++++ .../annotation_vcfanno.nf => local/annotate_vcfanno.nf} | 7 ++++--- workflows/raredisease.nf | 6 ++++++ 3 files changed, 16 insertions(+), 3 deletions(-) rename subworkflows/{nf-core/annotation_vcfanno.nf => local/annotate_vcfanno.nf} (75%) diff --git a/conf/modules.config b/conf/modules.config index 7cbb08f1..338b9439 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -168,6 +168,12 @@ process { mode: 'copy', ] } + // ANNOTATE_VCFANNO + withName: "VCFANNO" { + publishDir = [ + path: { "${params.outdir}/variant_annotation" }, + ] + } // NF-CORE Subworkflows // ALIGN_BWAMEM2 withName: BWAMEM2_MEM { diff --git a/subworkflows/nf-core/annotation_vcfanno.nf b/subworkflows/local/annotate_vcfanno.nf similarity index 75% rename from subworkflows/nf-core/annotation_vcfanno.nf rename to subworkflows/local/annotate_vcfanno.nf index 0227d695..3c7d40bb 100644 --- a/subworkflows/nf-core/annotation_vcfanno.nf +++ b/subworkflows/local/annotate_vcfanno.nf @@ -4,9 +4,7 @@ include { VCFANNO } from '../../modules/local/vcfanno/main' -include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' - -workflow ANNOTATION_VCFANNO { +workflow ANNOTATE_VCFANNO { take: vcf // channel: [ val(meta), path(vcf), path(tbi) ] resource_dir // channel: path(resource_dir) @@ -14,6 +12,9 @@ workflow ANNOTATION_VCFANNO { main: ch_versions = Channel.empty() + VCFANNO (vcf, resource_dir) + ch_versions = ch_versions.mix(VCFANNO.out.versions) + emit: versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } \ No newline at end of file diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 685413aa..2ba0cb9f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -72,6 +72,7 @@ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/local/call_structural_variants' +include { ANNOTATE_VCFANNO } from '../subworkflows/local/annotate_vcfanno' /* ======================================================================================== @@ -171,6 +172,11 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) + // STEP 3: VARIANT ANNOTATION + ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) + ANNOTATE_VCFANNO ( ch_dv_vcf, file("/home/mei.wu/nextflow/nf-core/vcfanno_resource_dir") ) + ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) + // // MODULE: Pipeline reporting // From 28bcbbcfd48d6ef8fab7361493b39e0aec2c2350 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 8 Feb 2022 17:23:10 +0100 Subject: [PATCH 0230/1169] rm'd bcftools/view bc thought it was annotate --- modules.json | 3 - modules/nf-core/modules/bcftools/view/main.nf | 41 ------------ .../nf-core/modules/bcftools/view/meta.yml | 63 ------------------- 3 files changed, 107 deletions(-) delete mode 100644 modules/nf-core/modules/bcftools/view/main.nf delete mode 100644 modules/nf-core/modules/bcftools/view/meta.yml diff --git a/modules.json b/modules.json index bc3d8e7e..57a14a4a 100644 --- a/modules.json +++ b/modules.json @@ -6,9 +6,6 @@ "bcftools/norm": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, - "bcftools/view": { - "git_sha": "e751e5040af57e1b4e06ed4e0f3efe6de25c1683" - }, "bwamem2/index": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, diff --git a/modules/nf-core/modules/bcftools/view/main.nf b/modules/nf-core/modules/bcftools/view/main.nf deleted file mode 100644 index 7056ecdb..00000000 --- a/modules/nf-core/modules/bcftools/view/main.nf +++ /dev/null @@ -1,41 +0,0 @@ -process BCFTOOLS_VIEW { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? 'bioconda::bcftools=1.14' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0' : - 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" - - input: - tuple val(meta), path(vcf), path(index) - path(regions) - path(targets) - path(samples) - - output: - tuple val(meta), path("*.gz") , emit: vcf - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def regions_file = regions ? "--regions-file ${regions}" : "" - def targets_file = targets ? "--targets-file ${targets}" : "" - def samples_file = samples ? "--samples-file ${samples}" : "" - """ - bcftools view \\ - --output ${prefix}.vcf.gz \\ - ${regions_file} \\ - ${targets_file} \\ - ${samples_file} \\ - $args \\ - --threads $task.cpus \\ - ${vcf} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/bcftools/view/meta.yml b/modules/nf-core/modules/bcftools/view/meta.yml deleted file mode 100644 index df5b0f8f..00000000 --- a/modules/nf-core/modules/bcftools/view/meta.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: bcftools_view -description: View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF -keywords: - - variant calling - - view - - bcftools - - VCF - -tools: - - view: - description: | - View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF - homepage: http://samtools.github.io/bcftools/bcftools.html - documentation: http://www.htslib.org/doc/bcftools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: | - The vcf file to be inspected. - e.g. 'file.vcf' - - index: - type: file - description: | - The tab index for the VCF file to be inspected. - e.g. 'file.tbi' - - regions: - type: file - description: | - Optionally, restrict the operation to regions listed in this file. - e.g. 'file.vcf' - - targets: - type: file - description: | - Optionally, restrict the operation to regions listed in this file (doesn't rely upon index files) - e.g. 'file.vcf' - - samples: - type: file - description: | - Optional, file of sample names to be included or excluded. - e.g. 'file.tsv' -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: VCF normalized output file - pattern: "*.{vcf.gz}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@abhi18av" From 8b61340598680a13459cb6464d8d246844c5aa27 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Feb 2022 09:58:04 +0100 Subject: [PATCH 0231/1169] install svdb/merge --- modules.json | 3 ++ modules/nf-core/modules/svdb/merge/main.nf | 52 +++++++++++++++++++++ modules/nf-core/modules/svdb/merge/meta.yml | 39 ++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 modules/nf-core/modules/svdb/merge/main.nf create mode 100644 modules/nf-core/modules/svdb/merge/meta.yml diff --git a/modules.json b/modules.json index 57a14a4a..ddc5d098 100644 --- a/modules.json +++ b/modules.json @@ -69,6 +69,9 @@ "samtools/stats": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, + "svdb/merge": { + "git_sha": "f44e6c74b4c51c5e49bc91e3d9d225544b5c1685" + }, "tabix/bgziptabix": { "git_sha": "e22966ce74340cb671576143e5fdbbd71670cffa" }, diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf new file mode 100644 index 00000000..1f479ea4 --- /dev/null +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -0,0 +1,52 @@ +process SVDB_MERGE { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::svdb=2.5.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/svdb:2.5.0--py39hcbe4a3b_0': + 'quay.io/biocontainers/svdb:2.5.0--py39hcbe4a3b_0' }" + + input: + tuple val(meta), path(vcfs) + val (priority) + + output: + tuple val(meta), path("*_sv_merge.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def input = "" + for (int index = 0; index < vcfs.size(); index++) { + input += " ${vcfs[index]}:${priority[index]}" + } + """ + svdb \\ + --merge \\ + $args \\ + --priority ${priority.join(',')} \\ + --vcf $input \\ + > ${prefix}_sv_merge.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_sv_merge.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/svdb/merge/meta.yml b/modules/nf-core/modules/svdb/merge/meta.yml new file mode 100644 index 00000000..2092ddd9 --- /dev/null +++ b/modules/nf-core/modules/svdb/merge/meta.yml @@ -0,0 +1,39 @@ +name: svdb_merge +description: The merge module merges structural variants within one or more vcf files. +keywords: + - structural variants +tools: + - svdb: + description: structural variant database software + homepage: https://github.com/J35P312/SVDB + documentation: https://github.com/J35P312/SVDB/blob/master/README.md + licence: ['MIT'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - priority: + type: list + description: prioritise the input vcf files according to this list, e.g ['tiddit','cnvnator'] + - vcfs: + type: list + description: Two or more VCF files. Order of files should correspond to the order of tags used for priority. + pattern: "*.{vcf,vcf.gz}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: merged VCF file + pattern: "*_sv_merge.vcf" +authors: + - "@ramprasadn" From 6ac747eee09cf625e9fa753a059dee6e23741d18 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Feb 2022 12:52:28 +0100 Subject: [PATCH 0232/1169] add svdb merge --- conf/modules.config | 16 ++++++++- modules/nf-core/modules/svdb/merge/main.nf | 12 +++++-- .../local/call_structural_variants.nf | 27 +++++++++++++-- subworkflows/local/call_sv_tiddit.nf | 33 +++++++++++++++++++ 4 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 subworkflows/local/call_sv_tiddit.nf diff --git a/conf/modules.config b/conf/modules.config index 7cbb08f1..6479e140 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -161,13 +161,27 @@ process { mode: 'copy', ] } - withName: ".*CALL_STRUCTURAL_VARIANTS:TIDDIT_SV" { + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:TIDDIT_SV" { ext.args = '-p 6' publishDir = [ path: { "${params.outdir}/sv_caller" }, mode: 'copy', ] } + withName: SVDB_MERGE_TIDDIT { + ext.args = '--notag' + ext.prefix = 'tiddit' + publishDir = [ + path: { "${params.outdir}/sv_caller" }, + mode: 'copy', + ] + } + withName: SVDB_MERGE { + publishDir = [ + path: { "${params.outdir}/sv_caller" }, + mode: 'copy', + ] + } // NF-CORE Subworkflows // ALIGN_BWAMEM2 withName: BWAMEM2_MEM { diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 1f479ea4..7c812a1a 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -22,14 +22,20 @@ process SVDB_MERGE { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def input = "" - for (int index = 0; index < vcfs.size(); index++) { - input += " ${vcfs[index]}:${priority[index]}" + if(priority) { + prio = "--priority ${priority.join(',')}" + for (int index = 0; index < vcfs.size(); index++) { + input += " ${vcfs[index]}:${priority[index]}" + } + } else { + prio = "" + input = "${vcfs.join(" ")}" } """ svdb \\ --merge \\ $args \\ - --priority ${priority.join(',')} \\ + $prio \\ --vcf $input \\ > ${prefix}_sv_merge.vcf diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index 5a1e6830..ae24e21f 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -4,7 +4,9 @@ include { CALL_SV_MANTA } from './call_sv_manta' -include { TIDDIT_SV } from '../../modules/nf-core/modules/tiddit/sv/main' +include { CALL_SV_TIDDIT } from './call_sv_tiddit' + +include { SVDB_MERGE } from '../../modules/nf-core/modules/svdb/merge/main' workflow CALL_STRUCTURAL_VARIANTS { @@ -19,10 +21,29 @@ workflow CALL_STRUCTURAL_VARIANTS { main: ch_versions = Channel.empty() - CALL_SV_MANTA ( bam, bai, fasta, fai, case_info, target_bed ) + //manta + CALL_SV_MANTA ( bam, bai, fasta, fai, case_info, target_bed ).diploid_sv_vcf + .collect{it[1]} + .set{ manta_vcf } ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) - TIDDIT_SV ( bam, fasta, fai ) + //tiddit + CALL_SV_TIDDIT ( bam, fasta, fai, case_info ).vcf + .collect{it[1]} + .set { tiddit_vcf } + ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) + + //merge + tiddit_vcf + .combine(manta_vcf) + .toList() + .set { vcf_list } + + case_info.combine(vcf_list) + .set { merge_input_vcfs } + + SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta"] ) + emit: versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] diff --git a/subworkflows/local/call_sv_tiddit.nf b/subworkflows/local/call_sv_tiddit.nf new file mode 100644 index 00000000..6d234d3b --- /dev/null +++ b/subworkflows/local/call_sv_tiddit.nf @@ -0,0 +1,33 @@ +// +// A structural variant caller workflow for tiddit +// + +include { TIDDIT_SV } from '../../modules/nf-core/modules/tiddit/sv/main' + +include { SVDB_MERGE as SVDB_MERGE_TIDDIT } from '../../modules/nf-core/modules/svdb/merge/main' + +workflow CALL_SV_TIDDIT { + take: + bam // channel: [ val(meta), path(bam) ] + fasta // path(fasta) + fai // path(fai) + ch_case_info // channel: [ case_id ] + + main: + TIDDIT_SV ( bam, fasta, fai ) + ch_versions = TIDDIT_SV.out.versions + + TIDDIT_SV.out.vcf.collect{it[1]} + .toList() + .set { vcf_file_list } + + ch_case_info.combine(vcf_file_list) + .set { merge_input_vcfs } + + SVDB_MERGE_TIDDIT ( merge_input_vcfs, [] ) + ch_versions = ch_versions.mix(SVDB_MERGE_TIDDIT.out.versions) + + emit: + vcf = SVDB_MERGE_TIDDIT.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} From 07601ab10261c7c27e24dd9810e2bfdec291a524 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Feb 2022 15:59:18 +0100 Subject: [PATCH 0233/1169] install mosdepth --- modules.json | 3 + modules/nf-core/modules/mosdepth/main.nf | 68 ++++++++++++++++++++ modules/nf-core/modules/mosdepth/meta.yml | 78 +++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 modules/nf-core/modules/mosdepth/main.nf create mode 100644 modules/nf-core/modules/mosdepth/meta.yml diff --git a/modules.json b/modules.json index 57a14a4a..3ffcc9e7 100644 --- a/modules.json +++ b/modules.json @@ -39,6 +39,9 @@ "glnexus": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, + "mosdepth": { + "git_sha": "45acc79667b58b5888cdea7327e76c728e94d6df" + }, "multiqc": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, diff --git a/modules/nf-core/modules/mosdepth/main.nf b/modules/nf-core/modules/mosdepth/main.nf new file mode 100644 index 00000000..ff91e06f --- /dev/null +++ b/modules/nf-core/modules/mosdepth/main.nf @@ -0,0 +1,68 @@ +process MOSDEPTH { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? 'bioconda::mosdepth=0.3.3' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mosdepth:0.3.3--hdfd78af_1' : + 'quay.io/biocontainers/mosdepth:0.3.3--hdfd78af_1'}" + + input: + tuple val(meta), path(bam), path(bai) + path bed + val window_size + + output: + tuple val(meta), path('*.global.dist.txt') , emit: global_txt + tuple val(meta), path('*.region.dist.txt') , emit: regions_txt , optional:true + tuple val(meta), path('*.summary.txt') , emit: summary_txt + tuple val(meta), path('*.per-base.d4') , emit: d4 , optional:true + tuple val(meta), path('*.per-base.bed.gz') , emit: per_base_bed, optional:true + tuple val(meta), path('*.per-base.bed.gz.csi'), emit: per_base_csi, optional:true + tuple val(meta), path('*.regions.bed.gz') , emit: regions_bed , optional:true + tuple val(meta), path('*.regions.bed.gz.csi') , emit: regions_csi , optional:true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + if (window_size) { + interval = "--by ${window_size}" + } else if ( bed ) { + interval = "--by ${bed}" + } else { + interval = "" + } + """ + mosdepth \\ + $interval \\ + $args \\ + $prefix \\ + $bam + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mosdepth: \$(mosdepth --version 2>&1 | sed 's/^.*mosdepth //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.global.dist.txt + touch ${prefix}.region.dist.txt + touch ${prefix}.summary.txt + touch ${prefix}.per-base.d4 + touch ${prefix}.per-base.bed.gz + touch ${prefix}.per-base.bed.gz.csi + touch ${prefix}.regions.bed.gz + touch ${prefix}.regions.bed.gz.csi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mosdepth: \$(mosdepth --version 2>&1 | sed 's/^.*mosdepth //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/mosdepth/meta.yml b/modules/nf-core/modules/mosdepth/meta.yml new file mode 100644 index 00000000..0ca7bce9 --- /dev/null +++ b/modules/nf-core/modules/mosdepth/meta.yml @@ -0,0 +1,78 @@ +name: mosdepth +description: Calculates genome-wide sequencing coverage. +keywords: + - mosdepth + - bam + - cram + - coverage +tools: + - mosdepth: + description: | + Fast BAM/CRAM depth calculation for WGS, exome, or targeted sequencing. + documentation: https://github.com/brentp/mosdepth + doi: 10.1093/bioinformatics/btx699 + licence: ['MIT'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Input BAM/CRAM file + pattern: "*.{bam,cram}" + - bai: + type: file + description: Index for BAM/CRAM file + pattern: "*.{bai,crai}" + - bed: + type: file + description: BED file with intersected intervals + pattern: "*.{bed}" + - window_size: + type: integer + description: Window size + pattern: "[0-9]+" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - global_txt: + type: file + description: Text file with global cumulative coverage distribution + pattern: "*.{global.dist.txt}" + - regions_txt: + type: file + description: Text file with region cumulative coverage distribution + pattern: "*.{region.dist.txt}" + - summary_txt: + type: file + description: Text file with summary mean depths per chromosome and regions + pattern: "*.{summary.txt}" + - per_base_bed: + type: file + description: BED file with per-base coverage + pattern: "*.{per-base.bed.gz}" + - per_base_csi: + type: file + description: Index file for BED file with per-base coverage + pattern: "*.{per-base.bed.gz.csi}" + - regions_bed: + type: file + description: BED file with per-region coverage + pattern: "*.{regions.bed.gz}" + - regions_csi: + type: file + description: Index file for BED file with per-region coverage + pattern: "*.{regions.bed.gz.csi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" + - "@ramprasadn" From 58c01d73a6be0236ae3378786416a7cfb71dd7b1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 10 Feb 2022 03:23:09 +0100 Subject: [PATCH 0234/1169] Apply suggestions from code review Co-authored-by: Anders Jemt --- conf/modules.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 6479e140..f1f36641 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -169,7 +169,7 @@ process { ] } withName: SVDB_MERGE_TIDDIT { - ext.args = '--notag' + ext.args = '--notag --pass_only' ext.prefix = 'tiddit' publishDir = [ path: { "${params.outdir}/sv_caller" }, @@ -178,6 +178,7 @@ process { } withName: SVDB_MERGE { publishDir = [ + ext.args = '--pass_only' path: { "${params.outdir}/sv_caller" }, mode: 'copy', ] From 019a7e8e96ab234afd0d0c0b2963a4c84497c9e5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 10 Feb 2022 03:40:36 +0100 Subject: [PATCH 0235/1169] update modules --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index f1f36641..91a63180 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -177,8 +177,8 @@ process { ] } withName: SVDB_MERGE { + ext.args = '--pass_only' publishDir = [ - ext.args = '--pass_only' path: { "${params.outdir}/sv_caller" }, mode: 'copy', ] From 523112ccf948884d4e24f5a924330bf589de71c3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 10 Feb 2022 03:43:02 +0100 Subject: [PATCH 0236/1169] add mosdepth to bamqc --- conf/modules.config | 7 +++++++ subworkflows/nf-core/qc_bam.nf | 8 ++++++++ workflows/raredisease.nf | 1 + 3 files changed, 16 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 7cbb08f1..e6dc9dd9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -245,6 +245,13 @@ process { mode: 'copy' ] } + withName: MOSDEPTH { + ext.args = '--d4' + publishDir = [ + path: { "${params.outdir}/mosdepth" }, + mode: 'copy' + ] + } // nf-core modules withName: FASTQC { ext.args = '--quiet' diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 576b509a..59cf1c32 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -8,12 +8,14 @@ include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/ma include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/modules/cat/cat/main' include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' +include { MOSDEPTH } from '../../modules/nf-core/modules/mosdepth/main' include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' workflow QC_BAM { take: bam // channel: [ val(meta), path(bam) ] + bai // channel: [ val(meta), path(bai) ] fasta // path: genome.fasta fai // path: genome.fasta.fai bait_intervals // path: bait.intervals_list @@ -51,6 +53,11 @@ workflow QC_BAM { UCSC_WIGTOBIGWIG ( TIDDIT_COV.out.wig, chrom_sizes ) ch_versions = ch_versions.mix(TIDDIT_COV.out.versions) + // MOSDEPTH + bam.join(bai, by: [0]) + .set { mosdepth_input_bams } + MOSDEPTH (mosdepth_input_bams,[],[]) + ch_versions = ch_versions.mix(MOSDEPTH.out.versions) emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] @@ -58,6 +65,7 @@ workflow QC_BAM { qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] + d4 = MOSDEPTH.out.d4 // channel: [ val(meta), path(*.d4) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 685413aa..1092f02a 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -135,6 +135,7 @@ workflow RAREDISEASE { // STEP 1.5: BAM QUALITY CHECK QC_BAM ( ch_marked_bam, + ch_marked_bai, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, CHECK_BED.out.bait_intervals, From 36e4e80dbfef19539dc2855c07d4610a77878f33 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Thu, 10 Feb 2022 10:30:05 +0100 Subject: [PATCH 0237/1169] Added link to the flowchart and short description --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2ba5ca11..1d718fdd 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,10 @@ On release, automated continuous integration tests run the pipeline on a full-si 4. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) 5. Variant calling ([deepvariant](https://github.com/google/deepvariant) and [glnexus](https://github.com/dnanexus-rnd/GLnexus)) +The different steps and corresponding tools are represented in the flowchart below. Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). + + + ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) From dbe9ce6ccf631638037f0e84f5f42a359916ce39 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 14 Feb 2022 02:09:40 +0100 Subject: [PATCH 0238/1169] regular assignment --- subworkflows/nf-core/qc_bam.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 59cf1c32..8788c87e 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -54,8 +54,7 @@ workflow QC_BAM { ch_versions = ch_versions.mix(TIDDIT_COV.out.versions) // MOSDEPTH - bam.join(bai, by: [0]) - .set { mosdepth_input_bams } + mosdepth_input_bams = bam.join(bai, by: [0]) MOSDEPTH (mosdepth_input_bams,[],[]) ch_versions = ch_versions.mix(MOSDEPTH.out.versions) From bcf7a7a29c717ce4ac513042f434a09ccc250d5b Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 14 Feb 2022 16:10:57 +0100 Subject: [PATCH 0239/1169] added bcftools annotate --- modules/local/bcftools_annotate/main.nf | 42 ++++++++++++++++++++++ modules/local/bcftools_annotate/meta.yml | 45 ++++++++++++++++++++++++ subworkflows/local/annotate_vcfanno.nf | 3 ++ 3 files changed, 90 insertions(+) create mode 100644 modules/local/bcftools_annotate/main.nf create mode 100644 modules/local/bcftools_annotate/meta.yml diff --git a/modules/local/bcftools_annotate/main.nf b/modules/local/bcftools_annotate/main.nf new file mode 100644 index 00000000..0020fedb --- /dev/null +++ b/modules/local/bcftools_annotate/main.nf @@ -0,0 +1,42 @@ +process BCFTOOLS_ANNOTATE { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::bcftools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0': + 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" + + input: + tuple val(meta), path(input) + + output: + tuple val(meta), path("*.vcf.gz"), optional:true , emit: vcf + tuple val(meta), path("*.bcf") , optional:true , emit: bcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def matcher = input =~ /vcf/ + def output_suffix = matcher ? "vcf.gz" : "bcf" + def output_type_compressed = matcher ? "z" : "b" + """ + bcftools \\ + annotate \\ + $args \\ + --output ${prefix}.${output_suffix} \\ + --output-type $output_type_compressed \\ + --threads $task.cpus \\ + $input + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/bcftools_annotate/meta.yml b/modules/local/bcftools_annotate/meta.yml new file mode 100644 index 00000000..8b76986b --- /dev/null +++ b/modules/local/bcftools_annotate/meta.yml @@ -0,0 +1,45 @@ +name: bcftools_annotate +description: write your description here +keywords: + - bcftools + - annotate + - vcf + - remove + - add +tools: + - annotate: + description: Add or remove annotations. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: https://samtools.github.io/bcftools/bcftools.html#annotate + doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: files + description: Query VCF or BCF file, can be either uncompressed or compressed +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: Compressed annotated VCF file + pattern: "*.vcf.gz" + - bcf: + type: file + description: Compressed annotated BCF file + pattern: "*.bcf" +authors: + - "@projectoriented" diff --git a/subworkflows/local/annotate_vcfanno.nf b/subworkflows/local/annotate_vcfanno.nf index 3c7d40bb..302bee48 100644 --- a/subworkflows/local/annotate_vcfanno.nf +++ b/subworkflows/local/annotate_vcfanno.nf @@ -3,6 +3,7 @@ // include { VCFANNO } from '../../modules/local/vcfanno/main' +include { BCFTOOLS_ANNOTATE } from '../../modules/local/bcftools_annotate/main' workflow ANNOTATE_VCFANNO { take: @@ -13,8 +14,10 @@ workflow ANNOTATE_VCFANNO { ch_versions = Channel.empty() VCFANNO (vcf, resource_dir) + BCFTOOLS_ANNOTATE ( VCFANNO.out.vcf ) ch_versions = ch_versions.mix(VCFANNO.out.versions) emit: + annotated_vcf = BCFTOOLS_ANNOTATE.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } \ No newline at end of file From b4cd65b706946b41d35fa67bbc31693db6627995 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 14 Feb 2022 16:13:46 +0100 Subject: [PATCH 0240/1169] forgt to add emit ver for bcf --- subworkflows/local/annotate_vcfanno.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/annotate_vcfanno.nf b/subworkflows/local/annotate_vcfanno.nf index 302bee48..a0117818 100644 --- a/subworkflows/local/annotate_vcfanno.nf +++ b/subworkflows/local/annotate_vcfanno.nf @@ -14,9 +14,11 @@ workflow ANNOTATE_VCFANNO { ch_versions = Channel.empty() VCFANNO (vcf, resource_dir) - BCFTOOLS_ANNOTATE ( VCFANNO.out.vcf ) ch_versions = ch_versions.mix(VCFANNO.out.versions) + BCFTOOLS_ANNOTATE ( VCFANNO.out.vcf ) + ch_versions = ch_versions.mix(BCFTOOLS_ANNOTATE.out.versions) + emit: annotated_vcf = BCFTOOLS_ANNOTATE.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] From 166ecec7c7f308d95ef9c78ff02453d87c64173e Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:33:23 +0100 Subject: [PATCH 0241/1169] test runs --- conf/genomes.config | 26 +++++++++++++------------ conf/modules.config | 9 +++++++++ conf/test.config | 3 +++ main.nf | 13 +++++++------ modules.json | 3 +++ modules/local/bcftools_annotate/main.nf | 2 +- nextflow_schema.json | 6 ++++++ subworkflows/local/prepare_genome.nf | 19 +++++++++++++++--- workflows/raredisease.nf | 6 ++++-- 9 files changed, 63 insertions(+), 24 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 3a72deb5..5b4caf39 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -11,20 +11,22 @@ params { genomes { 'GRCh37' { - fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" - fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" - bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" - variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" - target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" + fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" + fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" + bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" + variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" } 'GRCh38' { - fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" - fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" - bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" - variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" - target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" + fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" + fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" + bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" + variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" } } } diff --git a/conf/modules.config b/conf/modules.config index 7b67ce95..bfe941ee 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -51,6 +51,11 @@ process { enabled: false, ] } + withName: UNTAR_VCFANNO { + publishDir = [ + enabled: false, + ] + } // PREPARE_VCF && PREPARE_BED withName: CHECK_INPUT_VCF { publishDir = [ @@ -187,12 +192,16 @@ process { withName: "VCFANNO" { publishDir = [ path: { "${params.outdir}/variant_annotation" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: "BCFTOOLS_ANNOTATE" { ext.args = "" publishDir = [ path: { "${params.outdir}/variant_annotation" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } // NF-CORE Subworkflows diff --git a/conf/test.config b/conf/test.config index fa041a02..caf992b2 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,5 +31,8 @@ params { // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' + // Variant annotation + vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/vcfanno_grch38_test.tar.gz' + target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/target_chr20.bed' } diff --git a/main.nf b/main.nf index d9ff2c5e..1e9c303a 100644 --- a/main.nf +++ b/main.nf @@ -17,12 +17,13 @@ nextflow.enable.dsl = 2 ======================================================================================== */ -params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') -params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') -params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') -params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') -params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') -params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') +params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') +params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') +params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') +params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') +params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') +params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') +params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') /* ======================================================================================== diff --git a/modules.json b/modules.json index ddc5d098..09d78aa0 100644 --- a/modules.json +++ b/modules.json @@ -86,6 +86,9 @@ }, "ucsc/wigtobigwig": { "git_sha": "30e64becaa1e6c807a09a49a6d3d457ff3cf7251" + }, + "untar": { + "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" } } } diff --git a/modules/local/bcftools_annotate/main.nf b/modules/local/bcftools_annotate/main.nf index 0020fedb..d3c3aa01 100644 --- a/modules/local/bcftools_annotate/main.nf +++ b/modules/local/bcftools_annotate/main.nf @@ -29,7 +29,7 @@ process BCFTOOLS_ANNOTATE { bcftools \\ annotate \\ $args \\ - --output ${prefix}.${output_suffix} \\ + --output ${prefix}_annotated.${output_suffix} \\ --output-type $output_type_compressed \\ --threads $task.cpus \\ $input diff --git a/nextflow_schema.json b/nextflow_schema.json index d3695fe2..2ab5681a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -114,6 +114,12 @@ "help_text": "This parameter is mandatory for use with ExpansionHunter", "fa_icon": "far fa-file-code" }, + "vcfanno_resources": { + "type": "string", + "description": "Directory path or tar.gz archive that holds resources defined within the vcfanno toml file, including itself.", + "help_text": "If no directory path is passed, default configurations will be used according to genome build within the context of the pipeline.", + "fa_icon": "fas fa-folder-open" + }, "save_reference": { "type": "boolean", "description": "If generated by the pipeline save the required indices/references in the results directory.", diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 6692d33b..2477325d 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -2,8 +2,11 @@ // Prepare reference genome files // +include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/modules/untar/main' + include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' + include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD} from '../../modules/nf-core/modules/gatk4/createsequencedictionary/main' include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' @@ -35,6 +38,14 @@ workflow PREPARE_GENOME { ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) } + // Uncompress vcfanno resources if nothing else given + if ( params.vcfanno_resources.endsWith('.tar.gz') ) { + ch_vcfanno_resources = UNTAR_VCFANNO ( params.vcfanno_resources ).untar + ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) + } else { + ch_vcfanno_resources = file(params.vcfanno_resources) + } + if ( params.variant_catalog && file(params.variant_catalog, checkIfExists:true) ) { ch_variant_catalog = file(params.variant_catalog) } else { @@ -51,11 +62,13 @@ workflow PREPARE_GENOME { emit: - fasta = ch_fasta // path: genome.fasta - fai = ch_fai // path: genome.fasta.fai bwamem2_index = ch_bwamem2_index // path: bwamem2/index - variant_catalog = ch_variant_catalog // path: variant_catalog.json chrom_sizes = ch_chrom_sizes // path: chrom.sizes + fasta = ch_fasta // path: genome.fasta + fai = ch_fai // path: genome.fasta.fai sequence_dict = ch_sequence_dict + variant_catalog = ch_variant_catalog // path: variant_catalog.json + vcfanno_resources = ch_vcfanno_resources // channel: [ untar'd files, ] + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 2ba0cb9f..21513d56 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -12,7 +12,8 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, - params.bwamem2_index, params.fasta_fai, params.gnomad + params.bwamem2_index, params.fasta_fai, params.gnomad, + params.vcfanno_resources ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } @@ -174,7 +175,8 @@ workflow RAREDISEASE { // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) - ANNOTATE_VCFANNO ( ch_dv_vcf, file("/home/mei.wu/nextflow/nf-core/vcfanno_resource_dir") ) + + ANNOTATE_VCFANNO ( ch_dv_vcf, PREPARE_GENOME.out.vcfanno_resources ) ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) // From cb685dd8b1fea168a074155bb6d71e2f9731ba0b Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:34:06 +0100 Subject: [PATCH 0242/1169] :down_arrow: untar module --- modules/nf-core/modules/untar/main.nf | 36 ++++++++++++++++++++++++++ modules/nf-core/modules/untar/meta.yml | 28 ++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 modules/nf-core/modules/untar/main.nf create mode 100644 modules/nf-core/modules/untar/meta.yml diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf new file mode 100644 index 00000000..01205e60 --- /dev/null +++ b/modules/nf-core/modules/untar/main.nf @@ -0,0 +1,36 @@ +process UNTAR { + tag "$archive" + label 'process_low' + + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : + 'biocontainers/biocontainers:v1.2.0_cv1' }" + + input: + path archive + + output: + path "$untar" , emit: untar + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + untar = archive.toString() - '.tar.gz' + """ + tar \\ + -xzvf \\ + $args \\ + $archive \\ + $args2 \\ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/modules/untar/meta.yml new file mode 100644 index 00000000..51f94995 --- /dev/null +++ b/modules/nf-core/modules/untar/meta.yml @@ -0,0 +1,28 @@ +name: untar +description: Extract files. +keywords: + - untar + - uncompress +tools: + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ['GPL-3.0-or-later'] +input: + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" +output: + - untar: + type: file + description: + pattern: "*.*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" From 71d796b27f65d4edbc144a11311e7916beea1a73 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 21 Feb 2022 12:12:57 +0100 Subject: [PATCH 0243/1169] swapped local for modules/vcfanno --- modules.json | 3 ++ modules/local/bcftools_annotate/main.nf | 42 ----------------- modules/local/bcftools_annotate/meta.yml | 45 ------------------- .../modules}/vcfanno/main.nf | 14 +++--- .../modules}/vcfanno/meta.yml | 14 +++--- 5 files changed, 20 insertions(+), 98 deletions(-) delete mode 100644 modules/local/bcftools_annotate/main.nf delete mode 100644 modules/local/bcftools_annotate/meta.yml rename modules/{local => nf-core/modules}/vcfanno/main.nf (75%) rename modules/{local => nf-core/modules}/vcfanno/meta.yml (79%) diff --git a/modules.json b/modules.json index 09d78aa0..8d2d05f4 100644 --- a/modules.json +++ b/modules.json @@ -89,6 +89,9 @@ }, "untar": { "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" + }, + "vcfanno": { + "git_sha": "2597c31d6bba4a354fc58b535c76bd14aed1c585" } } } diff --git a/modules/local/bcftools_annotate/main.nf b/modules/local/bcftools_annotate/main.nf deleted file mode 100644 index d3c3aa01..00000000 --- a/modules/local/bcftools_annotate/main.nf +++ /dev/null @@ -1,42 +0,0 @@ -process BCFTOOLS_ANNOTATE { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::bcftools=1.14" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0': - 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" - - input: - tuple val(meta), path(input) - - output: - tuple val(meta), path("*.vcf.gz"), optional:true , emit: vcf - tuple val(meta), path("*.bcf") , optional:true , emit: bcf - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - - def matcher = input =~ /vcf/ - def output_suffix = matcher ? "vcf.gz" : "bcf" - def output_type_compressed = matcher ? "z" : "b" - """ - bcftools \\ - annotate \\ - $args \\ - --output ${prefix}_annotated.${output_suffix} \\ - --output-type $output_type_compressed \\ - --threads $task.cpus \\ - $input - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/bcftools_annotate/meta.yml b/modules/local/bcftools_annotate/meta.yml deleted file mode 100644 index 8b76986b..00000000 --- a/modules/local/bcftools_annotate/meta.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: bcftools_annotate -description: write your description here -keywords: - - bcftools - - annotate - - vcf - - remove - - add -tools: - - annotate: - description: Add or remove annotations. - homepage: http://samtools.github.io/bcftools/bcftools.html - documentation: https://samtools.github.io/bcftools/bcftools.html#annotate - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: - type: files - description: Query VCF or BCF file, can be either uncompressed or compressed -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - vcf: - type: file - description: Compressed annotated VCF file - pattern: "*.vcf.gz" - - bcf: - type: file - description: Compressed annotated BCF file - pattern: "*.bcf" -authors: - - "@projectoriented" diff --git a/modules/local/vcfanno/main.nf b/modules/nf-core/modules/vcfanno/main.nf similarity index 75% rename from modules/local/vcfanno/main.nf rename to modules/nf-core/modules/vcfanno/main.nf index 6608d22e..51b1ec5b 100644 --- a/modules/local/vcfanno/main.nf +++ b/modules/nf-core/modules/vcfanno/main.nf @@ -9,11 +9,13 @@ process VCFANNO { input: tuple val(meta), path(vcf), path(tbi) + tuple val(meta), path(vcf_uncompressed) + path toml path resource_dir output: - tuple val(meta), path("*.vcf"), emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*_annotated.vcf"), emit: vcf + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -21,15 +23,15 @@ process VCFANNO { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def input_vcf = vcf_uncompressed ?: vcf """ - ln -s $resource_dir/* \$(pwd) - toml=\$(echo *.toml) + ln -sf $resource_dir/* \$(pwd) vcfanno \\ -p $task.cpus \\ $args \\ - \$toml \\ - $vcf \\ + $toml \\ + $input_vcf \\ > ${prefix}_annotated.vcf cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/vcfanno/meta.yml b/modules/nf-core/modules/vcfanno/meta.yml similarity index 79% rename from modules/local/vcfanno/meta.yml rename to modules/nf-core/modules/vcfanno/meta.yml index b2caaefc..1c6893ea 100644 --- a/modules/local/vcfanno/meta.yml +++ b/modules/nf-core/modules/vcfanno/meta.yml @@ -25,15 +25,19 @@ input: - vcf: type: file description: query VCF file - pattern: "*.{vcf.gz}" + pattern: "*.{vcf, vcf.gz}" - vcf_tabix: type: file - description: tabix index of query VCF - pattern: "*.{vcf.gz.tbi}" + description: tabix index of query VCF - only needed if vcf is compressed + pattern: "*.vcf.gz.tbi" + - toml: + type: file + description: configuration file + pattern: "*.toml" - resource_dir: type: file description: | - This directory must contain one TOML config and referenced files in that config, + This directory contains referenced files in the TOML config, and the corresponding indicies e.g. exac.vcf.gz + exac.vcf.gz.tbi, with exception to the lua file. @@ -50,7 +54,7 @@ output: - vcf: type: file description: Annotated VCF file - pattern: "*.{vcf}" + pattern: "*.vcf" authors: - "@projectoriented" From d2f3fd69100973300c96c70b752e0ff58ba9006b Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 21 Feb 2022 15:39:19 +0100 Subject: [PATCH 0244/1169] added vcfanno --- conf/genomes.config | 2 ++ conf/modules.config | 24 +++++++------------ conf/test.config | 3 ++- main.nf | 1 + nextflow_schema.json | 8 ++++++- .../{local => nf-core}/annotate_vcfanno.nf | 14 +++++------ workflows/raredisease.nf | 4 ++-- 7 files changed, 28 insertions(+), 28 deletions(-) rename subworkflows/{local => nf-core}/annotate_vcfanno.nf (55%) diff --git a/conf/genomes.config b/conf/genomes.config index 5b4caf39..e8ddd83d 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -18,6 +18,7 @@ params { target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" + vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" @@ -27,6 +28,7 @@ params { target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" + vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" } } } diff --git a/conf/modules.config b/conf/modules.config index bfe941ee..45e50041 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -188,22 +188,6 @@ process { mode: 'copy', ] } - // ANNOTATE_VCFANNO - withName: "VCFANNO" { - publishDir = [ - path: { "${params.outdir}/variant_annotation" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - withName: "BCFTOOLS_ANNOTATE" { - ext.args = "" - publishDir = [ - path: { "${params.outdir}/variant_annotation" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } // NF-CORE Subworkflows // ALIGN_BWAMEM2 withName: BWAMEM2_MEM { @@ -254,6 +238,14 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + // ANNOTATE_VCFANNO + withName: "VCFANNO" { + publishDir = [ + path: { "${params.outdir}/variant_annotation" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } // QC_BAM withName: '.*COLLECTMULTIPLEMETRICS' { publishDir = [ diff --git a/conf/test.config b/conf/test.config index caf992b2..dac7e011 100644 --- a/conf/test.config +++ b/conf/test.config @@ -32,7 +32,8 @@ params { variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' // Variant annotation - vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/vcfanno_grch38_test.tar.gz' + vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/vcfanno_grch38_small_test.tar.gz' + vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/grch38_vcfanno_config_-v0.2-_chr20.toml' target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/target_chr20.bed' } diff --git a/main.nf b/main.nf index 1e9c303a..2b244799 100644 --- a/main.nf +++ b/main.nf @@ -24,6 +24,7 @@ params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') +params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') /* ======================================================================================== diff --git a/nextflow_schema.json b/nextflow_schema.json index 2ab5681a..20bbbf55 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -116,10 +116,16 @@ }, "vcfanno_resources": { "type": "string", - "description": "Directory path or tar.gz archive that holds resources defined within the vcfanno toml file, including itself.", + "description": "Directory path or tar.gz archive that holds resources defined within the vcfanno toml file.", "help_text": "If no directory path is passed, default configurations will be used according to genome build within the context of the pipeline.", "fa_icon": "fas fa-folder-open" }, + "vcfanno_toml": { + "type": "string", + "description": "Path to the vcfanno toml file.", + "help_text": "If toml is passed, default configurations will be used according to genome build within the context of the pipeline.", + "fa_icon": "fas fa-file-csv" + }, "save_reference": { "type": "boolean", "description": "If generated by the pipeline save the required indices/references in the results directory.", diff --git a/subworkflows/local/annotate_vcfanno.nf b/subworkflows/nf-core/annotate_vcfanno.nf similarity index 55% rename from subworkflows/local/annotate_vcfanno.nf rename to subworkflows/nf-core/annotate_vcfanno.nf index a0117818..380767b5 100644 --- a/subworkflows/local/annotate_vcfanno.nf +++ b/subworkflows/nf-core/annotate_vcfanno.nf @@ -2,24 +2,22 @@ // Annotate with VCFanno // -include { VCFANNO } from '../../modules/local/vcfanno/main' -include { BCFTOOLS_ANNOTATE } from '../../modules/local/bcftools_annotate/main' +include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' workflow ANNOTATE_VCFANNO { take: + toml // channel: path(toml) vcf // channel: [ val(meta), path(vcf), path(tbi) ] resource_dir // channel: path(resource_dir) main: ch_versions = Channel.empty() - VCFANNO (vcf, resource_dir) + ch_placeholder = vcf.map { meta, vcf, idx -> vcf = []; [meta, vcf] } + VCFANNO (vcf, ch_placeholder, toml, resource_dir) ch_versions = ch_versions.mix(VCFANNO.out.versions) - BCFTOOLS_ANNOTATE ( VCFANNO.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_ANNOTATE.out.versions) - emit: - annotated_vcf = BCFTOOLS_ANNOTATE.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] + annotated_vcf = VCFANNO.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] -} \ No newline at end of file +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 21513d56..8407169c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -66,6 +66,7 @@ include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_exp include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' include { QC_BAM } from '../subworkflows/nf-core/qc_bam' +include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' // // SUBWORKFLOW: Consists of mix/local modules // @@ -73,7 +74,6 @@ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/local/call_structural_variants' -include { ANNOTATE_VCFANNO } from '../subworkflows/local/annotate_vcfanno' /* ======================================================================================== @@ -176,7 +176,7 @@ workflow RAREDISEASE { // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) - ANNOTATE_VCFANNO ( ch_dv_vcf, PREPARE_GENOME.out.vcfanno_resources ) + ANNOTATE_VCFANNO ( params.vcfanno_toml, ch_dv_vcf, PREPARE_GENOME.out.vcfanno_resources ) ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) // From de655d294fbd5510e80e0c0640f100a3588681f6 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 21 Feb 2022 15:42:41 +0100 Subject: [PATCH 0245/1169] lint quest: fix_1 --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8407169c..ff747251 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -175,7 +175,7 @@ workflow RAREDISEASE { // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) - + ANNOTATE_VCFANNO ( params.vcfanno_toml, ch_dv_vcf, PREPARE_GENOME.out.vcfanno_resources ) ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) From 4db58a6d30a3e080cb2c3110242018f8caf8c142 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 21 Feb 2022 17:49:15 +0100 Subject: [PATCH 0246/1169] updated nfcore modules --- modules.json | 58 ++++++------ modules/nf-core/modules/bcftools/norm/main.nf | 9 +- .../nf-core/modules/bcftools/norm/meta.yml | 70 +++++++------- modules/nf-core/modules/bwamem2/index/main.nf | 3 + .../nf-core/modules/bwamem2/index/meta.yml | 46 ++++----- modules/nf-core/modules/bwamem2/mem/main.nf | 7 +- modules/nf-core/modules/bwamem2/mem/meta.yml | 80 ++++++++-------- modules/nf-core/modules/cat/cat/main.nf | 3 + modules/nf-core/modules/cat/cat/meta.yml | 2 +- .../custom/dumpsoftwareversions/main.nf | 3 + .../custom/dumpsoftwareversions/meta.yml | 2 +- modules/nf-core/modules/deepvariant/main.nf | 3 + modules/nf-core/modules/deepvariant/meta.yml | 2 +- .../nf-core/modules/expansionhunter/main.nf | 3 + .../nf-core/modules/expansionhunter/meta.yml | 2 +- modules/nf-core/modules/fastqc/main.nf | 3 + modules/nf-core/modules/fastqc/meta.yml | 90 +++++++++--------- .../modules/gatk4/bedtointervallist/main.nf | 9 +- .../modules/gatk4/bedtointervallist/meta.yml | 2 +- .../gatk4/createsequencedictionary/main.nf | 9 +- .../gatk4/createsequencedictionary/meta.yml | 48 +++++----- .../modules/gatk4/intervallisttools/main.nf | 9 +- .../modules/gatk4/intervallisttools/meta.yml | 2 +- modules/nf-core/modules/glnexus/main.nf | 3 + modules/nf-core/modules/glnexus/meta.yml | 2 +- modules/nf-core/modules/mosdepth/meta.yml | 8 +- modules/nf-core/modules/multiqc/main.nf | 9 +- modules/nf-core/modules/multiqc/meta.yml | 66 ++++++------- .../modules/picard/collecthsmetrics/main.nf | 3 + .../picard/collectmultiplemetrics/main.nf | 9 +- .../picard/collectmultiplemetrics/meta.yml | 86 ++++++++--------- .../modules/picard/markduplicates/main.nf | 9 +- .../modules/picard/markduplicates/meta.yml | 2 +- .../nf-core/modules/qualimap/bamqc/main.nf | 10 +- .../nf-core/modules/qualimap/bamqc/meta.yml | 83 ++++++++-------- .../modules/qualimap/bamqccram/main.nf | 60 ++++++++++++ .../modules/qualimap/bamqccram/meta.yml | 51 ++++++++++ .../nf-core/modules/samtools/faidx/main.nf | 12 ++- .../nf-core/modules/samtools/faidx/meta.yml | 72 +++++++------- .../nf-core/modules/samtools/index/main.nf | 11 ++- .../nf-core/modules/samtools/index/meta.yml | 92 +++++++++--------- .../nf-core/modules/samtools/merge/main.nf | 17 +++- .../nf-core/modules/samtools/merge/meta.yml | 94 +++++++++---------- modules/nf-core/modules/samtools/sort/main.nf | 4 + .../nf-core/modules/samtools/sort/meta.yml | 74 +++++++-------- .../nf-core/modules/samtools/stats/main.nf | 10 +- .../nf-core/modules/samtools/stats/meta.yml | 90 +++++++++--------- modules/nf-core/modules/svdb/merge/main.nf | 12 +-- modules/nf-core/modules/svdb/merge/meta.yml | 2 +- .../nf-core/modules/tabix/bgziptabix/main.nf | 5 +- .../nf-core/modules/tabix/bgziptabix/meta.yml | 76 +++++++-------- modules/nf-core/modules/tabix/tabix/main.nf | 3 + modules/nf-core/modules/tabix/tabix/meta.yml | 68 +++++++------- modules/nf-core/modules/tiddit/cov/main.nf | 3 + modules/nf-core/modules/tiddit/sv/main.nf | 3 + modules/nf-core/modules/tiddit/sv/meta.yml | 88 ++++++++--------- .../nf-core/modules/ucsc/wigtobigwig/main.nf | 3 + .../nf-core/modules/ucsc/wigtobigwig/meta.yml | 2 +- 58 files changed, 907 insertions(+), 700 deletions(-) create mode 100644 modules/nf-core/modules/qualimap/bamqccram/main.nf create mode 100644 modules/nf-core/modules/qualimap/bamqccram/meta.yml diff --git a/modules.json b/modules.json index 5daaec1b..94316fc1 100644 --- a/modules.json +++ b/modules.json @@ -4,91 +4,91 @@ "repos": { "nf-core/modules": { "bcftools/norm": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "bwamem2/index": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "bwamem2/mem": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "cat/cat": { - "git_sha": "c4549c0ecd1b02473471b507fd88a9fd5289d91c" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "custom/dumpsoftwareversions": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "deepvariant": { - "git_sha": "1287ba48fe6b2acb7449cfca387c91dc2ddf6538" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "expansionhunter": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "fastqc": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "gatk4/bedtointervallist": { - "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "gatk4/createsequencedictionary": { - "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "gatk4/intervallisttools": { - "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "glnexus": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "mosdepth": { - "git_sha": "45acc79667b58b5888cdea7327e76c728e94d6df" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "multiqc": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "picard/collecthsmetrics": { - "git_sha": "e751e5040af57e1b4e06ed4e0f3efe6de25c1683" + "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" }, "picard/collectmultiplemetrics": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "picard/markduplicates": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "qualimap/bamqc": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e31f1ff3b1375b30db08637d8937e25cc046f3cc" }, "samtools/faidx": { - "git_sha": "e0aa89141ffecb5f54d230f7ea46de242b74e084" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "samtools/index": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "samtools/merge": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "samtools/sort": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "samtools/stats": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "svdb/merge": { - "git_sha": "f44e6c74b4c51c5e49bc91e3d9d225544b5c1685" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "tabix/bgziptabix": { - "git_sha": "e22966ce74340cb671576143e5fdbbd71670cffa" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "tabix/tabix": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "tiddit/cov": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" }, "tiddit/sv": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "ucsc/wigtobigwig": { - "git_sha": "30e64becaa1e6c807a09a49a6d3d457ff3cf7251" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" } } } diff --git a/modules/nf-core/modules/bcftools/norm/main.nf b/modules/nf-core/modules/bcftools/norm/main.nf index 95da56db..cd681f21 100644 --- a/modules/nf-core/modules/bcftools/norm/main.nf +++ b/modules/nf-core/modules/bcftools/norm/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_NORM { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.13" : null) + conda (params.enable_conda ? 'bioconda::bcftools=1.14' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.13--h3a49de5_0' : - 'quay.io/biocontainers/bcftools:1.13--h3a49de5_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0' : + 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" input: tuple val(meta), path(vcf) @@ -15,6 +15,9 @@ process BCFTOOLS_NORM { tuple val(meta), path("*.gz") , emit: vcf path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/bcftools/norm/meta.yml b/modules/nf-core/modules/bcftools/norm/meta.yml index 27978a53..ce4aee85 100644 --- a/modules/nf-core/modules/bcftools/norm/meta.yml +++ b/modules/nf-core/modules/bcftools/norm/meta.yml @@ -6,41 +6,41 @@ keywords: - variant calling - VCF tools: - - norm: - description: | - Normalize VCF files. - homepage: http://samtools.github.io/bcftools/bcftools.html - documentation: http://www.htslib.org/doc/bcftools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - norm: + description: | + Normalize VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: | - The vcf file to be normalized - e.g. 'file1.vcf' - - fasta: - type: file - description: FASTA reference file - pattern: "*.{fasta,fa}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + The vcf file to be normalized + e.g. 'file1.vcf' + - fasta: + type: file + description: FASTA reference file + pattern: "*.{fasta,fa}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: VCF normalized output file - pattern: "*.{vcf.gz}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF normalized output file + pattern: "*.{vcf.gz}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@abhi18av" + - "@abhi18av" diff --git a/modules/nf-core/modules/bwamem2/index/main.nf b/modules/nf-core/modules/bwamem2/index/main.nf index e00538c9..0e9cc2f8 100644 --- a/modules/nf-core/modules/bwamem2/index/main.nf +++ b/modules/nf-core/modules/bwamem2/index/main.nf @@ -14,6 +14,9 @@ process BWAMEM2_INDEX { path "bwamem2" , emit: index path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/bwamem2/index/meta.yml b/modules/nf-core/modules/bwamem2/index/meta.yml index e0f6014c..1b52448d 100644 --- a/modules/nf-core/modules/bwamem2/index/meta.yml +++ b/modules/nf-core/modules/bwamem2/index/meta.yml @@ -1,30 +1,30 @@ name: bwamem2_index description: Create BWA-mem2 index for reference genome keywords: - - index - - fasta - - genome - - reference + - index + - fasta + - genome + - reference tools: - - bwa: - description: | - BWA-mem2 is a software package for mapping DNA sequences against - a large reference genome, such as the human genome. - homepage: https://github.com/bwa-mem2/bwa-mem2 - documentation: https://github.com/bwa-mem2/bwa-mem2#usage - licence: ['MIT'] + - bwa: + description: | + BWA-mem2 is a software package for mapping DNA sequences against + a large reference genome, such as the human genome. + homepage: https://github.com/bwa-mem2/bwa-mem2 + documentation: https://github.com/bwa-mem2/bwa-mem2#usage + licence: ["MIT"] input: - - fasta: - type: file - description: Input genome fasta file + - fasta: + type: file + description: Input genome fasta file output: - - index: - type: file - description: BWA genome index files - pattern: "*.{0132,amb,ann,bwt.2bit.64,pac}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - index: + type: file + description: BWA genome index files + pattern: "*.{0132,amb,ann,bwt.2bit.64,pac}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@maxulysse" + - "@maxulysse" diff --git a/modules/nf-core/modules/bwamem2/mem/main.nf b/modules/nf-core/modules/bwamem2/mem/main.nf index 81b4b8ab..56f595ec 100644 --- a/modules/nf-core/modules/bwamem2/mem/main.nf +++ b/modules/nf-core/modules/bwamem2/mem/main.nf @@ -10,16 +10,21 @@ process BWAMEM2_MEM { input: tuple val(meta), path(reads) path index + val sort_bam output: tuple val(meta), path("*.bam"), emit: bam path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def read_group = meta.read_group ? "-R ${meta.read_group}" : "" + def samtools_command = sort_bam ? 'sort' : 'view' """ INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` @@ -30,7 +35,7 @@ process BWAMEM2_MEM { -t $task.cpus \\ \$INDEX \\ $reads \\ - | samtools view $args2 -@ $task.cpus -bhS -o ${prefix}.bam - + | samtools $samtools_command $args2 -@ $task.cpus -o ${prefix}.bam - cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/bwamem2/mem/meta.yml b/modules/nf-core/modules/bwamem2/mem/meta.yml index 58a35e08..25c97f91 100644 --- a/modules/nf-core/modules/bwamem2/mem/meta.yml +++ b/modules/nf-core/modules/bwamem2/mem/meta.yml @@ -1,45 +1,49 @@ name: bwamem2_mem description: Performs fastq alignment to a fasta reference using BWA keywords: - - mem - - bwa - - alignment - - map - - fastq - - bam - - sam + - mem + - bwa + - alignment + - map + - fastq + - bam + - sam tools: - - bwa: - description: | - BWA is a software package for mapping DNA sequences against - a large reference genome, such as the human genome. - homepage: http://bio-bwa.sourceforge.net/ - documentation: http://www.htslib.org/doc/samtools.html - arxiv: arXiv:1303.3997 - licence: ['MIT'] + - bwa: + description: | + BWA-mem2 is a software package for mapping DNA sequences against + a large reference genome, such as the human genome. + homepage: https://github.com/bwa-mem2/bwa-mem2 + documentation: http://www.htslib.org/doc/samtools.html + arxiv: arXiv:1303.3997 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - - index: - type: file - description: BWA genome index files - pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + - index: + type: file + description: BWA genome index files + pattern: "Directory containing BWA index *.{0132,amb,ann,bwt.2bit.64,pac}" + - sort_bam: + type: boolean + description: use samtools sort (true) or samtools view (false) + pattern: "true or false" output: - - bam: - type: file - description: Output BAM file containing read alignments - pattern: "*.{bam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - bam: + type: file + description: Output BAM file containing read alignments + pattern: "*.{bam}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@maxulysse" + - "@maxulysse" diff --git a/modules/nf-core/modules/cat/cat/main.nf b/modules/nf-core/modules/cat/cat/main.nf index 2efe20a5..4ee44599 100644 --- a/modules/nf-core/modules/cat/cat/main.nf +++ b/modules/nf-core/modules/cat/cat/main.nf @@ -14,6 +14,9 @@ process CAT_CAT { path "${file_out}*" , emit: file_out path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' diff --git a/modules/nf-core/modules/cat/cat/meta.yml b/modules/nf-core/modules/cat/cat/meta.yml index b3f370ee..e0a6361d 100644 --- a/modules/nf-core/modules/cat/cat/meta.yml +++ b/modules/nf-core/modules/cat/cat/meta.yml @@ -10,7 +10,7 @@ tools: homepage: None documentation: https://man7.org/linux/man-pages/man1/cat.1.html tool_dev_url: None - licence: ['GPL-3.0-or-later'] + licence: ["GPL-3.0-or-later"] input: - files_in: type: file diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index 934bb467..327d5100 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -15,6 +15,9 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { path "software_versions_mqc.yml", emit: mqc_yml path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' template 'dumpsoftwareversions.py' diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index 5b5b8a60..60b546a0 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -8,7 +8,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - licence: ['MIT'] + licence: ["MIT"] input: - versions: type: file diff --git a/modules/nf-core/modules/deepvariant/main.nf b/modules/nf-core/modules/deepvariant/main.nf index 98345c83..c5e81997 100644 --- a/modules/nf-core/modules/deepvariant/main.nf +++ b/modules/nf-core/modules/deepvariant/main.nf @@ -21,6 +21,9 @@ process DEEPVARIANT { tuple val(meta), path("*g.vcf.gz"), emit: gvcf path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/deepvariant/meta.yml b/modules/nf-core/modules/deepvariant/meta.yml index d4423d69..b2d480a3 100644 --- a/modules/nf-core/modules/deepvariant/meta.yml +++ b/modules/nf-core/modules/deepvariant/meta.yml @@ -10,7 +10,7 @@ tools: documentation: https://github.com/google/deepvariant tool_dev_url: https://github.com/google/deepvariant doi: "https://doi.org/10.1038/nbt.4235" - licence: ['BSD-3-clause'] + licence: ["BSD-3-clause"] input: - meta: diff --git a/modules/nf-core/modules/expansionhunter/main.nf b/modules/nf-core/modules/expansionhunter/main.nf index 4db78230..4e62b2a6 100644 --- a/modules/nf-core/modules/expansionhunter/main.nf +++ b/modules/nf-core/modules/expansionhunter/main.nf @@ -16,6 +16,9 @@ process EXPANSIONHUNTER { tuple val(meta), path("*.vcf"), emit: vcf path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/expansionhunter/meta.yml b/modules/nf-core/modules/expansionhunter/meta.yml index 17d72bb4..3483c0db 100644 --- a/modules/nf-core/modules/expansionhunter/meta.yml +++ b/modules/nf-core/modules/expansionhunter/meta.yml @@ -10,7 +10,7 @@ tools: documentation: https://github.com/Illumina/ExpansionHunter/blob/master/docs/01_Introduction.md tool_dev_url: None doi: "10.1093/bioinformatics/btz431" - licence: ['Apache-2.0'] + licence: ["Apache-2.0"] input: - meta: diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index d250eca0..ed6b8c50 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -15,6 +15,9 @@ process FASTQC { tuple val(meta), path("*.zip") , emit: zip path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index b09553a3..4da5bb5a 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -1,52 +1,52 @@ name: fastqc description: Run FastQC on sequenced reads keywords: - - quality control - - qc - - adapters - - fastq + - quality control + - qc + - adapters + - fastq tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ['GPL-2.0-only'] + - fastqc: + description: | + FastQC gives general quality metrics about your reads. + It provides information about the quality score distribution + across your reads, the per base sequence content (%A/C/G/T). + You get information about adapter contamination and other + overrepresented sequences. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ + documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ["GPL-2.0-only"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - html: + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + - zip: + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf index 37f46f48..74256dd1 100644 --- a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf +++ b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf @@ -2,10 +2,10 @@ process GATK4_BEDTOINTERVALLIST { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" input: tuple val(meta), path(bed) @@ -15,6 +15,9 @@ process GATK4_BEDTOINTERVALLIST { tuple val(meta), path('*.interval_list'), emit: interval_list path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml b/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml index 910f9552..986f1592 100644 --- a/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml +++ b/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml @@ -12,7 +12,7 @@ tools: homepage: https://gatk.broadinstitute.org/hc/en-us documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s doi: 10.1158/1538-7445.AM2017-3590 - licence: ['Apache-2.0'] + licence: ["Apache-2.0"] input: - meta: type: map diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf index 2cbd8948..87d52a59 100644 --- a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf +++ b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf @@ -2,10 +2,10 @@ process GATK4_CREATESEQUENCEDICTIONARY { tag "$fasta" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" input: path fasta @@ -14,6 +14,9 @@ process GATK4_CREATESEQUENCEDICTIONARY { path "*.dict" , emit: dict path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def avail_mem = 6 diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml b/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml index 54f479b3..bd247888 100644 --- a/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml +++ b/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml @@ -1,32 +1,32 @@ name: gatk4_createsequencedictionary description: Creates a sequence dictionary for a reference sequence keywords: - - dictionary - - fasta + - dictionary + - fasta tools: - - gatk: - description: | - Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools - with a primary focus on variant discovery and genotyping. Its powerful processing engine - and high-performance computing features make it capable of taking on projects of any size. - homepage: https://gatk.broadinstitute.org/hc/en-us - documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s - doi: 10.1158/1538-7445.AM2017-3590 - licence: ['Apache-2.0'] + - gatk: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] input: - - fasta: - type: file - description: Input fasta file - pattern: "*.{fasta,fa}" + - fasta: + type: file + description: Input fasta file + pattern: "*.{fasta,fa}" output: - - dict: - type: file - description: gatk dictionary file - pattern: "*.{dict}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - dict: + type: file + description: gatk dictionary file + pattern: "*.{dict}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@maxulysse" + - "@maxulysse" diff --git a/modules/nf-core/modules/gatk4/intervallisttools/main.nf b/modules/nf-core/modules/gatk4/intervallisttools/main.nf index 17412160..352a3240 100644 --- a/modules/nf-core/modules/gatk4/intervallisttools/main.nf +++ b/modules/nf-core/modules/gatk4/intervallisttools/main.nf @@ -2,10 +2,10 @@ process GATK4_INTERVALLISTTOOLS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" input: tuple val(meta), path(interval_list) @@ -14,6 +14,9 @@ process GATK4_INTERVALLISTTOOLS { tuple val(meta), path("*_split/*/*.interval_list"), emit: interval_list path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/gatk4/intervallisttools/meta.yml b/modules/nf-core/modules/gatk4/intervallisttools/meta.yml index 9e2d994f..804645f3 100644 --- a/modules/nf-core/modules/gatk4/intervallisttools/meta.yml +++ b/modules/nf-core/modules/gatk4/intervallisttools/meta.yml @@ -14,7 +14,7 @@ tools: homepage: https://gatk.broadinstitute.org/hc/en-us documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s doi: 10.1158/1538-7445.AM2017-3590 - licence: ['Apache-2.0'] + licence: ["Apache-2.0"] input: - meta: diff --git a/modules/nf-core/modules/glnexus/main.nf b/modules/nf-core/modules/glnexus/main.nf index b8afca22..84da95a0 100644 --- a/modules/nf-core/modules/glnexus/main.nf +++ b/modules/nf-core/modules/glnexus/main.nf @@ -14,6 +14,9 @@ process GLNEXUS { tuple val(meta), path("*.bcf"), emit: bcf path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/glnexus/meta.yml b/modules/nf-core/modules/glnexus/meta.yml index 5ba17cae..0fc19452 100644 --- a/modules/nf-core/modules/glnexus/meta.yml +++ b/modules/nf-core/modules/glnexus/meta.yml @@ -10,7 +10,7 @@ tools: documentation: https://github.com/dnanexus-rnd/GLnexus/wiki/Getting-Started tool_dev_url: None doi: https://doi.org/10.1101/343970 - licence: ['Apache-2.0'] + licence: ["Apache-2.0"] input: - meta: diff --git a/modules/nf-core/modules/mosdepth/meta.yml b/modules/nf-core/modules/mosdepth/meta.yml index 0ca7bce9..636e966b 100644 --- a/modules/nf-core/modules/mosdepth/meta.yml +++ b/modules/nf-core/modules/mosdepth/meta.yml @@ -11,7 +11,7 @@ tools: Fast BAM/CRAM depth calculation for WGS, exome, or targeted sequencing. documentation: https://github.com/brentp/mosdepth doi: 10.1093/bioinformatics/btx699 - licence: ['MIT'] + licence: ["MIT"] input: - meta: type: map @@ -73,6 +73,6 @@ output: description: File containing software versions pattern: "versions.yml" authors: - - "@joseespinosa" - - "@drpatelh" - - "@ramprasadn" + - "@joseespinosa" + - "@drpatelh" + - "@ramprasadn" diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 3dceb162..1264aac1 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_medium' - conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" input: path multiqc_files @@ -15,6 +15,9 @@ process MULTIQC { path "*_plots" , optional:true, emit: plots path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 63c75a45..6fa891ef 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -1,40 +1,40 @@ name: MultiQC description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report + - QC + - bioinformatics tools + - Beautiful stand-alone HTML report tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ - licence: ['GPL-3.0-or-later'] + - multiqc: + description: | + MultiQC searches a given directory for analysis logs and compiles a HTML report. + It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. + homepage: https://multiqc.info/ + documentation: https://multiqc.info/docs/ + licence: ["GPL-3.0-or-later"] input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: dir - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - report: + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + - data: + type: dir + description: MultiQC data dir + pattern: "multiqc_data" + - plots: + type: file + description: Plots created by MultiQC + pattern: "*_data" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" + - "@abhi18av" + - "@bunop" + - "@drpatelh" diff --git a/modules/nf-core/modules/picard/collecthsmetrics/main.nf b/modules/nf-core/modules/picard/collecthsmetrics/main.nf index ae3e4d96..07e8504f 100644 --- a/modules/nf-core/modules/picard/collecthsmetrics/main.nf +++ b/modules/nf-core/modules/picard/collecthsmetrics/main.nf @@ -18,6 +18,9 @@ process PICARD_COLLECTHSMETRICS { tuple val(meta), path("*collecthsmetrics.txt"), emit: hs_metrics path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index 6b292534..e023ea3c 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -2,10 +2,10 @@ process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) + conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -16,6 +16,9 @@ process PICARD_COLLECTMULTIPLEMETRICS { tuple val(meta), path("*.pdf") , emit: pdf path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml index 613afc62..68b5c65e 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml @@ -1,50 +1,50 @@ name: picard_collectmultiplemetrics description: Collect multiple metrics from a BAM file keywords: - - alignment - - metrics - - statistics - - insert - - quality - - bam + - alignment + - metrics + - statistics + - insert + - quality + - bam tools: - - picard: - description: | - A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) - data and formats such as SAM/BAM/CRAM and VCF. - homepage: https://broadinstitute.github.io/picard/ - documentation: https://broadinstitute.github.io/picard/ - licence: ['MIT'] + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file - pattern: "*.{bam}" - - fasta: - type: file - description: Genome fasta file + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam}" + - fasta: + type: file + description: Genome fasta file output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - metrics: - type: file - description: Alignment metrics files generated by picard - pattern: "*_{metrics}" - - pdf: - type: file - description: PDF plots of metrics - pattern: "*.{pdf}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - metrics: + type: file + description: Alignment metrics files generated by picard + pattern: "*_{metrics}" + - pdf: + type: file + description: PDF plots of metrics + pattern: "*.{pdf}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" + - "@drpatelh" diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index d3bf6938..5196b6ed 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -2,10 +2,10 @@ process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) + conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -16,6 +16,9 @@ process PICARD_MARKDUPLICATES { tuple val(meta), path("*.metrics.txt"), emit: metrics path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/picard/markduplicates/meta.yml b/modules/nf-core/modules/picard/markduplicates/meta.yml index c9a08b36..842817bc 100644 --- a/modules/nf-core/modules/picard/markduplicates/meta.yml +++ b/modules/nf-core/modules/picard/markduplicates/meta.yml @@ -14,7 +14,7 @@ tools: data and formats such as SAM/BAM/CRAM and VCF. homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ - licence: ['MIT'] + licence: ["MIT"] input: - meta: type: map diff --git a/modules/nf-core/modules/qualimap/bamqc/main.nf b/modules/nf-core/modules/qualimap/bamqc/main.nf index a47fde7e..92f38f8c 100644 --- a/modules/nf-core/modules/qualimap/bamqc/main.nf +++ b/modules/nf-core/modules/qualimap/bamqc/main.nf @@ -10,19 +10,21 @@ process QUALIMAP_BAMQC { input: tuple val(meta), path(bam) path gff - val use_gff output: tuple val(meta), path("${prefix}"), emit: results path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: - def args = task.ext.args ?: '' - prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" def collect_pairs = meta.single_end ? '' : '--collect-overlap-pairs' def memory = task.memory.toGiga() + "G" - def regions = use_gff ? "--gff $gff" : '' + def regions = gff ? "--gff $gff" : '' def strandedness = 'non-strand-specific' if (meta.strandedness == 'forward') { diff --git a/modules/nf-core/modules/qualimap/bamqc/meta.yml b/modules/nf-core/modules/qualimap/bamqc/meta.yml index 6888d30e..303532eb 100644 --- a/modules/nf-core/modules/qualimap/bamqc/meta.yml +++ b/modules/nf-core/modules/qualimap/bamqc/meta.yml @@ -1,50 +1,47 @@ name: qualimap_bamqc description: Evaluate alignment data keywords: - - quality control - - qc - - bam + - quality control + - qc + - bam tools: - - qualimap: - description: | - Qualimap 2 is a platform-independent application written in - Java and R that provides both a Graphical User Interface and - a command-line interface to facilitate the quality control of - alignment sequencing data and its derivatives like feature counts. - homepage: http://qualimap.bioinfo.cipf.es/ - documentation: http://qualimap.conesalab.org/doc_html/index.html - doi: 10.1093/bioinformatics/bts503 - licence: ['GPL-2.0-only'] + - qualimap: + description: | + Qualimap 2 is a platform-independent application written in + Java and R that provides both a Graphical User Interface and + a command-line interface to facilitate the quality control of + alignment sequencing data and its derivatives like feature counts. + homepage: http://qualimap.bioinfo.cipf.es/ + documentation: http://qualimap.conesalab.org/doc_html/index.html + doi: 10.1093/bioinformatics/bts503 + licence: ["GPL-2.0-only"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file - pattern: "*.{bam}" - - gff: - type: file - description: Feature file with regions of interest - pattern: "*.{gff,gtf,bed}" - - use_gff: - type: boolean - description: Specifies if feature file should be used or not + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam}" + - gff: + type: file + description: Feature file with regions of interest + pattern: "*.{gff,gtf,bed}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - results: - type: dir - description: Qualimap results dir - pattern: "*/*" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - results: + type: dir + description: Qualimap results dir + pattern: "*/*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@phue" + - "@phue" diff --git a/modules/nf-core/modules/qualimap/bamqccram/main.nf b/modules/nf-core/modules/qualimap/bamqccram/main.nf new file mode 100644 index 00000000..b9a5538d --- /dev/null +++ b/modules/nf-core/modules/qualimap/bamqccram/main.nf @@ -0,0 +1,60 @@ +process QUALIMAP_BAMQCCRAM { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::qualimap=2.2.2d bioconda::samtools=1.12" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-d3934ca6bb4e61334891ffa2e9a4c87a530e3188:4bf11d12f2c3eccf1eb585097c0b6fd31c18c418-0' : + 'quay.io/biocontainers/mulled-v2-d3934ca6bb4e61334891ffa2e9a4c87a530e3188:4bf11d12f2c3eccf1eb585097c0b6fd31c18c418-0' }" + + input: + tuple val(meta), path(cram), path(crai) + path gff + path fasta + path fasta_fai + + output: + tuple val(meta), path("${prefix}"), emit: results + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def collect_pairs = meta.single_end ? '' : '--collect-overlap-pairs' + def memory = task.memory.toGiga() + "G" + def regions = gff ? "--gff $gff" : '' + + def strandedness = 'non-strand-specific' + if (meta.strandedness == 'forward') { + strandedness = 'strand-specific-forward' + } else if (meta.strandedness == 'reverse') { + strandedness = 'strand-specific-reverse' + } + """ + unset DISPLAY + mkdir tmp + export _JAVA_OPTIONS=-Djava.io.tmpdir=./tmp + + samtools view -hb -T ${fasta} ${cram} | + qualimap \\ + --java-mem-size=$memory \\ + bamqc \\ + $args \\ + -bam /dev/stdin \\ + $regions \\ + -p $strandedness \\ + $collect_pairs \\ + -outdir $prefix \\ + -nt $task.cpus + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + qualimap: \$(echo \$(qualimap 2>&1) | sed 's/^.*QualiMap v.//; s/Built.*\$//') + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/qualimap/bamqccram/meta.yml b/modules/nf-core/modules/qualimap/bamqccram/meta.yml new file mode 100644 index 00000000..d72f203d --- /dev/null +++ b/modules/nf-core/modules/qualimap/bamqccram/meta.yml @@ -0,0 +1,51 @@ +name: qualimap_bamqccram +description: Evaluate alignment data +keywords: + - quality control + - qc + - bam +tools: + - qualimap: + description: | + Qualimap 2 is a platform-independent application written in + Java and R that provides both a Graphical User Interface and + a command-line interface to facilitate the quality control of + alignment sequencing data and its derivatives like feature counts. + homepage: http://qualimap.bioinfo.cipf.es/ + documentation: http://qualimap.conesalab.org/doc_html/index.html + doi: 10.1093/bioinformatics/bts503 + licence: ["GPL-2.0-only"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bacramm: + type: file + description: BAM file + pattern: "*.{bam}" + - gff: + type: file + description: Feature file with regions of interest + pattern: "*.{gff,gtf,bed}" + - fasta: + type: file + description: Reference file of cram file + pattern: "*.{fasta,fa,fna}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - results: + type: dir + description: Qualimap results dir + pattern: "*/*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/modules/samtools/faidx/main.nf index d8308b03..b83a4952 100644 --- a/modules/nf-core/modules/samtools/faidx/main.nf +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -11,13 +11,19 @@ process SAMTOOLS_FAIDX { tuple val(meta), path(fasta) output: - tuple val(meta), path ("*.fai") , emit: fai - path "versions.yml" , emit: versions + tuple val(meta), path ("*.fai"), emit: fai + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' """ - samtools faidx $fasta + samtools \\ + faidx \\ + $fasta + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml index bae97a39..e9767764 100644 --- a/modules/nf-core/modules/samtools/faidx/meta.yml +++ b/modules/nf-core/modules/samtools/faidx/meta.yml @@ -1,43 +1,43 @@ name: samtools_faidx description: Index FASTA file keywords: - - index - - fasta + - index + - fasta tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: http://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fasta: - type: file - description: FASTA file - pattern: "*.{fa,fasta}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: FASTA file + pattern: "*.{fa,fasta}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fai: - type: file - description: FASTA index file - pattern: "*.{fai}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@ewels" - - "@phue" + - "@drpatelh" + - "@ewels" + - "@phue" diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index b033e225..dfe0234f 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -12,14 +12,21 @@ process SAMTOOLS_INDEX { output: tuple val(meta), path("*.bai") , optional:true, emit: bai - tuple val(meta), path("*.crai"), optional:true, emit: crai tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ - samtools index -@ ${task.cpus-1} $args $input + samtools \\ + index \\ + -@ ${task.cpus-1} \\ + $args \\ + $input cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml index 0905b3cd..e5cadbc2 100644 --- a/modules/nf-core/modules/samtools/index/meta.yml +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -1,53 +1,53 @@ name: samtools_index description: Index SAM/BAM/CRAM file keywords: - - index - - bam - - sam - - cram + - index + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bai: - type: file - description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - crai: - type: file - description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - csi: - type: file - description: CSI index file - pattern: "*.{csi}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - crai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - csi: + type: file + description: CSI index file + pattern: "*.{csi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@ewels" - - "@maxulysse" + - "@drpatelh" + - "@ewels" + - "@maxulysse" diff --git a/modules/nf-core/modules/samtools/merge/main.nf b/modules/nf-core/modules/samtools/merge/main.nf index 8eeb64a2..be6fe32e 100644 --- a/modules/nf-core/modules/samtools/merge/main.nf +++ b/modules/nf-core/modules/samtools/merge/main.nf @@ -12,17 +12,26 @@ process SAMTOOLS_MERGE { path fasta output: - tuple val(meta), path("${prefix}.bam"), optional:true, emit: bam + tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: - def args = task.ext.args ?: '' - prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" def file_type = input_files[0].getExtension() def reference = fasta ? "--reference ${fasta}" : "" """ - samtools merge --threads ${task.cpus-1} $args ${reference} ${prefix}.${file_type} $input_files + samtools \\ + merge \\ + --threads ${task.cpus-1} \\ + $args \\ + ${reference} \\ + ${prefix}.${file_type} \\ + $input_files cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/samtools/merge/meta.yml b/modules/nf-core/modules/samtools/merge/meta.yml index 2576a3a3..fb78e55c 100644 --- a/modules/nf-core/modules/samtools/merge/meta.yml +++ b/modules/nf-core/modules/samtools/merge/meta.yml @@ -1,54 +1,54 @@ name: samtools_merge description: Merge BAM or CRAM file keywords: - - merge - - bam - - sam - - cram + - merge + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input_files: - type: file - description: BAM/CRAM file - pattern: "*.{bam,cram,sam}" - - fasta: - type: optional file - description: Reference file the CRAM was created with - pattern: "*.{fasta,fa}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_files: + type: file + description: BAM/CRAM file + pattern: "*.{bam,cram,sam}" + - fasta: + type: optional file + description: Reference file the CRAM was created with + pattern: "*.{fasta,fa}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file - pattern: "*.{bam}" - - cram: - type: file - description: CRAM file - pattern: "*.{cram}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam}" + - cram: + type: file + description: CRAM file + pattern: "*.{cram}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@yuukiiwa " - - "@maxulysse" - - "@FriederikeHanssen" + - "@drpatelh" + - "@yuukiiwa " + - "@maxulysse" + - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index 0c2cf25e..0f2237cc 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -14,9 +14,13 @@ process SAMTOOLS_SORT { tuple val(meta), path("*.bam"), emit: bam path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ samtools sort $args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml index 3402a068..a820c55a 100644 --- a/modules/nf-core/modules/samtools/sort/meta.yml +++ b/modules/nf-core/modules/samtools/sort/meta.yml @@ -1,44 +1,44 @@ name: samtools_sort description: Sort SAM/BAM/CRAM file keywords: - - sort - - bam - - sam - - cram + - sort + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@ewels" + - "@drpatelh" + - "@ewels" diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 83c87002..f6fe3bfe 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -15,11 +15,19 @@ process SAMTOOLS_STATS { tuple val(meta), path("*.stats"), emit: stats path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def reference = fasta ? "--reference ${fasta}" : "" """ - samtools stats --threads ${task.cpus-1} ${reference} ${input} > ${input}.stats + samtools \\ + stats \\ + --threads ${task.cpus-1} \\ + ${reference} \\ + ${input} \\ + > ${input}.stats cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/modules/samtools/stats/meta.yml index 869e62e3..cac50b1c 100644 --- a/modules/nf-core/modules/samtools/stats/meta.yml +++ b/modules/nf-core/modules/samtools/stats/meta.yml @@ -1,53 +1,53 @@ name: samtools_stats description: Produces comprehensive statistics from SAM/BAM/CRAM file keywords: - - statistics - - counts - - bam - - sam - - cram + - statistics + - counts + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + - fasta: + type: optional file + description: Reference file the CRAM was created with + pattern: "*.{fasta,fa}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - stats: type: file - description: BAM/CRAM file from alignment - pattern: "*.{bam,cram}" - - input_index: + description: File containing samtools stats output + pattern: "*.{stats}" + - versions: type: file - description: BAI/CRAI file from alignment - pattern: "*.{bai,crai}" - - fasta: - type: optional file - description: Reference file the CRAM was created with - pattern: "*.{fasta,fa}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - stats: - type: file - description: File containing samtools stats output - pattern: "*.{stats}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@FriederikeHanssen" + - "@drpatelh" + - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 7c812a1a..1f479ea4 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -22,20 +22,14 @@ process SVDB_MERGE { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def input = "" - if(priority) { - prio = "--priority ${priority.join(',')}" - for (int index = 0; index < vcfs.size(); index++) { - input += " ${vcfs[index]}:${priority[index]}" - } - } else { - prio = "" - input = "${vcfs.join(" ")}" + for (int index = 0; index < vcfs.size(); index++) { + input += " ${vcfs[index]}:${priority[index]}" } """ svdb \\ --merge \\ $args \\ - $prio \\ + --priority ${priority.join(',')} \\ --vcf $input \\ > ${prefix}_sv_merge.vcf diff --git a/modules/nf-core/modules/svdb/merge/meta.yml b/modules/nf-core/modules/svdb/merge/meta.yml index 2092ddd9..e166bad0 100644 --- a/modules/nf-core/modules/svdb/merge/meta.yml +++ b/modules/nf-core/modules/svdb/merge/meta.yml @@ -7,7 +7,7 @@ tools: description: structural variant database software homepage: https://github.com/J35P312/SVDB documentation: https://github.com/J35P312/SVDB/blob/master/README.md - licence: ['MIT'] + licence: ["MIT"] input: - meta: type: map diff --git a/modules/nf-core/modules/tabix/bgziptabix/main.nf b/modules/nf-core/modules/tabix/bgziptabix/main.nf index e419d153..12657599 100644 --- a/modules/nf-core/modules/tabix/bgziptabix/main.nf +++ b/modules/nf-core/modules/tabix/bgziptabix/main.nf @@ -14,12 +14,15 @@ process TABIX_BGZIPTABIX { tuple val(meta), path("*.gz"), path("*.tbi"), emit: gz_tbi path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - bgzip -c $args $input > ${prefix}.gz + bgzip --threads ${task.cpus} -c $args $input > ${prefix}.gz tabix $args2 ${prefix}.gz cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/tabix/bgziptabix/meta.yml b/modules/nf-core/modules/tabix/bgziptabix/meta.yml index f2aed84d..49c03289 100644 --- a/modules/nf-core/modules/tabix/bgziptabix/meta.yml +++ b/modules/nf-core/modules/tabix/bgziptabix/meta.yml @@ -1,45 +1,45 @@ name: tabix_bgziptabix description: bgzip a sorted tab-delimited genome file and then create tabix index keywords: - - bgzip - - compress - - index - - tabix - - vcf + - bgzip + - compress + - index + - tabix + - vcf tools: - - tabix: - description: Generic indexer for TAB-delimited genome position files. - homepage: https://www.htslib.org/doc/tabix.html - documentation: https://www.htslib.org/doc/tabix.1.html - doi: 10.1093/bioinformatics/btq671 - licence: ['MIT'] + - tabix: + description: Generic indexer for TAB-delimited genome position files. + homepage: https://www.htslib.org/doc/tabix.html + documentation: https://www.htslib.org/doc/tabix.1.html + doi: 10.1093/bioinformatics/btq671 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - tab: - type: file - description: TAB-delimited genome position file - pattern: "*.{bed,gff,sam,vcf}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - tab: + type: file + description: TAB-delimited genome position file + pattern: "*.{bed,gff,sam,vcf}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - gz: - type: file - description: Output compressed file - pattern: "*.{gz}" - - tbi: - type: file - description: tabix index file - pattern: "*.{gz.tbi}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - gz: + type: file + description: Output compressed file + pattern: "*.{gz}" + - tbi: + type: file + description: tabix index file + pattern: "*.{gz.tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@maxulysse" + - "@maxulysse" diff --git a/modules/nf-core/modules/tabix/tabix/main.nf b/modules/nf-core/modules/tabix/tabix/main.nf index c721a554..5f516261 100644 --- a/modules/nf-core/modules/tabix/tabix/main.nf +++ b/modules/nf-core/modules/tabix/tabix/main.nf @@ -14,6 +14,9 @@ process TABIX_TABIX { tuple val(meta), path("*.tbi"), emit: tbi path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/tabix/tabix/meta.yml b/modules/nf-core/modules/tabix/tabix/meta.yml index 2e37c4ff..89478abe 100644 --- a/modules/nf-core/modules/tabix/tabix/meta.yml +++ b/modules/nf-core/modules/tabix/tabix/meta.yml @@ -1,41 +1,41 @@ name: tabix_tabix description: create tabix index from a sorted bgzip tab-delimited genome file keywords: - - index - - tabix - - vcf + - index + - tabix + - vcf tools: - - tabix: - description: Generic indexer for TAB-delimited genome position files. - homepage: https://www.htslib.org/doc/tabix.html - documentation: https://www.htslib.org/doc/tabix.1.html - doi: 10.1093/bioinformatics/btq671 - licence: ['MIT'] + - tabix: + description: Generic indexer for TAB-delimited genome position files. + homepage: https://www.htslib.org/doc/tabix.html + documentation: https://www.htslib.org/doc/tabix.1.html + doi: 10.1093/bioinformatics/btq671 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - tab: - type: file - description: TAB-delimited genome position file compressed with bgzip - pattern: "*.{bed.gz,gff.gz,sam.gz,vcf.gz}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - tab: + type: file + description: TAB-delimited genome position file compressed with bgzip + pattern: "*.{bed.gz,gff.gz,sam.gz,vcf.gz}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - tbi: - type: file - description: tabix index file - pattern: "*.{tbi}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - tbi: + type: file + description: tabix index file + pattern: "*.{tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@joseespinosa" - - "@drpatelh" - - "@maxulysse" + - "@joseespinosa" + - "@drpatelh" + - "@maxulysse" diff --git a/modules/nf-core/modules/tiddit/cov/main.nf b/modules/nf-core/modules/tiddit/cov/main.nf index c5a1ca0f..a5f8c649 100644 --- a/modules/nf-core/modules/tiddit/cov/main.nf +++ b/modules/nf-core/modules/tiddit/cov/main.nf @@ -16,6 +16,9 @@ process TIDDIT_COV { tuple val(meta), path("*.wig"), optional: true, emit: wig path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/tiddit/sv/main.nf b/modules/nf-core/modules/tiddit/sv/main.nf index 08eecc01..454dfc54 100644 --- a/modules/nf-core/modules/tiddit/sv/main.nf +++ b/modules/nf-core/modules/tiddit/sv/main.nf @@ -18,6 +18,9 @@ process TIDDIT_SV { tuple val(meta), path("*.signals.tab"), emit: signals path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/tiddit/sv/meta.yml b/modules/nf-core/modules/tiddit/sv/meta.yml index f788ffa6..fc307081 100644 --- a/modules/nf-core/modules/tiddit/sv/meta.yml +++ b/modules/nf-core/modules/tiddit/sv/meta.yml @@ -1,51 +1,51 @@ name: tiddit_sv description: Identify chromosomal rearrangements. keywords: - - structural - - variants - - vcf + - structural + - variants + - vcf tools: - - sv: - description: Search for structural variants. - homepage: https://github.com/SciLifeLab/TIDDIT - documentation: https://github.com/SciLifeLab/TIDDIT/blob/master/README.md - doi: 10.12688/f1000research.11168.1 - licence: ['GPL-3.0-or-later'] + - sv: + description: Search for structural variants. + homepage: https://github.com/SciLifeLab/TIDDIT + documentation: https://github.com/SciLifeLab/TIDDIT/blob/master/README.md + doi: 10.12688/f1000research.11168.1 + licence: ["GPL-3.0-or-later"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fasta: - type: file - description: Input FASTA file - pattern: "*.{fasta,fa}" - - fai: - type: file - description: FASTA index file - pattern: "*.{fai}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: Input FASTA file + pattern: "*.{fasta,fa}" + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: vcf - pattern: "*.{vcf}" - - ploidy: - type: file - description: tab - pattern: "*.{ploidy.tab}" - - signals: - type: file - description: tab - pattern: "*.{signals.tab}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: vcf + pattern: "*.{vcf}" + - ploidy: + type: file + description: tab + pattern: "*.{ploidy.tab}" + - signals: + type: file + description: tab + pattern: "*.{signals.tab}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@maxulysse" + - "@maxulysse" diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf index 6a1847b6..d07e7ec1 100644 --- a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf +++ b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf @@ -17,6 +17,9 @@ process UCSC_WIGTOBIGWIG { tuple val(meta), path("*.bw"), emit: bw path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml b/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml index 5ca94bb4..8eed29bb 100644 --- a/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml +++ b/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml @@ -12,7 +12,7 @@ tools: documentation: None tool_dev_url: None doi: "" - licence: ['varies; see http://genome.ucsc.edu/license'] + licence: ["varies; see http://genome.ucsc.edu/license"] input: - meta: From a4b1578aef699ecae39ca4b6f32a8892e0ca4cdc Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 21 Feb 2022 18:02:10 +0100 Subject: [PATCH 0247/1169] update local modules: attmpt 1 --- modules/local/check_input_vcf.nf | 6 +++--- modules/local/get_chrom_sizes.nf | 3 +++ modules/local/manta/germline/main.nf | 3 +++ modules/local/samplesheet_check.nf | 14 ++++++++------ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index 8afcb4b3..ac1eb6c6 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -1,10 +1,10 @@ process CHECK_INPUT_VCF { tag "check_vcf" - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - 'quay.io/biocontainers/python:3.8.3' }" + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'quay.io/biocontainers/python:3.9--1' }" input: path vcf diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index d87b3e39..66919879 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -13,6 +13,9 @@ process GET_CHROM_SIZES { path '*.sizes' , emit: sizes path "versions.yml", emit: versions + when: + task.ext.when == null || task.ext.when + script: """ cut -f 1,2 $fai > ${fai}.sizes diff --git a/modules/local/manta/germline/main.nf b/modules/local/manta/germline/main.nf index 87512e08..981bccbf 100644 --- a/modules/local/manta/germline/main.nf +++ b/modules/local/manta/germline/main.nf @@ -24,6 +24,9 @@ process MANTA_GERMLINE { tuple val(meta), path("*diploid_sv.vcf.gz.tbi") , emit: diploid_sv_vcf_tbi path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index d2c6d889..dcbb9a90 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,10 +1,10 @@ process SAMPLESHEET_CHECK { tag "$samplesheet" - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - 'quay.io/biocontainers/python:3.8.3' }" + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'quay.io/biocontainers/python:3.9--1' }" input: path samplesheet @@ -13,15 +13,17 @@ process SAMPLESHEET_CHECK { path '*.csv' , emit: csv path "versions.yml", emit: versions - script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ + when: + task.ext.when == null || task.ext.when + + script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/ """ check_samplesheet.py \\ $samplesheet \\ samplesheet.valid.csv - cat <<-END_VERSIONS > versions.yml "${task.process}": python: \$(python --version | sed 's/Python //g') END_VERSIONS """ -} +} \ No newline at end of file From effe4e897aff20e8d22926f7e45603b3bb9d53f0 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Feb 2022 09:32:23 +0100 Subject: [PATCH 0248/1169] fixed qualimap --- subworkflows/nf-core/qc_bam.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 8788c87e..720c14d5 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -44,8 +44,7 @@ workflow QC_BAM { // QUALIMAP BAMQC gff = [] - use_gff = false - QUALIMAP_BAMQC ( bam, gff, use_gff ) + QUALIMAP_BAMQC ( bam, gff ) ch_versions = ch_versions.mix(QUALIMAP_BAMQC.out.versions) // TIDDIT COVERAGE From 33fb8136a7b64f6cc144380122acaa4d4d0e90e1 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Feb 2022 10:17:30 +0100 Subject: [PATCH 0249/1169] fixed svdb_merge --- modules/nf-core/modules/svdb/merge/main.nf | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 1f479ea4..4baa1d88 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -22,17 +22,22 @@ process SVDB_MERGE { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def input = "" - for (int index = 0; index < vcfs.size(); index++) { - input += " ${vcfs[index]}:${priority[index]}" + if(priority) { + prio = "--priority ${priority.join(',')}" + for (int index = 0; index < vcfs.size(); index++) { + input += " ${vcfs[index]}:${priority[index]}" + } + } else { + prio = "" + input = "${vcfs.join(" ")}" } """ svdb \\ --merge \\ $args \\ - --priority ${priority.join(',')} \\ + $prio \\ --vcf $input \\ > ${prefix}_sv_merge.vcf - cat <<-END_VERSIONS > versions.yml "${task.process}": svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) @@ -43,10 +48,9 @@ process SVDB_MERGE { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_sv_merge.vcf - cat <<-END_VERSIONS > versions.yml "${task.process}": svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) END_VERSIONS """ -} +} \ No newline at end of file From 7c1a38b1728963fe19ef666caaab70b0a885fd86 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Feb 2022 10:46:09 +0100 Subject: [PATCH 0250/1169] nf-core/modules updated --- modules.json | 2 +- .../modules/qualimap/bamqccram/main.nf | 60 ------------------- .../modules/qualimap/bamqccram/meta.yml | 51 ---------------- modules/nf-core/modules/untar/meta.yml | 42 ++++++------- 4 files changed, 22 insertions(+), 133 deletions(-) delete mode 100644 modules/nf-core/modules/qualimap/bamqccram/main.nf delete mode 100644 modules/nf-core/modules/qualimap/bamqccram/meta.yml diff --git a/modules.json b/modules.json index e45ee698..93b454fb 100644 --- a/modules.json +++ b/modules.json @@ -91,7 +91,7 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "untar": { - "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "vcfanno": { "git_sha": "2597c31d6bba4a354fc58b535c76bd14aed1c585" diff --git a/modules/nf-core/modules/qualimap/bamqccram/main.nf b/modules/nf-core/modules/qualimap/bamqccram/main.nf deleted file mode 100644 index b9a5538d..00000000 --- a/modules/nf-core/modules/qualimap/bamqccram/main.nf +++ /dev/null @@ -1,60 +0,0 @@ -process QUALIMAP_BAMQCCRAM { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::qualimap=2.2.2d bioconda::samtools=1.12" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-d3934ca6bb4e61334891ffa2e9a4c87a530e3188:4bf11d12f2c3eccf1eb585097c0b6fd31c18c418-0' : - 'quay.io/biocontainers/mulled-v2-d3934ca6bb4e61334891ffa2e9a4c87a530e3188:4bf11d12f2c3eccf1eb585097c0b6fd31c18c418-0' }" - - input: - tuple val(meta), path(cram), path(crai) - path gff - path fasta - path fasta_fai - - output: - tuple val(meta), path("${prefix}"), emit: results - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" - - def collect_pairs = meta.single_end ? '' : '--collect-overlap-pairs' - def memory = task.memory.toGiga() + "G" - def regions = gff ? "--gff $gff" : '' - - def strandedness = 'non-strand-specific' - if (meta.strandedness == 'forward') { - strandedness = 'strand-specific-forward' - } else if (meta.strandedness == 'reverse') { - strandedness = 'strand-specific-reverse' - } - """ - unset DISPLAY - mkdir tmp - export _JAVA_OPTIONS=-Djava.io.tmpdir=./tmp - - samtools view -hb -T ${fasta} ${cram} | - qualimap \\ - --java-mem-size=$memory \\ - bamqc \\ - $args \\ - -bam /dev/stdin \\ - $regions \\ - -p $strandedness \\ - $collect_pairs \\ - -outdir $prefix \\ - -nt $task.cpus - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - qualimap: \$(echo \$(qualimap 2>&1) | sed 's/^.*QualiMap v.//; s/Built.*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/qualimap/bamqccram/meta.yml b/modules/nf-core/modules/qualimap/bamqccram/meta.yml deleted file mode 100644 index d72f203d..00000000 --- a/modules/nf-core/modules/qualimap/bamqccram/meta.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: qualimap_bamqccram -description: Evaluate alignment data -keywords: - - quality control - - qc - - bam -tools: - - qualimap: - description: | - Qualimap 2 is a platform-independent application written in - Java and R that provides both a Graphical User Interface and - a command-line interface to facilitate the quality control of - alignment sequencing data and its derivatives like feature counts. - homepage: http://qualimap.bioinfo.cipf.es/ - documentation: http://qualimap.conesalab.org/doc_html/index.html - doi: 10.1093/bioinformatics/bts503 - licence: ["GPL-2.0-only"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bacramm: - type: file - description: BAM file - pattern: "*.{bam}" - - gff: - type: file - description: Feature file with regions of interest - pattern: "*.{gff,gtf,bed}" - - fasta: - type: file - description: Reference file of cram file - pattern: "*.{fasta,fa,fna}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - results: - type: dir - description: Qualimap results dir - pattern: "*/*" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/modules/untar/meta.yml index 51f94995..e877a97c 100644 --- a/modules/nf-core/modules/untar/meta.yml +++ b/modules/nf-core/modules/untar/meta.yml @@ -1,28 +1,28 @@ name: untar description: Extract files. keywords: - - untar - - uncompress + - untar + - uncompress tools: - - untar: - description: | - Extract tar.gz files. - documentation: https://www.gnu.org/software/tar/manual/ - licence: ['GPL-3.0-or-later'] + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ["GPL-3.0-or-later"] input: - - archive: - type: file - description: File to be untar - pattern: "*.{tar}.{gz}" + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" output: - - untar: - type: file - description: - pattern: "*.*" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - untar: + type: file + description: + pattern: "*.*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@joseespinosa" - - "@drpatelh" + - "@joseespinosa" + - "@drpatelh" From 8baf3264846a1822167ca95beeba24d7054dbae4 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Feb 2022 11:18:43 +0100 Subject: [PATCH 0251/1169] added when directive Signed-off-by: Mei Wu <25568561+projectoriented@users.noreply.github.com> --- modules/local/check_input_vcf.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index ac1eb6c6..725197b3 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -12,6 +12,9 @@ process CHECK_INPUT_VCF { output: path '*.txt' , emit: txt + when: + task.ext.when == null || task.ext.when + script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ """ export INPUT_FILE=${vcf} From 6e6982917d3c9b11d1b880022684aac89ec47886 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Feb 2022 11:32:52 +0100 Subject: [PATCH 0252/1169] now the modules dont individually publish a versions file --- conf/modules.config | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 7cef3e8d..b722747a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -148,7 +148,7 @@ process { publishDir = [ path: { "${params.outdir}/glnexus" }, mode: 'copy', - + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } // CALL_REPEAT_EXPANSIONS @@ -156,7 +156,7 @@ process { publishDir = [ path: { "${params.outdir}/expansionhunter" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } // CALL_STRUCTURAL_VARIANTS @@ -164,6 +164,7 @@ process { publishDir = [ path: { "${params.outdir}/sv_caller" }, mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:TIDDIT_SV" { @@ -179,6 +180,7 @@ process { publishDir = [ path: { "${params.outdir}/sv_caller" }, mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: SVDB_MERGE { @@ -227,7 +229,8 @@ process { } withName: SAMTOOLS_MERGE { publishDir = [ - path: { "${params.outdir}/samtools" } + path: { "${params.outdir}/samtools" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: '.*MARKDUPLICATES' { @@ -250,7 +253,8 @@ process { withName: '.*COLLECTMULTIPLEMETRICS' { publishDir = [ path: { "${params.outdir}/bamqc_collectmultiplemetrics" }, - mode: 'copy' + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: QUALIMAP_BAMQC { @@ -263,28 +267,32 @@ process { ext.args = '-z 500 -w -u' publishDir = [ path: { "${params.outdir}/tiddit_coverage" }, - mode: 'copy' + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: ".*QC_BAM:UCSC_WIGTOBIGWIG" { ext.args = '-clip' publishDir = [ path: { "${params.outdir}/tiddit_coverage" }, - mode: 'copy' + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: MOSDEPTH { ext.args = '--d4' publishDir = [ path: { "${params.outdir}/mosdepth" }, - mode: 'copy' + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } // nf-core modules withName: FASTQC { ext.args = '--quiet' publishDir = [ - path: { "${params.outdir}/reports/fastqc/${meta.id}" } + path: { "${params.outdir}/reports/fastqc/${meta.id}" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } From 9624da409e9c845bd59b5d7c06a1a57073803383 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 23 Feb 2022 09:43:53 +0100 Subject: [PATCH 0253/1169] install module --- modules.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules.json b/modules.json index 93b454fb..9238eacd 100644 --- a/modules.json +++ b/modules.json @@ -75,6 +75,9 @@ "svdb/merge": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, + "svdb/query": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, "tabix/bgziptabix": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, From 2eafab7c7559ddab741c6ba111502bbb952b1c0c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 23 Feb 2022 12:53:00 +0100 Subject: [PATCH 0254/1169] add module files --- modules/nf-core/modules/svdb/query/main.nf | 37 ++++++++++++++++++ modules/nf-core/modules/svdb/query/meta.yml | 43 +++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 modules/nf-core/modules/svdb/query/main.nf create mode 100644 modules/nf-core/modules/svdb/query/meta.yml diff --git a/modules/nf-core/modules/svdb/query/main.nf b/modules/nf-core/modules/svdb/query/main.nf new file mode 100644 index 00000000..292fe4ce --- /dev/null +++ b/modules/nf-core/modules/svdb/query/main.nf @@ -0,0 +1,37 @@ +process SVDB_QUERY { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::svdb=2.5.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/svdb:2.5.0--py39hcbe4a3b_0': + 'quay.io/biocontainers/svdb:2.5.0--py39hcbe4a3b_0' }" + + input: + tuple val(meta), path(vcf) + path (vcf_db) + + output: + tuple val(meta), path("*_ann_svdbq.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + svdb \\ + --query \\ + $args \\ + --db $vcf_db \\ + --query_vcf $vcf \\ + >${prefix}_ann_svdbq.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/svdb/query/meta.yml b/modules/nf-core/modules/svdb/query/meta.yml new file mode 100644 index 00000000..e2a9e456 --- /dev/null +++ b/modules/nf-core/modules/svdb/query/meta.yml @@ -0,0 +1,43 @@ +name: svdb_query +description: Query a structural variant database, using a vcf file as query +keywords: + - structural variants +tools: + - svdb: + description: structural variant database software + homepage: https://github.com/J35P312/SVDB + documentation: https://github.com/J35P312/SVDB/blob/master/README.md + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: query vcf file + pattern: "*.{vcf,vcf.gz}" + - vcf_db: + type: file + description: database vcf file + pattern: "*.{vcf,vcf.gz}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: Annotated output VCF file + pattern: "*_ann_svdbq.vcf" + +authors: + - "@ramprasadn" From 4d147178c7a4e9d7bbf87f6c46ef38c162c2fc9c Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Thu, 24 Feb 2022 09:36:13 +0100 Subject: [PATCH 0255/1169] applying suggestions for: modules/local/samplesheet_check.nf Co-authored-by: Anders Jemt --- modules/local/samplesheet_check.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index dcbb9a90..5984df97 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -16,7 +16,7 @@ process SAMPLESHEET_CHECK { when: task.ext.when == null || task.ext.when - script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/ + script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ """ check_samplesheet.py \\ $samplesheet \\ From c66a34360bea403a90afddeda93beec9dabe1bd3 Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 24 Feb 2022 17:51:00 +0100 Subject: [PATCH 0256/1169] linting --- .github/workflows/linting.yml | 16 +++++----------- lib/NfcoreSchema.groovy | 4 ++-- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 3b448773..b7c3159c 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -12,9 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint @@ -51,9 +49,7 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -65,13 +61,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install yaml-lint run: npm install -g yaml-lint - name: Run yaml-lint - run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml" -o -name "*.yaml") + run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml" -o -name "*.yaml") -c ${GITHUB_WORKSPACE}/.yamllint.yml # If the above check failed, post a comment on the PR explaining the failure - name: Post PR comment @@ -87,7 +81,7 @@ jobs: * Install `yaml-lint` * [Install `npm`](https://www.npmjs.com/get-npm) then [install `yaml-lint`](https://www.npmjs.com/package/yaml-lint) (`npm install -g yaml-lint`) * Fix the markdown errors - * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml")` + * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml") -c ./.yamllint.yml` * Fix any reported errors in your YAML files Once you push these changes the test should pass, and you can hide this comment :+1: diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 40ab65f2..b3d092f8 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -27,7 +27,7 @@ class NfcoreSchema { /* groovylint-disable-next-line UnusedPrivateMethodParameter */ public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { def has_error = false - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Check for nextflow core params and unexpected params def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') @@ -135,7 +135,7 @@ class NfcoreSchema { } } - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Validate parameters against the schema InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) From eb77fc046acd4189643d46b92754a601a3448874 Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 24 Feb 2022 18:01:08 +0100 Subject: [PATCH 0257/1169] use the sort command in the bwa mem module --- conf/modules.config | 7 --- modules.json | 3 -- modules/nf-core/modules/samtools/sort/main.nf | 31 ------------- .../nf-core/modules/samtools/sort/meta.yml | 44 ------------------- subworkflows/nf-core/align_bwamem2.nf | 10 ++--- 5 files changed, 4 insertions(+), 91 deletions(-) delete mode 100644 modules/nf-core/modules/samtools/sort/main.nf delete mode 100644 modules/nf-core/modules/samtools/sort/meta.yml diff --git a/conf/modules.config b/conf/modules.config index b722747a..c1f06027 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -212,13 +212,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:ALIGN_BWAMEM2:SAMTOOLS_SORT' { - ext.prefix = { "${meta.id}_sorted" } - publishDir = [ - path: { "${params.outdir}/samtools" }, - enabled: false - ] - } withName: SAMTOOLS_STATS { ext.args = '-s --remove-overlaps' publishDir = [ diff --git a/modules.json b/modules.json index 93b454fb..e48f0f5b 100644 --- a/modules.json +++ b/modules.json @@ -66,9 +66,6 @@ "samtools/merge": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, - "samtools/sort": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, "samtools/stats": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf deleted file mode 100644 index 0f2237cc..00000000 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ /dev/null @@ -1,31 +0,0 @@ -process SAMTOOLS_SORT { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" - - input: - tuple val(meta), path(bam) - - output: - tuple val(meta), path("*.bam"), emit: bam - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" - """ - samtools sort $args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml deleted file mode 100644 index a820c55a..00000000 --- a/modules/nf-core/modules/samtools/sort/meta.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: samtools_sort -description: Sort SAM/BAM/CRAM file -keywords: - - sort - - bam - - sam - - cram -tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@drpatelh" - - "@ewels" diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index b4c98bea..98cfec62 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -5,7 +5,6 @@ include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' @@ -20,19 +19,18 @@ workflow ALIGN_BWAMEM2 { ch_versions = Channel.empty() // Map, sort, and index - BWAMEM2_MEM ( reads_input, index, false ) + BWAMEM2_MEM ( reads_input, index, true ) ch_versions = ch_versions.mix(BWAMEM2_MEM.out.versions) - SAMTOOLS_SORT ( BWAMEM2_MEM.out.bam ) - SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) + SAMTOOLS_INDEX ( BWAMEM2_MEM.out.bam ) // Join the mapped bam + bai paths by their keys for stats // Get stats for each demultiplexed read pair. - bam_sorted_indexed = SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai) + bam_sorted_indexed = BWAMEM2_MEM.out.bam.join(SAMTOOLS_INDEX.out.bai) SAMTOOLS_STATS ( bam_sorted_indexed, [] ) // Merge multiple lane samples and index - SAMTOOLS_SORT.out.bam + BWAMEM2_MEM.out.bam .map{ meta, bam -> new_meta = meta.clone() // clone to avoid overriding the global meta new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename From 626233274c5f72eb2ba0568a32a39be2514d26dc Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 24 Feb 2022 18:11:09 +0100 Subject: [PATCH 0258/1169] linting newline --- modules/local/samplesheet_check.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 5984df97..e8d19a6f 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -26,4 +26,4 @@ process SAMPLESHEET_CHECK { python: \$(python --version | sed 's/Python //g') END_VERSIONS """ -} \ No newline at end of file +} From aa1b14ec39fec1d5b133aaf6882e197d5a1ad31d Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 25 Feb 2022 11:11:47 +0100 Subject: [PATCH 0259/1169] linting --- docs/usage.md | 2 +- modules/local/samplesheet_check.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 1f94372c..eeffb471 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -169,7 +169,7 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to __cap__ the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. +To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. ```nextflow process { diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 5984df97..e8d19a6f 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -26,4 +26,4 @@ process SAMPLESHEET_CHECK { python: \$(python --version | sed 's/Python //g') END_VERSIONS """ -} \ No newline at end of file +} From e59acafeb524c05a73e82f7e7bc4fda794abcf32 Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 25 Feb 2022 11:31:18 +0100 Subject: [PATCH 0260/1169] modyyfing lint files in accordance with https://github.com/nf-core/rnaseq/pull/767 --- .nf-core.yml | 2 ++ .yamllint | 5 +++++ 2 files changed, 7 insertions(+) create mode 100644 .yamllint diff --git a/.nf-core.yml b/.nf-core.yml index 99e8d5c3..f34e81a4 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -4,3 +4,5 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml - .github/PULL_REQUEST_TEMPLATE.md - assets/multiqc_config.yaml + - lib/NfcoreTemplate.groovy + - .github/workflows/linting.yml diff --git a/.yamllint b/.yamllint new file mode 100644 index 00000000..6889fa34 --- /dev/null +++ b/.yamllint @@ -0,0 +1,5 @@ +extends: default + +rules: + document-start: disable + line-length: disable From ad26bf84d2a46c7ecfb91de4ed4782c3ad11db78 Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 25 Feb 2022 11:35:10 +0100 Subject: [PATCH 0261/1169] fixing missing file ending --- .yamllint => .yamllint.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .yamllint => .yamllint.yml (100%) diff --git a/.yamllint b/.yamllint.yml similarity index 100% rename from .yamllint rename to .yamllint.yml From 74409c6833ee9ac1e37927bf9a04b532116edc91 Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 25 Feb 2022 11:38:58 +0100 Subject: [PATCH 0262/1169] adding lib/NfcoreSchema.groovy to exclude list --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index f34e81a4..056a5ad9 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -4,5 +4,5 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml - .github/PULL_REQUEST_TEMPLATE.md - assets/multiqc_config.yaml - - lib/NfcoreTemplate.groovy + - lib/NfcoreSchema.groovy - .github/workflows/linting.yml From c93d3abf9d7eb8f23bf30a99b8ed41c9ea3a0be0 Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 25 Feb 2022 11:40:28 +0100 Subject: [PATCH 0263/1169] updating svdb merge module --- modules.json | 2 +- modules/nf-core/modules/svdb/merge/main.nf | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules.json b/modules.json index 93b454fb..e1efb023 100644 --- a/modules.json +++ b/modules.json @@ -73,7 +73,7 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "svdb/merge": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "ee915a43e405324e62ee5d4c14a6a6ec6c610058" }, "tabix/bgziptabix": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 4baa1d88..505e2c0b 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -21,15 +21,13 @@ process SVDB_MERGE { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input = "" + def input = "${vcfs.join(" ")}" + def prio = "" if(priority) { prio = "--priority ${priority.join(',')}" for (int index = 0; index < vcfs.size(); index++) { input += " ${vcfs[index]}:${priority[index]}" } - } else { - prio = "" - input = "${vcfs.join(" ")}" } """ svdb \\ @@ -38,6 +36,7 @@ process SVDB_MERGE { $prio \\ --vcf $input \\ > ${prefix}_sv_merge.vcf + cat <<-END_VERSIONS > versions.yml "${task.process}": svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) @@ -48,9 +47,10 @@ process SVDB_MERGE { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_sv_merge.vcf + cat <<-END_VERSIONS > versions.yml "${task.process}": svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) END_VERSIONS """ -} \ No newline at end of file +} From cc5b4e48f095adc39c7f24eb32cf50d7e61e7ad4 Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 25 Feb 2022 11:57:45 +0100 Subject: [PATCH 0264/1169] more yaml linting --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/workflows/awsfulltest.yml | 4 ++-- .github/workflows/awstest.yml | 2 +- .github/workflows/branch.yml | 1 - .github/workflows/linting.yml | 1 - .github/workflows/linting_comment.yml | 1 - .nf-core.yml | 2 ++ 7 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 2ca71ec3..e455d5a5 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,4 +1,3 @@ - name: Bug report description: Report something that is broken or incorrect labels: bug diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index ae1fbaaf..3bbed9a5 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -18,7 +18,7 @@ jobs: # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters - + with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} @@ -31,4 +31,4 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" } profiles: test_full,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' \ No newline at end of file + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index ced685df..4e36f111 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Launch workflow via tower uses: nf-core/tower-action@v2 - + with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 13cdbacd..b4b2e2a3 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -43,4 +43,3 @@ jobs: Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false - diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index b7c3159c..0c9c5554 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -136,4 +136,3 @@ jobs: lint_log.txt lint_results.md PR_number.txt - diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 44d72994..7e41ac67 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -1,4 +1,3 @@ - name: nf-core linting comment # This workflow is triggered after the linting action is complete # It posts an automated comment to the PR, even if the PR is coming from a fork diff --git a/.nf-core.yml b/.nf-core.yml index 056a5ad9..d59399c3 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -6,3 +6,5 @@ lint: - assets/multiqc_config.yaml - lib/NfcoreSchema.groovy - .github/workflows/linting.yml + - .github/workflows/linting_comment.yml + - .github/workflows/branch.yml From 7ce8c2854daca4fd297529e60dfa4a8e88d05533 Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 25 Feb 2022 12:01:01 +0100 Subject: [PATCH 0265/1169] removed blank line from yml --- .github/workflows/linting_comment.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 7e41ac67..04758f61 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -26,4 +26,3 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} path: linting-logs/lint_results.md - From cd02eeb6071b1481a94a8a384deaef8cb9706242 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Mon, 28 Feb 2022 10:41:17 +0100 Subject: [PATCH 0266/1169] Adds basic framework of Gens preprocessing --- conf/test.config | 2 +- modules.json | 3 + modules/local/gatk4/collectreadcounts/main.nf | 41 ++++++++++ .../local/gatk4/collectreadcounts/meta.yml | 45 +++++++++++ modules/local/gatk4/denoisereadcounts/main.nf | 41 ++++++++++ .../local/gatk4/denoisereadcounts/meta.yml | 44 +++++++++++ modules/local/gens/main.nf | 40 ++++++++++ modules/local/gens/meta.yml | 45 +++++++++++ .../modules/gatk4/haplotypecaller/main.nf | 54 +++++++++++++ .../modules/gatk4/haplotypecaller/meta.yml | 75 +++++++++++++++++++ subworkflows/local/gens.nf | 33 ++++++++ workflows/raredisease.nf | 13 ++++ 12 files changed, 435 insertions(+), 1 deletion(-) create mode 100644 modules/local/gatk4/collectreadcounts/main.nf create mode 100644 modules/local/gatk4/collectreadcounts/meta.yml create mode 100644 modules/local/gatk4/denoisereadcounts/main.nf create mode 100644 modules/local/gatk4/denoisereadcounts/meta.yml create mode 100644 modules/local/gens/main.nf create mode 100644 modules/local/gens/meta.yml create mode 100644 modules/nf-core/modules/gatk4/haplotypecaller/main.nf create mode 100644 modules/nf-core/modules/gatk4/haplotypecaller/meta.yml create mode 100644 subworkflows/local/gens.nf diff --git a/conf/test.config b/conf/test.config index fa041a02..aea83120 100644 --- a/conf/test.config +++ b/conf/test.config @@ -18,7 +18,7 @@ params { // Limit resources so that this can run on GitHub Actions max_cpus = 2 - max_memory = '6.GB' + //max_memory = '6.GB' max_time = '6.h' // Input data diff --git a/modules.json b/modules.json index bcc0692f..4658398b 100644 --- a/modules.json +++ b/modules.json @@ -33,6 +33,9 @@ "gatk4/createsequencedictionary": { "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" }, + "gatk4/haplotypecaller": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, "gatk4/intervallisttools": { "git_sha": "598d7abdb2a8df1aa3471c48d9186a9e3465983f" }, diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf new file mode 100644 index 00000000..ca827fc7 --- /dev/null +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -0,0 +1,41 @@ +process GATK4_COLLECTREADCOUNTS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + + input: + tuple val(meta), path(bam) + path fasta + path interval_list + + output: + tuple val(meta), path('*.hdf5'), emit: read_counts + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 12 + if (!task.memory) { + log.info '[GATK CollectReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" CollectReadCounts \\ + -I $bam \\ + -R $fasta \\ + -L $interval_list \\ + -O ${prefix}.hdf5 \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/gatk4/collectreadcounts/meta.yml b/modules/local/gatk4/collectreadcounts/meta.yml new file mode 100644 index 00000000..b74afb5c --- /dev/null +++ b/modules/local/gatk4/collectreadcounts/meta.yml @@ -0,0 +1,45 @@ +name: gatk4_collectreadcounts +description: +keywords: + - bam + - interval list + - hdf5 +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ['Apache-2.0'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - bam: + type: file + description: Input bam file + pattern: "*.bam" + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + - interval_list: + type: file + description: Binning intervals file + pattern: "*.interval_list" +output: + - read_counts: + type: file + description: gatk read count file + pattern: "*.hdf5" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@raysloks" diff --git a/modules/local/gatk4/denoisereadcounts/main.nf b/modules/local/gatk4/denoisereadcounts/main.nf new file mode 100644 index 00000000..c603f502 --- /dev/null +++ b/modules/local/gatk4/denoisereadcounts/main.nf @@ -0,0 +1,41 @@ +process GATK4_DENOISEREADCOUNTS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + + input: + tuple val(meta), path(read_counts) + path panel_of_normals + + output: + tuple val(meta), path('*.standardizedCR.tsv'), emit: standardized_read_counts + tuple val(meta), path('*.denoisedCR.tsv') , emit: denoised_read_counts + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 12 + if (!task.memory) { + log.info '[GATK DenoiseReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" DenoiseReadCounts \\ + -I $read_counts \\ + --count-panel-of-normals $panel_of_normals \\ + --standardized-copy-ratios ${prefix}.standardizedCR.tsv" \\ + --denoised-copy-ratios ${prefix}.denoisedCR.tsv" \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/gatk4/denoisereadcounts/meta.yml b/modules/local/gatk4/denoisereadcounts/meta.yml new file mode 100644 index 00000000..5edf4cde --- /dev/null +++ b/modules/local/gatk4/denoisereadcounts/meta.yml @@ -0,0 +1,44 @@ +name: gatk4_denoisereadcounts +description: +keywords: + - hdf5 + - interval list +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ['Apache-2.0'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - read_counts: + type: file + description: Input read counts file + pattern: "*.hdf5" + - read_counts_panel: + type: file + description: Panel of normals + pattern: "*.hdf5" + - interval_list: + type: file + description: Binning intervals file + pattern: "*.interval_list" +output: + - read_counts: + type: file + description: gatk read count file + pattern: "*.hdf5" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@raysloks" diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf new file mode 100644 index 00000000..97e3d7b4 --- /dev/null +++ b/modules/local/gens/main.nf @@ -0,0 +1,40 @@ +process GENS { + tag "$meta.id" + label 'process_medium' + + //conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'raysloks/gens_preproc:1.0.0' : + 'raysloks/gens_preproc:1.0.0' }" + + input: + tuple val(meta), path(read_counts) + path vcf + path gnomad_positions + + output: + tuple val(meta), path('*.bed.gz'), emit: cov + path '*.bed.gz' , emit: baf + path "versions.yml" , emit: versions + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 6 + if (!task.memory) { + log.info '[Gens] Available memory not known - defaulting to 6GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" CollectReadCounts \\ + $vcf \\ + $read_counts \\ + $prefix \\ + $gnomad_positions + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/gens/meta.yml b/modules/local/gens/meta.yml new file mode 100644 index 00000000..9907d667 --- /dev/null +++ b/modules/local/gens/meta.yml @@ -0,0 +1,45 @@ +name: gens +description: +keywords: + - bed + - vcf +tools: + - gens: + description: | + Gens is a web-based interactive tool to visualize genomic copy number profiles from WGS data (although it could theoretically be used for any type of data). + It plots the normalized read depth and alternative allele frequency. + homepage: https://github.com/Clinical-Genomics-Lund/gens + documentation: https://github.com/Clinical-Genomics-Lund/gens +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - read_counts: + type: file + description: Input standardized read counts file + pattern: "*.tsv" + - vcf: + type: file + description: Input vcf file + pattern: "*.vcf" + - gnomad_positions: + type: file + description: SNV filter file + pattern: "*.txt" +output: + - cov: + type: file + description: Gens preprocessed coverage file + pattern: "*.bed.gz" + - baf: + type: file + description: Gens preprocessed base allele frequency file + pattern: "*.bed.gz" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@raysloks" diff --git a/modules/nf-core/modules/gatk4/haplotypecaller/main.nf b/modules/nf-core/modules/gatk4/haplotypecaller/main.nf new file mode 100644 index 00000000..33871fcf --- /dev/null +++ b/modules/nf-core/modules/gatk4/haplotypecaller/main.nf @@ -0,0 +1,54 @@ +process GATK4_HAPLOTYPECALLER { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" + + input: + tuple val(meta), path(input), path(input_index), path(intervals) + path fasta + path fai + path dict + path dbsnp + path dbsnp_tbi + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def interval_option = intervals ? "-L ${intervals}" : "" + def dbsnp_option = dbsnp ? "-D ${dbsnp}" : "" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK HaplotypeCaller] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk \\ + --java-options "-Xmx${avail_mem}g" \\ + HaplotypeCaller \\ + -R $fasta \\ + -I $input \\ + ${dbsnp_option} \\ + ${interval_option} \\ + -O ${prefix}.vcf.gz \\ + $args \\ + --tmp-dir . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/haplotypecaller/meta.yml b/modules/nf-core/modules/gatk4/haplotypecaller/meta.yml new file mode 100644 index 00000000..81851a96 --- /dev/null +++ b/modules/nf-core/modules/gatk4/haplotypecaller/meta.yml @@ -0,0 +1,75 @@ +name: gatk4_haplotypecaller +description: Call germline SNPs and indels via local re-assembly of haplotypes +keywords: + - gatk4 + - haplotypecaller + - haplotype +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + - intervals: + type: file + description: Bed file with the genomic regions included in the library (optional) + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + - fai: + type: file + description: Index of reference fasta file + pattern: "fasta.fai" + - dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" + - dbsnp: + type: file + description: VCF file containing known sites (optional) + - dbsnp_tbi: + type: file + description: VCF index of dbsnp (optional) + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: Compressed VCF file + pattern: "*.vcf.gz" + - tbi: + type: file + description: Index of VCF file + pattern: "*.vcf.gz.tbi" + +authors: + - "@suzannejin" + - "@FriederikeHanssen" diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf new file mode 100644 index 00000000..e602de9b --- /dev/null +++ b/subworkflows/local/gens.nf @@ -0,0 +1,33 @@ +// +// A preprocessing workflow for Gens +// + +include { GATK4_COLLECTREADCOUNTS as COLLECTREADCOUNTS } from '../../modules/local/gatk4/collectreadcounts/main' +include { GATK4_DENOISEREADCOUNTS as DENOISEREADCOUNTS } from '../../modules/local/gatk4/denoisereadcounts/main' +include { GATK4_HAPLOTYPECALLER as HAPLOTYPECALLER } from '../../modules/nf-core/modules/gatk4/haplotypecaller/main' + +workflow PREPARE_GENS { + take: + bam // channel: [ val(meta), path(bam) ] + bai // channel: [ val(meta), path(bai) ] + fasta // path(fasta) + fai // path(fai) + pon // path(pon) + gnomad_pos // path(gnomad_pos) + case_info // channel: [ val(case_info) ] + seq_dict // path: seq_dict + + main: + HAPLOTYPECALLER ( bam.join(bai, by: [0]), fasta, fai, seq_dict ) + + COLLECTREADCOUNTS ( bam, fasta ) + + DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, fasta, pon ) + + GENS ( DENOISEREADCOUNTS.out.standardized_read_counts, HAPLOTYPECALLER.out.vcf, gnomad_pos ) + + emit: + gens_cov_bed_gz = GENS.out.cov + gens_baf_bed_gz = GENS.out.baf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8e0b524e..9e86682f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -41,6 +41,7 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi include { INPUT_CHECK } from '../subworkflows/local/input_check' include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' include { CHECK_BED } from '../subworkflows/local/prepare_bed' +include { GENS } from '../subworkflows/local/gens' /* ======================================================================================== @@ -151,6 +152,18 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) + // STEP 1.7: GENS + GENS ( + ch_marked_bam, + ch_marked_bai, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.fai, + params.gens_pon, + params.gens_gnomad_pos, + INPUT_CHECK.out.ch_case_info, + PREPARE_GENOME.out.sequence_dict + ) + // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV_DEEPVARIANT ( From 708b67fc4c6da80de179114ecd05d37caf88873d Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Mon, 28 Feb 2022 11:17:55 +0100 Subject: [PATCH 0267/1169] Changes Gens subworkflow name --- subworkflows/local/gens.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index e602de9b..dba56552 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -6,7 +6,7 @@ include { GATK4_COLLECTREADCOUNTS as COLLECTREADCOUNTS } from '../../modules/loc include { GATK4_DENOISEREADCOUNTS as DENOISEREADCOUNTS } from '../../modules/local/gatk4/denoisereadcounts/main' include { GATK4_HAPLOTYPECALLER as HAPLOTYPECALLER } from '../../modules/nf-core/modules/gatk4/haplotypecaller/main' -workflow PREPARE_GENS { +workflow GENS { take: bam // channel: [ val(meta), path(bam) ] bai // channel: [ val(meta), path(bai) ] From f9510e19e92052bd00c59c3d0905e9c4727f74dc Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 28 Feb 2022 13:33:36 +0100 Subject: [PATCH 0268/1169] trying a different selector for the entire subwrkflw --- conf/modules.config | 3 +++ workflows/raredisease.nf | 16 +++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index c1f06027..ad8dff1c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -192,6 +192,9 @@ process { } // NF-CORE Subworkflows // ALIGN_BWAMEM2 + withName: ".*ALIGN_BWAMEM2:.*"{ + ext.when = params.aligner.contains('bwamem2') + } withName: BWAMEM2_MEM { ext.args = '-M -K 100000000' publishDir = [ diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 25f8a640..63684c0d 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -122,17 +122,15 @@ workflow RAREDISEASE { } // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. - if (params.aligner == 'bwamem2') { - ALIGN_BWAMEM2 ( - INPUT_CHECK.out.reads, - PREPARE_GENOME.out.bwamem2_index - ) + ALIGN_BWAMEM2 ( + INPUT_CHECK.out.reads, + PREPARE_GENOME.out.bwamem2_index + ) - ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam - ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai + ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam + ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai - ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) - } + ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) // STEP 1.5: BAM QUALITY CHECK QC_BAM ( From ef37071ef8ee48dfe6b30a9dec86ea9345679fe9 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Mon, 28 Feb 2022 16:02:24 +0100 Subject: [PATCH 0269/1169] Adds missing dummy input channels --- subworkflows/local/gens.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index dba56552..406b82f8 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -18,7 +18,7 @@ workflow GENS { seq_dict // path: seq_dict main: - HAPLOTYPECALLER ( bam.join(bai, by: [0]), fasta, fai, seq_dict ) + HAPLOTYPECALLER ( bam.join(bai, by: [0]), fasta, fai, seq_dict, [], [] ) COLLECTREADCOUNTS ( bam, fasta ) From 3d76846bfa55a1140bf7a6362443ee221c1483df Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 28 Feb 2022 17:21:01 +0100 Subject: [PATCH 0270/1169] aggregate mem2 subwrkflw in config --- conf/modules.config | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ad8dff1c..215da9b5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -194,47 +194,33 @@ process { // ALIGN_BWAMEM2 withName: ".*ALIGN_BWAMEM2:.*"{ ext.when = params.aligner.contains('bwamem2') - } - withName: BWAMEM2_MEM { - ext.args = '-M -K 100000000' publishDir = [ path: { "${params.outdir}/bwamem2" }, - enabled: false - ] - } - withName: SAMTOOLS_INDEX { - publishDir = [ - path: { "${params.outdir}/samtools" }, - enabled: false - ] - } - withName: SAMTOOLS_INDEX_MD { - publishDir = [ - path: { "${params.outdir}/markduplicates" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + pattern: "*{stats,sorted_md.bam,sorted_md.bam.bai}", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: SAMTOOLS_STATS { - ext.args = '-s --remove-overlaps' + withName: BWAMEM2_MEM { + ext.args = '-M -K 100000000' publishDir = [ - path: { "${params.outdir}/samtools" }, - mode: 'copy', + path: { "${params.outdir}/bwamem2" }, + enabled: false, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: SAMTOOLS_MERGE { + withName: SAMTOOLS_STATS { + ext.args = '-s --remove-overlaps' publishDir = [ - path: { "${params.outdir}/samtools" }, + path: { "${params.outdir}/bwamem2" }, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: '.*MARKDUPLICATES' { ext.prefix = { "${meta.id}_sorted_md" } publishDir = [ - path: { "${params.outdir}/markduplicates" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + path: { "${params.outdir}/bwamem2" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } // ANNOTATE_VCFANNO From 794dcb47aae728bd9a5340e45e8686237693b3fb Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 10:29:56 +0100 Subject: [PATCH 0271/1169] Adds missing interval list parameter --- subworkflows/local/gens.nf | 19 ++++++++++--------- workflows/raredisease.nf | 1 + 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 406b82f8..55af53a4 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -8,19 +8,20 @@ include { GATK4_HAPLOTYPECALLER as HAPLOTYPECALLER } from '../../modules/nf-core workflow GENS { take: - bam // channel: [ val(meta), path(bam) ] - bai // channel: [ val(meta), path(bai) ] - fasta // path(fasta) - fai // path(fai) - pon // path(pon) - gnomad_pos // path(gnomad_pos) - case_info // channel: [ val(case_info) ] - seq_dict // path: seq_dict + bam // channel: [ val(meta), path(bam) ] + bai // channel: [ val(meta), path(bai) ] + fasta // path(fasta) + fai // path(fai) + interval_list // path(interval_list) + pon // path(pon) + gnomad_pos // path(gnomad_pos) + case_info // channel: [ val(case_info) ] + seq_dict // path: seq_dict main: HAPLOTYPECALLER ( bam.join(bai, by: [0]), fasta, fai, seq_dict, [], [] ) - COLLECTREADCOUNTS ( bam, fasta ) + COLLECTREADCOUNTS ( bam, fasta, interval_list ) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, fasta, pon ) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 9e86682f..a2adac37 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -158,6 +158,7 @@ workflow RAREDISEASE { ch_marked_bai, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, + params.gens_interval_list, params.gens_pon, params.gens_gnomad_pos, INPUT_CHECK.out.ch_case_info, From cd4dd0cc10050a96be5bd41f6c985f8217b24200 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 10:38:05 +0100 Subject: [PATCH 0272/1169] Adds temporary lines to test config --- conf/test.config | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/conf/test.config b/conf/test.config index aea83120..fe1f6e91 100644 --- a/conf/test.config +++ b/conf/test.config @@ -32,4 +32,9 @@ params { variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/target_chr20.bed' + + // Gens + gens_interval_list = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gens_female_pon_100bp.hdf5' + gens_pon = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gens_targets_preprocessed_100bp.interval_list' + gens_gnomad_pos = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gnomad.genomes.r2.1.1.sites.5percent.pos.txt' } From f28ba087e90c5bcd16aa6e0a36868292cf10989a Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 10:40:22 +0100 Subject: [PATCH 0273/1169] Removes unused parameter --- subworkflows/local/gens.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 55af53a4..c5c9ebcb 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -23,7 +23,7 @@ workflow GENS { COLLECTREADCOUNTS ( bam, fasta, interval_list ) - DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, fasta, pon ) + DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) GENS ( DENOISEREADCOUNTS.out.standardized_read_counts, HAPLOTYPECALLER.out.vcf, gnomad_pos ) From c79ff1638f74c27fe8434d59f5be8df7063b35b3 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 10:48:50 +0100 Subject: [PATCH 0274/1169] Fixes Gens module --- modules/local/gens/main.nf | 8 ++++---- subworkflows/local/gens.nf | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index 97e3d7b4..95ca498e 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -13,8 +13,8 @@ process GENS { path gnomad_positions output: - tuple val(meta), path('*.bed.gz'), emit: cov - path '*.bed.gz' , emit: baf + tuple val(meta), path('*.cov.bed.gz'), emit: cov + tuple val(meta), path('*.baf.bed.gz'), emit: baf path "versions.yml" , emit: versions script: @@ -26,7 +26,7 @@ process GENS { avail_mem = task.memory.giga } """ - gatk --java-options "-Xmx${avail_mem}g" CollectReadCounts \\ + generate_gens_data.pl \\ $vcf \\ $read_counts \\ $prefix \\ @@ -34,7 +34,7 @@ process GENS { cat <<-END_VERSIONS > versions.yml "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + generate_gens_data.pl: \$(echo \$(generate_gens_data.pl --version 2>&1)) END_VERSIONS """ } diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index c5c9ebcb..80a2a0d0 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -5,6 +5,7 @@ include { GATK4_COLLECTREADCOUNTS as COLLECTREADCOUNTS } from '../../modules/local/gatk4/collectreadcounts/main' include { GATK4_DENOISEREADCOUNTS as DENOISEREADCOUNTS } from '../../modules/local/gatk4/denoisereadcounts/main' include { GATK4_HAPLOTYPECALLER as HAPLOTYPECALLER } from '../../modules/nf-core/modules/gatk4/haplotypecaller/main' +include { GENS as GENS_GENERATE } from '../../modules/local/gens/main' workflow GENS { take: @@ -25,7 +26,7 @@ workflow GENS { DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) - GENS ( DENOISEREADCOUNTS.out.standardized_read_counts, HAPLOTYPECALLER.out.vcf, gnomad_pos ) + GENS_GENERATE ( DENOISEREADCOUNTS.out.standardized_read_counts, HAPLOTYPECALLER.out.vcf, gnomad_pos ) emit: gens_cov_bed_gz = GENS.out.cov From 232a85808d873f96b7ec1201b07c0cd83c5c651a Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 10:50:44 +0100 Subject: [PATCH 0275/1169] Fixes a small problem in Gens subworkflow --- subworkflows/local/gens.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 80a2a0d0..e052184b 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -29,7 +29,7 @@ workflow GENS { GENS_GENERATE ( DENOISEREADCOUNTS.out.standardized_read_counts, HAPLOTYPECALLER.out.vcf, gnomad_pos ) emit: - gens_cov_bed_gz = GENS.out.cov - gens_baf_bed_gz = GENS.out.baf + gens_cov_bed_gz = GENS_GENERATE.out.cov + gens_baf_bed_gz = GENS_GENERATE.out.baf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 3acf816e8274780aecca8f16db2b5df9a8b953dc Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 10:54:59 +0100 Subject: [PATCH 0276/1169] Fixes version channel handling --- modules/local/gens/main.nf | 2 +- subworkflows/local/gens.nf | 6 ++++++ workflows/raredisease.nf | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index 95ca498e..d2caf303 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -15,7 +15,7 @@ process GENS { output: tuple val(meta), path('*.cov.bed.gz'), emit: cov tuple val(meta), path('*.baf.bed.gz'), emit: baf - path "versions.yml" , emit: versions + path "versions.yml" , emit: versions script: def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index e052184b..521d1151 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -20,13 +20,19 @@ workflow GENS { seq_dict // path: seq_dict main: + ch_versions = Channel.empty() + HAPLOTYPECALLER ( bam.join(bai, by: [0]), fasta, fai, seq_dict, [], [] ) + ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) COLLECTREADCOUNTS ( bam, fasta, interval_list ) + ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) + ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions) GENS_GENERATE ( DENOISEREADCOUNTS.out.standardized_read_counts, HAPLOTYPECALLER.out.vcf, gnomad_pos ) + ch_versions = ch_versions.mix(GENS_GENERATE.out.versions) emit: gens_cov_bed_gz = GENS_GENERATE.out.cov diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index a2adac37..911a4a3e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -164,6 +164,7 @@ workflow RAREDISEASE { INPUT_CHECK.out.ch_case_info, PREPARE_GENOME.out.sequence_dict ) + ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. From 4f5af295a93ef68bdb283fe9a6208384cc883962 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 11:51:51 +0100 Subject: [PATCH 0277/1169] Attempts to fix handling of bam input channel --- modules/local/gatk4/collectreadcounts/main.nf | 2 +- subworkflows/local/gens.nf | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index ca827fc7..81874948 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -8,7 +8,7 @@ process GATK4_COLLECTREADCOUNTS { 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" input: - tuple val(meta), path(bam) + tuple val(meta), path(bam), path(bai) path fasta path interval_list diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 521d1151..5dc2b7b8 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -20,12 +20,16 @@ workflow GENS { seq_dict // path: seq_dict main: + bam.map { meta, bam, bai -> + return [meta, bam, bai, []] + } + .set { ch_bam } ch_versions = Channel.empty() - HAPLOTYPECALLER ( bam.join(bai, by: [0]), fasta, fai, seq_dict, [], [] ) + HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) - COLLECTREADCOUNTS ( bam, fasta, interval_list ) + COLLECTREADCOUNTS ( ch_bam, fasta, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) From f7dde9520bac6fd92cb3ff3a2739e07dff30ebdf Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 12:12:33 +0100 Subject: [PATCH 0278/1169] Again attempts to fix bam handling --- subworkflows/local/gens.nf | 11 +++-------- workflows/raredisease.nf | 3 +-- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 5dc2b7b8..50250509 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -9,8 +9,7 @@ include { GENS as GENS_GENERATE } from '../../modules/local/gens/main' workflow GENS { take: - bam // channel: [ val(meta), path(bam) ] - bai // channel: [ val(meta), path(bai) ] + bam // channel: [ val(meta), path(bam), path(bai) ] fasta // path(fasta) fai // path(fai) interval_list // path(interval_list) @@ -20,16 +19,12 @@ workflow GENS { seq_dict // path: seq_dict main: - bam.map { meta, bam, bai -> - return [meta, bam, bai, []] - } - .set { ch_bam } ch_versions = Channel.empty() - HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) + HAPLOTYPECALLER ( bam, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) - COLLECTREADCOUNTS ( ch_bam, fasta, interval_list ) + COLLECTREADCOUNTS ( bam, fasta, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 911a4a3e..8ebdb4e6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -154,8 +154,7 @@ workflow RAREDISEASE { // STEP 1.7: GENS GENS ( - ch_marked_bam, - ch_marked_bai, + ch_marked_bam.join(ch_marked_bai, by: [0]), PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, params.gens_interval_list, From a2155e3e47cd2c0b7d6230f4830aadc87e1b0e0b Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 12:23:20 +0100 Subject: [PATCH 0279/1169] Attempts fix again --- subworkflows/local/gens.nf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 50250509..f1731a49 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -20,8 +20,12 @@ workflow GENS { main: ch_versions = Channel.empty() + bam.map { meta, bam, bai -> + return [meta, bam, bai, []] + } + .set { ch_bam } - HAPLOTYPECALLER ( bam, fasta, fai, seq_dict, [], [] ) + HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) COLLECTREADCOUNTS ( bam, fasta, interval_list ) From 53a32dc727f958d7bcac3353aff6540ece2bb052 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 14:16:56 +0100 Subject: [PATCH 0280/1169] Adds bai to collectreadcounts --- modules/local/gatk4/collectreadcounts/main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index 81874948..d133a1fc 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -28,6 +28,7 @@ process GATK4_COLLECTREADCOUNTS { """ gatk --java-options "-Xmx${avail_mem}g" CollectReadCounts \\ -I $bam \\ + --read-index $bai \\ -R $fasta \\ -L $interval_list \\ -O ${prefix}.hdf5 \\ From c5c87fa0ef6f954fe3183f0392475d73f20e0240 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 18:20:41 +0100 Subject: [PATCH 0281/1169] Adds fai as parameter to collectreadcounts --- modules/local/gatk4/collectreadcounts/main.nf | 1 + subworkflows/local/gens.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index d133a1fc..c40191fd 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -10,6 +10,7 @@ process GATK4_COLLECTREADCOUNTS { input: tuple val(meta), path(bam), path(bai) path fasta + path fai path interval_list output: diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index f1731a49..7596e5a1 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -28,7 +28,7 @@ workflow GENS { HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) - COLLECTREADCOUNTS ( bam, fasta, interval_list ) + COLLECTREADCOUNTS ( bam, fasta, fai, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) From ee7e987355651845c758eb554e72296d8ad2cc40 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 18:45:44 +0100 Subject: [PATCH 0282/1169] Adds sequence dict to collectreadcounts --- modules/local/gatk4/collectreadcounts/main.nf | 1 + subworkflows/local/gens.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index c40191fd..d947b0a0 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -11,6 +11,7 @@ process GATK4_COLLECTREADCOUNTS { tuple val(meta), path(bam), path(bai) path fasta path fai + path sequence_dict path interval_list output: diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 7596e5a1..cd1ddeb5 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -28,7 +28,7 @@ workflow GENS { HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) - COLLECTREADCOUNTS ( bam, fasta, fai, interval_list ) + COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) From 0821424705b1eb8f7f520867314f3b8a1163acef Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 1 Mar 2022 19:04:06 +0100 Subject: [PATCH 0283/1169] Fixes temporary test config --- conf/test.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index fe1f6e91..d93e3ab8 100644 --- a/conf/test.config +++ b/conf/test.config @@ -34,7 +34,7 @@ params { target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/target_chr20.bed' // Gens - gens_interval_list = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gens_female_pon_100bp.hdf5' - gens_pon = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gens_targets_preprocessed_100bp.interval_list' + gens_pon = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gens_female_pon_100bp.hdf5' + gens_interval_list = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gens_targets_preprocessed_100bp.interval_list' gens_gnomad_pos = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gnomad.genomes.r2.1.1.sites.5percent.pos.txt' } From 26bd87b97bfe10a953ac7346f0e07f2c5ee26ed8 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Wed, 2 Mar 2022 09:26:55 +0100 Subject: [PATCH 0284/1169] Sets interval merging rule for collectreadcounts --- conf/modules.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 7fee2cd0..4e9c8afe 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -239,6 +239,9 @@ process { mode: 'copy' ] } + withName: COLLECTREADCOUNTS { + ext.args = '--interval-merging-rule OVERLAPPING_ONLY' + } // nf-core modules withName: FASTQC { ext.args = '--quiet' From 9362d8c7ef63845958a9617a2ccc7dfd3237a58c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 3 Mar 2022 14:32:48 +0100 Subject: [PATCH 0285/1169] svdb query in parallel --- conf/genomes.config | 2 + conf/modules.config | 12 +++++ conf/test.config | 3 ++ main.nf | 1 + modules/nf-core/modules/svdb/query/main.nf | 17 ++++++- nextflow_schema.json | 6 +++ .../local/annotate_structural_variants.nf | 46 +++++++++++++++++++ .../local/call_structural_variants.nf | 3 +- 8 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 subworkflows/local/annotate_structural_variants.nf diff --git a/conf/genomes.config b/conf/genomes.config index e8ddd83d..c05f375e 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -15,6 +15,7 @@ params { fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" + svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" @@ -25,6 +26,7 @@ params { fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" + svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" diff --git a/conf/modules.config b/conf/modules.config index c1f06027..b2494a58 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -190,6 +190,18 @@ process { mode: 'copy', ] } + // ANNOTATE_SV + withName: "SVDB_QUERY*" { + publishDir = [ + enabled: false, + ] + } + withName: PICARD_SORTVCF { + publishDir = [ + path: { "${params.outdir}/sv_annotate" }, + mode: 'copy', + ] + } // NF-CORE Subworkflows // ALIGN_BWAMEM2 withName: BWAMEM2_MEM { diff --git a/conf/test.config b/conf/test.config index dac7e011..b46c825b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -28,6 +28,9 @@ params { // Genome references fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + // Structural variant annotation databases + svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" + // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' diff --git a/main.nf b/main.nf index 2b244799..f89213a1 100644 --- a/main.nf +++ b/main.nf @@ -22,6 +22,7 @@ params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') +params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') diff --git a/modules/nf-core/modules/svdb/query/main.nf b/modules/nf-core/modules/svdb/query/main.nf index 292fe4ce..12c67587 100644 --- a/modules/nf-core/modules/svdb/query/main.nf +++ b/modules/nf-core/modules/svdb/query/main.nf @@ -8,8 +8,7 @@ process SVDB_QUERY { 'quay.io/biocontainers/svdb:2.5.0--py39hcbe4a3b_0' }" input: - tuple val(meta), path(vcf) - path (vcf_db) + tuple val(meta), path(vcf), path(vcf_db), val(in_occ), val(in_frq), val(out_occ), val(out_frq) output: tuple val(meta), path("*_ann_svdbq.vcf"), emit: vcf @@ -21,10 +20,24 @@ process SVDB_QUERY { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def input = "" + if(in_occ) { + input += "--in_occ ${in_occ} " + } + if(in_frq) { + input += "--in_frq ${in_frq} " + } + if(out_occ) { + input += "--out_occ ${out_occ} " + } + if(out_frq) { + input += "--out_frq ${out_frq} " + } """ svdb \\ --query \\ $args \\ + $input \\ --db $vcf_db \\ --query_vcf $vcf \\ >${prefix}_ann_svdbq.vcf diff --git a/nextflow_schema.json b/nextflow_schema.json index 20bbbf55..da9241ee 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -107,6 +107,12 @@ "fa_icon": "fas fa-bezier-curve", "description": "Path to directory for target bed file." }, + "svdb_query_dbs": { + "type": "string", + "format": "file-path", + "description": "Path to comma-separated file containing information about the databases used for structural variant annotation.", + "fa_icon": "far fa-file-code" + }, "variant_catalog": { "type": "string", "format": "file-path", diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf new file mode 100644 index 00000000..feaf9037 --- /dev/null +++ b/subworkflows/local/annotate_structural_variants.nf @@ -0,0 +1,46 @@ +// +// A subworkflow to annotate structural variants. +// + +include { SVDB_QUERY as SVDB_QUERY_FILTER } from '../../modules/nf-core/modules/svdb/query/main' +include { SVDB_QUERY as SVDB_QUERY_NOFILTER } from '../../modules/nf-core/modules/svdb/query/main' + + +// include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' + +workflow ANNOTATE_STRUCTURAL_VARIANTS { + + take: + vcf // channel: [ val(meta), path(vcf) ] + sv_dbs // file: dbs.csv + + main: + ch_versions = Channel.empty() + + Channel.fromPath(sv_dbs) + .splitCsv ( header:true ) + .branch { row -> + freq_filter: row.use_in_freq_filter == "1" + return [row.filename, + row.in_freq_info_key, + row.in_allele_count_info_key, + row.out_freq_info_key, + row.out_allele_count_info_key] + no_freq_filter: row.use_in_freq_filter == "0" + return [row.filename, + row.in_freq_info_key, + row.in_allele_count_info_key, + row.out_freq_info_key, + row.out_allele_count_info_key] + } + .set { ch_svdb_dbs } + + ch_input_filter = vcf.combine(ch_svdb_dbs.freq_filter).view() + ch_input_nofilter = vcf.combine(ch_svdb_dbs.no_freq_filter).view() + + SVDB_QUERY_FILTER(ch_input_filter) + SVDB_QUERY_NOFILTER(ch_input_nofilter) + + emit: + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index ae24e21f..f4ae56bd 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -46,5 +46,6 @@ workflow CALL_STRUCTURAL_VARIANTS { emit: - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf = SVDB_MERGE.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From c7f1963bc4c61417a310df13017554aa9263914e Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 09:21:15 +0100 Subject: [PATCH 0286/1169] Removes temporary test config changes --- conf/test.config | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/conf/test.config b/conf/test.config index d93e3ab8..fa041a02 100644 --- a/conf/test.config +++ b/conf/test.config @@ -18,7 +18,7 @@ params { // Limit resources so that this can run on GitHub Actions max_cpus = 2 - //max_memory = '6.GB' + max_memory = '6.GB' max_time = '6.h' // Input data @@ -32,9 +32,4 @@ params { variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/target_chr20.bed' - - // Gens - gens_pon = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gens_female_pon_100bp.hdf5' - gens_interval_list = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gens_targets_preprocessed_100bp.interval_list' - gens_gnomad_pos = '/home/proj/stage/rare-disease/references/references_10.0/grch37_gnomad.genomes.r2.1.1.sites.5percent.pos.txt' } From a0586621bd47f516d8cef1ac203846e51bbf7d5b Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 09:21:39 +0100 Subject: [PATCH 0287/1169] Updates module configuration --- conf/modules.config | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 4e9c8afe..39259d7f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -239,9 +239,15 @@ process { mode: 'copy' ] } - withName: COLLECTREADCOUNTS { + withName: ".*GENS:COLLECTREADCOUNTS" { ext.args = '--interval-merging-rule OVERLAPPING_ONLY' } + withName: GENS { + publishDir = [ + path: { "${params.outdir}/gens" } + mode: 'copy' + ] + } // nf-core modules withName: FASTQC { ext.args = '--quiet' From 0f122345beb59aca402afd6e8550908e636a616f Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 09:22:16 +0100 Subject: [PATCH 0288/1169] Fixes a channel issue --- modules/local/gatk4/collectreadcounts/main.nf | 2 +- .../local/gatk4/collectreadcounts/meta.yml | 19 +++++++++++++++++-- subworkflows/local/gens.nf | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index d947b0a0..72307dde 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -8,7 +8,7 @@ process GATK4_COLLECTREADCOUNTS { 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" input: - tuple val(meta), path(bam), path(bai) + tuple val(meta), path(bam), path(bai), path(intervals) path fasta path fai path sequence_dict diff --git a/modules/local/gatk4/collectreadcounts/meta.yml b/modules/local/gatk4/collectreadcounts/meta.yml index b74afb5c..03501e41 100644 --- a/modules/local/gatk4/collectreadcounts/meta.yml +++ b/modules/local/gatk4/collectreadcounts/meta.yml @@ -22,12 +22,27 @@ input: e.g. [ id:'test'] - bam: type: file - description: Input bam file - pattern: "*.bam" + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + - bai: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + - intervals: + type: file + description: Bed file with the genomic regions included in the library (optional) - fasta: type: file description: The reference fasta file pattern: "*.fasta" + - fai: + type: file + description: Index of reference fasta file + pattern: "fasta.fai" + - sequence_dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" - interval_list: type: file description: Binning intervals file diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index cd1ddeb5..3b2c38d9 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -28,7 +28,7 @@ workflow GENS { HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) - COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) + COLLECTREADCOUNTS ( ch_bam, fasta, fai, seq_dict, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) From b6eb1b8c17a2b9957cbedf07fa6c9a7e0dc1c0d5 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 09:30:07 +0100 Subject: [PATCH 0289/1169] Adds missing comma --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 39259d7f..7cda4cac 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -244,7 +244,7 @@ process { } withName: GENS { publishDir = [ - path: { "${params.outdir}/gens" } + path: { "${params.outdir}/gens" }, mode: 'copy' ] } From 68e3e36012fb405a39e101d4847ef2e1a2e1a1ed Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 10:09:23 +0100 Subject: [PATCH 0290/1169] Fixes a channel issue --- subworkflows/local/gens.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 3b2c38d9..859d4eec 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -23,12 +23,12 @@ workflow GENS { bam.map { meta, bam, bai -> return [meta, bam, bai, []] } - .set { ch_bam } + .into { ch_bam_hc, ch_bam_cr } - HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) + HAPLOTYPECALLER ( ch_bam_hc, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) - COLLECTREADCOUNTS ( ch_bam, fasta, fai, seq_dict, interval_list ) + COLLECTREADCOUNTS ( ch_bam_cr, fasta, fai, seq_dict, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) From 3b7df52b3a9e403e7a06fbec3b6a305e6893b519 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 10:10:31 +0100 Subject: [PATCH 0291/1169] Changes a comma into a semi-colon --- subworkflows/local/gens.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 859d4eec..a092c093 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -23,7 +23,7 @@ workflow GENS { bam.map { meta, bam, bai -> return [meta, bam, bai, []] } - .into { ch_bam_hc, ch_bam_cr } + .into { ch_bam_hc; ch_bam_cr } HAPLOTYPECALLER ( ch_bam_hc, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) From 3b90a7376ef2d80b523de4204aa53e1ed55589ce Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 10:15:31 +0100 Subject: [PATCH 0292/1169] Reverts some changes --- modules/local/gatk4/collectreadcounts/main.nf | 2 +- modules/local/gatk4/collectreadcounts/meta.yml | 3 --- subworkflows/local/gens.nf | 10 +++++----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index 72307dde..d947b0a0 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -8,7 +8,7 @@ process GATK4_COLLECTREADCOUNTS { 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" input: - tuple val(meta), path(bam), path(bai), path(intervals) + tuple val(meta), path(bam), path(bai) path fasta path fai path sequence_dict diff --git a/modules/local/gatk4/collectreadcounts/meta.yml b/modules/local/gatk4/collectreadcounts/meta.yml index 03501e41..6aa4a3dd 100644 --- a/modules/local/gatk4/collectreadcounts/meta.yml +++ b/modules/local/gatk4/collectreadcounts/meta.yml @@ -28,9 +28,6 @@ input: type: file description: BAI/CRAI file from alignment pattern: "*.{bai,crai}" - - intervals: - type: file - description: Bed file with the genomic regions included in the library (optional) - fasta: type: file description: The reference fasta file diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index a092c093..5b09ae32 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -23,14 +23,14 @@ workflow GENS { bam.map { meta, bam, bai -> return [meta, bam, bai, []] } - .into { ch_bam_hc; ch_bam_cr } + .set { ch_bam } - HAPLOTYPECALLER ( ch_bam_hc, fasta, fai, seq_dict, [], [] ) - ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) - - COLLECTREADCOUNTS ( ch_bam_cr, fasta, fai, seq_dict, interval_list ) + COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) + HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) + ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) + DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions) From 7e11c86007cfdde94b0b44a0cdd5cb0eae6ffee6 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 10:28:07 +0100 Subject: [PATCH 0293/1169] Tests a fix --- subworkflows/local/gens.nf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 5b09ae32..7af1bdde 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -20,14 +20,15 @@ workflow GENS { main: ch_versions = Channel.empty() + + COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) + ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) + bam.map { meta, bam, bai -> return [meta, bam, bai, []] } .set { ch_bam } - COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) - ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) - HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) From 31a64e05e2d97033def15ec014f1c3a6b1d038aa Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 10:49:46 +0100 Subject: [PATCH 0294/1169] Tests view --- subworkflows/local/gens.nf | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 7af1bdde..c94d18e0 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -20,18 +20,19 @@ workflow GENS { main: ch_versions = Channel.empty() - - COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) - ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) - bam.map { meta, bam, bai -> - return [meta, bam, bai, []] - } - .set { ch_bam } + return [meta, bam, bai, []] + }.set { ch_bam } + + bam.view() + ch_bam.view() HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) + COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) + ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) + DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions) From 9b8d4f345ab97f94abf397def79b54b675d03200 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 10:57:57 +0100 Subject: [PATCH 0295/1169] Test again --- conf/modules.config | 3 +++ subworkflows/local/gens.nf | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 7cda4cac..f7ffb2d6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -239,15 +239,18 @@ process { mode: 'copy' ] } + withName: ".*GENS:COLLECTREADCOUNTS" { ext.args = '--interval-merging-rule OVERLAPPING_ONLY' } + withName: GENS { publishDir = [ path: { "${params.outdir}/gens" }, mode: 'copy' ] } + // nf-core modules withName: FASTQC { ext.args = '--quiet' diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index c94d18e0..e8196e9c 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -21,7 +21,8 @@ workflow GENS { main: ch_versions = Channel.empty() bam.map { meta, bam, bai -> - return [meta, bam, bai, []] + new_meta = meta.clone() + [new_meta, bam, bai, []] }.set { ch_bam } bam.view() From 5027a597549306e91230f7a5f4dee3844df9762b Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 11:01:26 +0100 Subject: [PATCH 0296/1169] Test again again --- modules/local/gatk4/collectreadcounts/main.nf | 2 +- subworkflows/local/gens.nf | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index d947b0a0..8e4a945e 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -1,5 +1,5 @@ process GATK4_COLLECTREADCOUNTS { - tag "$meta.id" + tag "wutface" label 'process_medium' conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index e8196e9c..029c7f15 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -21,8 +21,7 @@ workflow GENS { main: ch_versions = Channel.empty() bam.map { meta, bam, bai -> - new_meta = meta.clone() - [new_meta, bam, bai, []] + [meta, bam, bai, []] }.set { ch_bam } bam.view() From dbadaf33e35771ac75503e7793ed5f9955ccc2e1 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 11:09:58 +0100 Subject: [PATCH 0297/1169] Adds file() to params --- workflows/raredisease.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8ebdb4e6..a5cf5445 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -157,9 +157,9 @@ workflow RAREDISEASE { ch_marked_bam.join(ch_marked_bai, by: [0]), PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, - params.gens_interval_list, - params.gens_pon, - params.gens_gnomad_pos, + file(params.gens_interval_list), + file(params.gens_pon), + file(params.gens_gnomad_pos), INPUT_CHECK.out.ch_case_info, PREPARE_GENOME.out.sequence_dict ) From 4422fc195349950c9d081dd9b6a1776d6df03601 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 4 Mar 2022 13:35:40 +0100 Subject: [PATCH 0298/1169] Removes errant quote sign --- modules/local/gatk4/denoisereadcounts/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/gatk4/denoisereadcounts/main.nf b/modules/local/gatk4/denoisereadcounts/main.nf index c603f502..2cc0a94a 100644 --- a/modules/local/gatk4/denoisereadcounts/main.nf +++ b/modules/local/gatk4/denoisereadcounts/main.nf @@ -29,8 +29,8 @@ process GATK4_DENOISEREADCOUNTS { gatk --java-options "-Xmx${avail_mem}g" DenoiseReadCounts \\ -I $read_counts \\ --count-panel-of-normals $panel_of_normals \\ - --standardized-copy-ratios ${prefix}.standardizedCR.tsv" \\ - --denoised-copy-ratios ${prefix}.denoisedCR.tsv" \\ + --standardized-copy-ratios ${prefix}.standardizedCR.tsv \\ + --denoised-copy-ratios ${prefix}.denoisedCR.tsv \\ $args cat <<-END_VERSIONS > versions.yml From db39c5f629520fbbe872ce714e3c3be9d1990a1d Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 7 Mar 2022 11:04:13 +0100 Subject: [PATCH 0299/1169] aggregate mem2 subwkflw in config --- conf/modules.config | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ad8dff1c..215da9b5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -194,47 +194,33 @@ process { // ALIGN_BWAMEM2 withName: ".*ALIGN_BWAMEM2:.*"{ ext.when = params.aligner.contains('bwamem2') - } - withName: BWAMEM2_MEM { - ext.args = '-M -K 100000000' publishDir = [ path: { "${params.outdir}/bwamem2" }, - enabled: false - ] - } - withName: SAMTOOLS_INDEX { - publishDir = [ - path: { "${params.outdir}/samtools" }, - enabled: false - ] - } - withName: SAMTOOLS_INDEX_MD { - publishDir = [ - path: { "${params.outdir}/markduplicates" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + pattern: "*{stats,sorted_md.bam,sorted_md.bam.bai}", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: SAMTOOLS_STATS { - ext.args = '-s --remove-overlaps' + withName: BWAMEM2_MEM { + ext.args = '-M -K 100000000' publishDir = [ - path: { "${params.outdir}/samtools" }, - mode: 'copy', + path: { "${params.outdir}/bwamem2" }, + enabled: false, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: SAMTOOLS_MERGE { + withName: SAMTOOLS_STATS { + ext.args = '-s --remove-overlaps' publishDir = [ - path: { "${params.outdir}/samtools" }, + path: { "${params.outdir}/bwamem2" }, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } withName: '.*MARKDUPLICATES' { ext.prefix = { "${meta.id}_sorted_md" } publishDir = [ - path: { "${params.outdir}/markduplicates" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + path: { "${params.outdir}/bwamem2" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } // ANNOTATE_VCFANNO From 6d4e2d023724403f5cdf554ef3155f93a4a6ca42 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 7 Mar 2022 12:29:59 +0100 Subject: [PATCH 0300/1169] condense mem2 into ternary in prepare_genome --- subworkflows/local/prepare_genome.nf | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 2477325d..9cbc843e 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -12,22 +12,17 @@ include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' workflow PREPARE_GENOME { take: - fasta // path: genome.fasta - variant_catalog // path: variant_catalog.json + fasta // channel: [mandatory] genome.fasta + variant_catalog // channel: [optional] variant_catalog.json main: ch_fasta = file(fasta) ch_versions = Channel.empty() // Fetch BWAMEM2 index or create from scratch if required - if ( params.aligner == 'bwamem2' ) { - if ( params.bwamem2_index && file(params.bwamem2_index, checkIfExists:true) ) { - ch_bwamem2_index = file(params.bwamem2_index) - } else { - ch_bwamem2_index = BWAMEM2_INDEX ( ch_fasta ).index - ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) - } - } + BWAMEM2_INDEX ( ch_fasta ) + ch_bwamem2_index = params.bwamem2_index && params.aligner == "bwamem2" ? file(params.bwamem2_index) : BWAMEM2_INDEX.out.index + ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) if ( params.fasta_fai ) { ch_fai = file(params.fasta_fai) From b2e22df11fd36f8a3c6c5fe2d8de8eb306ba3fa8 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 7 Mar 2022 12:47:41 +0100 Subject: [PATCH 0301/1169] when clause for mem2 idx --- conf/modules.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 215da9b5..92821145 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -7,6 +7,7 @@ ext.args2 = Second set of arguments appended to command in module (multi-tool modules). ext.args3 = Third set of arguments appended to command in module (multi-tool modules). ext.prefix = File name prefix for output files. + ext.when = Conditional clause ---------------------------------------------------------------------------------------- */ @@ -29,6 +30,7 @@ process { } // PREPARE_GENOME withName: BWAMEM2_INDEX { + ext.when = { !params.bwamem2_index && params.aligner == "bwamem2" } publishDir = [ path: { "${params.outdir}/references" }, mode: 'copy', From 4cfaa865749d9ed0e5ae77a571de96db67e42b76 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Mar 2022 20:56:23 +0100 Subject: [PATCH 0302/1169] update manta --- modules.json | 3 ++ .../modules}/manta/germline/main.nf | 29 +++++++++++++++---- .../modules}/manta/germline/meta.yml | 26 ++++++++++++----- subworkflows/local/call_sv_manta.nf | 2 +- 4 files changed, 46 insertions(+), 14 deletions(-) rename modules/{local => nf-core/modules}/manta/germline/main.nf (73%) rename modules/{local => nf-core/modules}/manta/germline/meta.yml (77%) diff --git a/modules.json b/modules.json index dca78aa6..45728d03 100644 --- a/modules.json +++ b/modules.json @@ -39,6 +39,9 @@ "glnexus": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, + "manta/germline": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, "mosdepth": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, diff --git a/modules/local/manta/germline/main.nf b/modules/nf-core/modules/manta/germline/main.nf similarity index 73% rename from modules/local/manta/germline/main.nf rename to modules/nf-core/modules/manta/germline/main.nf index 981bccbf..5ddba51b 100644 --- a/modules/local/manta/germline/main.nf +++ b/modules/nf-core/modules/manta/germline/main.nf @@ -8,11 +8,10 @@ process MANTA_GERMLINE { 'quay.io/biocontainers/manta:1.6.0--h9ee0642_1' }" input: - tuple val(meta), path(inputs) - path indices + tuple val(meta), path(input), path(index) path fasta path fasta_fai - tuple val(bed_meta), path(target_bed), path(target_bed_tbi) + tuple path(target_bed), path(target_bed_tbi) output: @@ -30,13 +29,15 @@ process MANTA_GERMLINE { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def options_manta = target_bed ? "--exome --callRegions $target_bed" : "" + def input_files = input.collect{"--bam ${it}"}.join(' ') + def options_manta = target_bed ? "--callRegions $target_bed" : "" """ configManta.py \ - --bam ${inputs.join(' --bam ')} \ + ${input_files} \ --reference $fasta \ + --runDir manta \ $options_manta \ - --runDir manta + $args python manta/runWorkflow.py -m local -j $task.cpus @@ -58,4 +59,20 @@ process MANTA_GERMLINE { manta: \$( configManta.py --version ) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.candidate_small_indels.vcf.gz + touch ${prefix}.candidate_small_indels.vcf.gz.tbi + touch ${prefix}.candidate_sv.vcf.gz + touch ${prefix}.candidate_sv.vcf.gz.tbi + touch ${prefix}.diploid_sv.vcf.gz + touch ${prefix}.diploid_sv.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + manta: \$( configManta.py --version ) + END_VERSIONS + """ } diff --git a/modules/local/manta/germline/meta.yml b/modules/nf-core/modules/manta/germline/meta.yml similarity index 77% rename from modules/local/manta/germline/meta.yml rename to modules/nf-core/modules/manta/germline/meta.yml index 60d46201..d6297ead 100644 --- a/modules/local/manta/germline/meta.yml +++ b/modules/nf-core/modules/manta/germline/meta.yml @@ -15,30 +15,38 @@ tools: documentation: https://github.com/Illumina/manta/blob/v1.6.0/docs/userGuide/README.md tool_dev_url: https://github.com/Illumina/manta doi: "10.1093/bioinformatics/btv710" - licence: ['GPL v3'] + licence: ["GPL v3"] input: - meta: type: map description: | - Groovy Map containing case information - e.g. [ id:'case_id' ] + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - input: type: file - description: BAM/CRAM/SAM file + description: BAM/CRAM/SAM file. For joint calling use a list of files. pattern: "*.{bam,cram,sam}" - - input_index: + - index: type: file - description: BAM/CRAM/SAM index file + description: BAM/CRAM/SAM index file. For joint calling use a list of files. pattern: "*.{bai,crai,sai}" - fasta: type: file description: Genome reference FASTA file pattern: "*.{fa,fasta}" - - fai: + - fasta_fai: type: file description: Genome reference FASTA index file pattern: "*.{fa.fai,fasta.fai}" + - target_bed: + type: file + description: BED file containing target regions for variant calling + pattern: "*.{bed}" + - target_bed_tbi: + type: file + description: Index for BED file containing target regions for variant calling + pattern: "*.{bed.tbi}" output: - meta: @@ -74,3 +82,7 @@ output: type: file description: File containing software versions pattern: "versions.yml" + +authors: + - "@maxulysse" + - "@ramprasadn" diff --git a/subworkflows/local/call_sv_manta.nf b/subworkflows/local/call_sv_manta.nf index 86de5daf..40692eb2 100644 --- a/subworkflows/local/call_sv_manta.nf +++ b/subworkflows/local/call_sv_manta.nf @@ -2,7 +2,7 @@ // A structural variant caller workflow for manta // -include { MANTA_GERMLINE as MANTA } from '../../modules/local/manta/germline/main' +include { MANTA_GERMLINE as MANTA } from '../../modules/nf-core/modules/manta/germline/main' workflow CALL_SV_MANTA { take: From abf9add1db567258a95f4472c5158db97a197644 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Mar 2022 21:20:34 +0100 Subject: [PATCH 0303/1169] update channel structure in calls --- subworkflows/local/call_sv_manta.nf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/call_sv_manta.nf b/subworkflows/local/call_sv_manta.nf index 40692eb2..5138b604 100644 --- a/subworkflows/local/call_sv_manta.nf +++ b/subworkflows/local/call_sv_manta.nf @@ -19,16 +19,18 @@ workflow CALL_SV_MANTA { .set { bam_file_list } bai.collect{it[1]} + .toList() .set { bai_file_list } ch_case_info.combine(bam_file_list) + .combine(bai_file_list) .set { manta_input_bams } if (params.analysis_type == "WGS") { - MANTA ( manta_input_bams, bai_file_list, fasta, fai, [[],[],[]] ) + MANTA ( manta_input_bams, fasta, fai, [[],[]] ) } else { - ch_target_bed = ch_bed.ifEmpty([[],[],[]]) - MANTA ( manta_input_bams, bai_file_list, fasta, fai, ch_target_bed ) + ch_target_bed = ch_bed.ifEmpty([[],[]]) + MANTA ( manta_input_bams, fasta, fai, ch_target_bed ) } ch_versions = MANTA.out.versions From f7aa85d0c1816bc63b0815ec466228a140f11434 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Mar 2022 21:40:45 +0100 Subject: [PATCH 0304/1169] update subworkflow --- subworkflows/local/call_sv_manta.nf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/call_sv_manta.nf b/subworkflows/local/call_sv_manta.nf index 5138b604..76460fa4 100644 --- a/subworkflows/local/call_sv_manta.nf +++ b/subworkflows/local/call_sv_manta.nf @@ -26,11 +26,15 @@ workflow CALL_SV_MANTA { .combine(bai_file_list) .set { manta_input_bams } + bed_input = ch_bed.map{ id, bed, index -> + return [bed, index] + } + if (params.analysis_type == "WGS") { MANTA ( manta_input_bams, fasta, fai, [[],[]] ) } else { ch_target_bed = ch_bed.ifEmpty([[],[]]) - MANTA ( manta_input_bams, fasta, fai, ch_target_bed ) + MANTA ( manta_input_bams, fasta, fai, bed_input ) } ch_versions = MANTA.out.versions From 56390696eefa356475d498b184d9e09d52b0efc8 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 8 Mar 2022 09:26:54 +0100 Subject: [PATCH 0305/1169] Tests fix to picard disk space issue --- modules/nf-core/modules/picard/markduplicates/main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index d3bf6938..b0a36691 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -26,6 +26,8 @@ process PICARD_MARKDUPLICATES { avail_mem = task.memory.giga } """ + mkdir tmp + export _JAVA_OPTIONS=-Djava.io.tmpdir=./tmp picard \\ -Xmx${avail_mem}g \\ MarkDuplicates \\ From 791adc9accf2f964884457a76467805fa676e3c8 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 8 Mar 2022 10:34:08 +0100 Subject: [PATCH 0306/1169] Attempts bandaid solution for memory problem --- modules/nf-core/modules/picard/markduplicates/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index b0a36691..0bf7f04a 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -23,7 +23,7 @@ process PICARD_MARKDUPLICATES { if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = task.memory.giga - 1 } """ mkdir tmp From 95d99c6da4190fefc55718330ae2050b586460ab Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 8 Mar 2022 13:53:43 +0100 Subject: [PATCH 0307/1169] Merge branch 'TEMPLATE' into update/template_merge --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 92821145..4ba2d0ca 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -195,7 +195,7 @@ process { // NF-CORE Subworkflows // ALIGN_BWAMEM2 withName: ".*ALIGN_BWAMEM2:.*"{ - ext.when = params.aligner.contains('bwamem2') + ext.when = params.aligner.equals("bwamem2") publishDir = [ path: { "${params.outdir}/bwamem2" }, mode: 'copy', From 9a968c96a378d81d4103495fb2ae82c36d55501e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 8 Mar 2022 13:53:52 +0100 Subject: [PATCH 0308/1169] add subworkflow --- workflows/raredisease.nf | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 25f8a640..7df2e4e6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -13,7 +13,7 @@ WorkflowRaredisease.initialise(params, log) def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, params.bwamem2_index, params.fasta_fai, params.gnomad, - params.vcfanno_resources + params.vcfanno_resources, params.svdb_query_dbs ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } @@ -75,6 +75,8 @@ include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/local/call_structural_variants' +include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' + /* ======================================================================================== RUN MAIN WORKFLOW @@ -174,6 +176,12 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) + ANNOTATE_STRUCTURAL_VARIANTS ( + CALL_STRUCTURAL_VARIANTS.out.vcf, + file(params.svdb_query_dbs) + ) + ch_versions = ch_versions.mix(ANNOTATE_STRUCTURAL_VARIANTS.out.versions) + // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) From bf58ce3351be2497f39a94cfa120c45fd56a733f Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 8 Mar 2022 15:27:32 +0100 Subject: [PATCH 0309/1169] Attempts to fix memory issues --- modules/local/gatk4/collectreadcounts/main.nf | 5 +++-- modules/local/gatk4/denoisereadcounts/main.nf | 7 ++++--- modules/nf-core/modules/picard/markduplicates/main.nf | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index 8e4a945e..b7639a01 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -25,7 +25,7 @@ process GATK4_COLLECTREADCOUNTS { if (!task.memory) { log.info '[GATK CollectReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = task.memory.giga * 14 / 15 } """ gatk --java-options "-Xmx${avail_mem}g" CollectReadCounts \\ @@ -34,7 +34,8 @@ process GATK4_COLLECTREADCOUNTS { -R $fasta \\ -L $interval_list \\ -O ${prefix}.hdf5 \\ - $args + $args \\ + --tmp-dir . cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/gatk4/denoisereadcounts/main.nf b/modules/local/gatk4/denoisereadcounts/main.nf index 2cc0a94a..f68b7813 100644 --- a/modules/local/gatk4/denoisereadcounts/main.nf +++ b/modules/local/gatk4/denoisereadcounts/main.nf @@ -1,6 +1,6 @@ process GATK4_DENOISEREADCOUNTS { tag "$meta.id" - label 'process_medium' + label 'process_high' conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -23,7 +23,7 @@ process GATK4_DENOISEREADCOUNTS { if (!task.memory) { log.info '[GATK DenoiseReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = task.memory.giga * 14 / 15 } """ gatk --java-options "-Xmx${avail_mem}g" DenoiseReadCounts \\ @@ -31,7 +31,8 @@ process GATK4_DENOISEREADCOUNTS { --count-panel-of-normals $panel_of_normals \\ --standardized-copy-ratios ${prefix}.standardizedCR.tsv \\ --denoised-copy-ratios ${prefix}.denoisedCR.tsv \\ - $args + $args \\ + --tmp-dir . cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index 0bf7f04a..df7211cf 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -23,7 +23,7 @@ process PICARD_MARKDUPLICATES { if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga - 1 + avail_mem = task.memory.giga * 14 / 15 } """ mkdir tmp From fc9dd5088eddb09c09812c5e9f4967df038ec8d3 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Wed, 9 Mar 2022 09:29:24 +0100 Subject: [PATCH 0310/1169] Floors java memory allocation --- modules/local/gatk4/collectreadcounts/main.nf | 2 +- modules/local/gatk4/denoisereadcounts/main.nf | 2 +- modules/nf-core/modules/picard/markduplicates/main.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index b7639a01..82fbb728 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -25,7 +25,7 @@ process GATK4_COLLECTREADCOUNTS { if (!task.memory) { log.info '[GATK CollectReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga * 14 / 15 + avail_mem = task.memory.giga * 14 / 15 as long } """ gatk --java-options "-Xmx${avail_mem}g" CollectReadCounts \\ diff --git a/modules/local/gatk4/denoisereadcounts/main.nf b/modules/local/gatk4/denoisereadcounts/main.nf index f68b7813..5bf2c73e 100644 --- a/modules/local/gatk4/denoisereadcounts/main.nf +++ b/modules/local/gatk4/denoisereadcounts/main.nf @@ -23,7 +23,7 @@ process GATK4_DENOISEREADCOUNTS { if (!task.memory) { log.info '[GATK DenoiseReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga * 14 / 15 + avail_mem = task.memory.giga * 14 / 15 as long } """ gatk --java-options "-Xmx${avail_mem}g" DenoiseReadCounts \\ diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index df7211cf..b0107e47 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -23,7 +23,7 @@ process PICARD_MARKDUPLICATES { if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga * 14 / 15 + avail_mem = task.memory.giga * 14 / 15 as long } """ mkdir tmp From 7ac967e7466d71792d9064638b56213ba376b704 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 9 Mar 2022 16:09:33 +0100 Subject: [PATCH 0311/1169] removed slash for vcfanno_resources param --- conf/genomes.config | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index e8ddd83d..f5cbd9b6 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -17,18 +17,18 @@ params { gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" - vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37" + vcfanno_toml = "${params.local_genomes}/vcfanno_resources_grch37/vcfanno_toml-grch37.toml" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" + gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-.vcf.gz" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" - vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38" + vcfanno_toml = "${params.local_genomes}/vcfanno_resources_grch38/vcfanno_toml-grch38.toml" } } } From 49c70040b8c268b9443ef6f3ca226c8944c9514a Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Thu, 10 Mar 2022 11:03:42 +0100 Subject: [PATCH 0312/1169] Add stranger module files --- modules.json | 3 ++ modules/nf-core/modules/stranger/main.nf | 33 +++++++++++++++++ modules/nf-core/modules/stranger/meta.yml | 44 +++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 modules/nf-core/modules/stranger/main.nf create mode 100644 modules/nf-core/modules/stranger/meta.yml diff --git a/modules.json b/modules.json index 45728d03..250e65fc 100644 --- a/modules.json +++ b/modules.json @@ -72,6 +72,9 @@ "samtools/stats": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, + "stranger": { + "git_sha": "fe4eb459fbc76fbcbf63e204b6f5b79f88dca452" + }, "svdb/merge": { "git_sha": "ee915a43e405324e62ee5d4c14a6a6ec6c610058" }, diff --git a/modules/nf-core/modules/stranger/main.nf b/modules/nf-core/modules/stranger/main.nf new file mode 100644 index 00000000..2e647627 --- /dev/null +++ b/modules/nf-core/modules/stranger/main.nf @@ -0,0 +1,33 @@ +process STRANGER { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::stranger=0.8.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/stranger:0.8.1--pyh5e36f6f_0': + 'quay.io/biocontainers/stranger:0.8.1--pyh5e36f6f_0' }" + + input: + tuple val(meta), path(vcf) + + output: + tuple val(meta), path("*.gz"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + stranger \\ + $args \\ + $vcf | gzip --no-name > ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + stranger: \$( stranger --version ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/stranger/meta.yml b/modules/nf-core/modules/stranger/meta.yml new file mode 100644 index 00000000..a9a280ad --- /dev/null +++ b/modules/nf-core/modules/stranger/meta.yml @@ -0,0 +1,44 @@ +name: stranger +description: Annotates output files from ExpansionHunter with the pathologic implications of the repeat sizes. +keywords: + - STR + - repeat_expansions + - annotate + - vcf +tools: + - stranger: + description: Annotate VCF files with str variants + homepage: https://github.com/moonso/stranger + documentation: https://github.com/moonso/stranger + tool_dev_url: https://github.com/moonso/stranger + doi: "10.5281/zenodo.4548873" + licence: ['MIT'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF with repeat expansions + pattern: "*.{vcf.gz,vcf}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: annotated VCF with keys STR_STATUS, NormalMax and PathologicMin + pattern: "*.{vcf.gz}" + +authors: + - "@ljmesi" From fa2e37b128fba119a02e5873c66598ef6c45a6ad Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 13 Mar 2022 12:33:38 +0100 Subject: [PATCH 0313/1169] rewrite svdb query block --- modules/local/svdb/query/main.nf | 72 +++++++++++++++++++ .../modules => local}/svdb/query/meta.yml | 0 modules/nf-core/modules/svdb/query/main.nf | 50 ------------- .../local/annotate_structural_variants.nf | 34 ++++----- 4 files changed, 86 insertions(+), 70 deletions(-) create mode 100644 modules/local/svdb/query/main.nf rename modules/{nf-core/modules => local}/svdb/query/meta.yml (100%) delete mode 100644 modules/nf-core/modules/svdb/query/main.nf diff --git a/modules/local/svdb/query/main.nf b/modules/local/svdb/query/main.nf new file mode 100644 index 00000000..07e40ad6 --- /dev/null +++ b/modules/local/svdb/query/main.nf @@ -0,0 +1,72 @@ +process SVDB_QUERY { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::svdb=2.5.2" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/svdb:2.5.2--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.5.2--py39h5371cbf_0' }" + + input: + tuple val(meta), path(vcf) + val(in_occs) + val(in_frqs) + val(out_occs) + val(out_frqs) + path (vcf_dbs) + + output: + tuple val(meta), path("*_query.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def in_occ = "" + def in_frq = "" + def out_occ = "" + def out_frq = "" + if (in_occs) { + in_occ = "--in_occ ${in_occs.join(',')}" + } + if (in_frqs) { + in_frq = "--in_frq ${in_frqs.join(',')}" + } + if (out_occs) { + out_occ = "--out_occ ${out_occs.join(',')}" + } + if (out_frqs) { + out_frq = "--out_frq ${out_frqs.join(',')}" + } + + """ + svdb \\ + --query \\ + $in_occ \\ + $in_frq \\ + $out_occ \\ + $out_frq \\ + $args \\ + --db ${vcf_dbs.join(',')} \\ + --query_vcf $vcf \\ + --prefix ${prefix} + cat <<-END_VERSIONS > versions.yml + "${task.process}": + svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_query.vcf + cat <<-END_VERSIONS > versions.yml + "${task.process}": + svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) + END_VERSIONS + """ + +} diff --git a/modules/nf-core/modules/svdb/query/meta.yml b/modules/local/svdb/query/meta.yml similarity index 100% rename from modules/nf-core/modules/svdb/query/meta.yml rename to modules/local/svdb/query/meta.yml diff --git a/modules/nf-core/modules/svdb/query/main.nf b/modules/nf-core/modules/svdb/query/main.nf deleted file mode 100644 index 12c67587..00000000 --- a/modules/nf-core/modules/svdb/query/main.nf +++ /dev/null @@ -1,50 +0,0 @@ -process SVDB_QUERY { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::svdb=2.5.0" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.5.0--py39hcbe4a3b_0': - 'quay.io/biocontainers/svdb:2.5.0--py39hcbe4a3b_0' }" - - input: - tuple val(meta), path(vcf), path(vcf_db), val(in_occ), val(in_frq), val(out_occ), val(out_frq) - - output: - tuple val(meta), path("*_ann_svdbq.vcf"), emit: vcf - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def input = "" - if(in_occ) { - input += "--in_occ ${in_occ} " - } - if(in_frq) { - input += "--in_frq ${in_frq} " - } - if(out_occ) { - input += "--out_occ ${out_occ} " - } - if(out_frq) { - input += "--out_frq ${out_frq} " - } - """ - svdb \\ - --query \\ - $args \\ - $input \\ - --db $vcf_db \\ - --query_vcf $vcf \\ - >${prefix}_ann_svdbq.vcf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) - END_VERSIONS - """ -} diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index feaf9037..debe31bc 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -2,8 +2,7 @@ // A subworkflow to annotate structural variants. // -include { SVDB_QUERY as SVDB_QUERY_FILTER } from '../../modules/nf-core/modules/svdb/query/main' -include { SVDB_QUERY as SVDB_QUERY_NOFILTER } from '../../modules/nf-core/modules/svdb/query/main' +include { SVDB_QUERY } from '../../modules/local/svdb/query/main' // include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' @@ -19,27 +18,22 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { Channel.fromPath(sv_dbs) .splitCsv ( header:true ) - .branch { row -> - freq_filter: row.use_in_freq_filter == "1" - return [row.filename, - row.in_freq_info_key, - row.in_allele_count_info_key, - row.out_freq_info_key, - row.out_allele_count_info_key] - no_freq_filter: row.use_in_freq_filter == "0" - return [row.filename, - row.in_freq_info_key, - row.in_allele_count_info_key, - row.out_freq_info_key, - row.out_allele_count_info_key] + .multiMap { row -> + vcf_dbs: row.filename + in_frqs: row.in_freq_info_key + in_occs: row.in_allele_count_info_key + out_frqs: row.out_freq_info_key + out_occs: row.out_allele_count_info_key } .set { ch_svdb_dbs } - ch_input_filter = vcf.combine(ch_svdb_dbs.freq_filter).view() - ch_input_nofilter = vcf.combine(ch_svdb_dbs.no_freq_filter).view() - - SVDB_QUERY_FILTER(ch_input_filter) - SVDB_QUERY_NOFILTER(ch_input_nofilter) + SVDB_QUERY(vcf, + ch_svdb_dbs.in_frqs.toList(), + ch_svdb_dbs.in_occs.toList(), + ch_svdb_dbs.out_frqs.toList(), + ch_svdb_dbs.out_occs.toList(), + ch_svdb_dbs.vcf_dbs.toList() + ) emit: versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] From f2d37637d773f33630d4ed00c69b6391b1ba870d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 13 Mar 2022 14:17:39 +0100 Subject: [PATCH 0314/1169] include picard sortvcf and bcftools view --- conf/modules.config | 6 ++ modules.json | 9 ++- modules/nf-core/modules/bcftools/view/main.nf | 44 +++++++++++++ .../nf-core/modules/bcftools/view/meta.yml | 63 +++++++++++++++++++ .../nf-core/modules/picard/sortvcf/main.nf | 49 +++++++++++++++ .../nf-core/modules/picard/sortvcf/meta.yml | 40 ++++++++++++ .../local/annotate_structural_variants.nf | 9 ++- workflows/raredisease.nf | 4 +- 8 files changed, 219 insertions(+), 5 deletions(-) create mode 100644 modules/nf-core/modules/bcftools/view/main.nf create mode 100644 modules/nf-core/modules/bcftools/view/meta.yml create mode 100644 modules/nf-core/modules/picard/sortvcf/main.nf create mode 100644 modules/nf-core/modules/picard/sortvcf/meta.yml diff --git a/conf/modules.config b/conf/modules.config index b2494a58..85665386 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -197,6 +197,12 @@ process { ] } withName: PICARD_SORTVCF { + publishDir = [ + enabled: false, + ] + } + withName: BCFTOOLS_VIEW { + exts.args = '--output-type v --apply-filters PASS --exclude "INFO/clinical_genomics_mipAF > 0.40 | INFO/swegenAF > 0.40 | INFO/clingen_ngiAF > 0.40 | INFO/gnomad_svAF > 0.40 "' publishDir = [ path: { "${params.outdir}/sv_annotate" }, mode: 'copy', diff --git a/modules.json b/modules.json index 925a5622..de283387 100644 --- a/modules.json +++ b/modules.json @@ -6,6 +6,9 @@ "bcftools/norm": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, + "bcftools/view": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, "bwamem2/index": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, @@ -57,6 +60,9 @@ "picard/markduplicates": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, + "picard/sortvcf": { + "git_sha": "d8028dc1c3ef64c2ee3494ce65d4f4a76c42bde9" + }, "qualimap/bamqc": { "git_sha": "e31f1ff3b1375b30db08637d8937e25cc046f3cc" }, @@ -75,9 +81,6 @@ "svdb/merge": { "git_sha": "ee915a43e405324e62ee5d4c14a6a6ec6c610058" }, - "svdb/query": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, "tabix/bgziptabix": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, diff --git a/modules/nf-core/modules/bcftools/view/main.nf b/modules/nf-core/modules/bcftools/view/main.nf new file mode 100644 index 00000000..2a240f4a --- /dev/null +++ b/modules/nf-core/modules/bcftools/view/main.nf @@ -0,0 +1,44 @@ +process BCFTOOLS_VIEW { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? 'bioconda::bcftools=1.14' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0' : + 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" + + input: + tuple val(meta), path(vcf), path(index) + path(regions) + path(targets) + path(samples) + + output: + tuple val(meta), path("*.gz") , emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def regions_file = regions ? "--regions-file ${regions}" : "" + def targets_file = targets ? "--targets-file ${targets}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" + """ + bcftools view \\ + --output ${prefix}.vcf.gz \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + $args \\ + --threads $task.cpus \\ + ${vcf} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/bcftools/view/meta.yml b/modules/nf-core/modules/bcftools/view/meta.yml new file mode 100644 index 00000000..326fd1fa --- /dev/null +++ b/modules/nf-core/modules/bcftools/view/meta.yml @@ -0,0 +1,63 @@ +name: bcftools_view +description: View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF +keywords: + - variant calling + - view + - bcftools + - VCF + +tools: + - view: + description: | + View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + The vcf file to be inspected. + e.g. 'file.vcf' + - index: + type: file + description: | + The tab index for the VCF file to be inspected. + e.g. 'file.tbi' + - regions: + type: file + description: | + Optionally, restrict the operation to regions listed in this file. + e.g. 'file.vcf' + - targets: + type: file + description: | + Optionally, restrict the operation to regions listed in this file (doesn't rely upon index files) + e.g. 'file.vcf' + - samples: + type: file + description: | + Optional, file of sample names to be included or excluded. + e.g. 'file.tsv' +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF normalized output file + pattern: "*.{vcf.gz}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@abhi18av" diff --git a/modules/nf-core/modules/picard/sortvcf/main.nf b/modules/nf-core/modules/picard/sortvcf/main.nf new file mode 100644 index 00000000..0f10c1ab --- /dev/null +++ b/modules/nf-core/modules/picard/sortvcf/main.nf @@ -0,0 +1,49 @@ +process PICARD_SORTVCF { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + + input: + tuple val(meta), path(vcf) + path reference + path sequence_dict + + output: + tuple val(meta), path("*_sorted.vcf.gz"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def seq_dict = sequence_dict ? "-SEQUENCE_DICTIONARY $sequence_dict" : "" + def reference = reference ? "-REFERENCE_SEQUENCE $reference" : "" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard SortVcf] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + + """ + picard \\ + SortVcf \\ + -Xmx${avail_mem}g \\ + --INPUT $vcf \\ + $args \\ + $seq_dict \\ + $reference \\ + --OUTPUT ${prefix}_sorted.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard SortVcf --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/picard/sortvcf/meta.yml b/modules/nf-core/modules/picard/sortvcf/meta.yml new file mode 100644 index 00000000..a2b46d5a --- /dev/null +++ b/modules/nf-core/modules/picard/sortvcf/meta.yml @@ -0,0 +1,40 @@ +name: picard_sortvcf +description: Sorts vcf files +keywords: + - sort + - vcf +tools: + - picard: + description: Java tools for working with NGS data in the BAM/CRAM/SAM and VCF format + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/command-line-overview.html#SortVcf + licence: ['MIT'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF file + pattern: "*.{vcf,vcf.gz}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: Sorted VCF file + pattern: "*.{vcf}" + +authors: + - "@ramprasadn" diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index debe31bc..9e4da7b5 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -5,13 +5,15 @@ include { SVDB_QUERY } from '../../modules/local/svdb/query/main' -// include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' +include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { take: vcf // channel: [ val(meta), path(vcf) ] sv_dbs // file: dbs.csv + fasta // file: genome.fasta + seq_dict // file: genome.dict main: ch_versions = Channel.empty() @@ -35,6 +37,11 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ch_svdb_dbs.vcf_dbs.toList() ) + PICARD_SORTVCF(SVDB_QUERY.out.vcf, + fasta, + seq_dict + ) + emit: versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 7df2e4e6..9ae02ec3 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -178,7 +178,9 @@ workflow RAREDISEASE { ANNOTATE_STRUCTURAL_VARIANTS ( CALL_STRUCTURAL_VARIANTS.out.vcf, - file(params.svdb_query_dbs) + params.svdb_query_dbs, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.sequence_dict ) ch_versions = ch_versions.mix(ANNOTATE_STRUCTURAL_VARIANTS.out.versions) From 80fb668d9d4acb5388259307928d5f144c91dbbc Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 15 Mar 2022 09:43:54 +0100 Subject: [PATCH 0315/1169] Tries to use deepvariant with gens --- subworkflows/local/gens.nf | 7 ++----- workflows/raredisease.nf | 27 ++++++++++++++------------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 029c7f15..5f7b0616 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -4,12 +4,12 @@ include { GATK4_COLLECTREADCOUNTS as COLLECTREADCOUNTS } from '../../modules/local/gatk4/collectreadcounts/main' include { GATK4_DENOISEREADCOUNTS as DENOISEREADCOUNTS } from '../../modules/local/gatk4/denoisereadcounts/main' -include { GATK4_HAPLOTYPECALLER as HAPLOTYPECALLER } from '../../modules/nf-core/modules/gatk4/haplotypecaller/main' include { GENS as GENS_GENERATE } from '../../modules/local/gens/main' workflow GENS { take: bam // channel: [ val(meta), path(bam), path(bai) ] + vcf // channel: [ val(meta), path(vcf) ] fasta // path(fasta) fai // path(fai) interval_list // path(interval_list) @@ -27,16 +27,13 @@ workflow GENS { bam.view() ch_bam.view() - HAPLOTYPECALLER ( ch_bam, fasta, fai, seq_dict, [], [] ) - ch_versions = ch_versions.mix(HAPLOTYPECALLER.out.versions) - COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions) - GENS_GENERATE ( DENOISEREADCOUNTS.out.standardized_read_counts, HAPLOTYPECALLER.out.vcf, gnomad_pos ) + GENS_GENERATE ( DENOISEREADCOUNTS.out.standardized_read_counts, vcf, gnomad_pos ) ch_versions = ch_versions.mix(GENS_GENERATE.out.versions) emit: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index a5cf5445..c19b9acf 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -152,19 +152,6 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) - // STEP 1.7: GENS - GENS ( - ch_marked_bam.join(ch_marked_bai, by: [0]), - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, - file(params.gens_interval_list), - file(params.gens_pon), - file(params.gens_gnomad_pos), - INPUT_CHECK.out.ch_case_info, - PREPARE_GENOME.out.sequence_dict - ) - ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) - // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV_DEEPVARIANT ( @@ -185,6 +172,20 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) + // STEP 2.1: GENS + GENS ( + ch_marked_bam.join(ch_marked_bai, by: [0]), + CALL_SNV_DEEPVARIANT.out.vcf, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.fai, + file(params.gens_interval_list), + file(params.gens_pon), + file(params.gens_gnomad_pos), + INPUT_CHECK.out.ch_case_info, + PREPARE_GENOME.out.sequence_dict + ) + ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) + // // MODULE: Pipeline reporting // From d0909643709f890d4336d05cd2bd73f1484b59ce Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 15 Mar 2022 10:01:42 +0100 Subject: [PATCH 0316/1169] Attempts fix --- modules/local/gens/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index d2caf303..664cee13 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -9,12 +9,12 @@ process GENS { input: tuple val(meta), path(read_counts) - path vcf + tuple val(meta_vcf), path(vcf) path gnomad_positions output: tuple val(meta), path('*.cov.bed.gz'), emit: cov - tuple val(meta), path('*.baf.bed.gz'), emit: baf + tuple val(meta_vcf), path('*.baf.bed.gz'), emit: baf path "versions.yml" , emit: versions script: From 28c0c73bd0a5347b6f5f19582b8b7d04285eac41 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 15 Mar 2022 10:27:01 +0100 Subject: [PATCH 0317/1169] Fixes order of arguments to generate_gens_data.pl --- modules/local/gens/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index 664cee13..f1d22838 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -27,8 +27,8 @@ process GENS { } """ generate_gens_data.pl \\ - $vcf \\ $read_counts \\ + $vcf \\ $prefix \\ $gnomad_positions From 3d76b80a3c1f4aa1b4cfdc47982815a2687955a3 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 15 Mar 2022 20:58:32 +0000 Subject: [PATCH 0318/1169] Template update for nf-core/tools version 2.3 --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/awsfulltest.yml | 6 +- .github/workflows/awstest.yml | 6 +- .github/workflows/ci.yml | 4 +- .github/workflows/linting.yml | 28 +-- .gitpod.yml | 14 ++ .nf-core.yml | 1 + .yamllint.yml | 6 + README.md | 6 +- bin/check_samplesheet.py | 346 +++++++++++++++++--------- conf/base.config | 4 +- conf/igenomes.config | 80 +++--- conf/modules.config | 18 +- conf/test.config | 6 +- conf/test_full.config | 6 +- docs/usage.md | 21 +- lib/NfcoreSchema.groovy | 4 +- lib/Utils.groovy | 4 +- lib/WorkflowRaredisease.groovy | 4 +- main.nf | 24 +- nextflow.config | 18 +- nextflow_schema.json | 23 +- subworkflows/local/input_check.nf | 18 +- workflows/raredisease.nf | 28 +-- 25 files changed, 419 insertions(+), 259 deletions(-) create mode 100644 .gitpod.yml create mode 100644 .nf-core.yml create mode 100644 .yamllint.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 2ca71ec3..e455d5a5 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,4 +1,3 @@ - name: Bug report description: Report something that is broken or incorrect labels: bug diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 94c01b6c..5ed28cd3 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -19,7 +19,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker` --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 073f3e48..c284c5ef 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: nf-core/tower-action@v3 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters @@ -31,4 +31,6 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" } profiles: test_full,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' + nextflow_config: | + process.errorStrategy = 'retry' + process.maxRetries = 3 diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index ced685df..bd795776 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: nf-core/tower-action@v3 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} @@ -25,4 +25,6 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test-${{ github.sha }}" } profiles: test,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' + nextflow_config: | + process.errorStrategy = 'retry' + process.maxRetries = 3 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97c32da7..d529b893 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ env: jobs: test: - name: Run workflow tests + name: Run pipeline with test data # Only run on push if this is the nf-core dev branch (merged PRs) if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/raredisease') }} runs-on: ubuntu-latest @@ -47,4 +47,4 @@ jobs: # For example: adding multiple test runs with different parameters # Remember that you can parallelise this by using strategy.matrix run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 3b448773..fda934c0 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -12,9 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint @@ -51,9 +49,7 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -64,14 +60,13 @@ jobs: YAML: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - name: Checkout + uses: actions/checkout@master + - name: 'Yamllint' + uses: karancode/yamllint-github-action@master with: - node-version: '10' - - name: Install yaml-lint - run: npm install -g yaml-lint - - name: Run yaml-lint - run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml" -o -name "*.yaml") + yamllint_file_or_dir: '.' + yamllint_config_filepath: '.yamllint.yml' # If the above check failed, post a comment on the PR explaining the failure - name: Post PR comment @@ -84,10 +79,11 @@ jobs: To keep the code consistent with lots of contributors, we run automated code consistency checks. To fix this CI test, please run: - * Install `yaml-lint` - * [Install `npm`](https://www.npmjs.com/get-npm) then [install `yaml-lint`](https://www.npmjs.com/package/yaml-lint) (`npm install -g yaml-lint`) + * Install `yamllint` + * Install `yamllint` following [this](https://yamllint.readthedocs.io/en/stable/quickstart.html#installing-yamllint) + instructions or alternative install it in your [conda environment](https://anaconda.org/conda-forge/yamllint) * Fix the markdown errors - * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml")` + * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml") -c ./.yamllint.yml` * Fix any reported errors in your YAML files Once you push these changes the test should pass, and you can hide this comment :+1: diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 00000000..b7d4cee1 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,14 @@ +image: nfcore/gitpod:latest + +vscode: + extensions: # based on nf-core.nf-core-extensionpack + - codezombiech.gitignore # Language support for .gitignore files + # - cssho.vscode-svgviewer # SVG viewer + - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed + - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files + - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar + - mechatroner.rainbow-csv # Highlight columns in csv files in different colors + # - nextflow.nextflow # Nextflow syntax highlighting + - oderwat.indent-rainbow # Highlight indentation level + - streetsidesoftware.code-spell-checker # Spelling checker for source code diff --git a/.nf-core.yml b/.nf-core.yml new file mode 100644 index 00000000..3805dc81 --- /dev/null +++ b/.nf-core.yml @@ -0,0 +1 @@ +repository_type: pipeline diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 00000000..d466deec --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,6 @@ +extends: default + +rules: + document-start: disable + line-length: disable + truthy: disable diff --git a/README.md b/README.md index ae41107b..c99fd01f 100644 --- a/README.md +++ b/README.md @@ -40,14 +40,14 @@ On release, automated continuous integration tests run the pipeline on a full-si 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/raredisease -profile test,YOURPROFILE + nextflow run nf-core/raredisease -profile test,YOURPROFILE --outdir ``` Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. + > * If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! @@ -55,7 +55,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ```console - nextflow run nf-core/raredisease -profile --input samplesheet.csv --genome GRCh37 + nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile ``` ## Documentation diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index d8831053..5473b624 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -1,145 +1,249 @@ #!/usr/bin/env python -# TODO nf-core: Update the script to check the samplesheet -# This script is based on the example at: https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv -import os -import sys -import errno +"""Provide a command line tool to validate and transform tabular samplesheets.""" + + import argparse +import csv +import logging +import sys +from collections import Counter +from pathlib import Path -def parse_args(args=None): - Description = "Reformat nf-core/raredisease samplesheet file and check its contents." - Epilog = "Example usage: python check_samplesheet.py " +logger = logging.getLogger() - parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument("FILE_IN", help="Input samplesheet file.") - parser.add_argument("FILE_OUT", help="Output file.") - return parser.parse_args(args) +class RowChecker: + """ + Define a service that can validate and transform each given row. -def make_dir(path): - if len(path) > 0: - try: - os.makedirs(path) - except OSError as exception: - if exception.errno != errno.EEXIST: - raise exception + Attributes: + modified (list): A list of dicts, where each dict corresponds to a previously + validated and transformed row. The order of rows is maintained. + """ -def print_error(error, context="Line", context_str=""): - error_str = "ERROR: Please check samplesheet -> {}".format(error) - if context != "" and context_str != "": - error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format( - error, context.strip(), context_str.strip() + VALID_FORMATS = ( + ".fq.gz", + ".fastq.gz", + ) + + def __init__( + self, + sample_col="sample", + first_col="fastq_1", + second_col="fastq_2", + single_col="single_end", + **kwargs, + ): + """ + Initialize the row checker with the expected column names. + + Args: + sample_col (str): The name of the column that contains the sample name + (default "sample"). + first_col (str): The name of the column that contains the first (or only) + FASTQ file path (default "fastq_1"). + second_col (str): The name of the column that contains the second (if any) + FASTQ file path (default "fastq_2"). + single_col (str): The name of the new column that will be inserted and + records whether the sample contains single- or paired-end sequencing + reads (default "single_end"). + + """ + super().__init__(**kwargs) + self._sample_col = sample_col + self._first_col = first_col + self._second_col = second_col + self._single_col = single_col + self._seen = set() + self.modified = [] + + def validate_and_transform(self, row): + """ + Perform all validations on the given row and insert the read pairing status. + + Args: + row (dict): A mapping from column headers (keys) to elements of that row + (values). + + """ + self._validate_sample(row) + self._validate_first(row) + self._validate_second(row) + self._validate_pair(row) + self._seen.add((row[self._sample_col], row[self._first_col])) + self.modified.append(row) + + def _validate_sample(self, row): + """Assert that the sample name exists and convert spaces to underscores.""" + assert len(row[self._sample_col]) > 0, "Sample input is required." + # Sanitize samples slightly. + row[self._sample_col] = row[self._sample_col].replace(" ", "_") + + def _validate_first(self, row): + """Assert that the first FASTQ entry is non-empty and has the right format.""" + assert len(row[self._first_col]) > 0, "At least the first FASTQ file is required." + self._validate_fastq_format(row[self._first_col]) + + def _validate_second(self, row): + """Assert that the second FASTQ entry has the right format if it exists.""" + if len(row[self._second_col]) > 0: + self._validate_fastq_format(row[self._second_col]) + + def _validate_pair(self, row): + """Assert that read pairs have the same file extension. Report pair status.""" + if row[self._first_col] and row[self._second_col]: + row[self._single_col] = False + assert ( + Path(row[self._first_col]).suffixes == Path(row[self._second_col]).suffixes + ), "FASTQ pairs must have the same file extensions." + else: + row[self._single_col] = True + + def _validate_fastq_format(self, filename): + """Assert that a given filename has one of the expected FASTQ extensions.""" + assert any(filename.endswith(extension) for extension in self.VALID_FORMATS), ( + f"The FASTQ file has an unrecognized extension: {filename}\n" + f"It should be one of: {', '.join(self.VALID_FORMATS)}" ) - print(error_str) - sys.exit(1) + def validate_unique_samples(self): + """ + Assert that the combination of sample name and FASTQ filename is unique. + + In addition to the validation, also rename the sample if more than one sample, + FASTQ file combination exists. + + """ + assert len(self._seen) == len(self.modified), "The pair of sample name and FASTQ must be unique." + if len({pair[0] for pair in self._seen}) < len(self._seen): + counts = Counter(pair[0] for pair in self._seen) + seen = Counter() + for row in self.modified: + sample = row[self._sample_col] + seen[sample] += 1 + if counts[sample] > 1: + row[self._sample_col] = f"{sample}_T{seen[sample]}" + + +def sniff_format(handle): + """ + Detect the tabular format. + + Args: + handle (text file): A handle to a `text file`_ object. The read position is + expected to be at the beginning (index 0). + + Returns: + csv.Dialect: The detected tabular format. + + .. _text file: + https://docs.python.org/3/glossary.html#term-text-file -# TODO nf-core: Update the check_samplesheet function -def check_samplesheet(file_in, file_out): """ - This function checks that the samplesheet follows the following structure: + peek = handle.read(2048) + sniffer = csv.Sniffer() + if not sniffer.has_header(peek): + logger.critical(f"The given sample sheet does not appear to contain a header.") + sys.exit(1) + dialect = sniffer.sniff(peek) + handle.seek(0) + return dialect - sample,fastq_1,fastq_2 - SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz - SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz - SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, - For an example see: - https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv +def check_samplesheet(file_in, file_out): """ + Check that the tabular samplesheet has the structure expected by nf-core pipelines. - sample_mapping_dict = {} - with open(file_in, "r") as fin: + Validate the general shape of the table, expected columns, and each row. Also add + an additional column which records whether one or two FASTQ reads were found. - ## Check header - MIN_COLS = 2 - # TODO nf-core: Update the column names for the input samplesheet - HEADER = ["sample", "fastq_1", "fastq_2"] - header = [x.strip('"') for x in fin.readline().strip().split(",")] - if header[: len(HEADER)] != HEADER: - print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) - sys.exit(1) + Args: + file_in (pathlib.Path): The given tabular samplesheet. The format can be either + CSV, TSV, or any other format automatically recognized by ``csv.Sniffer``. + file_out (pathlib.Path): Where the validated and transformed samplesheet should + be created; always in CSV format. - ## Check sample entries - for line in fin: - lspl = [x.strip().strip('"') for x in line.strip().split(",")] - - # Check valid number of columns per row - if len(lspl) < len(HEADER): - print_error( - "Invalid number of columns (minimum = {})!".format(len(HEADER)), - "Line", - line, - ) - num_cols = len([x for x in lspl if x]) - if num_cols < MIN_COLS: - print_error( - "Invalid number of populated columns (minimum = {})!".format(MIN_COLS), - "Line", - line, - ) - - ## Check sample name entries - sample, fastq_1, fastq_2 = lspl[: len(HEADER)] - sample = sample.replace(" ", "_") - if not sample: - print_error("Sample entry has not been specified!", "Line", line) - - ## Check FastQ file extension - for fastq in [fastq_1, fastq_2]: - if fastq: - if fastq.find(" ") != -1: - print_error("FastQ file contains spaces!", "Line", line) - if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): - print_error( - "FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", - "Line", - line, - ) - - ## Auto-detect paired-end/single-end - sample_info = [] ## [single_end, fastq_1, fastq_2] - if sample and fastq_1 and fastq_2: ## Paired-end short reads - sample_info = ["0", fastq_1, fastq_2] - elif sample and fastq_1 and not fastq_2: ## Single-end short reads - sample_info = ["1", fastq_1, fastq_2] - else: - print_error("Invalid combination of columns provided!", "Line", line) - - ## Create sample mapping dictionary = { sample: [ single_end, fastq_1, fastq_2 ] } - if sample not in sample_mapping_dict: - sample_mapping_dict[sample] = [sample_info] - else: - if sample_info in sample_mapping_dict[sample]: - print_error("Samplesheet contains duplicate rows!", "Line", line) - else: - sample_mapping_dict[sample].append(sample_info) - - ## Write validated samplesheet with appropriate columns - if len(sample_mapping_dict) > 0: - out_dir = os.path.dirname(file_out) - make_dir(out_dir) - with open(file_out, "w") as fout: - fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2"]) + "\n") - for sample in sorted(sample_mapping_dict.keys()): - - ## Check that multiple runs of the same sample are of the same datatype - if not all(x[0] == sample_mapping_dict[sample][0][0] for x in sample_mapping_dict[sample]): - print_error("Multiple runs of a sample must be of the same datatype!", "Sample: {}".format(sample)) - - for idx, val in enumerate(sample_mapping_dict[sample]): - fout.write(",".join(["{}_T{}".format(sample, idx + 1)] + val) + "\n") - else: - print_error("No entries to process!", "Samplesheet: {}".format(file_in)) - - -def main(args=None): - args = parse_args(args) - check_samplesheet(args.FILE_IN, args.FILE_OUT) + Example: + This function checks that the samplesheet follows the following structure, + see also the `viral recon samplesheet`_:: + + sample,fastq_1,fastq_2 + SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz + SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz + SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, + + .. _viral recon samplesheet: + https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv + + """ + required_columns = {"sample", "fastq_1", "fastq_2"} + # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. + with file_in.open(newline="") as in_handle: + reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) + # Validate the existence of the expected header columns. + if not required_columns.issubset(reader.fieldnames): + logger.critical(f"The sample sheet **must** contain the column headers: {', '.join(required_columns)}.") + sys.exit(1) + # Validate each row. + checker = RowChecker() + for i, row in enumerate(reader): + try: + checker.validate_and_transform(row) + except AssertionError as error: + logger.critical(f"{str(error)} On line {i + 2}.") + sys.exit(1) + checker.validate_unique_samples() + header = list(reader.fieldnames) + header.insert(1, "single_end") + # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. + with file_out.open(mode="w", newline="") as out_handle: + writer = csv.DictWriter(out_handle, header, delimiter=",") + writer.writeheader() + for row in checker.modified: + writer.writerow(row) + + +def parse_args(argv=None): + """Define and immediately parse command line arguments.""" + parser = argparse.ArgumentParser( + description="Validate and transform a tabular samplesheet.", + epilog="Example: python check_samplesheet.py samplesheet.csv samplesheet.valid.csv", + ) + parser.add_argument( + "file_in", + metavar="FILE_IN", + type=Path, + help="Tabular input samplesheet in CSV or TSV format.", + ) + parser.add_argument( + "file_out", + metavar="FILE_OUT", + type=Path, + help="Transformed output samplesheet in CSV format.", + ) + parser.add_argument( + "-l", + "--log-level", + help="The desired log level (default WARNING).", + choices=("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"), + default="WARNING", + ) + return parser.parse_args(argv) + + +def main(argv=None): + """Coordinate argument parsing and program execution.""" + args = parse_args(argv) + logging.basicConfig(level=args.log_level, format="[%(levelname)s] %(message)s") + if not args.file_in.is_file(): + logger.error(f"The given input file {args.file_in} was not found!") + sys.exit(2) + args.file_out.parent.mkdir(parents=True, exist_ok=True) + check_samplesheet(args.file_in, args.file_out) if __name__ == "__main__": diff --git a/conf/base.config b/conf/base.config index 14979165..12aea369 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/raredisease Nextflow base config file -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 'blank slate' config file, appropriate for general use on most high performance compute environments. Assumes that all software is installed and available on the PATH. Runs in `local` mode - all jobs will be run on the logged in environment. diff --git a/conf/igenomes.config b/conf/igenomes.config index 855948de..7a1b3ac6 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for iGenomes paths -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines reference genomes using iGenome paths. Can be used by any config that customises the base path using: $params.igenomes_base / --igenomes_base @@ -13,7 +13,7 @@ params { genomes { 'GRCh37' { fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" @@ -26,7 +26,7 @@ params { } 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" @@ -38,7 +38,7 @@ params { } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" @@ -51,7 +51,7 @@ params { } 'TAIR10' { fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" @@ -62,7 +62,7 @@ params { } 'EB2' { fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" @@ -72,7 +72,7 @@ params { } 'UMD3.1' { fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" @@ -83,7 +83,7 @@ params { } 'WBcel235' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" @@ -94,7 +94,7 @@ params { } 'CanFam3.1' { fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" @@ -105,7 +105,7 @@ params { } 'GRCz10' { fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" @@ -115,7 +115,7 @@ params { } 'BDGP6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" @@ -126,7 +126,7 @@ params { } 'EquCab2' { fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" @@ -137,7 +137,7 @@ params { } 'EB1' { fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" @@ -147,7 +147,7 @@ params { } 'Galgal4' { fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" @@ -157,7 +157,7 @@ params { } 'Gm01' { fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" @@ -167,7 +167,7 @@ params { } 'Mmul_1' { fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" @@ -178,7 +178,7 @@ params { } 'IRGSP-1.0' { fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" @@ -188,7 +188,7 @@ params { } 'CHIMP2.1.4' { fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" @@ -199,7 +199,7 @@ params { } 'Rnor_5.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" @@ -209,7 +209,7 @@ params { } 'Rnor_6.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" @@ -219,7 +219,7 @@ params { } 'R64-1-1' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" @@ -230,7 +230,7 @@ params { } 'EF2' { fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" @@ -242,7 +242,7 @@ params { } 'Sbi1' { fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" @@ -252,7 +252,7 @@ params { } 'Sscrofa10.2' { fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" @@ -263,7 +263,7 @@ params { } 'AGPv3' { fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" @@ -273,7 +273,7 @@ params { } 'hg38' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" @@ -285,7 +285,7 @@ params { } 'hg19' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" @@ -298,7 +298,7 @@ params { } 'mm10' { fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" @@ -311,7 +311,7 @@ params { } 'bosTau8' { fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" @@ -321,7 +321,7 @@ params { } 'ce10' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" @@ -333,7 +333,7 @@ params { } 'canFam3' { fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" @@ -344,7 +344,7 @@ params { } 'danRer10' { fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" @@ -355,7 +355,7 @@ params { } 'dm6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" @@ -366,7 +366,7 @@ params { } 'equCab2' { fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" @@ -377,7 +377,7 @@ params { } 'galGal4' { fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" @@ -388,7 +388,7 @@ params { } 'panTro4' { fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" @@ -399,7 +399,7 @@ params { } 'rn6' { fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" @@ -409,7 +409,7 @@ params { } 'sacCer3' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" @@ -419,7 +419,7 @@ params { } 'susScr3' { fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" diff --git a/conf/modules.config b/conf/modules.config index a0506a4d..da58a5d8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,12 +1,12 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Config file for defining DSL2 per module options and publishing paths -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. ---------------------------------------------------------------------------------------- */ @@ -14,14 +14,14 @@ process { publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] withName: SAMPLESHEET_CHECK { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -33,7 +33,7 @@ process { withName: CUSTOM_DUMPSOFTWAREVERSIONS { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*_versions.yml' ] } diff --git a/conf/test.config b/conf/test.config index 18d4d65e..49fc7560 100644 --- a/conf/test.config +++ b/conf/test.config @@ -1,11 +1,11 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for running minimal tests -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run nf-core/raredisease -profile test, + nextflow run nf-core/raredisease -profile test, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/conf/test_full.config b/conf/test_full.config index a1f48902..a33b4721 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -1,11 +1,11 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for running full-size tests -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines input files and everything required to run a full size pipeline test. Use as follows: - nextflow run nf-core/raredisease -profile test_full, + nextflow run nf-core/raredisease -profile test_full, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/docs/usage.md b/docs/usage.md index 1f94372c..97588b8b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -57,7 +57,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```console -nextflow run nf-core/raredisease --input samplesheet.csv --genome GRCh37 -profile docker +nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -141,11 +141,11 @@ Whilst the default requirements set within the pipeline will hopefully work for For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: ```console -[62/149eb0] NOTE: Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) -Error executing process > 'RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' +[62/149eb0] NOTE: Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) +Error executing process > 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' Caused by: - Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) + Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) Command executed: STAR \ @@ -169,17 +169,24 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to __cap__ the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. +To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). +We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/software/star/align/main.nf`. +If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). +The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. +The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. +Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. +The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. ```nextflow process { - withName: STAR_ALIGN { + withName: 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN' { memory = 100.GB } } ``` -> **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. +> **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. +> If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. ### Updating containers diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 40ab65f2..b3d092f8 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -27,7 +27,7 @@ class NfcoreSchema { /* groovylint-disable-next-line UnusedPrivateMethodParameter */ public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { def has_error = false - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Check for nextflow core params and unexpected params def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') @@ -135,7 +135,7 @@ class NfcoreSchema { } } - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Validate parameters against the schema InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) diff --git a/lib/Utils.groovy b/lib/Utils.groovy index 1b88aec0..28567bd7 100755 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -29,12 +29,12 @@ class Utils { conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults')) if (conda_check_failed) { - log.warn "=============================================================================\n" + + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " There is a problem with your Conda configuration!\n\n" + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + " Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" + " NB: The order of the channels matters!\n" + - "===================================================================================" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" } } } diff --git a/lib/WorkflowRaredisease.groovy b/lib/WorkflowRaredisease.groovy index 23686959..afd9433e 100755 --- a/lib/WorkflowRaredisease.groovy +++ b/lib/WorkflowRaredisease.groovy @@ -48,11 +48,11 @@ class WorkflowRaredisease { // private static void genomeExistsError(params, log) { if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - log.error "=============================================================================\n" + + log.error "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + " Currently, the available genome keys are:\n" + " ${params.genomes.keySet().join(", ")}\n" + - "===================================================================================" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" System.exit(1) } } diff --git a/main.nf b/main.nf index 9d7ece62..25e7ee5d 100644 --- a/main.nf +++ b/main.nf @@ -1,8 +1,8 @@ #!/usr/bin/env nextflow /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/raredisease -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/raredisease Website: https://nf-co.re/raredisease Slack : https://nfcore.slack.com/channels/raredisease @@ -12,25 +12,25 @@ nextflow.enable.dsl = 2 /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GENOME PARAMETER VALUES -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE & PRINT PARAMETER SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ WorkflowMain.initialise(workflow, params, log) /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NAMED WORKFLOW FOR PIPELINE -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { RAREDISEASE } from './workflows/raredisease' @@ -43,9 +43,9 @@ workflow NFCORE_RAREDISEASE { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN ALL WORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -57,7 +57,7 @@ workflow { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ diff --git a/nextflow.config b/nextflow.config index 0eaaf845..387828ad 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/raredisease Nextflow config file -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Default config options for all compute environments ---------------------------------------------------------------------------------------- */ @@ -24,8 +24,9 @@ params { max_multiqc_email_size = '25.MB' // Boilerplate options - outdir = './results' + outdir = null tracedir = "${params.outdir}/pipeline_info" + publish_dir_mode = 'copy' email = null email_on_fail = null plaintext_email = false @@ -62,6 +63,15 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } +// Load nf-core/raredisease custom profiles from different institutions. +// Warning: Uncomment only if a pipeline-specific instititutional config already exists on nf-core/configs! +// try { +// includeConfig "${params.custom_config_base}/pipeline/raredisease.config" +// } catch (Exception e) { +// System.err.println("WARNING: Could not load nf-core/config/raredisease profiles: ${params.custom_config_base}/pipeline/raredisease.config") +// } + + profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -121,7 +131,7 @@ if (!params.igenomes_ignore) { } // Export these variables to prevent local Python/R libraries from conflicting with those in the container -// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. env { diff --git a/nextflow_schema.json b/nextflow_schema.json index 068a9809..7e946960 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -11,7 +11,8 @@ "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", "required": [ - "input" + "input", + "outdir" ], "properties": { "input": { @@ -26,8 +27,8 @@ }, "outdir": { "type": "string", - "description": "Path to the output directory where the results will be saved.", - "default": "./results", + "format": "directory-path", + "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", "fa_icon": "fas fa-folder-open" }, "email": { @@ -178,6 +179,22 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "move" + ], + "hidden": true + }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index cddcbb3c..0aecf87f 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -12,7 +12,7 @@ workflow INPUT_CHECK { SAMPLESHEET_CHECK ( samplesheet ) .csv .splitCsv ( header:true, sep:',' ) - .map { create_fastq_channels(it) } + .map { create_fastq_channel(it) } .set { reads } emit: @@ -21,22 +21,24 @@ workflow INPUT_CHECK { } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def create_fastq_channels(LinkedHashMap row) { +def create_fastq_channel(LinkedHashMap row) { + // create meta map def meta = [:] - meta.id = row.sample - meta.single_end = row.single_end.toBoolean() + meta.id = row.sample + meta.single_end = row.single_end.toBoolean() - def array = [] + // add path(s) of the fastq file(s) to the meta map + def fastq_meta = [] if (!file(row.fastq_1).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" } if (meta.single_end) { - array = [ meta, [ file(row.fastq_1) ] ] + fastq_meta = [ meta, [ file(row.fastq_1) ] ] } else { if (!file(row.fastq_2).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" } - array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] + fastq_meta = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] } - return array + return fastq_meta } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index ab9e9810..64de96a5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE INPUTS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) @@ -18,18 +18,18 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CONFIG FILES -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT LOCAL MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -38,9 +38,9 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi include { INPUT_CHECK } from '../subworkflows/local/input_check' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -51,9 +51,9 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // Info required for completion email and summary @@ -104,9 +104,9 @@ workflow RAREDISEASE { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ COMPLETION EMAIL AND SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow.onComplete { @@ -117,7 +117,7 @@ workflow.onComplete { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ From 2fdb58199f77b48111995fb357159c5d29540d96 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 11:43:22 +0100 Subject: [PATCH 0319/1169] using -revision dev --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1d718fdd..645cc744 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ The different steps and corresponding tools are represented in the flowchart bel 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/raredisease -profile test,YOURPROFILE + nextflow run nf-core/raredisease -revision dev -profile test,YOURPROFILE ``` Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. @@ -58,10 +58,11 @@ The different steps and corresponding tools are represented in the flowchart bel 4. Start running your own analysis! - - ```console - nextflow run nf-core/raredisease -profile --input samplesheet.csv --genome GRCh37 + nextflow run nf-core/raredisease \ + --input samplesheet.csv --genome GRCh38 \ + -revision dev \ + -profile ``` ## Documentation From 8cacbd1591c768640efa88b2a195b7f7f399d73b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 16 Mar 2022 12:07:10 +0100 Subject: [PATCH 0320/1169] make the subworkflow optional --- conf/genomes.config | 2 +- conf/test.config | 2 +- workflows/raredisease.nf | 18 +++++++++++------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index c05f375e..6c60010b 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -26,7 +26,7 @@ params { fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" - svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" + svdb_query_dbs = "" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" diff --git a/conf/test.config b/conf/test.config index b46c825b..617aefca 100644 --- a/conf/test.config +++ b/conf/test.config @@ -29,7 +29,7 @@ params { fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' // Structural variant annotation databases - svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" + svdb_query_dbs = "" // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 9ae02ec3..b262e885 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -176,13 +176,17 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) - ANNOTATE_STRUCTURAL_VARIANTS ( - CALL_STRUCTURAL_VARIANTS.out.vcf, - params.svdb_query_dbs, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.sequence_dict - ) - ch_versions = ch_versions.mix(ANNOTATE_STRUCTURAL_VARIANTS.out.versions) + ch_sv_annotate = Channel.empty() + if (params.svdb_query_dbs) { + ANNOTATE_STRUCTURAL_VARIANTS ( + CALL_STRUCTURAL_VARIANTS.out.vcf, + params.svdb_query_dbs, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.sequence_dict + ).set {ch_sv_annotate} + + ch_versions = ch_versions.mix(ch_sv_annotate.versions) + } // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) From 6c77dd78e1391c6028ba71411c5995667c90fe8f Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 14:09:58 +0100 Subject: [PATCH 0321/1169] analysis_type --- README.md | 3 +++ conf/wes.config | 2 +- nextflow_schema.json | 9 +++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 645cc744..1c4907ec 100644 --- a/README.md +++ b/README.md @@ -61,10 +61,13 @@ The different steps and corresponding tools are represented in the flowchart bel ```console nextflow run nf-core/raredisease \ --input samplesheet.csv --genome GRCh38 \ + --analysis_type \ # WGS is default -revision dev \ -profile ``` +Note that the `-revision` is used because pipeline is still under development and the latest working branch is dev. + ## Documentation The nf-core/raredisease pipeline comes with documentation about the pipeline [usage](https://nf-co.re/raredisease/usage), [parameters](https://nf-co.re/raredisease/parameters) and [output](https://nf-co.re/raredisease/output). diff --git a/conf/wes.config b/conf/wes.config index a5c239d2..b056190d 100644 --- a/conf/wes.config +++ b/conf/wes.config @@ -2,7 +2,7 @@ ======================================================================================== nf-core/raredisease Nextflow whole-exome sequencing (WES) config file ======================================================================================== - This config file is invoked when `--analysis_type` = 'WES'. + This config file is invoked when `--analysis_type` = 'wes'. The purpose is to reduce the amount of resources used compared to WGS data. ---------------------------------------------------------------------------------------- */ diff --git a/nextflow_schema.json b/nextflow_schema.json index 20bbbf55..8e044ca6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -149,12 +149,13 @@ "properties": { "analysis_type": { "type": "string", - "default": "WGS", - "description": "Specifies which analysis type for the pipeline- either 'WGS' or 'WES'. It'll mainly change the resources consumed.", + "default": "wgs", + "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", "enum": [ - "WGS", - "WES" + "wgs", + "wes", + "mito" ] } } From f1b72a554511f7df36f9bf6b83945c5cf028c3d3 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 14:12:37 +0100 Subject: [PATCH 0322/1169] spellcheck args --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c4907ec..31cd6b3d 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ The different steps and corresponding tools are represented in the flowchart bel ```console nextflow run nf-core/raredisease \ --input samplesheet.csv --genome GRCh38 \ - --analysis_type \ # WGS is default + --analysis_type \ # WGS is default -revision dev \ -profile ``` From 76877a30d4703e87ac90e23caaf979404dd5a62d Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 14:13:45 +0100 Subject: [PATCH 0323/1169] spellcheck v1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31cd6b3d..0726b455 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ The different steps and corresponding tools are represented in the flowchart bel ```console nextflow run nf-core/raredisease \ --input samplesheet.csv --genome GRCh38 \ - --analysis_type \ # WGS is default + --analysis_type \ # wgs is default -revision dev \ -profile ``` From 861c49350cd2710129766221828f970619393b7f Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 14:21:03 +0100 Subject: [PATCH 0324/1169] fix workflow fail --- nextflow.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nextflow.config b/nextflow.config index 24d1c0b1..f26760d4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -20,7 +20,7 @@ params { save_reference = false // Main options - analysis_type = 'WGS' + analysis_type = 'wgs' // Alignment aligner = 'bwamem2' @@ -141,8 +141,8 @@ if (params.local_config_path) { includeConfig "${params.local_config_path}" } -// Load wes.config if --analysis_type='WES' -if (params.analysis_type == 'WES') { +// Load wes.config if --analysis_type='wes' +if (params.analysis_type == 'wes') { includeConfig 'conf/wes.config' } From 5c16db035dbd0ad2681595414c7a5428f05ab3b8 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 14:45:01 +0100 Subject: [PATCH 0325/1169] removed todo in credits --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 0726b455..dfb6b4df 100644 --- a/README.md +++ b/README.md @@ -76,9 +76,7 @@ The nf-core/raredisease pipeline comes with documentation about the pipeline [us nf-core/raredisease was originally written by Clinical Genomics Stockholm. -We thank the following people for their extensive assistance in the development of this pipeline: - - +Big thanks to the contributors for their extensive assistance in the development of this pipeline. ## Contributions and Support From 87b5de321e0ff58fe54aaa12df7990422eac1960 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 14:53:59 +0100 Subject: [PATCH 0326/1169] fix letter case issue --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index c1f06027..25a2017a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -115,7 +115,7 @@ process { } // CALL_SNV_DEEPVARIANT withName: DEEPVARIANT { - ext.args = "--model_type=$params.analysis_type" + ext.args = { "--model_type=${params.analysis_type}.toUpperCase()" } ext.prefix = { "${meta.id}_deepvar" } publishDir = [ path: { "${params.outdir}/deepvariant" }, From 7eb5d40fbd9957ff003e99620722a99de2499003 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 14:55:32 +0100 Subject: [PATCH 0327/1169] rm comment --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0726b455..b8c841bc 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ The different steps and corresponding tools are represented in the flowchart bel ```console nextflow run nf-core/raredisease \ --input samplesheet.csv --genome GRCh38 \ - --analysis_type \ # wgs is default + --analysis_type \ -revision dev \ -profile ``` From 03f5bb939b99ad33ff0077cf6de663fcce67751d Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 15:15:52 +0100 Subject: [PATCH 0328/1169] final fix on character case --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 25a2017a..bd982791 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -115,7 +115,7 @@ process { } // CALL_SNV_DEEPVARIANT withName: DEEPVARIANT { - ext.args = { "--model_type=${params.analysis_type}.toUpperCase()" } + ext.args = { "--model_type=${params.analysis_type.toUpperCase()}" } ext.prefix = { "${meta.id}_deepvar" } publishDir = [ path: { "${params.outdir}/deepvariant" }, From fddc52bddb99f52feddc87bbf263018076be0934 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 15:21:32 +0100 Subject: [PATCH 0329/1169] woops merged the wrong branches --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2535fc8b..b8c841bc 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,9 @@ The nf-core/raredisease pipeline comes with documentation about the pipeline [us nf-core/raredisease was originally written by Clinical Genomics Stockholm. -Big thanks to the contributors for their extensive assistance in the development of this pipeline. +We thank the following people for their extensive assistance in the development of this pipeline: + + ## Contributions and Support From ebf0ec97d49637d83fce357bf345c838ddec743b Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 16 Mar 2022 15:23:40 +0100 Subject: [PATCH 0330/1169] final fix --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index b8c841bc..2535fc8b 100644 --- a/README.md +++ b/README.md @@ -76,9 +76,7 @@ The nf-core/raredisease pipeline comes with documentation about the pipeline [us nf-core/raredisease was originally written by Clinical Genomics Stockholm. -We thank the following people for their extensive assistance in the development of this pipeline: - - +Big thanks to the contributors for their extensive assistance in the development of this pipeline. ## Contributions and Support From eaac692054e2aabb31042d6c9805b23e593fc695 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 16 Mar 2022 15:25:24 +0100 Subject: [PATCH 0331/1169] update samplesheet check --- bin/check_samplesheet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 5473b624..bad81c36 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -180,7 +180,7 @@ def check_samplesheet(file_in, file_out): https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv """ - required_columns = {"sample", "fastq_1", "fastq_2"} + required_columns = {"sample", "lane", "fastq_1", "fastq_2", "gender", "phenotype", "paternal_id", "maternal_id", "case_id"} # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. with file_in.open(newline="") as in_handle: reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) From 1a9a359fab5ac8614371bd51d7fb8f7498b45406 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 16 Mar 2022 16:09:49 +0100 Subject: [PATCH 0332/1169] update files_unchanged --- .nf-core.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index 3805dc81..a6868bcb 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1 +1,10 @@ +lint: + files_unchanged: + - .github/CONTRIBUTING.md + - .github/ISSUE_TEMPLATE/bug_report.yml + - .github/PULL_REQUEST_TEMPLATE.md + - assets/multiqc_config.yaml + - .github/workflows/linting.yml + - .github/workflows/linting_comment.yml + - .github/workflows/branch.yml repository_type: pipeline From 2fd41e531f39b64f919ac4aa00fcb47452691030 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 16 Mar 2022 17:05:04 +0100 Subject: [PATCH 0333/1169] fix typo --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 451297e5..ea0052df 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -19,7 +19,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker` --outdir -stub`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir -stub`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. From 237dcd30939ffced84e3698268853dc8cc11f8d6 Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 17 Mar 2022 11:11:22 +0100 Subject: [PATCH 0334/1169] updates the usage.md file with info on samplesheet --- docs/usage.md | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 97588b8b..58903feb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -10,7 +10,7 @@ ## Samplesheet input -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. +You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 9 columns, and a header row as shown in the examples below. ```console --input '[path to samplesheet file]' @@ -18,37 +18,31 @@ You will need to create a samplesheet with information about the samples you wou ### Multiple runs of the same sample -The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: +The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will align the raw read/read-pairs independently before merging the alignments belonging to the same sample. Below is an example for a trio with the proband sequenced across 2 lanes: -```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz -``` - -### Full samplesheet - -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. - -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. + ```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, +sample,lane,fastq_1,fastq_2,gender,phenotype,paternal_id,maternal_id,case_id +AEG588A1,2,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1,2,AEG588A3,AEG588A2,fam_1 +AEG588A1,3,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,1,2,AEG588A3,AEG588A2,fam_1 +AEG588A2,4,AEG588A2_S1_L004_R1_001.fastq.gz,AEG588A2_S1_L004_R2_001.fastq.gz,2,1,,,fam_1 +AEG588A3,4,AEG588A3_S1_L004_R1_001.fastq.gz,AEG588A3_S1_L004_R2_001.fastq.gz,1,1,,,fam_1 ``` +The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information (sex/gender and phenotype) should be provided using the ped file format way of annotating. + | Column | Description | |----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `lane` | Used to generate seperate channels during the alignment step | | `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | | `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `gender` | Sex (1=male; 2=female; other=unknown) | +| `phenotype` | Affected status of patient (0 = missing; 1=unaffected; 2=affected) | +| `paternal_id` | Sample ID of the father, can be blank if the father isn't part of the analysis or for other samples than the proband. | +| `maternal_id` | Sample ID of the mother, can be blank if the mother isn't part of the analysis or for other samples than the proband. | +| `case_id` | Case ID, for the analysis used when generating a family VCF | An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. From e59b28ca6bb41081f20846b06751160416cce8e8 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Thu, 17 Mar 2022 14:28:23 +0100 Subject: [PATCH 0335/1169] edited local_genomes param --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index bc033c53..f0c820a9 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -137,8 +137,8 @@ "type": "string", "format": "directory-path", "fa_icon": "fas fa-map-marker-alt", - "description": "Local directory base for genomes references.", - "help_text": "All files are supposed to be in the same folder defining a flat structure" + "description": "Local directory base for genome references that map to the config.", + "help_text": "This folder is a flat structure with file names that map to the config." } } }, From 22ee70dcc1edaba578ae0bebd45e92a10de5bbd4 Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 17 Mar 2022 16:06:24 +0100 Subject: [PATCH 0336/1169] addressing comments from review --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 58903feb..8e441f73 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -30,7 +30,7 @@ AEG588A2,4,AEG588A2_S1_L004_R1_001.fastq.gz,AEG588A2_S1_L004_R2_001.fastq.gz,2,1 AEG588A3,4,AEG588A3_S1_L004_R1_001.fastq.gz,AEG588A3_S1_L004_R2_001.fastq.gz,1,1,,,fam_1 ``` -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information (sex/gender and phenotype) should be provided using the ped file format way of annotating. +The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information in the samplesheet (sex/gender and phenotype) should be provided as they would be for a [ped file](https://gatk.broadinstitute.org/hc/en-us/articles/360035531972-PED-Pedigree-format) (i.e. 1 for male, 2 for female, other for unknown). | Column | Description | |----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| From 7d5c0c5ba99edf0be8490d66ea09851a8fab6d3b Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Thu, 17 Mar 2022 16:14:17 +0100 Subject: [PATCH 0337/1169] steps --- README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e6173665..4ba4d920 100644 --- a/README.md +++ b/README.md @@ -27,11 +27,15 @@ On release, automated continuous integration tests run the pipeline on a full-si -1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) -2. Map reads to reference ([`BWA mem`](http://bio-bwa.sourceforge.net/bwa.shtml), `BWA mem2`) with the option to ([`merge`](http://www.htslib.org/doc/samtools-merge.html)) -3. Mark duplicated reads ([`GATK4 MarkDuplicates`](https://gatk.broadinstitute.org/hc/en-us/articles/360037052812-MarkDuplicates-Picard-)) -4. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) -5. Variant calling ([deepvariant](https://github.com/google/deepvariant) and [glnexus](https://github.com/dnanexus-rnd/GLnexus)) +1. Metrics: FastQC, MultiQC + +2. Data preprocessing: FastQC, bwamem2 (can merge), MarkDuplicates, + +3. Variant discovery: + +4. Annotation + aggregation: VCFanno, + +5. Variant ranking: The different steps and corresponding tools are represented in the flowchart below. Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). From f17a220a4deca592453a260e9935eb6131083a05 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 10:20:15 +0100 Subject: [PATCH 0338/1169] rm after spaces --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 4ba4d920..deb16aec 100644 --- a/README.md +++ b/README.md @@ -28,13 +28,9 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Metrics: FastQC, MultiQC - 2. Data preprocessing: FastQC, bwamem2 (can merge), MarkDuplicates, - 3. Variant discovery: - 4. Annotation + aggregation: VCFanno, - 5. Variant ranking: The different steps and corresponding tools are represented in the flowchart below. Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). From 59fb75757a0d50d04018b797101d73a731518037 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 10:24:27 +0100 Subject: [PATCH 0339/1169] added hyperlinks --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index deb16aec..fcccb4d7 100644 --- a/README.md +++ b/README.md @@ -27,10 +27,10 @@ On release, automated continuous integration tests run the pipeline on a full-si -1. Metrics: FastQC, MultiQC -2. Data preprocessing: FastQC, bwamem2 (can merge), MarkDuplicates, +1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) +2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), 3. Variant discovery: -4. Annotation + aggregation: VCFanno, +4. Annotation + aggregation: [`VCFanno`](https://github.com/brentp/vcfanno), 5. Variant ranking: The different steps and corresponding tools are represented in the flowchart below. Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). From 0e5f99041113e8bfe7ed8c5ab40d221be21122d0 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 10:32:56 +0100 Subject: [PATCH 0340/1169] sub-lists for snvs --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fcccb4d7..ff779449 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,11 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) 2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), -3. Variant discovery: -4. Annotation + aggregation: [`VCFanno`](https://github.com/brentp/vcfanno), +3. Variant calling + aggregation: + 1. SNVs: [`DeepVariant`](https://github.com/google/deepvariant) + 2. SVs: [`TIDDIT`](https://github.com/SciLifeLab/TIDDIT), +4. Annotation: + 1. SNVs: [`VCFanno`](https://github.com/brentp/vcfanno), 5. Variant ranking: The different steps and corresponding tools are represented in the flowchart below. Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). From 16cdf22540d32ee08074ed89e78b28612b6e1af6 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 11:06:46 +0100 Subject: [PATCH 0341/1169] separated pipeline summary --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ff779449..00be42f0 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,14 @@ On release, automated continuous integration tests run the pipeline on a full-si 2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), 3. Variant calling + aggregation: 1. SNVs: [`DeepVariant`](https://github.com/google/deepvariant) - 2. SVs: [`TIDDIT`](https://github.com/SciLifeLab/TIDDIT), -4. Annotation: - 1. SNVs: [`VCFanno`](https://github.com/brentp/vcfanno), + 2. SVs: [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), +4. Annotation: [`VCFanno`](https://github.com/brentp/vcfanno),[`VEP`](https://www.ensembl.org/info/docs/tools/vep/index.html) + 1. SNVs: + 2. SVs: + 3. Mitochondria: [`HmtNote`](https://github.com/robertopreste/HmtNote) + +>Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) + 5. Variant ranking: The different steps and corresponding tools are represented in the flowchart below. Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). From 627ac1c5164a2269865108e599d15d374590c221 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 11:07:05 +0100 Subject: [PATCH 0342/1169] rm todo line --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 00be42f0..e5401552 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,6 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Pipeline summary - - 1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) 2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), 3. Variant calling + aggregation: From ae965b4802d56e5b0d223fd1029b65973d5517c7 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 11:08:14 +0100 Subject: [PATCH 0343/1169] fix format --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e5401552..c7db1fde 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ On release, automated continuous integration tests run the pipeline on a full-si 2. SVs: 3. Mitochondria: [`HmtNote`](https://github.com/robertopreste/HmtNote) ->Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) +> Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) 5. Variant ranking: From 8c547ed1b1373273dba0a21e2ab6eedd67db7c03 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 11:11:30 +0100 Subject: [PATCH 0344/1169] added more sv tools --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c7db1fde..89a256f1 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) 2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), -3. Variant calling + aggregation: +3. Variant calling + multiple calls are aggregated: 1. SNVs: [`DeepVariant`](https://github.com/google/deepvariant) - 2. SVs: [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), + 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), 4. Annotation: [`VCFanno`](https://github.com/brentp/vcfanno),[`VEP`](https://www.ensembl.org/info/docs/tools/vep/index.html) 1. SNVs: 2. SVs: From ce9aff0b65d3ed4e10050fbd9ae330252288f69b Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 11:13:15 +0100 Subject: [PATCH 0345/1169] fix lint --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 89a256f1..6d334540 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,9 @@ On release, automated continuous integration tests run the pipeline on a full-si 2. SVs: 3. Mitochondria: [`HmtNote`](https://github.com/robertopreste/HmtNote) -> Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) +5. Variant ranking: something will be here -5. Variant ranking: +> Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) The different steps and corresponding tools are represented in the flowchart below. Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). From 897fe0f0b722a4285bb9609ee313650509d5b747 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 15:22:40 +0100 Subject: [PATCH 0346/1169] applying suggestions --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6d334540..a9698e43 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,16 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Pipeline summary 1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) -2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), +2. Data preprocessing: [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), + 1. [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), 3. Variant calling + multiple calls are aggregated: 1. SNVs: [`DeepVariant`](https://github.com/google/deepvariant) 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), + 3. Mitochondria: [`Mutect2`](https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2) 4. Annotation: [`VCFanno`](https://github.com/brentp/vcfanno),[`VEP`](https://www.ensembl.org/info/docs/tools/vep/index.html) 1. SNVs: 2. SVs: - 3. Mitochondria: [`HmtNote`](https://github.com/robertopreste/HmtNote) - + 3. Mitochondria: [`HmtNote`](https://github.com/robertopreste/HmtNote), [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), 5. Variant ranking: something will be here > Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) From ec6c3b11a6bb9b698a487d2d460e5a26b5b69cd5 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 15:25:26 +0100 Subject: [PATCH 0347/1169] applying suggestions v2 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a9698e43..50fdf148 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,9 @@ On release, automated continuous integration tests run the pipeline on a full-si 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), 3. Mitochondria: [`Mutect2`](https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2) 4. Annotation: [`VCFanno`](https://github.com/brentp/vcfanno),[`VEP`](https://www.ensembl.org/info/docs/tools/vep/index.html) - 1. SNVs: + 1. SNVs: [`CADD`](https://cadd.gs.washington.edu/) 2. SVs: - 3. Mitochondria: [`HmtNote`](https://github.com/robertopreste/HmtNote), [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), + 3. Mitochondria: [`HmtNote`](https://github.com/robertopreste/HmtNote), [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), [`gnomAD_mt`](https://gnomad.broadinstitute.org/downloads#v3-mitochondrial-dna) 5. Variant ranking: something will be here > Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) From c3425958262274b540f8ab989395f0af0b9dc61c Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 15:26:52 +0100 Subject: [PATCH 0348/1169] reformat --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 50fdf148..afaeec6e 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Pipeline summary 1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) -2. Data preprocessing: [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), - 1. [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), +2. Data preprocessing: [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), 3. Variant calling + multiple calls are aggregated: 1. SNVs: [`DeepVariant`](https://github.com/google/deepvariant) 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), From 37ac4cd90036c830c3591511004ad3c37f1934b1 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Fri, 18 Mar 2022 16:42:20 +0100 Subject: [PATCH 0349/1169] using publish_dir_mode param --- conf/modules.config | 46 ++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f27c5149..50f53e4d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -31,7 +31,7 @@ process { withName: BWAMEM2_INDEX { publishDir = [ path: { "${params.outdir}/references" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference, pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" @@ -40,7 +40,7 @@ process { withName: SAMTOOLS_FAIDX { publishDir = [ path: { "${params.outdir}/references" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference, pattern: "*fai" @@ -74,21 +74,21 @@ process { ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ path: { "${params.outdir}/processed_references" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: TABIX_PV { publishDir = [ path: { "${params.outdir}/processed_references" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: 'TABIX_PT|TABIX_PBT' { publishDir = [ path: { "${params.outdir}/processed_references" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -96,7 +96,7 @@ process { ext.prefix = { "${meta.id}_target" } publishDir = [ path: { "${params.outdir}/processed_references" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -109,7 +109,7 @@ process { withName: 'CAT_CAT_BAIT' { publishDir = [ path: { "${params.outdir}/processed_references" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -119,7 +119,7 @@ process { ext.prefix = { "${meta.id}_deepvar" } publishDir = [ path: { "${params.outdir}/deepvariant" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -134,7 +134,7 @@ process { ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ path: { "${params.outdir}/glnexus" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -147,7 +147,7 @@ process { withName: TABIX_GL { publishDir = [ path: { "${params.outdir}/glnexus" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -155,7 +155,7 @@ process { withName: EXPANSIONHUNTER { publishDir = [ path: { "${params.outdir}/expansionhunter" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } @@ -163,7 +163,7 @@ process { withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA" { publishDir = [ path: { "${params.outdir}/sv_caller" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } @@ -171,7 +171,7 @@ process { ext.args = '-p 6' publishDir = [ path: { "${params.outdir}/sv_caller" }, - mode: 'copy', + mode: params.publish_dir_mode, ] } withName: SVDB_MERGE_TIDDIT { @@ -179,7 +179,7 @@ process { ext.prefix = 'tiddit' publishDir = [ path: { "${params.outdir}/sv_caller" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } @@ -187,7 +187,7 @@ process { ext.args = '--pass_only' publishDir = [ path: { "${params.outdir}/sv_caller" }, - mode: 'copy', + mode: params.publish_dir_mode, ] } // NF-CORE Subworkflows @@ -208,7 +208,7 @@ process { withName: SAMTOOLS_INDEX_MD { publishDir = [ path: { "${params.outdir}/markduplicates" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -216,7 +216,7 @@ process { ext.args = '-s --remove-overlaps' publishDir = [ path: { "${params.outdir}/samtools" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } @@ -230,7 +230,7 @@ process { ext.prefix = { "${meta.id}_sorted_md" } publishDir = [ path: { "${params.outdir}/markduplicates" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -238,7 +238,7 @@ process { withName: "VCFANNO" { publishDir = [ path: { "${params.outdir}/variant_annotation" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } @@ -246,7 +246,7 @@ process { withName: '.*COLLECTMULTIPLEMETRICS' { publishDir = [ path: { "${params.outdir}/bamqc_collectmultiplemetrics" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } @@ -260,7 +260,7 @@ process { ext.args = '-z 500 -w -u' publishDir = [ path: { "${params.outdir}/tiddit_coverage" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } @@ -268,7 +268,7 @@ process { ext.args = '-clip' publishDir = [ path: { "${params.outdir}/tiddit_coverage" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } @@ -276,7 +276,7 @@ process { ext.args = '--d4' publishDir = [ path: { "${params.outdir}/mosdepth" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } From da8c2f5eccc2aa2c715909f6de17ae88f1da7772 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 20 Mar 2022 01:56:07 +0100 Subject: [PATCH 0350/1169] align --- subworkflows/local/input_check.nf | 27 ++++---- subworkflows/local/prepare_bed.nf | 8 +-- subworkflows/local/prepare_genome.nf | 13 ++-- subworkflows/local/prepare_vcf.nf | 61 ++++++++--------- subworkflows/nf-core/align_bwamem2.nf | 10 +-- subworkflows/nf-core/call_snv_deepvariant.nf | 20 +++--- .../call_structural_variants.nf | 12 ++-- .../{local => nf-core}/call_sv_manta.nf | 14 ++-- .../{local => nf-core}/call_sv_tiddit.nf | 13 ++-- workflows/raredisease.nf | 65 +++++++++++-------- 10 files changed, 128 insertions(+), 115 deletions(-) rename subworkflows/{local => nf-core}/call_structural_variants.nf (84%) rename subworkflows/{local => nf-core}/call_sv_manta.nf (83%) rename subworkflows/{local => nf-core}/call_sv_tiddit.nf (70%) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index c2cfb53f..28e63db9 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -6,25 +6,24 @@ include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow INPUT_CHECK { take: - samplesheet // file: /path/to/samplesheet.csv + samplesheet // file: /path/to/samplesheet.csv main: - SAMPLESHEET_CHECK ( samplesheet ) - .csv - .splitCsv ( header:true, sep:',' ) - .set { sheet } + SAMPLESHEET_CHECK ( samplesheet ) + .csv + .splitCsv ( header:true, sep:',' ) + .set { sheet } - ch_case_info = sheet.first() - .map { create_case_channel(it) } - reads = sheet.map { create_fastq_channel(it) } - samples = sheet.map { create_samples_channel(it) } + ch_case_info = sheet.first() + .map { create_case_channel(it) } + reads = sheet.map { create_fastq_channel(it) } + samples = sheet.map { create_samples_channel(it) } emit: - ch_case_info // channel: [ case_id ] - reads // channel: [ val(meta), [ reads ] ] - samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] - - versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] + ch_case_info // channel: [ case_id ] + reads // channel: [ val(meta), [ reads ] ] + samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index c706f50d..4eacc031 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -3,9 +3,9 @@ // include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/modules/gatk4/bedtointervallist/main' -include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/modules/gatk4/intervallisttools/main' -include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/modules/tabix/tabix/main' -include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/modules/tabix/bgziptabix/main' +include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/modules/gatk4/intervallisttools/main' +include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/modules/tabix/tabix/main' +include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/modules/tabix/bgziptabix/main' workflow CHECK_BED { take: @@ -31,7 +31,7 @@ workflow CHECK_BED { } emit: - bed = tab_out + bed = tab_out target_intervals = interval_list.collect{it[1]} bait_intervals = GATK_ILT.out.interval_list.collect{it[1]} } diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 2477325d..9fc44a1c 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -2,13 +2,11 @@ // Prepare reference genome files // -include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/modules/untar/main' - -include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' - -include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD} from '../../modules/nf-core/modules/gatk4/createsequencedictionary/main' -include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' +include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/modules/untar/main' +include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' +include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/modules/gatk4/createsequencedictionary/main' +include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' workflow PREPARE_GENOME { take: @@ -69,6 +67,5 @@ workflow PREPARE_GENOME { sequence_dict = ch_sequence_dict variant_catalog = ch_variant_catalog // path: variant_catalog.json vcfanno_resources = ch_vcfanno_resources // channel: [ untar'd files, ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index 0fc8471a..895cefcc 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -3,41 +3,42 @@ // include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_PV } from '../../modules/nf-core/modules/bcftools/norm/main' -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_PV } from '../../modules/nf-core/modules/bcftools/norm/main' -include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' -include { TABIX_TABIX as TABIX_PV } from '../../modules/nf-core/modules/tabix/tabix/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_PV } from '../../modules/nf-core/modules/bcftools/norm/main' +include { TABIX_TABIX as TABIX_PV } from '../../modules/nf-core/modules/tabix/tabix/main' +include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' workflow CHECK_VCF { take: - vcf // file: vcf file - fasta // path(fasta) + vcf // file: vcf file + fasta // path(fasta) main: - vcf_file = file(vcf) - CHECK_INPUT_VCF( vcf_file ) - .splitCsv( header:true ) - .map { row -> - def id = "${row.id}" - def filepath = "${row.filepath}" - def processed = "${row.processed}" - tuple(id,filepath,processed) - } - .branch { id, filepath, processed -> - processed: processed == 'yes' - return [['id':id],filepath] - unprocessed: processed == 'no' - return [['id':id],filepath] - } - .set { ch_vcfs_norm } - - SPLIT_MULTIALLELICS_PV (ch_vcfs_norm.unprocessed, fasta) - - REMOVE_DUPLICATES_PV (SPLIT_MULTIALLELICS_PV.out.vcf, fasta).vcf - .set { ch_vcfs_rmdup } - - vcf_out = ch_vcfs_rmdup.mix( ch_vcfs_norm.processed ) - - TABIX_PV (vcf_out) + vcf_file = file(vcf) + CHECK_INPUT_VCF( vcf_file ) + .splitCsv( header:true ) + .map { row -> + def id = "${row.id}" + def filepath = "${row.filepath}" + def processed = "${row.processed}" + tuple(id,filepath,processed) + } + .branch { id, filepath, processed -> + processed: processed == 'yes' + return [['id':id],filepath] + unprocessed: processed == 'no' + return [['id':id],filepath] + } + .set { ch_vcfs_norm } + + SPLIT_MULTIALLELICS_PV (ch_vcfs_norm.unprocessed, fasta) + + REMOVE_DUPLICATES_PV (SPLIT_MULTIALLELICS_PV.out.vcf, fasta) + .vcf + .set { ch_vcfs_rmdup } + + vcf_out = ch_vcfs_rmdup.mix( ch_vcfs_norm.processed ) + + TABIX_PV (vcf_out) emit: vcf = vcf_out // path: normalized_vcf diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index 98cfec62..e99c3575 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -2,11 +2,11 @@ // Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // -include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' -include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' +include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' +include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' diff --git a/subworkflows/nf-core/call_snv_deepvariant.nf b/subworkflows/nf-core/call_snv_deepvariant.nf index efcbd495..e6ec6c4b 100644 --- a/subworkflows/nf-core/call_snv_deepvariant.nf +++ b/subworkflows/nf-core/call_snv_deepvariant.nf @@ -3,17 +3,17 @@ // include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_GL } from '../../modules/nf-core/modules/bcftools/norm/main' -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../modules/nf-core/modules/bcftools/norm/main' -include { DEEPVARIANT } from '../../modules/nf-core/modules/deepvariant/main' -include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' -include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/modules/tabix/tabix/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../modules/nf-core/modules/bcftools/norm/main' +include { DEEPVARIANT } from '../../modules/nf-core/modules/deepvariant/main' +include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' +include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/modules/tabix/tabix/main' workflow CALL_SNV_DEEPVARIANT { take: bam // channel: [ val(meta), path(bam), path(bai) ] fasta // path(fasta) fai // path(fai) - ch_case_info // channel: [ case_id ] + case_info // channel: [ case_id ] main: ch_versions = Channel.empty() @@ -23,14 +23,17 @@ workflow CALL_SNV_DEEPVARIANT { .set { ch_bam } DEEPVARIANT ( ch_bam, fasta, fai ) - DEEPVARIANT.out.gvcf.collect{it[1]} + DEEPVARIANT.out + .gvcf + .collect{it[1]} .toList() .set { file_list } ch_versions = ch_versions.mix(DEEPVARIANT.out.versions) - //Combine case meta with the list of gvcfs - ch_case_info.combine(file_list) + case_info + .combine(file_list) .set { ch_gvcfs } + GLNEXUS ( ch_gvcfs ) ch_versions = ch_versions.mix(GLNEXUS.out.versions) @@ -44,6 +47,5 @@ workflow CALL_SNV_DEEPVARIANT { emit: vcf = REMOVE_DUPLICATES_GL.out.vcf tabix = TABIX_GL.out.tbi - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf similarity index 84% rename from subworkflows/local/call_structural_variants.nf rename to subworkflows/nf-core/call_structural_variants.nf index ae24e21f..d781d04f 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -2,11 +2,9 @@ // A nested subworkflow to call structural variants. // -include { CALL_SV_MANTA } from './call_sv_manta' - +include { CALL_SV_MANTA } from './call_sv_manta' include { CALL_SV_TIDDIT } from './call_sv_tiddit' - -include { SVDB_MERGE } from '../../modules/nf-core/modules/svdb/merge/main' +include { SVDB_MERGE } from '../../modules/nf-core/modules/svdb/merge/main' workflow CALL_STRUCTURAL_VARIANTS { @@ -22,13 +20,15 @@ workflow CALL_STRUCTURAL_VARIANTS { ch_versions = Channel.empty() //manta - CALL_SV_MANTA ( bam, bai, fasta, fai, case_info, target_bed ).diploid_sv_vcf + CALL_SV_MANTA ( bam, bai, fasta, fai, case_info, target_bed ) + .diploid_sv_vcf .collect{it[1]} .set{ manta_vcf } ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) //tiddit - CALL_SV_TIDDIT ( bam, fasta, fai, case_info ).vcf + CALL_SV_TIDDIT ( bam, fasta, fai, case_info ) + .vcf .collect{it[1]} .set { tiddit_vcf } ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) diff --git a/subworkflows/local/call_sv_manta.nf b/subworkflows/nf-core/call_sv_manta.nf similarity index 83% rename from subworkflows/local/call_sv_manta.nf rename to subworkflows/nf-core/call_sv_manta.nf index 76460fa4..24e0a7eb 100644 --- a/subworkflows/local/call_sv_manta.nf +++ b/subworkflows/nf-core/call_sv_manta.nf @@ -10,8 +10,8 @@ workflow CALL_SV_MANTA { bai // channel: [ val(meta), path(bai) ] fasta // path(fasta) fai // path(fai) - ch_case_info // channel: [ case_id ] - ch_bed // channel: [ val(meta), path(bed), path(bed_tbi) ] + case_info // channel: [ case_id ] + bed // channel: [ val(meta), path(bed), path(bed_tbi) ] main: bam.collect{it[1]} @@ -22,13 +22,15 @@ workflow CALL_SV_MANTA { .toList() .set { bai_file_list } - ch_case_info.combine(bam_file_list) + case_info.combine(bam_file_list) .combine(bai_file_list) .set { manta_input_bams } - bed_input = ch_bed.map{ id, bed, index -> - return [bed, index] - } + bed + .map { + id, bed_file, index -> + return [bed_file, index]} + .set { bed_input } if (params.analysis_type == "WGS") { MANTA ( manta_input_bams, fasta, fai, [[],[]] ) diff --git a/subworkflows/local/call_sv_tiddit.nf b/subworkflows/nf-core/call_sv_tiddit.nf similarity index 70% rename from subworkflows/local/call_sv_tiddit.nf rename to subworkflows/nf-core/call_sv_tiddit.nf index 6d234d3b..de89e2d8 100644 --- a/subworkflows/local/call_sv_tiddit.nf +++ b/subworkflows/nf-core/call_sv_tiddit.nf @@ -11,23 +11,26 @@ workflow CALL_SV_TIDDIT { bam // channel: [ val(meta), path(bam) ] fasta // path(fasta) fai // path(fai) - ch_case_info // channel: [ case_id ] + case_info // channel: [ case_id ] main: TIDDIT_SV ( bam, fasta, fai ) ch_versions = TIDDIT_SV.out.versions - TIDDIT_SV.out.vcf.collect{it[1]} + TIDDIT_SV.out + .vcf + .collect{it[1]} .toList() .set { vcf_file_list } - ch_case_info.combine(vcf_file_list) + case_info + .combine(vcf_file_list) .set { merge_input_vcfs } SVDB_MERGE_TIDDIT ( merge_input_vcfs, [] ) ch_versions = ch_versions.mix(SVDB_MERGE_TIDDIT.out.versions) emit: - vcf = SVDB_MERGE_TIDDIT.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf = SVDB_MERGE_TIDDIT.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 25b208dd..5c555fd0 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -11,8 +11,12 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ - params.input, params.multiqc_config, params.fasta, - params.bwamem2_index, params.fasta_fai, params.gnomad, + params.bwamem2_index, + params.fasta, + params.fasta_fai, + params.gnomad, + params.input, + params.multiqc_config, params.vcfanno_resources ] @@ -39,9 +43,11 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { INPUT_CHECK } from '../subworkflows/local/input_check' -include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' -include { CHECK_BED } from '../subworkflows/local/prepare_bed' +include { INPUT_CHECK } from '../subworkflows/local/input_check' +include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' +include { CHECK_BED } from '../subworkflows/local/prepare_bed' +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -61,19 +67,13 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' -include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' - -include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' -// -// SUBWORKFLOW: Consists of mix/local modules -// - -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' +include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' +include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' +include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' +include { QC_BAM } from '../subworkflows/nf-core/qc_bam' +include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' +include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/local/call_structural_variants' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -103,14 +103,19 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(FASTQC.out.versions.first()) // STEP 0: PREPARE GENOME REFERENCES AND INDICES. - PREPARE_GENOME ( params.fasta, params.variant_catalog ) + PREPARE_GENOME ( + params.fasta, + params.variant_catalog + ) ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) ch_gnomad = Channel.empty() if (params.gnomad) { CHECK_VCF( - params.gnomad, PREPARE_GENOME.out.fasta, - ).set { ch_gnomad } + params.gnomad, + PREPARE_GENOME.out.fasta + ) + .set { ch_gnomad } } ch_target_bed = Channel.empty() @@ -118,7 +123,8 @@ workflow RAREDISEASE { CHECK_BED( params.target_bed, PREPARE_GENOME.out.sequence_dict - ).set { ch_target_bed } + ) + .set { ch_target_bed } } // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. @@ -130,8 +136,7 @@ workflow RAREDISEASE { ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai - - ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) + ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) } // STEP 1.5: BAM QUALITY CHECK @@ -148,10 +153,10 @@ workflow RAREDISEASE { // STEP 1.6: EXPANSIONHUNTER CALL_REPEAT_EXPANSIONS ( - ch_marked_bam.join(ch_marked_bai, by: [0]), - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.variant_catalog - ) + ch_marked_bam.join(ch_marked_bai, by: [0]), + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.variant_catalog + ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 2: VARIANT CALLING @@ -177,7 +182,11 @@ workflow RAREDISEASE { // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) - ANNOTATE_VCFANNO ( params.vcfanno_toml, ch_dv_vcf, PREPARE_GENOME.out.vcfanno_resources ) + ANNOTATE_VCFANNO ( + params.vcfanno_toml, + ch_dv_vcf, + PREPARE_GENOME.out.vcfanno_resources + ) ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) // From 80566a279c34a31ffe7fb58c42d200aff6867052 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 20 Mar 2022 15:16:27 +0100 Subject: [PATCH 0351/1169] fix typo --- subworkflows/nf-core/call_sv_manta.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/call_sv_manta.nf b/subworkflows/nf-core/call_sv_manta.nf index 24e0a7eb..fed96edc 100644 --- a/subworkflows/nf-core/call_sv_manta.nf +++ b/subworkflows/nf-core/call_sv_manta.nf @@ -35,7 +35,7 @@ workflow CALL_SV_MANTA { if (params.analysis_type == "WGS") { MANTA ( manta_input_bams, fasta, fai, [[],[]] ) } else { - ch_target_bed = ch_bed.ifEmpty([[],[]]) + ch_target_bed = bed.ifEmpty([[],[]]) MANTA ( manta_input_bams, fasta, fai, bed_input ) } ch_versions = MANTA.out.versions From 560506fb888aaab5dfcbb5ff41310c03775af302 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 20 Mar 2022 15:29:43 +0100 Subject: [PATCH 0352/1169] rename ch_case_info to case_info --- subworkflows/local/input_check.nf | 4 ++-- workflows/raredisease.nf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 28e63db9..4110e2da 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -14,13 +14,13 @@ workflow INPUT_CHECK { .splitCsv ( header:true, sep:',' ) .set { sheet } - ch_case_info = sheet.first() + case_info = sheet.first() .map { create_case_channel(it) } reads = sheet.map { create_fastq_channel(it) } samples = sheet.map { create_samples_channel(it) } emit: - ch_case_info // channel: [ case_id ] + case_info // channel: [ case_id ] reads // channel: [ val(meta), [ reads ] ] samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5c555fd0..dd4e445f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -165,7 +165,7 @@ workflow RAREDISEASE { ch_marked_bam.join(ch_marked_bai, by: [0]), PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, - INPUT_CHECK.out.ch_case_info + INPUT_CHECK.out.case_info ) ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) @@ -174,7 +174,7 @@ workflow RAREDISEASE { ch_marked_bai, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, - INPUT_CHECK.out.ch_case_info, + INPUT_CHECK.out.case_info, ch_target_bed.bed ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) From 4bf883ddae77f512fbda79fe286b64f23ad60253 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Mar 2022 08:54:04 +0100 Subject: [PATCH 0353/1169] update config --- conf/genomes.config | 2 +- conf/test.config | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 6c60010b..ea529e63 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -15,7 +15,7 @@ params { fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" - svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" + svdb_query_dbs = "" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" diff --git a/conf/test.config b/conf/test.config index 05de6892..6355730a 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,9 +26,6 @@ params { // Genome references fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' - // Structural variant annotation databases - svdb_query_dbs = "" - // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' From eb8487bdfc87c2609aeb3537bdf185356b225bdd Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Mar 2022 10:54:47 +0100 Subject: [PATCH 0354/1169] switch local module to nf-core --- modules.json | 3 +++ .../{local => nf-core/modules}/svdb/query/main.nf | 2 ++ .../{local => nf-core/modules}/svdb/query/meta.yml | 14 +++++++++++++- subworkflows/local/annotate_structural_variants.nf | 4 +--- 4 files changed, 19 insertions(+), 4 deletions(-) rename modules/{local => nf-core/modules}/svdb/query/main.nf (99%) rename modules/{local => nf-core/modules}/svdb/query/meta.yml (74%) diff --git a/modules.json b/modules.json index de283387..d37cbe7b 100644 --- a/modules.json +++ b/modules.json @@ -81,6 +81,9 @@ "svdb/merge": { "git_sha": "ee915a43e405324e62ee5d4c14a6a6ec6c610058" }, + "svdb/query": { + "git_sha": "5297d27fbf50b7aa5a37cce9b85c7aac3ff7c4ff" + }, "tabix/bgziptabix": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, diff --git a/modules/local/svdb/query/main.nf b/modules/nf-core/modules/svdb/query/main.nf similarity index 99% rename from modules/local/svdb/query/main.nf rename to modules/nf-core/modules/svdb/query/main.nf index 07e40ad6..37ce432c 100644 --- a/modules/local/svdb/query/main.nf +++ b/modules/nf-core/modules/svdb/query/main.nf @@ -53,6 +53,7 @@ process SVDB_QUERY { --db ${vcf_dbs.join(',')} \\ --query_vcf $vcf \\ --prefix ${prefix} + cat <<-END_VERSIONS > versions.yml "${task.process}": svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) @@ -63,6 +64,7 @@ process SVDB_QUERY { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_query.vcf + cat <<-END_VERSIONS > versions.yml "${task.process}": svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) diff --git a/modules/local/svdb/query/meta.yml b/modules/nf-core/modules/svdb/query/meta.yml similarity index 74% rename from modules/local/svdb/query/meta.yml rename to modules/nf-core/modules/svdb/query/meta.yml index e2a9e456..57e67e15 100644 --- a/modules/local/svdb/query/meta.yml +++ b/modules/nf-core/modules/svdb/query/meta.yml @@ -15,6 +15,12 @@ input: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - in_occs: + type: list + description: A list of allele count tags + - in_frqs: + type: list + description: A list of allele frequency tags - vcf: type: file description: query vcf file @@ -34,10 +40,16 @@ output: type: file description: File containing software versions pattern: "versions.yml" + - out_occs: + type: list + description: A list of allele count tags + - out_frqs: + type: list + description: A list of allele frequency tags - vcf: type: file description: Annotated output VCF file - pattern: "*_ann_svdbq.vcf" + pattern: "*_query.vcf" authors: - "@ramprasadn" diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 9e4da7b5..66a12509 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -2,9 +2,7 @@ // A subworkflow to annotate structural variants. // -include { SVDB_QUERY } from '../../modules/local/svdb/query/main' - - +include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { From 665b3d61d2f68ef983f8cbaa6e5586eedebf5fac Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 21 Mar 2022 11:34:33 +0100 Subject: [PATCH 0355/1169] input opt to required opt --- nextflow.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 57526235..969fa086 100644 --- a/nextflow.config +++ b/nextflow.config @@ -9,8 +9,9 @@ // Global default params, used in configs params { - // Input options + // Required options input = null + outdir = null // References genome = null @@ -31,7 +32,6 @@ params { max_multiqc_email_size = '25.MB' // Boilerplate options - outdir = null tracedir = "${params.outdir}/pipeline_info" publish_dir_mode = 'copy' email = null From d481b10b95cb909b89211ff367b3224cb3c5733a Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Mon, 21 Mar 2022 11:35:12 +0100 Subject: [PATCH 0356/1169] Include stranger into the workflow --- conf/modules.config | 9 +++++++++ subworkflows/nf-core/call_repeat_expansions.nf | 8 ++++++-- workflows/raredisease.nf | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 50f53e4d..7d662d7a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -159,6 +159,15 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + // ANNOTATE CALLED REPEAT EXPANSIONS + withName: STRANGER { + ext.args = "--repeats-file ${params.variant_catalog}" + publishDir = [ + path: { "${params.outdir}/stranger" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } // CALL_STRUCTURAL_VARIANTS withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA" { publishDir = [ diff --git a/subworkflows/nf-core/call_repeat_expansions.nf b/subworkflows/nf-core/call_repeat_expansions.nf index 936340f5..1a1f45f2 100644 --- a/subworkflows/nf-core/call_repeat_expansions.nf +++ b/subworkflows/nf-core/call_repeat_expansions.nf @@ -1,8 +1,9 @@ // -// Run ExpansionHunter +// Run ExpansionHunter and Stranger // include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/main' +include { STRANGER } from '../../modules/nf-core/modules/stranger/main' workflow CALL_REPEAT_EXPANSIONS { take: @@ -16,7 +17,10 @@ workflow CALL_REPEAT_EXPANSIONS { EXPANSIONHUNTER( bam, fasta, variant_catalog ) ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) + STRANGER ( EXPANSIONHUNTER.out.vcf ) + ch_versions = ch_versions.mix(STRANGER.out.versions) + emit: - vcf = EXPANSIONHUNTER.out.vcf // channel: [ val(meta), path(*.vcf) ] + vcf = STRANGER.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 25b208dd..df613124 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -146,7 +146,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) - // STEP 1.6: EXPANSIONHUNTER + // STEP 1.6: EXPANSIONHUNTER AND STRANGER CALL_REPEAT_EXPANSIONS ( ch_marked_bam.join(ch_marked_bai, by: [0]), PREPARE_GENOME.out.fasta, From 83a8497fbd2bb3dc4c9b5df42263d3b5521b3452 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 21 Mar 2022 15:34:07 +0100 Subject: [PATCH 0357/1169] align subwkflw --- subworkflows/nf-core/align.nf | 33 +++++++++++++++++++++++++++++++++ workflows/raredisease.nf | 16 +++++++++------- 2 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 subworkflows/nf-core/align.nf diff --git a/subworkflows/nf-core/align.nf b/subworkflows/nf-core/align.nf new file mode 100644 index 00000000..366a7868 --- /dev/null +++ b/subworkflows/nf-core/align.nf @@ -0,0 +1,33 @@ +// +// Map to reference +// + +include { ALIGN_BWAMEM2 } from './align_bwamem2' + +workflow ALIGN { + take: + aligner // string: params.aligner + reads_input // channel: [ val(meta), reads_input ] + index // channel: [ /path/to/bwamem2/index/ ] + + main: + ch_versions = Channel.empty() + + //bwamem2 + ALIGN_BWAMEM2 ( reads_input, index ) + + if( aligner == "bwamem2" ) { + ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam + ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai + } else { + exit 1, 'Please provide a valid aligner!' + } + + ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) + + emit: + marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bam ] ] + marked_bai = ch_marked_bai // channel: [ val(meta), [ marked_bai ] ] + + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3c31908c..92056ac9 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -61,7 +61,7 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' +include { ALIGN } from '../subworkflows/nf-core/align' include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' include { QC_BAM } from '../subworkflows/nf-core/qc_bam' @@ -122,15 +122,17 @@ workflow RAREDISEASE { } // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. - ALIGN_BWAMEM2 ( + ALIGN ( + params.aligner, INPUT_CHECK.out.reads, PREPARE_GENOME.out.bwamem2_index ) - ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam - ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai + ch_marked_bam = ALIGN.out.marked_bam + ch_marked_bai = ALIGN.out.marked_bai + ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) - ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) + ch_versions = ch_versions.mix(ALIGN.out.versions) // STEP 1.5: BAM QUALITY CHECK QC_BAM ( @@ -146,7 +148,7 @@ workflow RAREDISEASE { // STEP 1.6: EXPANSIONHUNTER CALL_REPEAT_EXPANSIONS ( - ch_marked_bam.join(ch_marked_bai, by: [0]), + ch_bam_bai, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.variant_catalog ) @@ -155,7 +157,7 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV_DEEPVARIANT ( - ch_marked_bam.join(ch_marked_bai, by: [0]), + ch_bam_bai, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, INPUT_CHECK.out.ch_case_info From 9f1ec3eaea65b611a0221d22165b9b0081506958 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Mar 2022 20:57:15 +0100 Subject: [PATCH 0358/1169] fix config --- conf/genomes.config | 2 +- workflows/raredisease.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index ea529e63..6c60010b 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -15,7 +15,7 @@ params { fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" - svdb_query_dbs = "" + svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f405d046..196ae0b3 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -142,8 +142,8 @@ workflow RAREDISEASE { ch_marked_bai, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.fai, - CHECK_BED.out.bait_intervals, - CHECK_BED.out.target_intervals, + ch_target_bed.bait_intervals, + ch_target_bed.target_intervals, PREPARE_GENOME.out.chrom_sizes ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) From bcf353892bfceef09c1e5ab33a2fdc9bd2b02a4f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Mar 2022 22:35:56 +0100 Subject: [PATCH 0359/1169] create references in a separate subworkflow --- subworkflows/local/check_input.nf | 74 ++++++++++++++++++++++++ subworkflows/local/prepare_genome.nf | 2 +- subworkflows/local/prepare_references.nf | 70 ++++++++++++++++++++++ subworkflows/nf-core/qc_bam.nf | 13 ++--- workflows/raredisease.nf | 72 ++++++++--------------- 5 files changed, 175 insertions(+), 56 deletions(-) create mode 100644 subworkflows/local/check_input.nf create mode 100644 subworkflows/local/prepare_references.nf diff --git a/subworkflows/local/check_input.nf b/subworkflows/local/check_input.nf new file mode 100644 index 00000000..334ab1df --- /dev/null +++ b/subworkflows/local/check_input.nf @@ -0,0 +1,74 @@ +// +// Check input samplesheet and get read, sample, and case channels +// + +include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' + +workflow CHECK_INPUT { + take: + samplesheet // file: /path/to/samplesheet.csv + + main: + SAMPLESHEET_CHECK ( samplesheet ) + .csv + .splitCsv ( header:true, sep:',' ) + .set { sheet } + + case_info = sheet.first() + .map { create_case_channel(it) } + reads = sheet.map { create_fastq_channel(it) } + samples = sheet.map { create_samples_channel(it) } + + emit: + case_info // channel: [ case_id ] + reads // channel: [ val(meta), [ reads ] ] + samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] +} + +// Function to get list of [ meta, [ fastq_1, fastq_2 ] ] +def create_fastq_channel(LinkedHashMap row) { + // create meta map + def meta = [:] + meta.id = row.sample + meta.single_end = row.single_end.toBoolean() + //TODO: think about adding LB and PU, make sure only illumina will be used, ID can also contain a flowcell id + meta.read_group = "\'@RG\\tID:"+ row.fastq_1.split('/')[-1] + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" + + + // add path(s) of the fastq file(s) to the meta map + def fastq_meta = [] + if (!file(row.fastq_1).exists()) { + exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" + } + if (meta.single_end) { + fastq_meta = [ meta, [ file(row.fastq_1) ] ] + } else { + if (!file(row.fastq_2).exists()) { + exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" + } + fastq_meta = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] + } + return fastq_meta +} + +// Function to get a list of metadata (e.g. pedigree, case id) from the sample; [ meta ] +def create_samples_channel(LinkedHashMap row) { + def sample = [:] + sample.id = row.sample + sample.gender = row.gender + sample.phenotype = row.phenotype + sample.maternal = row.maternal_id + sample.paternal = row.paternal_id + sample.case_id = row.case_id + + return sample +} + +// Function to get a list of metadata (e.g. case id) for the case [ meta ] +def create_case_channel(LinkedHashMap row) { + def case_info = [:] + case_info.id = row.case_id + + return case_info +} diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 9fc44a1c..b64617f4 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -10,7 +10,7 @@ include { GET_CHROM_SIZES } from '../../modules/local/ workflow PREPARE_GENOME { take: - fasta // path: genome.fasta + fasta // path: genome.fasta variant_catalog // path: variant_catalog.json main: diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf new file mode 100644 index 00000000..e56690f9 --- /dev/null +++ b/subworkflows/local/prepare_references.nf @@ -0,0 +1,70 @@ +// +// Prepare reference files +// + +include { CHECK_BED } from './prepare_bed' +include { CHECK_VCF } from './prepare_vcf' +include { PREPARE_GENOME } from './prepare_genome' + + +workflow PREPARE_REFERENCES { + take: + + main: + // + // Prepare genome + // + ch_versions = Channel.empty() + PREPARE_GENOME ( + params.fasta, + params.variant_catalog + ) + .set { ch_genome } + ch_versions = ch_versions.mix(ch_genome.versions) + + // + // Gnomad vcf + // + ch_gnomad_vcf = Channel.empty() + ch_gnomad_idx = Channel.empty() + if (params.gnomad) { + CHECK_VCF( + params.gnomad, + ch_genome.fasta + ) + ch_gnomad_vcf = CHECK_VCF.out.vcf + ch_gnomad_idx = CHECK_VCF.out.idx + } + + // + // Target bed + // + ch_target_bed = Channel.empty() + ch_target_intervals = Channel.empty() + ch_bait_intervals = Channel.empty() + if (params.target_bed) { + CHECK_BED( + params.target_bed, + ch_genome.sequence_dict + ) + ch_target_bed = CHECK_BED.out.bed + ch_target_intervals = CHECK_BED.out.target_intervals + ch_bait_intervals = CHECK_BED.out.bait_intervals + } + + emit: + bwamem2_index = ch_genome.bwamem2_index + chrom_sizes = ch_genome.chrom_sizes + genome_fasta = ch_genome.fasta + genome_fai = ch_genome.fai + sequence_dict = ch_genome.sequence_dict + variant_catalog = ch_genome.variant_catalog + vcfanno_resources = ch_genome.vcfanno_resources + gnomad_vcf = ch_gnomad_vcf + gnomad_idx = ch_gnomad_idx + target_bed = ch_target_bed + target_intervals = ch_target_intervals + bait_intervals = ch_bait_intervals + versions = ch_versions +} + diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 720c14d5..b36d928e 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -3,13 +3,12 @@ // include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' -include { PICARD_COLLECTHSMETRICS } from '../../modules/nf-core/modules/picard/collecthsmetrics/main' -include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' -include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/modules/cat/cat/main' - -include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' -include { MOSDEPTH } from '../../modules/nf-core/modules/mosdepth/main' -include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' +include { PICARD_COLLECTHSMETRICS } from '../../modules/nf-core/modules/picard/collecthsmetrics/main' +include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' +include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/modules/cat/cat/main' +include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' +include { MOSDEPTH } from '../../modules/nf-core/modules/mosdepth/main' +include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' workflow QC_BAM { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index dd4e445f..48e09cda 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -43,11 +43,8 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { INPUT_CHECK } from '../subworkflows/local/input_check' -include { CHECK_VCF } from '../subworkflows/local/prepare_vcf' -include { CHECK_BED } from '../subworkflows/local/prepare_bed' -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' - +include { CHECK_INPUT } from '../subworkflows/local/check_input' +include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -91,47 +88,26 @@ workflow RAREDISEASE { // // SUBWORKFLOW: Read in samplesheet, validate and stage input files // - INPUT_CHECK ( + CHECK_INPUT ( ch_input ) - ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) + ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) // STEP 0: QUALITY CHECK. FASTQC ( - INPUT_CHECK.out.reads + CHECK_INPUT.out.reads ) ch_versions = ch_versions.mix(FASTQC.out.versions.first()) // STEP 0: PREPARE GENOME REFERENCES AND INDICES. - PREPARE_GENOME ( - params.fasta, - params.variant_catalog - ) - ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) - - ch_gnomad = Channel.empty() - if (params.gnomad) { - CHECK_VCF( - params.gnomad, - PREPARE_GENOME.out.fasta - ) - .set { ch_gnomad } - } - - ch_target_bed = Channel.empty() - if (params.target_bed) { - CHECK_BED( - params.target_bed, - PREPARE_GENOME.out.sequence_dict - ) - .set { ch_target_bed } - } + PREPARE_REFERENCES ().set { ch_references } + ch_versions = ch_versions.mix(ch_references.versions) // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. if (params.aligner == 'bwamem2') { ALIGN_BWAMEM2 ( - INPUT_CHECK.out.reads, - PREPARE_GENOME.out.bwamem2_index + CHECK_INPUT.out.reads, + ch_references.bwamem2_index ) ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam @@ -143,19 +119,19 @@ workflow RAREDISEASE { QC_BAM ( ch_marked_bam, ch_marked_bai, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, - CHECK_BED.out.bait_intervals, - CHECK_BED.out.target_intervals, - PREPARE_GENOME.out.chrom_sizes + ch_references.genome_fasta, + ch_references.genome_fai, + ch_references.bait_intervals, + ch_references.target_intervals, + ch_references.chrom_sizes ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) // STEP 1.6: EXPANSIONHUNTER CALL_REPEAT_EXPANSIONS ( ch_marked_bam.join(ch_marked_bai, by: [0]), - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.variant_catalog + ch_references.genome_fasta, + ch_references.variant_catalog ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) @@ -163,19 +139,19 @@ workflow RAREDISEASE { // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV_DEEPVARIANT ( ch_marked_bam.join(ch_marked_bai, by: [0]), - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, - INPUT_CHECK.out.case_info + ch_references.genome_fasta, + ch_references.genome_fai, + CHECK_INPUT.out.case_info ) ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) CALL_STRUCTURAL_VARIANTS ( ch_marked_bam, ch_marked_bai, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, - INPUT_CHECK.out.case_info, - ch_target_bed.bed + ch_references.genome_fasta, + ch_references.genome_fai, + CHECK_INPUT.out.case_info, + ch_references.target_bed ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) @@ -185,7 +161,7 @@ workflow RAREDISEASE { ANNOTATE_VCFANNO ( params.vcfanno_toml, ch_dv_vcf, - PREPARE_GENOME.out.vcfanno_resources + ch_references.vcfanno_resources ) ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) From 766bafdafa1f95dfbafedb1238d02b172ba1a5f2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Mar 2022 22:36:46 +0100 Subject: [PATCH 0360/1169] rename input_check subworkflow --- subworkflows/local/input_check.nf | 74 ------------------------------- 1 file changed, 74 deletions(-) delete mode 100644 subworkflows/local/input_check.nf diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf deleted file mode 100644 index 4110e2da..00000000 --- a/subworkflows/local/input_check.nf +++ /dev/null @@ -1,74 +0,0 @@ -// -// Check input samplesheet and get read, sample, and case channels -// - -include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' - -workflow INPUT_CHECK { - take: - samplesheet // file: /path/to/samplesheet.csv - - main: - SAMPLESHEET_CHECK ( samplesheet ) - .csv - .splitCsv ( header:true, sep:',' ) - .set { sheet } - - case_info = sheet.first() - .map { create_case_channel(it) } - reads = sheet.map { create_fastq_channel(it) } - samples = sheet.map { create_samples_channel(it) } - - emit: - case_info // channel: [ case_id ] - reads // channel: [ val(meta), [ reads ] ] - samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] - versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] -} - -// Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def create_fastq_channel(LinkedHashMap row) { - // create meta map - def meta = [:] - meta.id = row.sample - meta.single_end = row.single_end.toBoolean() - //TODO: think about adding LB and PU, make sure only illumina will be used, ID can also contain a flowcell id - meta.read_group = "\'@RG\\tID:"+ row.fastq_1.split('/')[-1] + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" - - - // add path(s) of the fastq file(s) to the meta map - def fastq_meta = [] - if (!file(row.fastq_1).exists()) { - exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" - } - if (meta.single_end) { - fastq_meta = [ meta, [ file(row.fastq_1) ] ] - } else { - if (!file(row.fastq_2).exists()) { - exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" - } - fastq_meta = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] - } - return fastq_meta -} - -// Function to get a list of metadata (e.g. pedigree, case id) from the sample; [ meta ] -def create_samples_channel(LinkedHashMap row) { - def sample = [:] - sample.id = row.sample - sample.gender = row.gender - sample.phenotype = row.phenotype - sample.maternal = row.maternal_id - sample.paternal = row.paternal_id - sample.case_id = row.case_id - - return sample -} - -// Function to get a list of metadata (e.g. case id) for the case [ meta ] -def create_case_channel(LinkedHashMap row) { - def case_info = [:] - case_info.id = row.case_id - - return case_info -} From f2aaf61afadb842580703a75f1a5991d9f39cbf6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Mar 2022 23:02:59 +0100 Subject: [PATCH 0361/1169] add versions --- subworkflows/local/prepare_bed.nf | 18 +++++++++++++++--- subworkflows/local/prepare_references.nf | 4 ++++ subworkflows/local/prepare_vcf.nf | 10 ++++++++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index 4eacc031..eaad3b71 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -14,24 +14,36 @@ workflow CHECK_BED { main: tab_out = Channel.empty() + ch_versions = Channel.empty() + + if (bed) { bed_file = file(bed) id = bed.split('/')[-1] ch_bed = Channel.fromList([[['id':id], bed_file]]) if ( bed.endsWith(".gz") && file(bed, checkIfExists:true) ) { - tbi_out = TABIX_PT (ch_bed).tbi - tab_out = ch_bed.join(tbi_out) + tbi_out = TABIX_PT (ch_bed).tbi + tab_out = ch_bed.join(tbi_out) + ch_versions = ch_versions.mix(TABIX_PT.out.versions) + } else if ( file(bed, checkIfExists:true) ) { - tab_out = TABIX_PBT (ch_bed).gz_tbi + tab_out = TABIX_PBT (ch_bed).gz_tbi + ch_versions = ch_versions.mix(TABIX_PBT.out.versions) + } interval_list = GATK_BILT (ch_bed, seq_dictionary).interval_list + ch_versions = ch_versions.mix(GATK_BILT.out.versions) + GATK_ILT(interval_list) + ch_versions = ch_versions.mix(GATK_ILT.out.versions) + } emit: bed = tab_out target_intervals = interval_list.collect{it[1]} bait_intervals = GATK_ILT.out.interval_list.collect{it[1]} + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index e56690f9..e2474d58 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -34,6 +34,8 @@ workflow PREPARE_REFERENCES { ) ch_gnomad_vcf = CHECK_VCF.out.vcf ch_gnomad_idx = CHECK_VCF.out.idx + ch_versions = ch_versions.mix(CHECK_VCF.out.versions) + } // @@ -50,6 +52,8 @@ workflow PREPARE_REFERENCES { ch_target_bed = CHECK_BED.out.bed ch_target_intervals = CHECK_BED.out.target_intervals ch_bait_intervals = CHECK_BED.out.bait_intervals + ch_versions = ch_versions.mix(CHECK_BED.out.versions) + } emit: diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index 895cefcc..7ce2c58e 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -14,6 +14,8 @@ workflow CHECK_VCF { main: vcf_file = file(vcf) + ch_versions = Channel.empty() + CHECK_INPUT_VCF( vcf_file ) .splitCsv( header:true ) .map { row -> @@ -31,16 +33,20 @@ workflow CHECK_VCF { .set { ch_vcfs_norm } SPLIT_MULTIALLELICS_PV (ch_vcfs_norm.unprocessed, fasta) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_PV.out.versions) + REMOVE_DUPLICATES_PV (SPLIT_MULTIALLELICS_PV.out.vcf, fasta) .vcf .set { ch_vcfs_rmdup } + ch_versions = ch_versions.mix(REMOVE_DUPLICATES_PV.out.versions) vcf_out = ch_vcfs_rmdup.mix( ch_vcfs_norm.processed ) TABIX_PV (vcf_out) emit: - vcf = vcf_out // path: normalized_vcf - idx = TABIX_PV.out.tbi + vcf = vcf_out // path: normalized_vcf + idx = TABIX_PV.out.tbi + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From b7de4d534e61f63a37827e3530b5d1a825fa3caa Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 22 Mar 2022 10:09:01 +0100 Subject: [PATCH 0362/1169] Remove blank line in if blocks --- subworkflows/local/prepare_bed.nf | 3 --- subworkflows/local/prepare_references.nf | 2 -- 2 files changed, 5 deletions(-) diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index eaad3b71..404d80ed 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -26,11 +26,9 @@ workflow CHECK_BED { tbi_out = TABIX_PT (ch_bed).tbi tab_out = ch_bed.join(tbi_out) ch_versions = ch_versions.mix(TABIX_PT.out.versions) - } else if ( file(bed, checkIfExists:true) ) { tab_out = TABIX_PBT (ch_bed).gz_tbi ch_versions = ch_versions.mix(TABIX_PBT.out.versions) - } interval_list = GATK_BILT (ch_bed, seq_dictionary).interval_list @@ -38,7 +36,6 @@ workflow CHECK_BED { GATK_ILT(interval_list) ch_versions = ch_versions.mix(GATK_ILT.out.versions) - } emit: diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index e2474d58..e60ab649 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -35,7 +35,6 @@ workflow PREPARE_REFERENCES { ch_gnomad_vcf = CHECK_VCF.out.vcf ch_gnomad_idx = CHECK_VCF.out.idx ch_versions = ch_versions.mix(CHECK_VCF.out.versions) - } // @@ -53,7 +52,6 @@ workflow PREPARE_REFERENCES { ch_target_intervals = CHECK_BED.out.target_intervals ch_bait_intervals = CHECK_BED.out.bait_intervals ch_versions = ch_versions.mix(CHECK_BED.out.versions) - } emit: From fc98f63efe1622daaaf3cc58535912ce7136b5b2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 22 Mar 2022 10:12:02 +0100 Subject: [PATCH 0363/1169] fix blank line --- subworkflows/local/prepare_bed.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index 404d80ed..72336c36 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -16,7 +16,6 @@ workflow CHECK_BED { tab_out = Channel.empty() ch_versions = Channel.empty() - if (bed) { bed_file = file(bed) id = bed.split('/')[-1] From 84701e07b88444fbffa570ed7a3bbd44dc131e51 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Mar 2022 11:46:10 +0100 Subject: [PATCH 0364/1169] applying suggestions --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 8e441f73..10b0136f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -60,7 +60,7 @@ Note that the pipeline will create the following files in your working directory ```console work # Directory containing the nextflow working files -results # Finished results (configurable, see below) + # Finished results in specified location (defined with --outdir) .nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` From 5226c131f8ec58dc17229f5f77b448753d593daa Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Mar 2022 12:38:03 +0100 Subject: [PATCH 0365/1169] refactored mem2 indx --- conf/modules.config | 2 +- subworkflows/local/prepare_genome.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 902630bf..d910a113 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -30,7 +30,7 @@ process { } // PREPARE_GENOME withName: BWAMEM2_INDEX { - ext.when = { !params.bwamem2_index && params.aligner == "bwamem2" } + ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 9cbc843e..56a682c5 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -21,7 +21,7 @@ workflow PREPARE_GENOME { // Fetch BWAMEM2 index or create from scratch if required BWAMEM2_INDEX ( ch_fasta ) - ch_bwamem2_index = params.bwamem2_index && params.aligner == "bwamem2" ? file(params.bwamem2_index) : BWAMEM2_INDEX.out.index + ch_bwamem2_index = !params.bwamem2_index ? params.aligner == "bwamem2" ? BWAMEM2_INDEX.out.index : Channel.fromPath(params.bwamem2_index).collect() : Channel.empty() ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) if ( params.fasta_fai ) { From 70fd731d22b36100c39cea171e76bf77277fbc8a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 22 Mar 2022 15:10:52 +0100 Subject: [PATCH 0366/1169] remove blank line --- subworkflows/local/prepare_vcf.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index 7ce2c58e..8917aaa6 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -35,7 +35,6 @@ workflow CHECK_VCF { SPLIT_MULTIALLELICS_PV (ch_vcfs_norm.unprocessed, fasta) ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_PV.out.versions) - REMOVE_DUPLICATES_PV (SPLIT_MULTIALLELICS_PV.out.vcf, fasta) .vcf .set { ch_vcfs_rmdup } From ed7e066bf844aa1f10ea79621b85db2f4542d97e Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Mar 2022 15:28:41 +0100 Subject: [PATCH 0367/1169] placed expansionhunter --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index afaeec6e..8ef49684 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,10 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Pipeline summary 1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) -2. Data preprocessing: [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates), [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), +2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) 3. Variant calling + multiple calls are aggregated: 1. SNVs: [`DeepVariant`](https://github.com/google/deepvariant) - 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), + 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`ExpansionHunter`](https://github.com/Illumina/ExpansionHunter), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), 3. Mitochondria: [`Mutect2`](https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2) 4. Annotation: [`VCFanno`](https://github.com/brentp/vcfanno),[`VEP`](https://www.ensembl.org/info/docs/tools/vep/index.html) 1. SNVs: [`CADD`](https://cadd.gs.washington.edu/) From 8003b34e7f1be5365fd3d94da46ca97b19446c9c Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Mar 2022 15:33:31 +0100 Subject: [PATCH 0368/1169] placed dnascope --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ef49684..a88ee251 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) 2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) -3. Variant calling + multiple calls are aggregated: +3. Variant calling + multiple calls are aggregated: [`DNAscope`](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) 1. SNVs: [`DeepVariant`](https://github.com/google/deepvariant) 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`ExpansionHunter`](https://github.com/Illumina/ExpansionHunter), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), 3. Mitochondria: [`Mutect2`](https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2) From 1b7d9d086a6ce74c8047382e9ec82c8ff7875fda Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Mar 2022 15:35:55 +0100 Subject: [PATCH 0369/1169] placed haplogrep --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a88ee251..67f0e34c 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ On release, automated continuous integration tests run the pipeline on a full-si 4. Annotation: [`VCFanno`](https://github.com/brentp/vcfanno),[`VEP`](https://www.ensembl.org/info/docs/tools/vep/index.html) 1. SNVs: [`CADD`](https://cadd.gs.washington.edu/) 2. SVs: - 3. Mitochondria: [`HmtNote`](https://github.com/robertopreste/HmtNote), [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), [`gnomAD_mt`](https://gnomad.broadinstitute.org/downloads#v3-mitochondrial-dna) + 3. Mitochondria: [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), [`gnomAD_mt`](https://gnomad.broadinstitute.org/downloads#v3-mitochondrial-dna), [`Haplogrep`](https://github.com/seppinho/haplogrep-cmd/tree/v2.1.21), [`HmtNote`](https://github.com/robertopreste/HmtNote) 5. Variant ranking: something will be here > Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) From 39afd0a4f53d4ecd75d7a7fee04619ebd634ff14 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 22 Mar 2022 16:03:22 +0100 Subject: [PATCH 0370/1169] applying suggestions --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 67f0e34c..97b238c9 100644 --- a/README.md +++ b/README.md @@ -27,14 +27,14 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) 2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) -3. Variant calling + multiple calls are aggregated: [`DNAscope`](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) - 1. SNVs: [`DeepVariant`](https://github.com/google/deepvariant) +3. Variant calling + multiple calls are aggregated: + 1. SNVs + short indels: [`DeepVariant`](https://github.com/google/deepvariant), [`DNAscope`](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`ExpansionHunter`](https://github.com/Illumina/ExpansionHunter), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), - 3. Mitochondria: [`Mutect2`](https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2) + 3. Mitochondria: [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), [`Mutect2`](https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2) 4. Annotation: [`VCFanno`](https://github.com/brentp/vcfanno),[`VEP`](https://www.ensembl.org/info/docs/tools/vep/index.html) 1. SNVs: [`CADD`](https://cadd.gs.washington.edu/) 2. SVs: - 3. Mitochondria: [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), [`gnomAD_mt`](https://gnomad.broadinstitute.org/downloads#v3-mitochondrial-dna), [`Haplogrep`](https://github.com/seppinho/haplogrep-cmd/tree/v2.1.21), [`HmtNote`](https://github.com/robertopreste/HmtNote) + 3. Mitochondria: [`gnomAD_mt`](https://gnomad.broadinstitute.org/downloads#v3-mitochondrial-dna), [`Haplogrep`](https://github.com/seppinho/haplogrep-cmd/tree/v2.1.21), [`HmtNote`](https://github.com/robertopreste/HmtNote) 5. Variant ranking: something will be here > Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) From e648df00c0b9042094c3c7504d0c3b09d68dad35 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:02:57 +0100 Subject: [PATCH 0371/1169] woops need 2 update process name --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 92e14cce..f04d5481 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -106,7 +106,7 @@ workflow RAREDISEASE { // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( params.aligner, - INPUT_CHECK.out.reads, + CHECK_INPUT.out.reads, PREPARE_GENOME.out.bwamem2_index ) ch_marked_bam = ALIGN.out.marked_bam From 50f65dfe9311e9844271db00e010a3973065bf63 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 23 Mar 2022 13:53:36 +0000 Subject: [PATCH 0372/1169] Template update for nf-core/tools version 2.3.1 --- .editorconfig | 5 +- .github/CONTRIBUTING.md | 15 +- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/PULL_REQUEST_TEMPLATE.md | 6 +- .github/workflows/awsfulltest.yml | 1 - .github/workflows/awstest.yml | 2 +- .github/workflows/branch.yml | 5 +- .github/workflows/ci.yml | 12 +- .github/workflows/linting.yml | 85 ++--------- .github/workflows/linting_comment.yml | 3 +- .gitpod.yml | 16 +- .markdownlint.yml | 14 -- .prettierrc.yml | 1 + .yamllint.yml | 6 - CHANGELOG.md | 2 + CITATIONS.md | 27 ++-- README.md | 31 ++-- assets/email_template.html | 142 ++++++++++++------ assets/multiqc_config.yaml | 11 -- assets/multiqc_config.yml | 11 ++ assets/schema_input.json | 5 +- docs/README.md | 8 +- docs/output.md | 28 ++-- docs/usage.md | 109 +++++++------- modules.json | 8 +- .../custom/dumpsoftwareversions/main.nf | 3 + .../custom/dumpsoftwareversions/meta.yml | 2 +- modules/nf-core/modules/fastqc/main.nf | 3 + modules/nf-core/modules/fastqc/meta.yml | 90 +++++------ modules/nf-core/modules/multiqc/main.nf | 9 +- modules/nf-core/modules/multiqc/meta.yml | 66 ++++---- nextflow_schema.json | 14 +- workflows/raredisease.nf | 2 +- 33 files changed, 361 insertions(+), 382 deletions(-) delete mode 100644 .markdownlint.yml create mode 100644 .prettierrc.yml delete mode 100644 .yamllint.yml delete mode 100644 assets/multiqc_config.yaml create mode 100644 assets/multiqc_config.yml diff --git a/.editorconfig b/.editorconfig index 95549501..b6b31907 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,12 +8,9 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{yml,yaml}] +[*.{md,yml,yaml,html,css,scss,js}] indent_size = 2 -[*.json] -insert_final_newline = unset - # These files are edited and tested upstream in nf-core/modules [/modules/nf-core/**] charset = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e8aed2df..9d738778 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -15,8 +15,7 @@ Contributions to the code are even more welcome ;) If you'd like to write some code for nf-core/raredisease, the standard workflow is as follows: -1. Check that there isn't already an issue about your idea in the [nf-core/raredisease issues](https://github.com/nf-core/raredisease/issues) to avoid duplicating work - * If there isn't one already, please create one so that others know you're working on this +1. Check that there isn't already an issue about your idea in the [nf-core/raredisease issues](https://github.com/nf-core/raredisease/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](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/raredisease repository](https://github.com/nf-core/raredisease) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) 4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). @@ -49,9 +48,9 @@ These tests are run both with the latest available version of `Nextflow` and als :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. +- 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 @@ -73,7 +72,7 @@ If you wish to contribute a new step, please use the following coding standards: 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. 8. If applicable, add a new test command in `.github/workflow/ci.yml`. -9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values @@ -92,8 +91,8 @@ The process resources can be passed on to the tool dynamically within the proces Please use the following naming schemes, to make it easy to understand what is going where. -* initial process channel: `ch_output_from_` -* intermediate and terminal channels: `ch__for_` +- initial process channel: `ch_output_from_` +- intermediate and terminal channels: `ch__for_` ### Nextflow version bumping diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e455d5a5..ab86047b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -2,7 +2,6 @@ name: Bug report description: Report something that is broken or incorrect labels: bug body: - - type: markdown attributes: value: | diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 5ed28cd3..6b9fd9c3 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -16,10 +16,10 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] 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 you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) + - [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker` --outdir `). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index c284c5ef..652780f8 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -18,7 +18,6 @@ jobs: # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters - with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index bd795776..43cfc49b 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -10,9 +10,9 @@ jobs: if: github.repository == 'nf-core/raredisease' runs-on: ubuntu-latest steps: + # Launch workflow using Tower CLI tool action - name: Launch workflow via tower uses: nf-core/tower-action@v3 - with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 13cdbacd..b946d7ec 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,8 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/raredisease' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/raredisease ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] - + "{ [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/raredisease ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]]" # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets @@ -43,4 +42,4 @@ jobs: Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false - +# diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d529b893..3493ffe1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,18 +16,18 @@ jobs: test: name: Run pipeline with test data # Only run on push if this is the nf-core dev branch (merged PRs) - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/raredisease') }} + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/raredisease') }}" runs-on: ubuntu-latest strategy: matrix: # Nextflow versions include: # Test pipeline minimum Nextflow version - - NXF_VER: '21.10.3' - NXF_EDGE: '' + - NXF_VER: "21.10.3" + NXF_EDGE: "" # Test latest edge release of Nextflow - - NXF_VER: '' - NXF_EDGE: '1' + - NXF_VER: "" + NXF_EDGE: "1" steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -48,3 +48,5 @@ jobs: # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results + +# diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index fda934c0..e9cf5de3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,6 +1,7 @@ name: nf-core linting # This workflow is triggered on pushes and PRs to the repository. -# It runs the `nf-core lint` and markdown lint tests to ensure that the code meets the nf-core guidelines +# It runs the `nf-core lint` and markdown lint tests to ensure +# that the code meets the nf-core guidelines. on: push: pull_request: @@ -8,42 +9,6 @@ on: types: [published] jobs: - Markdown: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - - name: Install markdownlint - run: npm install -g markdownlint-cli - - name: Run Markdownlint - run: markdownlint . - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## Markdown linting is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install `markdownlint-cli` - * On Mac: `brew install markdownlint-cli` - * Everything else: [Install `npm`](https://www.npmjs.com/get-npm) then [install `markdownlint-cli`](https://www.npmjs.com/package/markdownlint-cli) (`npm install -g markdownlint-cli`) - * Fix the markdown errors - * Automatically: `markdownlint . --fix` - * Manually resolve anything left from `markdownlint .` - - Once you push these changes the test should pass, and you can hide this comment :+1: - - We highly recommend setting up markdownlint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! - - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false - EditorConfig: runs-on: ubuntu-latest steps: @@ -55,49 +20,24 @@ jobs: run: npm install -g editorconfig-checker - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(git ls-files | grep -v test) + run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') - YAML: + Prettier: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@master - - name: 'Yamllint' - uses: karancode/yamllint-github-action@master - with: - yamllint_file_or_dir: '.' - yamllint_config_filepath: '.yamllint.yml' - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## YAML linting is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install `yamllint` - * Install `yamllint` following [this](https://yamllint.readthedocs.io/en/stable/quickstart.html#installing-yamllint) - instructions or alternative install it in your [conda environment](https://anaconda.org/conda-forge/yamllint) - * Fix the markdown errors - * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml") -c ./.yamllint.yml` - * Fix any reported errors in your YAML files + - uses: actions/checkout@v2 - Once you push these changes the test should pass, and you can hide this comment :+1: + - uses: actions/setup-node@v2 - We highly recommend setting up yaml-lint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + - name: Install Prettier + run: npm install -g prettier - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false + - name: Run Prettier --check + run: prettier --check ${GITHUB_WORKSPACE} nf-core: runs-on: ubuntu-latest steps: - - name: Check out pipeline code uses: actions/checkout@v2 @@ -110,8 +50,8 @@ jobs: - uses: actions/setup-python@v1 with: - python-version: '3.6' - architecture: 'x64' + python-version: "3.6" + architecture: "x64" - name: Install dependencies run: | @@ -139,3 +79,4 @@ jobs: lint_results.md PR_number.txt +# diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 44d72994..91c487a1 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -1,4 +1,3 @@ - name: nf-core linting comment # This workflow is triggered after the linting action is complete # It posts an automated comment to the PR, even if the PR is coming from a fork @@ -27,4 +26,4 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} path: linting-logs/lint_results.md - +# diff --git a/.gitpod.yml b/.gitpod.yml index b7d4cee1..c452ee93 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -2,13 +2,13 @@ image: nfcore/gitpod:latest vscode: extensions: # based on nf-core.nf-core-extensionpack - - codezombiech.gitignore # Language support for .gitignore files + - codezombiech.gitignore # Language support for .gitignore files # - cssho.vscode-svgviewer # SVG viewer - - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code - - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed - - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files - - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar - - mechatroner.rainbow-csv # Highlight columns in csv files in different colors + - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed + - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files + - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar + - mechatroner.rainbow-csv # Highlight columns in csv files in different colors # - nextflow.nextflow # Nextflow syntax highlighting - - oderwat.indent-rainbow # Highlight indentation level - - streetsidesoftware.code-spell-checker # Spelling checker for source code + - oderwat.indent-rainbow # Highlight indentation level + - streetsidesoftware.code-spell-checker # Spelling checker for source code diff --git a/.markdownlint.yml b/.markdownlint.yml deleted file mode 100644 index 9e605fcf..00000000 --- a/.markdownlint.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Markdownlint configuration file -default: true -line-length: false -ul-indent: - indent: 4 -no-duplicate-header: - siblings_only: true -no-inline-html: - allowed_elements: - - img - - p - - kbd - - details - - summary diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 00000000..c81f9a76 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1 @@ +printWidth: 120 diff --git a/.yamllint.yml b/.yamllint.yml deleted file mode 100644 index d466deec..00000000 --- a/.yamllint.yml +++ /dev/null @@ -1,6 +0,0 @@ -extends: default - -rules: - document-start: disable - line-length: disable - truthy: disable diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b18325f..d1c81d01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ Initial release of nf-core/raredisease, created with the [nf-core](https://nf-co ### `Fixed` +- Clarified conda usage and added an installation tutorial for Singularity since the one on Syllabs' website uses an outdate version of GO Compiler + ### `Dependencies` ### `Deprecated` diff --git a/CITATIONS.md b/CITATIONS.md index 2bc54565..34d06fe4 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,23 +10,26 @@ ## Pipeline tools -* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) +- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. +- [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. ## Software packaging/containerisation tools -* [Anaconda](https://anaconda.com) - > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. +- [Anaconda](https://anaconda.com) -* [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) - > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. + > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. -* [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) - > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. +- [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) -* [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. -* [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) - > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. +- [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) + + > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. + +- [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + +- [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) + > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. diff --git a/README.md b/README.md index c99fd01f..9cb5003c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![nf-core/raredisease](docs/images/nf-core-raredisease_logo_light.png#gh-light-mode-only) ![nf-core/raredisease](docs/images/nf-core-raredisease_logo_dark.png#gh-dark-mode-only) +# ![nf-core/raredisease](docs/images/nf-core/raredisease_logo_light.png#gh-light-mode-only) ![nf-core/raredisease](docs/images/nf-core/raredisease_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/raredisease/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/raredisease/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+linting%22) @@ -17,11 +17,13 @@ ## Introduction + **nf-core/raredisease** is a bioinformatics best-practice analysis pipeline for call and score variants from WGS/WES of rare disease patients. The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! + On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/raredisease/results). ## Pipeline summary @@ -35,28 +37,28 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) -2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ +2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) (you can follow [this tutorial](https://singularity-tutorial.github.io/01-installation/)), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(you can use [`Conda`](https://conda.io/miniconda.html) both to install Nextflow itself and also to manage software within pipelines. Please only use it within pipelines as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_. 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console - nextflow run nf-core/raredisease -profile test,YOURPROFILE --outdir - ``` + ```console + nextflow run nf-core/raredisease -profile test,YOURPROFILE --outdir + ``` - Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. + Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. - > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. - > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. - > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. + > - The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. + > - Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > - If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. + > - If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! - + - ```console - nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile - ``` + ```console + nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile + ``` ## Documentation @@ -82,6 +84,7 @@ For further information or help, don't hesitate to get in touch on the [Slack `# + An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. You can cite the `nf-core` publication as follows: diff --git a/assets/email_template.html b/assets/email_template.html index f7f3e4ef..94874386 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,53 +1,111 @@ - - - - + + + + - - nf-core/raredisease Pipeline Report - - -

+ + + nf-core/raredisease Pipeline Report + + +
+ - +

nf-core/raredisease v${version}

+

Run Name: $runName

-

nf-core/raredisease v${version}

-

Run Name: $runName

- -<% if (!success){ - out << """ -
-

nf-core/raredisease execution completed unsuccessfully!

+ <% if (!success){ out << """ +
+

nf-core/raredisease execution completed unsuccessfully!

The exit status of the task that caused the workflow execution to fail was: $exitStatus.

The full error message was:

-
${errorReport}
-
- """ -} else { - out << """ -
+
${errorReport}
+
+ """ } else { out << """ +
nf-core/raredisease execution completed successfully! -
- """ -} -%> +
+ """ } %> -

The workflow was completed at $dateComplete (duration: $duration)

-

The command used to launch the workflow was as follows:

-
$commandLine
+

The workflow was completed at $dateComplete (duration: $duration)

+

The command used to launch the workflow was as follows:

+
+$commandLine
-

Pipeline Configuration:

- - - <% out << summary.collect{ k,v -> "" }.join("\n") %> - -
$k
$v
+

Pipeline Configuration:

+ + + <% out << summary.collect{ k,v -> " + + + + + " }.join("\n") %> + +
+ $k + +
$v
+
-

nf-core/raredisease

-

https://github.com/nf-core/raredisease

- -
- - +

nf-core/raredisease

+

https://github.com/nf-core/raredisease

+
+ diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml deleted file mode 100644 index 03b23126..00000000 --- a/assets/multiqc_config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/raredisease - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - software_versions: - order: -1000 - nf-core-raredisease-summary: - order: -1001 - -export_plots: true diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml new file mode 100644 index 00000000..e70b56be --- /dev/null +++ b/assets/multiqc_config.yml @@ -0,0 +1,11 @@ +report_comment: > + This report has been generated by the nf-core/raredisease + analysis pipeline. For information about how to interpret these results, please see the + documentation. +report_section_order: + software_versions: + order: -1000 + "nf-core-raredisease-summary": + order: -1001 + +export_plots: true diff --git a/assets/schema_input.json b/assets/schema_input.json index 3d9ce2ab..4ba2de4c 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -31,9 +31,6 @@ ] } }, - "required": [ - "sample", - "fastq_1" - ] + "required": ["sample", "fastq_1"] } } diff --git a/docs/README.md b/docs/README.md index f93103e8..901fb207 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,9 +2,9 @@ The nf-core/raredisease documentation is split into the following pages: -* [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. -* [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. +- [Usage](usage.md) + - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. +- [Output](output.md) + - An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/docs/output.md b/docs/output.md index 8e94226e..36391053 100644 --- a/docs/output.md +++ b/docs/output.md @@ -12,18 +12,18 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQC](#fastqc) - Raw read QC -* [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline -* [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +- [FastQC](#fastqc) - Raw read QC +- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline +- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### FastQC
Output files -* `fastqc/` - * `*_fastqc.html`: FastQC report containing quality metrics. - * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. +- `fastqc/` + - `*_fastqc.html`: FastQC report containing quality metrics. + - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
@@ -42,10 +42,10 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d
Output files -* `multiqc/` - * `multiqc_report.html`: 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_plots/`: directory containing static images from the report in various formats. +- `multiqc/` + - `multiqc_report.html`: 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_plots/`: directory containing static images from the report in various formats.
@@ -58,10 +58,10 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ
Output files -* `pipeline_info/` - * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. +- `pipeline_info/` + - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. + - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`.
diff --git a/docs/usage.md b/docs/usage.md index 97588b8b..f5863e09 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -44,11 +44,11 @@ TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, ``` -| Column | Description | -|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| Column | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. @@ -57,7 +57,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```console -nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile docker +nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -65,9 +65,9 @@ This will launch the pipeline with the `docker` configuration profile. See below Note that the pipeline will create the following files in your working directory: ```console -work # Directory containing the nextflow working files -results # Finished results (configurable, see below) -.nextflow_log # Log file from Nextflow +work # Directory containing the nextflow working files + # Finished results in specified location (defined with --outdir) +.nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` @@ -106,25 +106,25 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles. If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. -* `docker` - * A generic configuration profile to be used with [Docker](https://docker.com/) -* `singularity` - * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) -* `podman` - * A generic configuration profile to be used with [Podman](https://podman.io/) -* `shifter` - * A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) -* `charliecloud` - * A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) -* `conda` - * A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. -* `test` - * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters +- `docker` + - A generic configuration profile to be used with [Docker](https://docker.com/) +- `singularity` + - A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) +- `podman` + - A generic configuration profile to be used with [Podman](https://podman.io/) +- `shifter` + - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) +- `charliecloud` + - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) +- `conda` + - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. +- `test` + - A profile with a complete configuration for automated testing + - Includes links to test data so needs no other parameters ### `-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. +Specify this when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. @@ -186,6 +186,7 @@ process { ``` > **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. +> > If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. ### Updating containers @@ -196,35 +197,35 @@ The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementatio 2. Find the latest version of the Biocontainer available on [Quay.io](https://quay.io/repository/biocontainers/pangolin?tag=latest&tab=tags) 3. Create the custom config accordingly: - * For Docker: - - ```nextflow - process { - withName: PANGOLIN { - container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` - - * For Singularity: - - ```nextflow - process { - withName: PANGOLIN { - container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` - - * For Conda: - - ```nextflow - process { - withName: PANGOLIN { - conda = 'bioconda::pangolin=3.0.5' - } - } - ``` + - For Docker: + + ```nextflow + process { + withName: PANGOLIN { + container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + - For Singularity: + + ```nextflow + process { + withName: PANGOLIN { + container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + - For Conda: + + ```nextflow + process { + withName: PANGOLIN { + conda = 'bioconda::pangolin=3.0.5' + } + } + ``` > **NB:** If you wish to periodically update individual tool-specific results (e.g. Pangolin) generated by the pipeline then you must ensure to keep the `work/` directory otherwise the `-resume` ability of the pipeline will be compromised and it will restart from scratch. diff --git a/modules.json b/modules.json index 6af82ab6..909b6bf3 100644 --- a/modules.json +++ b/modules.json @@ -4,14 +4,14 @@ "repos": { "nf-core/modules": { "custom/dumpsoftwareversions": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "fastqc": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "multiqc": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" } } } -} \ No newline at end of file +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index 934bb467..327d5100 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -15,6 +15,9 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { path "software_versions_mqc.yml", emit: mqc_yml path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' template 'dumpsoftwareversions.py' diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index 5b5b8a60..60b546a0 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -8,7 +8,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - licence: ['MIT'] + licence: ["MIT"] input: - versions: type: file diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index d250eca0..ed6b8c50 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -15,6 +15,9 @@ process FASTQC { tuple val(meta), path("*.zip") , emit: zip path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index b09553a3..4da5bb5a 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -1,52 +1,52 @@ name: fastqc description: Run FastQC on sequenced reads keywords: - - quality control - - qc - - adapters - - fastq + - quality control + - qc + - adapters + - fastq tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ['GPL-2.0-only'] + - fastqc: + description: | + FastQC gives general quality metrics about your reads. + It provides information about the quality score distribution + across your reads, the per base sequence content (%A/C/G/T). + You get information about adapter contamination and other + overrepresented sequences. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ + documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ["GPL-2.0-only"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - html: + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + - zip: + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 3dceb162..1264aac1 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_medium' - conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" input: path multiqc_files @@ -15,6 +15,9 @@ process MULTIQC { path "*_plots" , optional:true, emit: plots path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 63c75a45..6fa891ef 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -1,40 +1,40 @@ name: MultiQC description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report + - QC + - bioinformatics tools + - Beautiful stand-alone HTML report tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ - licence: ['GPL-3.0-or-later'] + - multiqc: + description: | + MultiQC searches a given directory for analysis logs and compiles a HTML report. + It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. + homepage: https://multiqc.info/ + documentation: https://multiqc.info/docs/ + licence: ["GPL-3.0-or-later"] input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: dir - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - report: + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + - data: + type: dir + description: MultiQC data dir + pattern: "multiqc_data" + - plots: + type: file + description: Plots created by MultiQC + pattern: "*_data" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" + - "@abhi18av" + - "@bunop" + - "@drpatelh" diff --git a/nextflow_schema.json b/nextflow_schema.json index 7e946960..1743c89c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,10 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": [ - "input", - "outdir" - ], + "required": ["input", "outdir"], "properties": { "input": { "type": "string", @@ -185,14 +182,7 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], "hidden": true }, "email_on_fail": { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 64de96a5..f7d800f0 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -23,7 +23,7 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) +ch_multiqc_config = file("$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() /* From 2f553bd2ede1ec5ef92f8fb048efdcc89575b832 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 24 Mar 2022 11:45:33 +0000 Subject: [PATCH 0373/1169] Template update for nf-core/tools version 2.3.2 --- .github/PULL_REQUEST_TEMPLATE.md | 1 - .github/workflows/awsfulltest.yml | 2 -- .github/workflows/awstest.yml | 2 -- .gitpod.yml | 2 +- CHANGELOG.md | 2 -- 5 files changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6b9fd9c3..9015e00c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,7 +10,6 @@ Remember that PRs should be made against the dev branch, unless you're preparing Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) --> - ## PR checklist diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 652780f8..da3a4b97 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -22,8 +22,6 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} - revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} parameters: | { diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 43cfc49b..c2ffb8ff 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -17,8 +17,6 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} - revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} parameters: | { diff --git a/.gitpod.yml b/.gitpod.yml index c452ee93..85d95ecc 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,7 +4,7 @@ vscode: extensions: # based on nf-core.nf-core-extensionpack - codezombiech.gitignore # Language support for .gitignore files # - cssho.vscode-svgviewer # SVG viewer - - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - esbenp.prettier-vscode # Markdown/CommonMark linting and style checking for Visual Studio Code - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar diff --git a/CHANGELOG.md b/CHANGELOG.md index d1c81d01..9b18325f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,6 @@ Initial release of nf-core/raredisease, created with the [nf-core](https://nf-co ### `Fixed` -- Clarified conda usage and added an installation tutorial for Singularity since the one on Syllabs' website uses an outdate version of GO Compiler - ### `Dependencies` ### `Deprecated` From 76124cbc40db0f2bbb604d5782c02097bbe11065 Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 24 Mar 2022 14:25:14 +0100 Subject: [PATCH 0374/1169] running prettier --- .github/CONTRIBUTING.md | 6 +++--- README.md | 32 ++++++++++++++++---------------- assets/multiqc_config.yaml | 6 +++--- docs/usage.md | 22 +++++++++++----------- nextflow_schema.json | 12 +++--------- 5 files changed, 36 insertions(+), 42 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a22c4cc6..517b8020 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -95,12 +95,12 @@ Please use the following naming schemes, to make it easy to understand what is g - intermediate and terminal channels: `ch__for_` * subworkflows: `verb_noun` or `verb_variant_noun` - * `verb_noun` : `align_bwamem2.nf` - * `verb_variant_noun` : `call_snv_deepvariant.nf` + - `verb_noun` : `align_bwamem2.nf` + - `verb_variant_noun` : `call_snv_deepvariant.nf` ### Reusing modules in the workflow -Occasionally, you might find yourself wanting to reuse a module with options that are different from what has already been defined in [conf/modules.config](../conf/modules.config). In that case, we recommend importing the module using an unique alias within the subworkflow, and then defining the options for the alias in [conf/modules.config](../conf/modules.config). +Occasionally, you might find yourself wanting to reuse a module with options that are different from what has already been defined in [conf/modules.config](../conf/modules.config). In that case, we recommend importing the module using an unique alias within the subworkflow, and then defining the options for the alias in [conf/modules.config](../conf/modules.config). For a working example, please have a look at how we have reused `bcftools norm` in both [subworkflows/local/call_snv_deepvariant.nf](../subworkflows/local/call_snv_deepvariant.nf) and [subworkflows/local/prepare_vcf.nf](../subworkflows/local/prepare_vcf.nf), and defined its subworkflow-specific options in [conf/modules.config](../conf/modules.config). diff --git a/README.md b/README.md index 5667153c..f2008807 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,13 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) 2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) 3. Variant calling + multiple calls are aggregated: - 1. SNVs + short indels: [`DeepVariant`](https://github.com/google/deepvariant), [`DNAscope`](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) - 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`ExpansionHunter`](https://github.com/Illumina/ExpansionHunter), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), - 3. Mitochondria: [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), [`Mutect2`](https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2) + 1. SNVs + short indels: [`DeepVariant`](https://github.com/google/deepvariant), [`DNAscope`](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) + 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`ExpansionHunter`](https://github.com/Illumina/ExpansionHunter), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), + 3. Mitochondria: [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), [`Mutect2`](https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2) 4. Annotation: [`VCFanno`](https://github.com/brentp/vcfanno),[`VEP`](https://www.ensembl.org/info/docs/tools/vep/index.html) - 1. SNVs: [`CADD`](https://cadd.gs.washington.edu/) - 2. SVs: - 3. Mitochondria: [`gnomAD_mt`](https://gnomad.broadinstitute.org/downloads#v3-mitochondrial-dna), [`Haplogrep`](https://github.com/seppinho/haplogrep-cmd/tree/v2.1.21), [`HmtNote`](https://github.com/robertopreste/HmtNote) + 1. SNVs: [`CADD`](https://cadd.gs.washington.edu/) + 2. SVs: + 3. Mitochondria: [`gnomAD_mt`](https://gnomad.broadinstitute.org/downloads#v3-mitochondrial-dna), [`Haplogrep`](https://github.com/seppinho/haplogrep-cmd/tree/v2.1.21), [`HmtNote`](https://github.com/robertopreste/HmtNote) 5. Variant ranking: something will be here > Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) @@ -52,9 +52,9 @@ The different steps and corresponding tools are represented in the flowchart bel 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console - nextflow run nf-core/raredisease -revision dev -profile test,YOURPROFILE --outdir - ``` + ```console + nextflow run nf-core/raredisease -revision dev -profile test,YOURPROFILE --outdir + ``` Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. @@ -65,13 +65,13 @@ The different steps and corresponding tools are represented in the flowchart bel 4. Start running your own analysis! - ```console - nextflow run nf-core/raredisease \ - --input samplesheet.csv --outdir --genome GRCh38 \ - --analysis_type \ - -revision dev \ - -profile - ``` + ```console + nextflow run nf-core/raredisease \ + --input samplesheet.csv --outdir --genome GRCh38 \ + --analysis_type \ + -revision dev \ + -profile + ``` Note that the `-revision` is used because pipeline is still under development and the latest working branch is dev. diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index bbce041b..15ff17a9 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/raredisease - analysis pipeline. For information about how to interpret these results, please see the - documentation. + This report has been generated by the nf-core/raredisease + analysis pipeline. For information about how to interpret these results, please see the + documentation. report_section_order: software_versions: order: -1000 diff --git a/docs/usage.md b/docs/usage.md index a05b7f6a..0ca15438 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -32,17 +32,17 @@ AEG588A3,4,AEG588A3_S1_L004_R1_001.fastq.gz,AEG588A3_S1_L004_R2_001.fastq.gz,1,1 The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information in the samplesheet (sex/gender and phenotype) should be provided as they would be for a [ped file](https://gatk.broadinstitute.org/hc/en-us/articles/360035531972-PED-Pedigree-format) (i.e. 1 for male, 2 for female, other for unknown). -| Column | Description | -|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `lane` | Used to generate seperate channels during the alignment step | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `gender` | Sex (1=male; 2=female; other=unknown) | -| `phenotype` | Affected status of patient (0 = missing; 1=unaffected; 2=affected) | -| `paternal_id` | Sample ID of the father, can be blank if the father isn't part of the analysis or for other samples than the proband. | -| `maternal_id` | Sample ID of the mother, can be blank if the mother isn't part of the analysis or for other samples than the proband. | -| `case_id` | Case ID, for the analysis used when generating a family VCF | +| Column | Description | +| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `lane` | Used to generate seperate channels during the alignment step | +| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `gender` | Sex (1=male; 2=female; other=unknown) | +| `phenotype` | Affected status of patient (0 = missing; 1=unaffected; 2=affected) | +| `paternal_id` | Sample ID of the father, can be blank if the father isn't part of the analysis or for other samples than the proband. | +| `maternal_id` | Sample ID of the mother, can be blank if the mother isn't part of the analysis or for other samples than the proband. | +| `case_id` | Case ID, for the analysis used when generating a family VCF | An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. diff --git a/nextflow_schema.json b/nextflow_schema.json index 53aafb6d..24d18b4a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -150,11 +150,7 @@ "default": "wgs", "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", - "enum": [ - "wgs", - "wes", - "mito" - ] + "enum": ["wgs", "wes", "mito"] } } }, @@ -169,9 +165,7 @@ "default": "bwamem2", "description": "Specifies the alignment algorithm to use - available options are 'bwamem2'.", "fa_icon": "fas fa-map-signs", - "enum": [ - "bwamem2" - ] + "enum": ["bwamem2"] } } }, @@ -372,4 +366,4 @@ "$ref": "#/definitions/generic_options" } ] -} \ No newline at end of file +} From 1da0c3e813ca4e701fa4d7da1c9b9dbdf84e8627 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 27 Mar 2022 14:35:45 +0200 Subject: [PATCH 0375/1169] some fixes --- conf/genomes.config | 2 +- subworkflows/local/annotate_structural_variants.nf | 4 ++-- workflows/raredisease.nf | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 6c60010b..c05f375e 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -26,7 +26,7 @@ params { fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" - svdb_query_dbs = "" + svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 66a12509..7d54eee1 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -28,10 +28,10 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { .set { ch_svdb_dbs } SVDB_QUERY(vcf, - ch_svdb_dbs.in_frqs.toList(), ch_svdb_dbs.in_occs.toList(), - ch_svdb_dbs.out_frqs.toList(), + ch_svdb_dbs.in_frqs.toList(), ch_svdb_dbs.out_occs.toList(), + ch_svdb_dbs.out_frqs.toList(), ch_svdb_dbs.vcf_dbs.toList() ) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index fd018d4e..4b5ced70 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -163,8 +163,8 @@ workflow RAREDISEASE { ANNOTATE_STRUCTURAL_VARIANTS ( CALL_STRUCTURAL_VARIANTS.out.vcf, params.svdb_query_dbs, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.sequence_dict + ch_references.genome_fasta, + ch_references.sequence_dict ).set {ch_sv_annotate} ch_versions = ch_versions.mix(ch_sv_annotate.versions) From 843c21c48aaddd284b578bc0b342991cafc6237e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 27 Mar 2022 14:39:46 +0200 Subject: [PATCH 0376/1169] update svdb merge --- modules.json | 2 +- modules/nf-core/modules/svdb/merge/main.nf | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index d37cbe7b..7b8277f6 100644 --- a/modules.json +++ b/modules.json @@ -79,7 +79,7 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "svdb/merge": { - "git_sha": "ee915a43e405324e62ee5d4c14a6a6ec6c610058" + "git_sha": "cc671a5f3c7a063ca3f84666ecbfbe3547d71a12" }, "svdb/query": { "git_sha": "5297d27fbf50b7aa5a37cce9b85c7aac3ff7c4ff" diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 505e2c0b..9e729bf3 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -2,10 +2,10 @@ process SVDB_MERGE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.5.0" : null) + conda (params.enable_conda ? "bioconda::svdb=2.5.2" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.5.0--py39hcbe4a3b_0': - 'quay.io/biocontainers/svdb:2.5.0--py39hcbe4a3b_0' }" + 'https://depot.galaxyproject.org/singularity/svdb:2.5.2--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.5.2--py39h5371cbf_0' }" input: tuple val(meta), path(vcfs) @@ -25,6 +25,7 @@ process SVDB_MERGE { def prio = "" if(priority) { prio = "--priority ${priority.join(',')}" + input = "" for (int index = 0; index < vcfs.size(); index++) { input += " ${vcfs[index]}:${priority[index]}" } From 1432f0b06dbe2c175999be2e47832b9bc64a3e69 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Mon, 28 Mar 2022 10:55:47 +0200 Subject: [PATCH 0377/1169] Removes JVM memory compensation in modules --- modules/local/gatk4/collectreadcounts/main.nf | 2 +- modules/local/gatk4/denoisereadcounts/main.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index 82fbb728..cca747fc 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -25,7 +25,7 @@ process GATK4_COLLECTREADCOUNTS { if (!task.memory) { log.info '[GATK CollectReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga * 14 / 15 as long + avail_mem = task.memory.giga } """ gatk --java-options "-Xmx${avail_mem}g" CollectReadCounts \\ diff --git a/modules/local/gatk4/denoisereadcounts/main.nf b/modules/local/gatk4/denoisereadcounts/main.nf index 5bf2c73e..a22aefdb 100644 --- a/modules/local/gatk4/denoisereadcounts/main.nf +++ b/modules/local/gatk4/denoisereadcounts/main.nf @@ -23,7 +23,7 @@ process GATK4_DENOISEREADCOUNTS { if (!task.memory) { log.info '[GATK DenoiseReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga * 14 / 15 as long + avail_mem = task.memory.giga } """ gatk --java-options "-Xmx${avail_mem}g" DenoiseReadCounts \\ From d096a55d55dd9e2c1dbbd9cf9bd07ec40f42f446 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Mon, 28 Mar 2022 13:51:16 +0200 Subject: [PATCH 0378/1169] Updates gens container version --- modules/local/gens/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index f1d22838..9ea940b4 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -4,8 +4,8 @@ process GENS { //conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'raysloks/gens_preproc:1.0.0' : - 'raysloks/gens_preproc:1.0.0' }" + 'raysloks/gens_preproc:1.0.1' : + 'raysloks/gens_preproc:1.0.1' }" input: tuple val(meta), path(read_counts) From 1aeab1c9959fdb8a8511109d5726fbd6570417a4 Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 30 Mar 2022 17:49:05 +0200 Subject: [PATCH 0379/1169] added cnvpytor subworkflow --- conf/modules.config | 16 ++++++ modules.json | 14 ++++- .../nf-core/modules/cnvpytor/callcnvs/main.nf | 33 ++++++++++++ .../modules/cnvpytor/callcnvs/meta.yml | 39 ++++++++++++++ .../modules/cnvpytor/histogram/main.nf | 32 +++++++++++ .../modules/cnvpytor/histogram/meta.yml | 42 +++++++++++++++ .../modules/cnvpytor/importreaddepth/main.nf | 38 +++++++++++++ .../modules/cnvpytor/importreaddepth/meta.yml | 54 +++++++++++++++++++ .../modules/cnvpytor/partition/main.nf | 32 +++++++++++ .../modules/cnvpytor/partition/meta.yml | 42 +++++++++++++++ subworkflows/nf-core/call_cnv_cnvpytor.nf | 41 ++++++++++++++ .../nf-core/call_structural_variants.nf | 10 ++++ 12 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/modules/cnvpytor/callcnvs/main.nf create mode 100644 modules/nf-core/modules/cnvpytor/callcnvs/meta.yml create mode 100644 modules/nf-core/modules/cnvpytor/histogram/main.nf create mode 100644 modules/nf-core/modules/cnvpytor/histogram/meta.yml create mode 100644 modules/nf-core/modules/cnvpytor/importreaddepth/main.nf create mode 100644 modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml create mode 100644 modules/nf-core/modules/cnvpytor/partition/main.nf create mode 100644 modules/nf-core/modules/cnvpytor/partition/meta.yml create mode 100644 subworkflows/nf-core/call_cnv_cnvpytor.nf diff --git a/conf/modules.config b/conf/modules.config index 50f53e4d..2194309f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -190,6 +190,22 @@ process { mode: params.publish_dir_mode, ] } + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:GENERATE_PYTOR" { + ext.args = {params.cnvpytor_chr ? "-chrom ${params.cnvpytor_chr}" : '' } + } + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:HISTOGRAMS" { + ext.args = '10000 100000' + } + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:PARTITIONS" { + ext.args = '10000 100000' + } + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:CALL_CNVS" { + ext.args = '10000' + publishDir = [ + path: { "${params.outdir}/sv_caller" }, + mode: params.publish_dir_mode, + ] + } // NF-CORE Subworkflows // ALIGN_BWAMEM2 withName: BWAMEM2_MEM { diff --git a/modules.json b/modules.json index ef781076..de04eb8d 100644 --- a/modules.json +++ b/modules.json @@ -15,6 +15,18 @@ "cat/cat": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, + "cnvpytor/callcnvs": { + "git_sha": "f0800157544a82ae222931764483331a81812012" + }, + "cnvpytor/histogram": { + "git_sha": "f0800157544a82ae222931764483331a81812012" + }, + "cnvpytor/importreaddepth": { + "git_sha": "f0800157544a82ae222931764483331a81812012" + }, + "cnvpytor/partition": { + "git_sha": "f0800157544a82ae222931764483331a81812012" + }, "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, @@ -98,4 +110,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf new file mode 100644 index 00000000..1d47ce16 --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf @@ -0,0 +1,33 @@ +process CNVPYTOR_CALLCNVS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/cnvpytor:A1.0--py39h6a678da_2': + 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" + + input: + tuple val(meta), path(pytor) + + output: + tuple val(meta), path("*.tsv"), emit: cnvs + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '1000' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + cnvpytor \\ + -root $pytor \\ + -call $args > ${prefix}.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/meta.yml b/modules/nf-core/modules/cnvpytor/callcnvs/meta.yml new file mode 100644 index 00000000..edfc462a --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/callcnvs/meta.yml @@ -0,0 +1,39 @@ +name: cnvpytor_callcnvs +description: command line tool for calling CNVs in whole genome sequencing data + - CNV calling +tools: + - cnvpytor: + description: calling CNVs using read depth + homepage: https://github.com/abyzovlab/CNVpytor + documentation: https://github.com/abyzovlab/CNVpytor + tool_dev_url: https://github.com/abyzovlab/CNVpytor + doi: "10.1101/2021.01.27.428472v1" + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - pytor: + type: file + description: cnvpytor root file + pattern: "*.{pytor}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - cnvs: + type: file + description: file containing identified copy numer variations + pattern: "*.{tsv}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@sima-r" diff --git a/modules/nf-core/modules/cnvpytor/histogram/main.nf b/modules/nf-core/modules/cnvpytor/histogram/main.nf new file mode 100644 index 00000000..29dc1bff --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/histogram/main.nf @@ -0,0 +1,32 @@ +process CNVPYTOR_HISTOGRAM { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/cnvpytor:A1.0--py39h6a678da_2': + 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" + + input: + tuple val(meta), path(pytor) + + output: + tuple val(meta), path("${pytor.baseName}.pytor") , emit: pytor + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '1000' + """ + cnvpytor \\ + -root $pytor \\ + -his $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/cnvpytor/histogram/meta.yml b/modules/nf-core/modules/cnvpytor/histogram/meta.yml new file mode 100644 index 00000000..fcad2221 --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/histogram/meta.yml @@ -0,0 +1,42 @@ +name: cnvpytor_histogram +description: calculates read depth histograms +keywords: + - cnv calling + - histogram +tools: + - cnvpytor: + description: calling CNVs using read depth + homepage: https://github.com/abyzovlab/CNVpytor + documentation: https://github.com/abyzovlab/CNVpytor + tool_dev_url: https://github.com/abyzovlab/CNVpytor + doi: "10.1101/2021.01.27.428472v1" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - pytor: + type: file + description: pytor file containing read depth data + pattern: "*.{pytor}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - pytor: + type: file + description: pytor file containing read depth histograms binned based on given bin size(s) + pattern: "*.{pytor}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@sima-r" diff --git a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf new file mode 100644 index 00000000..9fc7db08 --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf @@ -0,0 +1,38 @@ +process CNVPYTOR_IMPORTREADDEPTH { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/cnvpytor:A1.0--py39h6a678da_2': + 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" + + input: + tuple val(meta), path(input_file), path(index) + path fasta + path fai + + output: + tuple val(meta), path("*.pytor") , emit: pytor + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "-T ${fasta}" : '' + """ + cnvpytor \\ + -root ${prefix}.pytor \\ + -rd $input_file \\ + $args \\ + $reference + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml b/modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml new file mode 100644 index 00000000..1cf3c0d0 --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml @@ -0,0 +1,54 @@ +name: cnvpytor_importreaddepth +description: command line tool for CNV/CNA analysis. This step imports the read depth data into a root pytor file. +keywords: + - read depth + - cnv calling +tools: + - cnvpytor -rd: + description: calling CNVs using read depth + homepage: https://github.com/abyzovlab/CNVpytor + documentation: https://github.com/abyzovlab/CNVpytor + tool_dev_url: https://github.com/abyzovlab/CNVpytor + doi: "10.1101/2021.01.27.428472v1" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - input_file: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram}" + - index: + type: file + description: bam file index + pattern: "*.{bai,crai}" + - fasta: + type: file + description: specifies reference genome file (only for cram file without reference genome) + pattern: "*.{fasta,fasta.gz,fa,fa.gz}" + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fai" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - pytor: + type: file + description: read depth root file in which read depth data binned to 100 base pair bins will be stored. + pattern: "*.{pytor}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@sima-r" diff --git a/modules/nf-core/modules/cnvpytor/partition/main.nf b/modules/nf-core/modules/cnvpytor/partition/main.nf new file mode 100644 index 00000000..e3f73955 --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/partition/main.nf @@ -0,0 +1,32 @@ +process CNVPYTOR_PARTITION { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/cnvpytor:A1.0--py39h6a678da_2': + 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" + + input: + tuple val(meta), path(pytor) + + output: + tuple val(meta), path("${pytor.baseName}.pytor"), emit: pytor + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '1000' + """ + cnvpytor \\ + -root $pytor \\ + -partition $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/cnvpytor/partition/meta.yml b/modules/nf-core/modules/cnvpytor/partition/meta.yml new file mode 100644 index 00000000..a72cea4c --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/partition/meta.yml @@ -0,0 +1,42 @@ +name: cnvpytor_partition +description: partitioning read depth histograms +keywords: + - cnv calling + - partition histograms +tools: + - cnvpytor: + description: calling CNVs using read depth + homepage: https://github.com/abyzovlab/CNVpytor + documentation: https://github.com/abyzovlab/CNVpytor + tool_dev_url: https://github.com/abyzovlab/CNVpytor + doi: "10.1101/2021.01.27.428472v1" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - pytor: + type: file + description: pytor file containing read depth data + pattern: "*.{pytor}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - partitions: + type: file + description: pytor file containing partitions of read depth histograms using mean-shift method + pattern: "*.{pytor}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@sima-r" diff --git a/subworkflows/nf-core/call_cnv_cnvpytor.nf b/subworkflows/nf-core/call_cnv_cnvpytor.nf new file mode 100644 index 00000000..886d7b42 --- /dev/null +++ b/subworkflows/nf-core/call_cnv_cnvpytor.nf @@ -0,0 +1,41 @@ +// +// CNVpytor workflow - Calling CNVs +// + +include { CNVPYTOR_IMPORTREADDEPTH as GENERATE_PYTOR } from '../../modules/nf-core/modules/cnvpytor/importreaddepth/main' +include { CNVPYTOR_HISTOGRAM as HISTOGRAMS } from '../../modules/nf-core/modules/cnvpytor/histogram/main' +include { CNVPYTOR_PARTITION as PARTITIONS } from '../../modules/nf-core/modules/cnvpytor/partition/main' +include { CNVPYTOR_CALLCNVS as CALL_CNVS } from '../../modules/nf-core/modules/cnvpytor/callcnvs/main' + +workflow CALL_CNV_CNVPYTOR { + take: + bam // channel: [ val(meta), path(bam)] + bai // channel: [ val(meta), path(bai) ] + case_info // channel: [ case_id ] + + + main: + bam.collect{it[1]} + .toList() + .set { bam_file_list } + + bai.collect{it[1]} + .toList() + .set { bai_file_list } + + case_info.combine(bam_file_list) + .combine(bai_file_list) + .set { cnvpytor_input_bams } + + GENERATE_PYTOR(cnvpytor_input_bams,[],[]) + HISTOGRAMS(GENERATE_PYTOR.out.pytor) + PARTITIONS(HISTOGRAMS.out.pytor) + CALL_CNVS(PARTITIONS.out.pytor) + ch_versions = ch_versions.mix(CALL_CNVS.out.versions) + //TO DO : tsv2vcf + + emit: + candidate_cnvs_tsv = CALL_CNVS.out.cnvs // channel: [ val(meta), path(*.tsv) ] + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} + diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index d781d04f..a7a0e731 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -5,6 +5,7 @@ include { CALL_SV_MANTA } from './call_sv_manta' include { CALL_SV_TIDDIT } from './call_sv_tiddit' include { SVDB_MERGE } from '../../modules/nf-core/modules/svdb/merge/main' +include { CALL_CNV_CNVPYTOR } from './call_cnv_cnvpytor' workflow CALL_STRUCTURAL_VARIANTS { @@ -44,6 +45,15 @@ workflow CALL_STRUCTURAL_VARIANTS { SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta"] ) + //cnvpytor + CALL_CNV_CNVPYTOR ( bam, bai, case_info ) + .candidate_cnvs_tsv + .collect{it[1]} + .set {cnvpytor_tsv } + ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) + + + emit: versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] From 892c629950516697fc44588e7feff78e31cf933a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:56:29 +0200 Subject: [PATCH 0380/1169] add params and fix channels --- nextflow.config | 3 +++ nextflow_schema.json | 14 ++++++++++++ subworkflows/nf-core/call_cnv_cnvpytor.nf | 26 +++++++---------------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/nextflow.config b/nextflow.config index 969fa086..93aa5fbc 100644 --- a/nextflow.config +++ b/nextflow.config @@ -26,6 +26,9 @@ params { // Alignment aligner = 'bwamem2' + // CNVpytor + cnvpytor_chr = null + // MultiQC options multiqc_config = null multiqc_title = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 24d18b4a..80ded6b6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -169,6 +169,20 @@ } } }, + "sv_caller_options": { + "title": "Structural variant calling options", + "type": "object", + "fa_icon": "fas fa-map-signs", + "description": "Options to adjust parameters and filtering criteria for structural variant callers.", + "properties": { + "aligner": { + "type": "string", + "default": null, + "description": "Specifies the alignment algorithm to use - available options are 'bwamem2'.", + "fa_icon": "fas fa-map-signs" + } + } + }, "institutional_config_options": { "title": "Institutional config options", "type": "object", diff --git a/subworkflows/nf-core/call_cnv_cnvpytor.nf b/subworkflows/nf-core/call_cnv_cnvpytor.nf index 886d7b42..2ae9e69a 100644 --- a/subworkflows/nf-core/call_cnv_cnvpytor.nf +++ b/subworkflows/nf-core/call_cnv_cnvpytor.nf @@ -3,31 +3,21 @@ // include { CNVPYTOR_IMPORTREADDEPTH as GENERATE_PYTOR } from '../../modules/nf-core/modules/cnvpytor/importreaddepth/main' -include { CNVPYTOR_HISTOGRAM as HISTOGRAMS } from '../../modules/nf-core/modules/cnvpytor/histogram/main' -include { CNVPYTOR_PARTITION as PARTITIONS } from '../../modules/nf-core/modules/cnvpytor/partition/main' -include { CNVPYTOR_CALLCNVS as CALL_CNVS } from '../../modules/nf-core/modules/cnvpytor/callcnvs/main' +include { CNVPYTOR_HISTOGRAM as HISTOGRAMS } from '../../modules/nf-core/modules/cnvpytor/histogram/main' +include { CNVPYTOR_PARTITION as PARTITIONS } from '../../modules/nf-core/modules/cnvpytor/partition/main' +include { CNVPYTOR_CALLCNVS as CALL_CNVS } from '../../modules/nf-core/modules/cnvpytor/callcnvs/main' workflow CALL_CNV_CNVPYTOR { take: - bam // channel: [ val(meta), path(bam)] - bai // channel: [ val(meta), path(bai) ] - case_info // channel: [ case_id ] + bam // channel: [ val(meta), path(bam)] + bai // channel: [ val(meta), path(bai) ] + case_info // channel: [ case_id ] main: - bam.collect{it[1]} - .toList() - .set { bam_file_list } + ch_versions = Channel.empty() - bai.collect{it[1]} - .toList() - .set { bai_file_list } - - case_info.combine(bam_file_list) - .combine(bai_file_list) - .set { cnvpytor_input_bams } - - GENERATE_PYTOR(cnvpytor_input_bams,[],[]) + GENERATE_PYTOR(bam.join(bai, by: [0]),[],[]) HISTOGRAMS(GENERATE_PYTOR.out.pytor) PARTITIONS(HISTOGRAMS.out.pytor) CALL_CNVS(PARTITIONS.out.pytor) From bdaf63d68483aff41218a15d48ab4de06256f986 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:58:31 +0200 Subject: [PATCH 0381/1169] update cnvpytor --- modules.json | 8 ++++---- modules/nf-core/modules/cnvpytor/callcnvs/main.nf | 2 +- modules/nf-core/modules/cnvpytor/histogram/main.nf | 2 +- modules/nf-core/modules/cnvpytor/importreaddepth/main.nf | 2 +- modules/nf-core/modules/cnvpytor/partition/main.nf | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules.json b/modules.json index de04eb8d..70521c04 100644 --- a/modules.json +++ b/modules.json @@ -16,16 +16,16 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "cnvpytor/callcnvs": { - "git_sha": "f0800157544a82ae222931764483331a81812012" + "git_sha": "233f2e728b175d8d3c398ce6dd052c6a14a3aeb7" }, "cnvpytor/histogram": { - "git_sha": "f0800157544a82ae222931764483331a81812012" + "git_sha": "233f2e728b175d8d3c398ce6dd052c6a14a3aeb7" }, "cnvpytor/importreaddepth": { - "git_sha": "f0800157544a82ae222931764483331a81812012" + "git_sha": "233f2e728b175d8d3c398ce6dd052c6a14a3aeb7" }, "cnvpytor/partition": { - "git_sha": "f0800157544a82ae222931764483331a81812012" + "git_sha": "233f2e728b175d8d3c398ce6dd052c6a14a3aeb7" }, "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf index 1d47ce16..e296656b 100644 --- a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf +++ b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf @@ -4,7 +4,7 @@ process CNVPYTOR_CALLCNVS { conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:A1.0--py39h6a678da_2': + 'https://depot.galaxyproject.org/singularity/cnvpytor:1.0--py39h6a678da_2': 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" input: diff --git a/modules/nf-core/modules/cnvpytor/histogram/main.nf b/modules/nf-core/modules/cnvpytor/histogram/main.nf index 29dc1bff..e421f1b2 100644 --- a/modules/nf-core/modules/cnvpytor/histogram/main.nf +++ b/modules/nf-core/modules/cnvpytor/histogram/main.nf @@ -4,7 +4,7 @@ process CNVPYTOR_HISTOGRAM { conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:A1.0--py39h6a678da_2': + 'https://depot.galaxyproject.org/singularity/cnvpytor:1.0--py39h6a678da_2': 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" input: diff --git a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf index 9fc7db08..1b037629 100644 --- a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf +++ b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf @@ -4,7 +4,7 @@ process CNVPYTOR_IMPORTREADDEPTH { conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:A1.0--py39h6a678da_2': + 'https://depot.galaxyproject.org/singularity/cnvpytor:1.0--py39h6a678da_2': 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" input: diff --git a/modules/nf-core/modules/cnvpytor/partition/main.nf b/modules/nf-core/modules/cnvpytor/partition/main.nf index e3f73955..74ab4026 100644 --- a/modules/nf-core/modules/cnvpytor/partition/main.nf +++ b/modules/nf-core/modules/cnvpytor/partition/main.nf @@ -4,7 +4,7 @@ process CNVPYTOR_PARTITION { conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:A1.0--py39h6a678da_2': + 'https://depot.galaxyproject.org/singularity/cnvpytor:1.0--py39h6a678da_2': 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" input: From 81f247ff0d279578b9d972d1499f6d0a8cce03ca Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 31 Mar 2022 11:33:26 +0200 Subject: [PATCH 0382/1169] fix indentation --- subworkflows/nf-core/call_structural_variants.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index a7a0e731..6d909ebb 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -2,9 +2,9 @@ // A nested subworkflow to call structural variants. // -include { CALL_SV_MANTA } from './call_sv_manta' -include { CALL_SV_TIDDIT } from './call_sv_tiddit' -include { SVDB_MERGE } from '../../modules/nf-core/modules/svdb/merge/main' +include { CALL_SV_MANTA } from './call_sv_manta' +include { CALL_SV_TIDDIT } from './call_sv_tiddit' +include { SVDB_MERGE } from '../../modules/nf-core/modules/svdb/merge/main' include { CALL_CNV_CNVPYTOR } from './call_cnv_cnvpytor' workflow CALL_STRUCTURAL_VARIANTS { From b1fefaec29c55eafc6f886bb8e7c3e0cf0803b68 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:50:32 +0200 Subject: [PATCH 0383/1169] update modules --- modules.json | 60 ++++++++-------- modules/nf-core/modules/bcftools/norm/main.nf | 11 +++ modules/nf-core/modules/bwamem2/index/main.nf | 15 ++++ modules/nf-core/modules/bwamem2/mem/main.nf | 17 ++++- modules/nf-core/modules/cat/cat/main.nf | 32 ++++++--- modules/nf-core/modules/cat/cat/meta.yml | 9 ++- modules/nf-core/modules/deepvariant/main.nf | 18 ++++- .../nf-core/modules/expansionhunter/main.nf | 11 +++ modules/nf-core/modules/fastqc/main.nf | 12 ++++ .../modules/gatk4/bedtointervallist/main.nf | 11 +++ .../gatk4/createsequencedictionary/main.nf | 10 +++ .../modules/gatk4/intervallisttools/main.nf | 18 +++++ modules/nf-core/modules/glnexus/main.nf | 11 +++ .../nf-core/modules/manta/germline/meta.yml | 16 ++--- modules/nf-core/modules/multiqc/main.nf | 12 ++++ .../modules/picard/collecthsmetrics/main.nf | 11 +++ .../picard/collectmultiplemetrics/main.nf | 20 ++++++ .../modules/picard/markduplicates/main.nf | 13 ++++ .../nf-core/modules/qualimap/bamqc/main.nf | 68 +++++++++++++++++++ .../nf-core/modules/samtools/faidx/main.nf | 16 ++++- .../nf-core/modules/samtools/index/main.nf | 18 ++++- .../nf-core/modules/samtools/merge/main.nf | 18 ++++- .../nf-core/modules/samtools/stats/main.nf | 17 ++++- modules/nf-core/modules/svdb/merge/main.nf | 7 +- .../nf-core/modules/tabix/bgziptabix/main.nf | 12 ++++ modules/nf-core/modules/tabix/tabix/main.nf | 11 +++ modules/nf-core/modules/tiddit/cov/main.nf | 12 ++++ modules/nf-core/modules/tiddit/sv/main.nf | 13 ++++ .../nf-core/modules/ucsc/wigtobigwig/main.nf | 11 +++ modules/nf-core/modules/untar/main.nf | 23 +++++-- modules/nf-core/modules/untar/meta.yml | 10 +++ modules/nf-core/modules/vcfanno/main.nf | 11 +++ 32 files changed, 477 insertions(+), 77 deletions(-) diff --git a/modules.json b/modules.json index ef781076..3aef3733 100644 --- a/modules.json +++ b/modules.json @@ -4,98 +4,98 @@ "repos": { "nf-core/modules": { "bcftools/norm": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "bwamem2/index": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "bwamem2/mem": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "cat/cat": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641" }, "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "deepvariant": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, "expansionhunter": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "fastqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "gatk4/bedtointervallist": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "gatk4/createsequencedictionary": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, "gatk4/intervallisttools": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "glnexus": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "manta/germline": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, "mosdepth": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "multiqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/collecthsmetrics": { - "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/collectmultiplemetrics": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/markduplicates": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "qualimap/bamqc": { - "git_sha": "e31f1ff3b1375b30db08637d8937e25cc046f3cc" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "samtools/faidx": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "samtools/index": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "samtools/merge": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "samtools/stats": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "svdb/merge": { - "git_sha": "ee915a43e405324e62ee5d4c14a6a6ec6c610058" + "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" }, "tabix/bgziptabix": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "tabix/tabix": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "tiddit/cov": { - "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, "tiddit/sv": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, "ucsc/wigtobigwig": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "untar": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "vcfanno": { - "git_sha": "2597c31d6bba4a354fc58b535c76bd14aed1c585" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/bcftools/norm/main.nf b/modules/nf-core/modules/bcftools/norm/main.nf index cd681f21..b81a4310 100644 --- a/modules/nf-core/modules/bcftools/norm/main.nf +++ b/modules/nf-core/modules/bcftools/norm/main.nf @@ -34,4 +34,15 @@ process BCFTOOLS_NORM { bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/bwamem2/index/main.nf b/modules/nf-core/modules/bwamem2/index/main.nf index 0e9cc2f8..900f27d4 100644 --- a/modules/nf-core/modules/bwamem2/index/main.nf +++ b/modules/nf-core/modules/bwamem2/index/main.nf @@ -31,4 +31,19 @@ process BWAMEM2_INDEX { bwamem2: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') END_VERSIONS """ + + stub: + """ + mkdir bwamem2 + touch bwamem2/${fasta}.0123 + touch bwamem2/${fasta}.ann + touch bwamem2/${fasta}.pac + touch bwamem2/${fasta}.amb + touch bwamem2/${fasta}.bwt.2bit.64 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bwamem2: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/bwamem2/mem/main.nf b/modules/nf-core/modules/bwamem2/mem/main.nf index 56f595ec..e3a3d164 100644 --- a/modules/nf-core/modules/bwamem2/mem/main.nf +++ b/modules/nf-core/modules/bwamem2/mem/main.nf @@ -2,10 +2,10 @@ process BWAMEM2_MEM { tag "$meta.id" label 'process_high' - conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.12" : null) + conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:cf603b12db30ec91daa04ba45a8ee0f35bbcd1e2-0' : - 'quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:cf603b12db30ec91daa04ba45a8ee0f35bbcd1e2-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:8ee25ae85d7a2bacac3e3139db209aff3d605a18-0' : + 'quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:8ee25ae85d7a2bacac3e3139db209aff3d605a18-0' }" input: tuple val(meta), path(reads) @@ -43,4 +43,15 @@ process BWAMEM2_MEM { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bwamem2: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/cat/cat/main.nf b/modules/nf-core/modules/cat/cat/main.nf index 4ee44599..40e53f3e 100644 --- a/modules/nf-core/modules/cat/cat/main.nf +++ b/modules/nf-core/modules/cat/cat/main.nf @@ -1,4 +1,5 @@ process CAT_CAT { + tag "$meta.id" label 'process_low' conda (params.enable_conda ? "conda-forge::pigz=2.3.4" : null) @@ -7,12 +8,11 @@ process CAT_CAT { 'quay.io/biocontainers/pigz:2.3.4' }" input: - path files_in - val file_out + tuple val(meta), path(files_in) output: - path "${file_out}*" , emit: file_out - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}"), emit: file_out + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -29,16 +29,30 @@ process CAT_CAT { // | gzipped | ungzipped | zcat | | // | ungzipped | gzipped | cat | pigz | - def in_zip = file_list[0].endsWith('.gz') - def out_zip = file_out.endsWith('.gz') - def command1 = (in_zip && !out_zip) ? 'zcat' : 'cat' - def command2 = (!in_zip && out_zip) ? "| pigz -c -p $task.cpus $args2" : '' + // Use input file ending as default + prefix = task.ext.prefix ?: "${meta.id}${file_list[0].substring(file_list[0].lastIndexOf('.'))}" + out_zip = prefix.endsWith('.gz') + in_zip = file_list[0].endsWith('.gz') + command1 = (in_zip && !out_zip) ? 'zcat' : 'cat' + command2 = (!in_zip && out_zip) ? "| pigz -c -p $task.cpus $args2" : '' """ $command1 \\ $args \\ ${file_list.join(' ')} \\ $command2 \\ - > $file_out + > ${prefix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) + END_VERSIONS + """ + + stub: + def file_list = files_in.collect { it.toString() } + prefix = task.ext.prefix ?: "${meta.id}${file_list[0].substring(file_list[0].lastIndexOf('.'))}" + """ + touch $prefix cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/cat/cat/meta.yml b/modules/nf-core/modules/cat/cat/meta.yml index e0a6361d..5eeff5a6 100644 --- a/modules/nf-core/modules/cat/cat/meta.yml +++ b/modules/nf-core/modules/cat/cat/meta.yml @@ -12,13 +12,15 @@ tools: tool_dev_url: None licence: ["GPL-3.0-or-later"] input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - files_in: type: file description: List of compressed / uncompressed files pattern: "*" - - file_out: - type: value - description: Full name of output file with or without .gz extension output: - versions: @@ -32,3 +34,4 @@ output: authors: - "@erikrikarddaniel" + - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/deepvariant/main.nf b/modules/nf-core/modules/deepvariant/main.nf index c5e81997..e2a0bee7 100644 --- a/modules/nf-core/modules/deepvariant/main.nf +++ b/modules/nf-core/modules/deepvariant/main.nf @@ -17,8 +17,8 @@ process DEEPVARIANT { path(fai) output: - tuple val(meta), path("*.vcf.gz") , emit: vcf - tuple val(meta), path("*g.vcf.gz"), emit: gvcf + tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf + tuple val(meta), path("${prefix}.g.vcf.gz"), emit: gvcf path "versions.yml" , emit: versions when: @@ -26,7 +26,7 @@ process DEEPVARIANT { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" def regions = intervals ? "--regions ${intervals}" : "" """ @@ -44,4 +44,16 @@ process DEEPVARIANT { deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' ) END_VERSIONS """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + touch ${prefix}.g.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/expansionhunter/main.nf b/modules/nf-core/modules/expansionhunter/main.nf index 4e62b2a6..f60b75b4 100644 --- a/modules/nf-core/modules/expansionhunter/main.nf +++ b/modules/nf-core/modules/expansionhunter/main.nf @@ -37,4 +37,15 @@ process EXPANSIONHUNTER { expansionhunter: \$( echo \$(ExpansionHunter --version 2>&1) | sed 's/^.*ExpansionHunter v//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + expansionhunter: \$( echo \$(ExpansionHunter --version 2>&1) | sed 's/^.*ExpansionHunter v//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index ed6b8c50..05730368 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -44,4 +44,16 @@ process FASTQC { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.html + touch ${prefix}.zip + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf index 74256dd1..c3b624a8 100644 --- a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf +++ b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf @@ -39,4 +39,15 @@ process GATK4_BEDTOINTERVALLIST { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.interval_list + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf index 87d52a59..dea77a1d 100644 --- a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf +++ b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf @@ -37,4 +37,14 @@ process GATK4_CREATESEQUENCEDICTIONARY { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + """ + touch test.dict + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/gatk4/intervallisttools/main.nf b/modules/nf-core/modules/gatk4/intervallisttools/main.nf index 352a3240..82c3222c 100644 --- a/modules/nf-core/modules/gatk4/intervallisttools/main.nf +++ b/modules/nf-core/modules/gatk4/intervallisttools/main.nf @@ -51,4 +51,22 @@ process GATK4_INTERVALLISTTOOLS { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir -p ${prefix}_split/temp_0001_of_6 + mkdir -p ${prefix}_split/temp_0002_of_6 + mkdir -p ${prefix}_split/temp_0003_of_6 + mkdir -p ${prefix}_split/temp_0004_of_6 + touch ${prefix}_split/temp_0001_of_6/1scattered.interval_list + touch ${prefix}_split/temp_0002_of_6/2scattered.interval_list + touch ${prefix}_split/temp_0003_of_6/3scattered.interval_list + touch ${prefix}_split/temp_0004_of_6/4scattered.interval_list + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/glnexus/main.nf b/modules/nf-core/modules/glnexus/main.nf index 84da95a0..a26ab4ce 100644 --- a/modules/nf-core/modules/glnexus/main.nf +++ b/modules/nf-core/modules/glnexus/main.nf @@ -42,4 +42,15 @@ process GLNEXUS { glnexus: \$( echo \$(glnexus_cli 2>&1) | head -n 1 | sed 's/^.*release v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + glnexus: \$( echo \$(glnexus_cli 2>&1) | head -n 1 | sed 's/^.*release v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/manta/germline/meta.yml b/modules/nf-core/modules/manta/germline/meta.yml index d6297ead..b719f075 100644 --- a/modules/nf-core/modules/manta/germline/meta.yml +++ b/modules/nf-core/modules/manta/germline/meta.yml @@ -31,14 +31,6 @@ input: type: file description: BAM/CRAM/SAM index file. For joint calling use a list of files. pattern: "*.{bai,crai,sai}" - - fasta: - type: file - description: Genome reference FASTA file - pattern: "*.{fa,fasta}" - - fasta_fai: - type: file - description: Genome reference FASTA index file - pattern: "*.{fa.fai,fasta.fai}" - target_bed: type: file description: BED file containing target regions for variant calling @@ -47,6 +39,14 @@ input: type: file description: Index for BED file containing target regions for variant calling pattern: "*.{bed.tbi}" + - fasta: + type: file + description: Genome reference FASTA file + pattern: "*.{fa,fasta}" + - fasta_fai: + type: file + description: Genome reference FASTA index file + pattern: "*.{fa.fai,fasta.fai}" output: - meta: diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 1264aac1..ae019dbf 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -28,4 +28,16 @@ process MULTIQC { multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) END_VERSIONS """ + + stub: + """ + touch multiqc_data + touch multiqc_plots + touch multiqc_report.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/picard/collecthsmetrics/main.nf b/modules/nf-core/modules/picard/collecthsmetrics/main.nf index 07e8504f..3acf8bb8 100644 --- a/modules/nf-core/modules/picard/collecthsmetrics/main.nf +++ b/modules/nf-core/modules/picard/collecthsmetrics/main.nf @@ -48,4 +48,15 @@ process PICARD_COLLECTHSMETRICS { picard: \$(echo \$(picard CollectHsMetrics --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_collecthsmetrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard CollectHsMetrics --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index e023ea3c..340463a8 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -42,4 +42,24 @@ process PICARD_COLLECTMULTIPLEMETRICS { picard: \$(picard CollectMultipleMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.CollectMultipleMetrics.alignment_summary_metrics + touch ${prefix}.CollectMultipleMetrics.insert_size_metrics + touch ${prefix}.CollectMultipleMetrics.quality_distribution.pdf + touch ${prefix}.CollectMultipleMetrics.base_distribution_by_cycle_metrics + touch ${prefix}.CollectMultipleMetrics.quality_by_cycle_metrics + touch ${prefix}.CollectMultipleMetrics.read_length_histogram.pdf + touch ${prefix}.CollectMultipleMetrics.base_distribution_by_cycle.pdf + touch ${prefix}.CollectMultipleMetrics.quality_by_cycle.pdf + touch ${prefix}.CollectMultipleMetrics.insert_size_histogram.pdf + touch ${prefix}.CollectMultipleMetrics.quality_distribution_metrics + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard CollectMultipleMetrics --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index 5196b6ed..e754a587 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -42,4 +42,17 @@ process PICARD_MARKDUPLICATES { picard: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + touch ${prefix}.bam.bai + touch ${prefix}.MarkDuplicates.metrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/qualimap/bamqc/main.nf b/modules/nf-core/modules/qualimap/bamqc/main.nf index 92f38f8c..3bfcb4c1 100644 --- a/modules/nf-core/modules/qualimap/bamqc/main.nf +++ b/modules/nf-core/modules/qualimap/bamqc/main.nf @@ -52,4 +52,72 @@ process QUALIMAP_BAMQC { qualimap: \$(echo \$(qualimap 2>&1) | sed 's/^.*QualiMap v.//; s/Built.*\$//') END_VERSIONS """ + + stub: + prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" + """ + mkdir -p $prefix/css + mkdir $prefix/images_qualimapReport + mkdir $prefix/raw_data_qualimapReport + cd $prefix/css + touch agogo.css + touch basic.css + touch bgtop.png + touch comment-close.png + touch doctools.js + touch down-pressed.png + touch jquery.js + touch plus.png + touch qualimap_logo_small.png + touch searchtools.js + touch up.png + touch websupport.js + touch ajax-loader.gif + touch bgfooter.png + touch comment-bright.png + touch comment.png + touch down.png + touch file.png + touch minus.png + touch pygments.css + touch report.css + touch underscore.js + touch up-pressed.png + cd ../images_qualimapReport/ + touch genome_coverage_0to50_histogram.png + touch genome_coverage_quotes.png + touch genome_insert_size_across_reference.png + touch genome_mapping_quality_histogram.png + touch genome_uniq_read_starts_histogram.png + touch genome_coverage_across_reference.png + touch genome_gc_content_per_window.png + touch genome_insert_size_histogram.png + touch genome_reads_clipping_profile.png + touch genome_coverage_histogram.png + touch genome_homopolymer_indels.png + touch genome_mapping_quality_across_reference.png + touch genome_reads_content_per_read_position.png + cd ../raw_data_qualimapReport + touch coverage_across_reference.txt + touch genome_fraction_coverage.txt + touch insert_size_histogram.txt + touch mapped_reads_nucleotide_content.txt + touch coverage_histogram.txt + touch homopolymer_indels.txt + touch mapped_reads_clipping_profile.txt + touch mapping_quality_across_reference.txt + touch duplication_rate_histogram.txt + touch insert_size_across_reference.txt + touch mapped_reads_gc-content_distribution.txt + touch mapping_quality_histogram.txt + cd ../ + touch genome_results.txt + touch qualimapReport.html + cd ../ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + qualimap: \$(echo \$(qualimap 2>&1) | sed 's/^.*QualiMap v.//; s/Built.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/modules/samtools/faidx/main.nf index b83a4952..053279ff 100644 --- a/modules/nf-core/modules/samtools/faidx/main.nf +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_FAIDX { tag "$fasta" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: tuple val(meta), path(fasta) @@ -29,4 +29,14 @@ process SAMTOOLS_FAIDX { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + """ + touch ${fasta}.fai + cat <<-END_VERSIONS > versions.yml + + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index dfe0234f..fff6e1b8 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: tuple val(meta), path(input) @@ -33,4 +33,16 @@ process SAMTOOLS_INDEX { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + """ + touch ${input}.bai + touch ${input}.crai + touch ${input}.csi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/samtools/merge/main.nf b/modules/nf-core/modules/samtools/merge/main.nf index be6fe32e..9f962a4b 100644 --- a/modules/nf-core/modules/samtools/merge/main.nf +++ b/modules/nf-core/modules/samtools/merge/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_MERGE { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: tuple val(meta), path(input_files) @@ -38,4 +38,16 @@ process SAMTOOLS_MERGE { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" + def file_type = input_files[0].getExtension() + """ + touch ${prefix}.${file_type} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index f6fe3bfe..85cb64f3 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_STATS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: tuple val(meta), path(input), path(input_index) @@ -34,4 +34,15 @@ process SAMTOOLS_STATS { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${input}.stats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 505e2c0b..4a39940c 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -2,10 +2,10 @@ process SVDB_MERGE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.5.0" : null) + conda (params.enable_conda ? "bioconda::svdb=2.6.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.5.0--py39hcbe4a3b_0': - 'quay.io/biocontainers/svdb:2.5.0--py39hcbe4a3b_0' }" + 'https://depot.galaxyproject.org/singularity/svdb:2.6.0--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.6.0--py39h5371cbf_0' }" input: tuple val(meta), path(vcfs) @@ -25,6 +25,7 @@ process SVDB_MERGE { def prio = "" if(priority) { prio = "--priority ${priority.join(',')}" + input = "" for (int index = 0; index < vcfs.size(); index++) { input += " ${vcfs[index]}:${priority[index]}" } diff --git a/modules/nf-core/modules/tabix/bgziptabix/main.nf b/modules/nf-core/modules/tabix/bgziptabix/main.nf index 12657599..77fd91a5 100644 --- a/modules/nf-core/modules/tabix/bgziptabix/main.nf +++ b/modules/nf-core/modules/tabix/bgziptabix/main.nf @@ -30,4 +30,16 @@ process TABIX_BGZIPTABIX { tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.gz + touch ${prefix}.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/tabix/tabix/main.nf b/modules/nf-core/modules/tabix/tabix/main.nf index 5f516261..c9dab068 100644 --- a/modules/nf-core/modules/tabix/tabix/main.nf +++ b/modules/nf-core/modules/tabix/tabix/main.nf @@ -27,4 +27,15 @@ process TABIX_TABIX { tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${tab}.tbi + cat <<-END_VERSIONS > versions.yml + + "${task.process}": + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/tiddit/cov/main.nf b/modules/nf-core/modules/tiddit/cov/main.nf index a5f8c649..578c4043 100644 --- a/modules/nf-core/modules/tiddit/cov/main.nf +++ b/modules/nf-core/modules/tiddit/cov/main.nf @@ -36,4 +36,16 @@ process TIDDIT_COV { tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.wig + touch ${prefix}.tab + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/tiddit/sv/main.nf b/modules/nf-core/modules/tiddit/sv/main.nf index 454dfc54..1bf7146a 100644 --- a/modules/nf-core/modules/tiddit/sv/main.nf +++ b/modules/nf-core/modules/tiddit/sv/main.nf @@ -38,4 +38,17 @@ process TIDDIT_SV { tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf + touch ${prefix}.ploidy.tab + touch ${prefix}.signals.tab + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf index d07e7ec1..2af7190b 100644 --- a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf +++ b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf @@ -35,4 +35,15 @@ process UCSC_WIGTOBIGWIG { ucsc: $VERSION END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bw + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ucsc: $VERSION + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index 01205e60..5aa6aa7f 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -2,25 +2,25 @@ process UNTAR { tag "$archive" label 'process_low' - conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + conda (params.enable_conda ? "conda-forge::tar=1.32" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : 'biocontainers/biocontainers:v1.2.0_cv1' }" input: - path archive + tuple val(meta), path(archive) output: - path "$untar" , emit: untar - path "versions.yml", emit: versions + tuple val(meta), path("$untar"), emit: untar + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' - untar = archive.toString() - '.tar.gz' + untar = archive.toString() - '.tar.gz' """ tar \\ -xzvf \\ @@ -33,4 +33,15 @@ process UNTAR { untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') END_VERSIONS """ + + stub: + untar = archive.toString() - '.tar.gz' + """ + touch $untar + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/modules/untar/meta.yml index e877a97c..d426919b 100644 --- a/modules/nf-core/modules/untar/meta.yml +++ b/modules/nf-core/modules/untar/meta.yml @@ -10,11 +10,21 @@ tools: documentation: https://www.gnu.org/software/tar/manual/ licence: ["GPL-3.0-or-later"] input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - archive: type: file description: File to be untar pattern: "*.{tar}.{gz}" output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - untar: type: file description: diff --git a/modules/nf-core/modules/vcfanno/main.nf b/modules/nf-core/modules/vcfanno/main.nf index 51b1ec5b..bc0514c9 100644 --- a/modules/nf-core/modules/vcfanno/main.nf +++ b/modules/nf-core/modules/vcfanno/main.nf @@ -39,4 +39,15 @@ process VCFANNO { vcfanno: \$(echo \$(vcfanno 2>&1 | grep version | cut -f3 -d' ' )) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_annotated.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + vcfanno: \$(echo \$(vcfanno 2>&1 | grep version | cut -f3 -d' ' )) + END_VERSIONS + """ } From eb3bce37c1e683ac57af93f4c3b4e11c68c05a04 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 31 Mar 2022 14:00:15 +0200 Subject: [PATCH 0384/1169] fix subworkflows to work with stubs --- conf/modules.config | 1 + subworkflows/local/prepare_genome.nf | 6 +++++- subworkflows/nf-core/qc_bam.nf | 20 +++++++++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 50f53e4d..738f4197 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -107,6 +107,7 @@ process { ] } withName: 'CAT_CAT_BAIT' { + ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/processed_references" }, mode: params.publish_dir_mode, diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index b64617f4..a602ab1c 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -38,7 +38,11 @@ workflow PREPARE_GENOME { // Uncompress vcfanno resources if nothing else given if ( params.vcfanno_resources.endsWith('.tar.gz') ) { - ch_vcfanno_resources = UNTAR_VCFANNO ( params.vcfanno_resources ).untar + ch_vcfanno_resources = UNTAR_VCFANNO ( [[],params.vcfanno_resources] ).untar + .map { + id, resources -> + return [resources] + } ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) } else { ch_vcfanno_resources = file(params.vcfanno_resources) diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index b36d928e..5886f123 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -29,16 +29,30 @@ workflow QC_BAM { ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions) // COLLECT HS METRICS - bait_intervals_out = bait_intervals + bait_intervals .collect { it[0] .toString() .split("_split")[0] .split("/")[-1] + "_bait.intervals_list" } .flatten() + .concat(bait_intervals) + .toList() + .map { + id, bait -> + return [['id':id], bait] + } + .set { bait_intervals_cat_in } + + CAT_CAT_BAIT ( bait_intervals_cat_in ) + .file_out + .map { + id, file -> + return [file] + } + .set { bait_intervals_cat_out } - CAT_CAT_BAIT ( bait_intervals, bait_intervals_out ) - PICARD_COLLECTHSMETRICS ( bam, fasta, fai, CAT_CAT_BAIT.out.file_out, target_intervals ) + PICARD_COLLECTHSMETRICS ( bam, fasta, fai, bait_intervals_cat_out, target_intervals ) ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions) // QUALIMAP BAMQC From 8021d2fad42573b54c80f3e9b961493ba4b7efbb Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 31 Mar 2022 14:06:23 +0200 Subject: [PATCH 0385/1169] fix prettier --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 3aef3733..04137834 100644 --- a/modules.json +++ b/modules.json @@ -98,4 +98,4 @@ } } } -} \ No newline at end of file +} From ca46108b8f19773de1c0a3a1e11608b15560afc6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 31 Mar 2022 14:26:00 +0200 Subject: [PATCH 0386/1169] prettier --- modules.json | 2 +- nextflow_schema.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules.json b/modules.json index 70521c04..0ae270e1 100644 --- a/modules.json +++ b/modules.json @@ -110,4 +110,4 @@ } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index 80ded6b6..3faa66df 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -175,10 +175,10 @@ "fa_icon": "fas fa-map-signs", "description": "Options to adjust parameters and filtering criteria for structural variant callers.", "properties": { - "aligner": { + "cnvpytor_chr": { "type": "string", "default": null, - "description": "Specifies the alignment algorithm to use - available options are 'bwamem2'.", + "description": "Specifies the chromosome for cnvpytor run", "fa_icon": "fas fa-map-signs" } } From 69f6ca5b995edd2a58fafa82a0ca61bdec5c1715 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 31 Mar 2022 14:31:02 +0200 Subject: [PATCH 0387/1169] fix lint error --- nextflow_schema.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index 3faa66df..918bc933 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -370,6 +370,9 @@ { "$ref": "#/definitions/alignment_options" }, + { + "$ref": "#/definitions/sv_caller_options" + }, { "$ref": "#/definitions/institutional_config_options" }, From f917d892b86397be921f0a4a13f6ea79d78c43a0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Apr 2022 14:12:33 +0200 Subject: [PATCH 0388/1169] update modules config --- conf/modules.config | 7 ------- 1 file changed, 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index a58c05d0..5a5e766f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -202,13 +202,6 @@ process { enabled: false, ] } - withName: BCFTOOLS_VIEW { - exts.args = '--output-type v --apply-filters PASS --exclude "INFO/clinical_genomics_mipAF > 0.40 | INFO/swegenAF > 0.40 | INFO/clingen_ngiAF > 0.40 | INFO/gnomad_svAF > 0.40 "' - publishDir = [ - path: { "${params.outdir}/sv_annotate" }, - mode: 'copy', - ] - } // NF-CORE Subworkflows // ALIGN_BWAMEM2 withName: BWAMEM2_MEM { From 91ec66e604da04faf581ed1b2e6ef679fe9191f9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Apr 2022 15:06:01 +0200 Subject: [PATCH 0389/1169] update module --- modules.json | 9 ++++++--- modules/nf-core/modules/bcftools/view/main.nf | 11 +++++++++++ modules/nf-core/modules/picard/sortvcf/main.nf | 13 +++++++++++++ modules/nf-core/modules/picard/sortvcf/meta.yml | 2 +- modules/nf-core/modules/svdb/query/main.nf | 7 +++---- 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/modules.json b/modules.json index 881503e5..e48d2958 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "bcftools/view": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "bwamem2/index": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" @@ -61,7 +61,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/sortvcf": { - "git_sha": "d8028dc1c3ef64c2ee3494ce65d4f4a76c42bde9" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "qualimap/bamqc": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" @@ -81,6 +81,9 @@ "svdb/merge": { "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" }, + "svdb/query": { + "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" + }, "tabix/bgziptabix": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, @@ -104,4 +107,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/bcftools/view/main.nf b/modules/nf-core/modules/bcftools/view/main.nf index 2a240f4a..ca1121a5 100644 --- a/modules/nf-core/modules/bcftools/view/main.nf +++ b/modules/nf-core/modules/bcftools/view/main.nf @@ -41,4 +41,15 @@ process BCFTOOLS_VIEW { bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/picard/sortvcf/main.nf b/modules/nf-core/modules/picard/sortvcf/main.nf index 0f10c1ab..4047545e 100644 --- a/modules/nf-core/modules/picard/sortvcf/main.nf +++ b/modules/nf-core/modules/picard/sortvcf/main.nf @@ -46,4 +46,17 @@ process PICARD_SORTVCF { picard: \$(picard SortVcf --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_sorted.vcf.gz + touch ${prefix}.bam.bai + touch ${prefix}.MarkDuplicates.metrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard SortVcf --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/picard/sortvcf/meta.yml b/modules/nf-core/modules/picard/sortvcf/meta.yml index a2b46d5a..f75d3401 100644 --- a/modules/nf-core/modules/picard/sortvcf/meta.yml +++ b/modules/nf-core/modules/picard/sortvcf/meta.yml @@ -8,7 +8,7 @@ tools: description: Java tools for working with NGS data in the BAM/CRAM/SAM and VCF format homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/command-line-overview.html#SortVcf - licence: ['MIT'] + licence: ["MIT"] input: - meta: diff --git a/modules/nf-core/modules/svdb/query/main.nf b/modules/nf-core/modules/svdb/query/main.nf index 37ce432c..c669b5a5 100644 --- a/modules/nf-core/modules/svdb/query/main.nf +++ b/modules/nf-core/modules/svdb/query/main.nf @@ -2,10 +2,10 @@ process SVDB_QUERY { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.5.2" : null) + conda (params.enable_conda ? "bioconda::svdb=2.6.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.5.2--py39h5371cbf_0': - 'quay.io/biocontainers/svdb:2.5.2--py39h5371cbf_0' }" + 'https://depot.galaxyproject.org/singularity/svdb:2.6.0--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.6.0--py39h5371cbf_0' }" input: tuple val(meta), path(vcf) @@ -70,5 +70,4 @@ process SVDB_QUERY { svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) END_VERSIONS """ - } From 806fc71f7128c1c35d6c8a67312219793a4483f1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Apr 2022 15:09:12 +0200 Subject: [PATCH 0390/1169] prettier lint --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index e48d2958..3608aa86 100644 --- a/modules.json +++ b/modules.json @@ -107,4 +107,4 @@ } } } -} \ No newline at end of file +} From 2dec1e348a59b01f96f304c3f29d96c922b6bcdf Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Apr 2022 15:31:12 +0200 Subject: [PATCH 0391/1169] remove bcftools view --- modules.json | 5 +- modules/nf-core/modules/bcftools/view/main.nf | 55 ---------------- .../nf-core/modules/bcftools/view/meta.yml | 63 ------------------- 3 files changed, 1 insertion(+), 122 deletions(-) delete mode 100644 modules/nf-core/modules/bcftools/view/main.nf delete mode 100644 modules/nf-core/modules/bcftools/view/meta.yml diff --git a/modules.json b/modules.json index 3608aa86..b84285b7 100644 --- a/modules.json +++ b/modules.json @@ -6,9 +6,6 @@ "bcftools/norm": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, - "bcftools/view": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" - }, "bwamem2/index": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, @@ -107,4 +104,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/bcftools/view/main.nf b/modules/nf-core/modules/bcftools/view/main.nf deleted file mode 100644 index ca1121a5..00000000 --- a/modules/nf-core/modules/bcftools/view/main.nf +++ /dev/null @@ -1,55 +0,0 @@ -process BCFTOOLS_VIEW { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? 'bioconda::bcftools=1.14' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0' : - 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" - - input: - tuple val(meta), path(vcf), path(index) - path(regions) - path(targets) - path(samples) - - output: - tuple val(meta), path("*.gz") , emit: vcf - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def regions_file = regions ? "--regions-file ${regions}" : "" - def targets_file = targets ? "--targets-file ${targets}" : "" - def samples_file = samples ? "--samples-file ${samples}" : "" - """ - bcftools view \\ - --output ${prefix}.vcf.gz \\ - ${regions_file} \\ - ${targets_file} \\ - ${samples_file} \\ - $args \\ - --threads $task.cpus \\ - ${vcf} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.vcf.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/bcftools/view/meta.yml b/modules/nf-core/modules/bcftools/view/meta.yml deleted file mode 100644 index 326fd1fa..00000000 --- a/modules/nf-core/modules/bcftools/view/meta.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: bcftools_view -description: View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF -keywords: - - variant calling - - view - - bcftools - - VCF - -tools: - - view: - description: | - View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF - homepage: http://samtools.github.io/bcftools/bcftools.html - documentation: http://www.htslib.org/doc/bcftools.html - doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: | - The vcf file to be inspected. - e.g. 'file.vcf' - - index: - type: file - description: | - The tab index for the VCF file to be inspected. - e.g. 'file.tbi' - - regions: - type: file - description: | - Optionally, restrict the operation to regions listed in this file. - e.g. 'file.vcf' - - targets: - type: file - description: | - Optionally, restrict the operation to regions listed in this file (doesn't rely upon index files) - e.g. 'file.vcf' - - samples: - type: file - description: | - Optional, file of sample names to be included or excluded. - e.g. 'file.tsv' -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: VCF normalized output file - pattern: "*.{vcf.gz}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@abhi18av" From 2cd70c51aefff0ba5ac551a28f33a2bb1adff4a0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Apr 2022 15:32:50 +0200 Subject: [PATCH 0392/1169] prettier lint --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index b84285b7..50b91cae 100644 --- a/modules.json +++ b/modules.json @@ -104,4 +104,4 @@ } } } -} \ No newline at end of file +} From e6d4488225e96f9dce54c4c83c63ff2401301237 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Apr 2022 17:43:49 +0200 Subject: [PATCH 0393/1169] update modules --- modules.json | 10 +++++----- modules/nf-core/modules/cnvpytor/callcnvs/main.nf | 11 +++++++++++ modules/nf-core/modules/cnvpytor/histogram/main.nf | 10 ++++++++++ .../nf-core/modules/cnvpytor/importreaddepth/main.nf | 11 +++++++++++ modules/nf-core/modules/cnvpytor/partition/main.nf | 12 +++++++++++- 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/modules.json b/modules.json index 5d96d70d..80eb7362 100644 --- a/modules.json +++ b/modules.json @@ -16,16 +16,16 @@ "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641" }, "cnvpytor/callcnvs": { - "git_sha": "233f2e728b175d8d3c398ce6dd052c6a14a3aeb7" + "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" }, "cnvpytor/histogram": { - "git_sha": "233f2e728b175d8d3c398ce6dd052c6a14a3aeb7" + "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" }, "cnvpytor/importreaddepth": { - "git_sha": "233f2e728b175d8d3c398ce6dd052c6a14a3aeb7" + "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" }, "cnvpytor/partition": { - "git_sha": "233f2e728b175d8d3c398ce6dd052c6a14a3aeb7" + "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" }, "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -110,4 +110,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf index e296656b..17675cde 100644 --- a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf +++ b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf @@ -30,4 +30,15 @@ process CNVPYTOR_CALLCNVS { cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/cnvpytor/histogram/main.nf b/modules/nf-core/modules/cnvpytor/histogram/main.nf index e421f1b2..d1c6856c 100644 --- a/modules/nf-core/modules/cnvpytor/histogram/main.nf +++ b/modules/nf-core/modules/cnvpytor/histogram/main.nf @@ -29,4 +29,14 @@ process CNVPYTOR_HISTOGRAM { cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) END_VERSIONS """ + + stub: + """ + touch test.pytor + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf index 1b037629..162da719 100644 --- a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf +++ b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf @@ -35,4 +35,15 @@ process CNVPYTOR_IMPORTREADDEPTH { cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.pytor + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/cnvpytor/partition/main.nf b/modules/nf-core/modules/cnvpytor/partition/main.nf index 74ab4026..975458bf 100644 --- a/modules/nf-core/modules/cnvpytor/partition/main.nf +++ b/modules/nf-core/modules/cnvpytor/partition/main.nf @@ -18,7 +18,7 @@ process CNVPYTOR_PARTITION { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '1000' + def args = task.ext.args ?: '' """ cnvpytor \\ -root $pytor \\ @@ -29,4 +29,14 @@ process CNVPYTOR_PARTITION { cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) END_VERSIONS """ + + stub: + """ + touch test.pytor + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + END_VERSIONS + """ } From 3b99cc577084611ddcb343c49838bbd7e7125098 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Apr 2022 17:44:19 +0200 Subject: [PATCH 0394/1169] lint --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 80eb7362..709a4592 100644 --- a/modules.json +++ b/modules.json @@ -110,4 +110,4 @@ } } } -} \ No newline at end of file +} From 7bf88cfe4f966a88f611feb6258ca79959294836 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 1 Apr 2022 18:08:55 +0200 Subject: [PATCH 0395/1169] review suggestions --- nextflow.config | 1 + nextflow_schema.json | 6 ++++++ .../annotate_structural_variants.nf | 0 workflows/raredisease.nf | 18 ++++++++---------- 4 files changed, 15 insertions(+), 10 deletions(-) rename subworkflows/{local => nf-core}/annotate_structural_variants.nf (100%) diff --git a/nextflow.config b/nextflow.config index 969fa086..972655d7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,6 +22,7 @@ params { // Main options analysis_type = 'wgs' + annotate_sv_switch = false // Alignment aligner = 'bwamem2' diff --git a/nextflow_schema.json b/nextflow_schema.json index 14f5032e..9b9502a6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -157,6 +157,12 @@ "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", "enum": ["wgs", "wes", "mito"] + }, + "annotate_sv_switch": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to run annotate structural variant subworkflow.", + "fa_icon": "fas fa-book" } } }, diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/nf-core/annotate_structural_variants.nf similarity index 100% rename from subworkflows/local/annotate_structural_variants.nf rename to subworkflows/nf-core/annotate_structural_variants.nf diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3acc52b8..abfb77e6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -65,15 +65,13 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' -include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' -include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' -include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' - - -include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' +include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' +include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' +include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' +include { QC_BAM } from '../subworkflows/nf-core/qc_bam' +include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' +include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' +include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/annotate_structural_variants' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -159,7 +157,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) ch_sv_annotate = Channel.empty() - if (params.svdb_query_dbs) { + if (params.annotate_sv_switch) { ANNOTATE_STRUCTURAL_VARIANTS ( CALL_STRUCTURAL_VARIANTS.out.vcf, params.svdb_query_dbs, From 0d79eb882a1d659a5586197a1556557cfa836e38 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 2 Apr 2022 18:07:31 +0200 Subject: [PATCH 0396/1169] install vep --- modules.json | 5 +- modules/nf-core/modules/ensemblvep/Dockerfile | 30 +++++++++ modules/nf-core/modules/ensemblvep/build.sh | 27 ++++++++ .../modules/ensemblvep/environment.yml | 10 +++ modules/nf-core/modules/ensemblvep/main.nf | 52 +++++++++++++++ modules/nf-core/modules/ensemblvep/meta.yml | 65 +++++++++++++++++++ 6 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/modules/ensemblvep/Dockerfile create mode 100644 modules/nf-core/modules/ensemblvep/build.sh create mode 100644 modules/nf-core/modules/ensemblvep/environment.yml create mode 100644 modules/nf-core/modules/ensemblvep/main.nf create mode 100644 modules/nf-core/modules/ensemblvep/meta.yml diff --git a/modules.json b/modules.json index 04137834..1f4be9b9 100644 --- a/modules.json +++ b/modules.json @@ -21,6 +21,9 @@ "deepvariant": { "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, + "ensemblvep": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, "expansionhunter": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, @@ -98,4 +101,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/ensemblvep/Dockerfile b/modules/nf-core/modules/ensemblvep/Dockerfile new file mode 100644 index 00000000..ac1b4691 --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/Dockerfile @@ -0,0 +1,30 @@ +FROM nfcore/base:1.14 +LABEL \ + author="Maxime Garcia" \ + description="VEP image for nf-core pipelines" \ + maintainer="maxime.garcia@scilifelab.se" + +# Install the conda environment +COPY environment.yml / +RUN conda env create -f /environment.yml && conda clean -a + +# Add conda installation dir to PATH (instead of doing 'conda activate') +ENV PATH /opt/conda/envs/nf-core-vep-104.3/bin:$PATH + +# Setup default ARG variables +ARG GENOME=GRCh38 +ARG SPECIES=homo_sapiens +ARG VEP_VERSION=99 + +# Download Genome +RUN vep_install \ + -a c \ + -c .vep \ + -s ${SPECIES} \ + -y ${GENOME} \ + --CACHE_VERSION ${VEP_VERSION} \ + --CONVERT \ + --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE + +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name nf-core-vep-104.3 > nf-core-vep-104.3.yml diff --git a/modules/nf-core/modules/ensemblvep/build.sh b/modules/nf-core/modules/ensemblvep/build.sh new file mode 100644 index 00000000..5fcb91df --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/build.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Build and push all containers + +build_push() { + GENOME=$1 + SPECIES=$2 + VEP_VERSION=$3 + VEP_TAG=$4 + + docker build \ + -t nfcore/vep:${VEP_TAG}.${GENOME} \ + software/vep/. \ + --build-arg GENOME=${GENOME} \ + --build-arg SPECIES=${SPECIES} \ + --build-arg VEP_VERSION=${VEP_VERSION} + + docker push nfcore/vep:${VEP_TAG}.${GENOME} +} + +build_push "GRCh37" "homo_sapiens" "104" "104.3" +build_push "GRCh38" "homo_sapiens" "104" "104.3" +build_push "GRCm38" "mus_musculus" "102" "104.3" +build_push "GRCm39" "mus_musculus" "104" "104.3" +build_push "CanFam3.1" "canis_lupus_familiaris" "104" "104.3" +build_push "WBcel235" "caenorhabditis_elegans" "104" "104.3" diff --git a/modules/nf-core/modules/ensemblvep/environment.yml b/modules/nf-core/modules/ensemblvep/environment.yml new file mode 100644 index 00000000..c0731c26 --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/environment.yml @@ -0,0 +1,10 @@ +# You can use this file to create a conda environment for this module: +# conda env create -f environment.yml +name: nf-core-vep-104.3 +channels: + - conda-forge + - bioconda + - defaults + +dependencies: + - bioconda::ensembl-vep=104.3 diff --git a/modules/nf-core/modules/ensemblvep/main.nf b/modules/nf-core/modules/ensemblvep/main.nf new file mode 100644 index 00000000..c2bd055f --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/main.nf @@ -0,0 +1,52 @@ +process ENSEMBLVEP { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::ensembl-vep=104.3" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ensembl-vep:104.3--pl5262h4a94de4_0' : + 'quay.io/biocontainers/ensembl-vep:104.3--pl5262h4a94de4_0' }" + + input: + tuple val(meta), path(vcf) + val genome + val species + val cache_version + path cache + + output: + tuple val(meta), path("*.ann.vcf"), emit: vcf + path "*.summary.html" , emit: report + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" + """ + mkdir $prefix + + vep \\ + -i $vcf \\ + -o ${prefix}.ann.vcf \\ + $args \\ + --assembly $genome \\ + --species $species \\ + --cache \\ + --cache_version $cache_version \\ + --dir_cache $dir_cache \\ + --fork $task.cpus \\ + --vcf \\ + --stats_file ${prefix}.summary.html + + rm -rf $prefix + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/ensemblvep/meta.yml b/modules/nf-core/modules/ensemblvep/meta.yml new file mode 100644 index 00000000..cd9c8905 --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/meta.yml @@ -0,0 +1,65 @@ +name: ENSEMBLVEP +description: Ensembl Variant Effect Predictor (VEP) +keywords: + - annotation +tools: + - ensemblvep: + description: | + VEP determines the effect of your variants (SNPs, insertions, deletions, CNVs + or structural variants) on genes, transcripts, and protein sequence, as well as regulatory regions. + homepage: https://www.ensembl.org/info/docs/tools/vep/index.html + documentation: https://www.ensembl.org/info/docs/tools/vep/script/index.html + licence: ["Apache-2.0"] +params: + - use_cache: + type: boolean + description: | + Enable the usage of containers with cache + Does not work with conda + - vep_tag: + type: value + description: | + Specify the tag for the container + https://hub.docker.com/r/nfcore/vep/tags +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + vcf to annotate + - genome: + type: value + description: | + which genome to annotate with + - species: + type: value + description: | + which species to annotate with + - cache_version: + type: value + description: | + which version of the cache to annotate with + - cache: + type: file + description: | + path to VEP cache (optional) +output: + - vcf: + type: file + description: | + annotated vcf + pattern: "*.ann.vcf" + - report: + type: file + description: VEP report file + pattern: "*.html" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@maxulysse" From 802814e4ec24de4c015180ef97eb8fe7d392bdba Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 2 Apr 2022 20:05:34 +0200 Subject: [PATCH 0397/1169] add subworkflow --- conf/genomes.config | 2 ++ nextflow_schema.json | 6 ++++++ subworkflows/nf-core/annotate_vep.nf | 29 ++++++++++++++++++++++++++++ workflows/raredisease.nf | 3 ++- 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 subworkflows/nf-core/annotate_vep.nf diff --git a/conf/genomes.config b/conf/genomes.config index e8ddd83d..3929b88e 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -19,6 +19,7 @@ params { variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" + vep_cache = "${params.local_genomes}/vep_cache_grch37" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" @@ -29,6 +30,7 @@ params { variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" + vep_cache = "${params.local_genomes}/vep_cache_grch37" } } } diff --git a/nextflow_schema.json b/nextflow_schema.json index 24d18b4a..d27dfdc8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -124,6 +124,12 @@ "help_text": "If toml is passed, default configurations will be used according to genome build within the context of the pipeline.", "fa_icon": "fas fa-file-csv" }, + "vep_cache": { + "type": "string", + "description": "Path to vep's cache directory.", + "help_text": "If no directory path is passed, vcf files will not be annotated by vep.", + "fa_icon": "fas fa-folder-open" + }, "save_reference": { "type": "boolean", "description": "If generated by the pipeline save the required indices/references in the results directory.", diff --git a/subworkflows/nf-core/annotate_vep.nf b/subworkflows/nf-core/annotate_vep.nf new file mode 100644 index 00000000..ef85a428 --- /dev/null +++ b/subworkflows/nf-core/annotate_vep.nf @@ -0,0 +1,29 @@ +// +// Annotate with VEP +// + +include { ENSEMBLVEP } from '../../modules/nf-core/modules/ensemblvep/main' + +workflow ANNOTATE_VEP { + take: + vcf // channel: [ val(meta), vcf ] + vep_genome + vep_species + vep_cache_version + vep_cache + + main: + ch_reports = Channel.empty() + ch_vcf_ann = Channel.empty() + ch_versions = Channel.empty() + + ENSEMBLVEP(vcf, vep_genome, vep_species, vep_cache_version, vep_cache) + + ch_reports = ch_reports.mix(ENSEMBLVEP.out.reports) + ch_vcf_ann = ch_vcf_ann.mix(ENSEMBLVEP.out.vcf_tbi) + ch_versions = ch_versions.mix(ENSEMBLVEP.out.versions.first()) + + emit: + vcf_ann = ch_vcf_ann // channel: [ val(meta), vcf.gz, vcf.gz.tbi ] + reports = ch_reports // path: *.html + versions = ch_versions // path: versions.yml} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index bf911f92..6ed2df6f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -17,7 +17,8 @@ def checkPathParamList = [ params.gnomad, params.input, params.multiqc_config, - params.vcfanno_resources + params.vcfanno_resources, + params.vep_cache ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } From c770a526f68503c72cdff8235c5c8b002672f939 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 3 Apr 2022 14:47:55 +0200 Subject: [PATCH 0398/1169] add blank line --- subworkflows/nf-core/annotate_vep.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/subworkflows/nf-core/annotate_vep.nf b/subworkflows/nf-core/annotate_vep.nf index ef85a428..b535b350 100644 --- a/subworkflows/nf-core/annotate_vep.nf +++ b/subworkflows/nf-core/annotate_vep.nf @@ -27,3 +27,4 @@ workflow ANNOTATE_VEP { vcf_ann = ch_vcf_ann // channel: [ val(meta), vcf.gz, vcf.gz.tbi ] reports = ch_reports // path: *.html versions = ch_versions // path: versions.yml} +} From 0cccc221596f1e770a14f9738c2d0c0957af8f81 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 3 Apr 2022 14:50:04 +0200 Subject: [PATCH 0399/1169] prettier lint --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 1f4be9b9..d15299a2 100644 --- a/modules.json +++ b/modules.json @@ -101,4 +101,4 @@ } } } -} \ No newline at end of file +} From f800423a32957867b40362cf44bfbaed7f3fa5d6 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Mon, 4 Apr 2022 10:39:02 +0200 Subject: [PATCH 0400/1169] refactor: isolate subwrkflw --- subworkflows/local/prepare_genome.nf | 23 ++++++++------ subworkflows/local/prepare_references.nf | 28 ++++++++++------- subworkflows/nf-core/align.nf | 2 ++ workflows/raredisease.nf | 40 ++++++++++++++---------- 4 files changed, 54 insertions(+), 39 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 71b966a7..58382408 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -10,8 +10,11 @@ include { GET_CHROM_SIZES } from '../../modules/local/ workflow PREPARE_GENOME { take: - fasta // channel: [mandatory] genome.fasta - variant_catalog // channel: [optional] variant_catalog.json + bwamem2_index // [mandatory] bwamem2_index + fasta // [mandatory] genome.fasta + fai // [mandatory] genome.fai + variant_catalog // [optional] variant_catalog.json + vcfanno_resources // [mandatory] vcfanno resource file main: ch_fasta = file(fasta) @@ -19,11 +22,11 @@ workflow PREPARE_GENOME { // Fetch BWAMEM2 index or create from scratch if required BWAMEM2_INDEX ( ch_fasta ) - ch_bwamem2_index = !params.bwamem2_index ? params.aligner == "bwamem2" ? BWAMEM2_INDEX.out.index : Channel.fromPath(params.bwamem2_index).collect() : Channel.empty() + ch_bwamem2_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : Channel.fromPath(bwamem2_index).collect() ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) - if ( params.fasta_fai ) { - ch_fai = file(params.fasta_fai) + if ( fai ) { + ch_fai = file(fai) } else { ch_fai = SAMTOOLS_FAIDX ( [[], ch_fasta] ) .fai @@ -32,15 +35,15 @@ workflow PREPARE_GENOME { } // Uncompress vcfanno resources if nothing else given - if ( params.vcfanno_resources.endsWith('.tar.gz') ) { - ch_vcfanno_resources = UNTAR_VCFANNO ( params.vcfanno_resources ).untar + if ( vcfanno_resources.endsWith('.tar.gz') ) { + ch_vcfanno_resources = UNTAR_VCFANNO ( vcfanno_resources ).untar ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) } else { - ch_vcfanno_resources = file(params.vcfanno_resources) + ch_vcfanno_resources = file(vcfanno_resources) } - if ( params.variant_catalog && file(params.variant_catalog, checkIfExists:true) ) { - ch_variant_catalog = file(params.variant_catalog) + if ( variant_catalog && file(variant_catalog, checkIfExists:true) ) { + ch_variant_catalog = file(variant_catalog) } else { if ( params.genome == 'GRCh38' ) { ch_variant_catalog = file("https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/reference/variant_catalog_grch38.json") diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index e60ab649..b484077e 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -9,27 +9,33 @@ include { PREPARE_GENOME } from './prepare_genome' workflow PREPARE_REFERENCES { take: + bwamem2_index // [mandatory] bwamem2_index + gnomad + fasta // [mandatory] genome.fasta + fai // [mandatory] genome.fai + target_bed + variant_catalog // [optional] variant_catalog.json + vcfanno_resources // [mandatory] vcfanno resource file main: - // // Prepare genome - // ch_versions = Channel.empty() PREPARE_GENOME ( - params.fasta, - params.variant_catalog + bwamem2_index, + fasta, + fai, + variant_catalog, + vcfanno_resources ) .set { ch_genome } ch_versions = ch_versions.mix(ch_genome.versions) - // // Gnomad vcf - // ch_gnomad_vcf = Channel.empty() ch_gnomad_idx = Channel.empty() - if (params.gnomad) { + if (gnomad) { CHECK_VCF( - params.gnomad, + gnomad, ch_genome.fasta ) ch_gnomad_vcf = CHECK_VCF.out.vcf @@ -37,15 +43,13 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(CHECK_VCF.out.versions) } - // // Target bed - // ch_target_bed = Channel.empty() ch_target_intervals = Channel.empty() ch_bait_intervals = Channel.empty() - if (params.target_bed) { + if (target_bed) { CHECK_BED( - params.target_bed, + target_bed, ch_genome.sequence_dict ) ch_target_bed = CHECK_BED.out.bed diff --git a/subworkflows/nf-core/align.nf b/subworkflows/nf-core/align.nf index 366a7868..b97502fe 100644 --- a/subworkflows/nf-core/align.nf +++ b/subworkflows/nf-core/align.nf @@ -23,11 +23,13 @@ workflow ALIGN { exit 1, 'Please provide a valid aligner!' } + ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) emit: marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bam ] ] marked_bai = ch_marked_bai // channel: [ val(meta), [ marked_bai ] ] + bam_bai = ch_bam_bai // channel: [ val(meta), [ marked_bam, marked_bai ] ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f04d5481..d6363a19 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -64,7 +64,7 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { ALIGN } from '../subworkflows/nf-core/align' +include { ALIGN } from '../subworkflows/nf-core/align' include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' include { QC_BAM } from '../subworkflows/nf-core/qc_bam' @@ -100,25 +100,31 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(FASTQC.out.versions.first()) // STEP 0: PREPARE GENOME REFERENCES AND INDICES. - PREPARE_REFERENCES ().set { ch_references } + PREPARE_REFERENCES ( + params.bwamem2_index, + params.gnomad, + params.fasta, + params.fasta_fai, + params.target_bed, + params.variant_catalog, + params.vcfanno_resources + ) + .set { ch_references } ch_versions = ch_versions.mix(ch_references.versions) // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( params.aligner, CHECK_INPUT.out.reads, - PREPARE_GENOME.out.bwamem2_index + ch_references.bwamem2_index ) - ch_marked_bam = ALIGN.out.marked_bam - ch_marked_bai = ALIGN.out.marked_bai - ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) - + .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) // STEP 1.5: BAM QUALITY CHECK QC_BAM ( - ch_marked_bam, - ch_marked_bai, + ch_mapped.marked_bam, + ch_mapped.marked_bai, ch_references.genome_fasta, ch_references.genome_fai, ch_references.bait_intervals, @@ -129,25 +135,25 @@ workflow RAREDISEASE { // STEP 1.6: EXPANSIONHUNTER CALL_REPEAT_EXPANSIONS ( - ch_bam_bai, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.variant_catalog + ch_mapped.bam_bai, + ch_references.genome_fasta, + ch_references.variant_catalog ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV_DEEPVARIANT ( - ch_bam_bai, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, + ch_mapped.bam_bai, + ch_references.genome_fasta, + ch_references.genome_fai, CHECK_INPUT.out.case_info ) ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) CALL_STRUCTURAL_VARIANTS ( - ch_marked_bam, - ch_marked_bai, + ch_mapped.marked_bam, + ch_mapped.marked_bai, ch_references.genome_fasta, ch_references.genome_fai, CHECK_INPUT.out.case_info, From c3167135f9db8c6dc361c3c12a08fe7f9e395f0a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:21:27 +0200 Subject: [PATCH 0401/1169] update module --- modules.json | 4 ++-- modules/nf-core/modules/cnvpytor/histogram/main.nf | 2 +- modules/nf-core/modules/cnvpytor/partition/main.nf | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index 709a4592..515e4524 100644 --- a/modules.json +++ b/modules.json @@ -19,13 +19,13 @@ "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" }, "cnvpytor/histogram": { - "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" + "git_sha": "cb54d1ebd77de5b482cae89ed9e51fa6ef97d3ee" }, "cnvpytor/importreaddepth": { "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" }, "cnvpytor/partition": { - "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" + "git_sha": "cb54d1ebd77de5b482cae89ed9e51fa6ef97d3ee" }, "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" diff --git a/modules/nf-core/modules/cnvpytor/histogram/main.nf b/modules/nf-core/modules/cnvpytor/histogram/main.nf index d1c6856c..9e59c6b8 100644 --- a/modules/nf-core/modules/cnvpytor/histogram/main.nf +++ b/modules/nf-core/modules/cnvpytor/histogram/main.nf @@ -32,7 +32,7 @@ process CNVPYTOR_HISTOGRAM { stub: """ - touch test.pytor + touch ${pytor.baseName}.pytor cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/cnvpytor/partition/main.nf b/modules/nf-core/modules/cnvpytor/partition/main.nf index 975458bf..0311bdfc 100644 --- a/modules/nf-core/modules/cnvpytor/partition/main.nf +++ b/modules/nf-core/modules/cnvpytor/partition/main.nf @@ -32,7 +32,7 @@ process CNVPYTOR_PARTITION { stub: """ - touch test.pytor + touch ${pytor.baseName}.pytor cat <<-END_VERSIONS > versions.yml "${task.process}": From 66f4e3c709d5a51a1b4ec26c5ded282fc6d7c19d Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 5 Apr 2022 10:09:09 +0200 Subject: [PATCH 0402/1169] Updates gens subworkflow usage to new ref channel --- workflows/raredisease.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index cbc4a2a7..b7fb4147 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -160,13 +160,13 @@ workflow RAREDISEASE { GENS ( ch_marked_bam.join(ch_marked_bai, by: [0]), CALL_SNV_DEEPVARIANT.out.vcf, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, + ch_references.genome_fasta, + ch_references.genome_fai, file(params.gens_interval_list), file(params.gens_pon), file(params.gens_gnomad_pos), INPUT_CHECK.out.ch_case_info, - PREPARE_GENOME.out.sequence_dict + ch_references.sequence_dict ) ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) From 2ced77e7167dba3ff561d221766cf1e2741b6fb3 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 5 Apr 2022 10:10:19 +0200 Subject: [PATCH 0403/1169] Changes INPUT_CHECK to CHECK_INPUT --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index b7fb4147..662c9e05 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -165,7 +165,7 @@ workflow RAREDISEASE { file(params.gens_interval_list), file(params.gens_pon), file(params.gens_gnomad_pos), - INPUT_CHECK.out.ch_case_info, + CHECK_INPUT.out.ch_case_info, ch_references.sequence_dict ) ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) From c5fb46d71e8e734356220acc17a698f21c1bf2a3 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 5 Apr 2022 10:11:12 +0200 Subject: [PATCH 0404/1169] Changes ch_case_info to case_info --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 662c9e05..e18ffd39 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -165,7 +165,7 @@ workflow RAREDISEASE { file(params.gens_interval_list), file(params.gens_pon), file(params.gens_gnomad_pos), - CHECK_INPUT.out.ch_case_info, + CHECK_INPUT.out.case_info, ch_references.sequence_dict ) ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) From 17e4420215250ae3cd6de3d8285afad257b55282 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 5 Apr 2022 11:27:27 +0200 Subject: [PATCH 0405/1169] modify description --- nextflow_schema.json | 2 +- .../nf-core/call_structural_variants.nf | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 79d1c4a8..ed09b9ad 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -190,7 +190,7 @@ "cnvpytor_chr": { "type": "string", "default": null, - "description": "Specifies the chromosome for cnvpytor run", + "description": "Chromosome names must be specified the same way as they are described in the sam/bam/cram header, e.g., chrX or X. One can specify multiple chromosomes separated by space.", "fa_icon": "fas fa-map-signs" } } diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index e1ac98b0..8d30d96f 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -34,8 +34,16 @@ workflow CALL_STRUCTURAL_VARIANTS { .set { tiddit_vcf } ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) + //cnvpytor + CALL_CNV_CNVPYTOR ( bam, bai, case_info ) + .candidate_cnvs_tsv + .collect{it[1]} + .set {cnvpytor_tsv } + ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) + //merge tiddit_vcf + .combine(manta_vcf) .combine(manta_vcf) .toList() .set { vcf_list } @@ -45,15 +53,6 @@ workflow CALL_STRUCTURAL_VARIANTS { SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta"] ) - //cnvpytor - CALL_CNV_CNVPYTOR ( bam, bai, case_info ) - .candidate_cnvs_tsv - .collect{it[1]} - .set {cnvpytor_tsv } - ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) - - - emit: vcf = SVDB_MERGE.out.vcf From 3e55444844068a3ea6e0188946ee84e59293a180 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 5 Apr 2022 15:54:36 +0200 Subject: [PATCH 0406/1169] update params --- conf/genomes.config | 4 ++-- nextflow.config | 4 ++++ nextflow_schema.json | 25 +++++++++++++++++++++++++ subworkflows/nf-core/annotate_vep.nf | 8 ++------ workflows/raredisease.nf | 8 ++++++++ 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 3929b88e..64fdc89d 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -19,7 +19,7 @@ params { variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" - vep_cache = "${params.local_genomes}/vep_cache_grch37" + vep_cache = "${params.local_genomes}/vep_cache" } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" @@ -30,7 +30,7 @@ params { variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" - vep_cache = "${params.local_genomes}/vep_cache_grch37" + vep_cache = "${params.local_genomes}/vep_cache" } } } diff --git a/nextflow.config b/nextflow.config index 969fa086..a8797da7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -26,6 +26,10 @@ params { // Alignment aligner = 'bwamem2' + // Annotation + vep_genome = 'GRCh37' + vep_cache_version = '104' + // MultiQC options multiqc_config = null multiqc_title = null diff --git a/nextflow_schema.json b/nextflow_schema.json index d27dfdc8..043c0bfb 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -175,6 +175,28 @@ } } }, + "annotation_options": { + "title": "Annotation options", + "type": "object", + "fa_icon": "fas fa-user-cog", + "description": "Options used to facilitate the annotation of the variants.", + "properties": { + "vep_genome": { + "type": "string", + "default": "GRCh37", + "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", + "fa_icon": "fas fa-book", + "enum": ["GRCh37", "GRCh38"] + }, + "vep_cache_version": { + "type": "string", + "default": "104", + "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", + "fa_icon": "fas fa-book", + "enum": ["104", "105"] + } + } + }, "institutional_config_options": { "title": "Institutional config options", "type": "object", @@ -362,6 +384,9 @@ { "$ref": "#/definitions/alignment_options" }, + { + "$ref": "#/definitions/annotation_options" + }, { "$ref": "#/definitions/institutional_config_options" }, diff --git a/subworkflows/nf-core/annotate_vep.nf b/subworkflows/nf-core/annotate_vep.nf index b535b350..87ad9c80 100644 --- a/subworkflows/nf-core/annotate_vep.nf +++ b/subworkflows/nf-core/annotate_vep.nf @@ -6,18 +6,14 @@ include { ENSEMBLVEP } from '../../modules/nf-core/modules/ensemblvep/main' workflow ANNOTATE_VEP { take: - vcf // channel: [ val(meta), vcf ] - vep_genome - vep_species - vep_cache_version - vep_cache + sv_vcf // channel: [ val(meta), vcf ] main: ch_reports = Channel.empty() ch_vcf_ann = Channel.empty() ch_versions = Channel.empty() - ENSEMBLVEP(vcf, vep_genome, vep_species, vep_cache_version, vep_cache) + ENSEMBLVEP(sv_vcf, params.vep_genome, "homo_sapiens", params.vep_cache_version, params.vep_cache) ch_reports = ch_reports.mix(ENSEMBLVEP.out.reports) ch_vcf_ann = ch_vcf_ann.mix(ENSEMBLVEP.out.vcf_tbi) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6ed2df6f..6706c3e2 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -71,6 +71,7 @@ include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_d include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' +include { ANNOTATE_VEP } from '../subworkflows/nf-core/annotate_variants' /* @@ -166,6 +167,13 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) + ANNOTATE_VEP ( + params.vcfanno_toml, + ch_dv_vcf, + ch_references.vcfanno_resources + ) + ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) + // // MODULE: Pipeline reporting // From 1998d96dfb99e570bf30dcbc8469b9b4964eb27f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 5 Apr 2022 16:57:40 +0200 Subject: [PATCH 0407/1169] add vep to annotation subworkflow --- .../nf-core/annotate_structural_variants.nf | 4 +++ subworkflows/nf-core/annotate_vep.nf | 26 ------------------- workflows/raredisease.nf | 1 - 3 files changed, 4 insertions(+), 27 deletions(-) delete mode 100644 subworkflows/nf-core/annotate_vep.nf diff --git a/subworkflows/nf-core/annotate_structural_variants.nf b/subworkflows/nf-core/annotate_structural_variants.nf index 7d54eee1..d051bdcf 100644 --- a/subworkflows/nf-core/annotate_structural_variants.nf +++ b/subworkflows/nf-core/annotate_structural_variants.nf @@ -4,6 +4,7 @@ include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' +include { ENSEMBLVEP } from '../../modules/nf-core/modules/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { @@ -40,6 +41,9 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { seq_dict ) + ENSEMBLVEP(PICARD_SORTVCF.out.vcf, params.vep_genome, "homo_sapiens", params.vep_cache_version, params.vep_cache) + emit: + vcf_ann = ENSEMBLVEP.out.vcf_tbi versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/annotate_vep.nf b/subworkflows/nf-core/annotate_vep.nf deleted file mode 100644 index 87ad9c80..00000000 --- a/subworkflows/nf-core/annotate_vep.nf +++ /dev/null @@ -1,26 +0,0 @@ -// -// Annotate with VEP -// - -include { ENSEMBLVEP } from '../../modules/nf-core/modules/ensemblvep/main' - -workflow ANNOTATE_VEP { - take: - sv_vcf // channel: [ val(meta), vcf ] - - main: - ch_reports = Channel.empty() - ch_vcf_ann = Channel.empty() - ch_versions = Channel.empty() - - ENSEMBLVEP(sv_vcf, params.vep_genome, "homo_sapiens", params.vep_cache_version, params.vep_cache) - - ch_reports = ch_reports.mix(ENSEMBLVEP.out.reports) - ch_vcf_ann = ch_vcf_ann.mix(ENSEMBLVEP.out.vcf_tbi) - ch_versions = ch_versions.mix(ENSEMBLVEP.out.versions.first()) - - emit: - vcf_ann = ch_vcf_ann // channel: [ val(meta), vcf.gz, vcf.gz.tbi ] - reports = ch_reports // path: *.html - versions = ch_versions // path: versions.yml} -} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3edd9d7a..fd460558 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -73,7 +73,6 @@ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/annotate_structural_variants' -include { ANNOTATE_VEP } from '../subworkflows/nf-core/annotate_variants' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From c30c916f218ad2aeaa929b1335798006cd58013c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 5 Apr 2022 17:38:36 +0200 Subject: [PATCH 0408/1169] add vepcache to main.nf --- main.nf | 2 ++ workflows/raredisease.nf | 7 ------- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index 5f11003a..2de5ffcb 100644 --- a/main.nf +++ b/main.nf @@ -26,6 +26,8 @@ params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_quer params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') +params.vep_cache = WorkflowMain.getGenomeAttribute(params, 'vep_cache') + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index fd460558..8f4dee2b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -179,13 +179,6 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) - ANNOTATE_VEP ( - params.vcfanno_toml, - ch_dv_vcf, - ch_references.vcfanno_resources - ) - ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) - // // MODULE: Pipeline reporting // From 53553c0e3e605b24936cc8c971a1bb0d301a75bc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 7 Apr 2022 23:32:39 +0200 Subject: [PATCH 0409/1169] vep run --- conf/modules.config | 17 +++++++++++++++++ .../nf-core/annotate_structural_variants.nf | 15 +++++++++------ workflows/raredisease.nf | 3 +++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5a5e766f..fea6438f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -202,6 +202,23 @@ process { enabled: false, ] } + withName: ENSEMBLVEP { + ext.args = [ + '--plugin LoFtool,vep_cache/LoFtool_scores.txt', + '--distance 5000', + '--buffer_size 20000', + '--format vcf --max_sv_size 248956422 --vcf', + '--appris --biotype --canonical --ccds', + '--domains --exclude_predicted --force_overwrite', + '--humdiv --no_progress --no_stats --numbers', + '--polyphen p --protein --offline --regulatory --sift p --symbol --tsl', + '--uniprot' + ].join(' ') + publishDir = [ + path: { "${params.outdir}/sv_annotate" }, + mode: params.publish_dir_mode, + ] + } // NF-CORE Subworkflows // ALIGN_BWAMEM2 withName: BWAMEM2_MEM { diff --git a/subworkflows/nf-core/annotate_structural_variants.nf b/subworkflows/nf-core/annotate_structural_variants.nf index d051bdcf..2b650252 100644 --- a/subworkflows/nf-core/annotate_structural_variants.nf +++ b/subworkflows/nf-core/annotate_structural_variants.nf @@ -9,10 +9,13 @@ include { ENSEMBLVEP } from '../../modules/nf-core/modules/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { take: - vcf // channel: [ val(meta), path(vcf) ] - sv_dbs // file: dbs.csv - fasta // file: genome.fasta - seq_dict // file: genome.dict + vcf // channel: [ val(meta), path(vcf) ] + sv_dbs // file: dbs.csv + vep_genome + vep_cache_version + vep_cache + fasta // file: genome.fasta + seq_dict // file: genome.dict main: ch_versions = Channel.empty() @@ -41,9 +44,9 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { seq_dict ) - ENSEMBLVEP(PICARD_SORTVCF.out.vcf, params.vep_genome, "homo_sapiens", params.vep_cache_version, params.vep_cache) + ENSEMBLVEP(PICARD_SORTVCF.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, file(vep_cache)) emit: - vcf_ann = ENSEMBLVEP.out.vcf_tbi + vcf_ann = ENSEMBLVEP.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8f4dee2b..3856408d 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -162,6 +162,9 @@ workflow RAREDISEASE { ANNOTATE_STRUCTURAL_VARIANTS ( CALL_STRUCTURAL_VARIANTS.out.vcf, params.svdb_query_dbs, + params.vep_genome, + params.vep_cache_version, + params.vep_cache, ch_references.genome_fasta, ch_references.sequence_dict ).set {ch_sv_annotate} From 8e9e38530f54d893e8c9f42fd8af4b1cf0c3f1e6 Mon Sep 17 00:00:00 2001 From: sysbiocoder Date: Fri, 8 Apr 2022 09:52:43 +0200 Subject: [PATCH 0410/1169] modified: modules.json new file: modules/nf-core/modules/samtools/view/main.nf new file: modules/nf-core/modules/samtools/view/meta.yml --- modules.json | 5 +- modules/nf-core/modules/samtools/view/main.nf | 44 +++++++++++++++ .../nf-core/modules/samtools/view/meta.yml | 53 +++++++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/modules/samtools/view/main.nf create mode 100644 modules/nf-core/modules/samtools/view/meta.yml diff --git a/modules.json b/modules.json index 50b91cae..087a28a8 100644 --- a/modules.json +++ b/modules.json @@ -75,6 +75,9 @@ "samtools/stats": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, + "samtools/view": { + "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" + }, "svdb/merge": { "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" }, @@ -104,4 +107,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/samtools/view/main.nf b/modules/nf-core/modules/samtools/view/main.nf new file mode 100644 index 00000000..75aad063 --- /dev/null +++ b/modules/nf-core/modules/samtools/view/main.nf @@ -0,0 +1,44 @@ +process SAMTOOLS_VIEW { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + + input: + tuple val(meta), path(input) + path fasta + + output: + tuple val(meta), path("*.bam") , emit: bam , optional: true + tuple val(meta), path("*.cram"), emit: cram, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--reference ${fasta} -C" : "" + def file_type = input.getExtension() + if ("$input" == "${prefix}.${file_type}") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + """ + samtools \\ + view \\ + --threads ${task.cpus-1} \\ + ${reference} \\ + $args \\ + $input \\ + $args2 \\ + > ${prefix}.${file_type} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/samtools/view/meta.yml b/modules/nf-core/modules/samtools/view/meta.yml new file mode 100644 index 00000000..5604bfa7 --- /dev/null +++ b/modules/nf-core/modules/samtools/view/meta.yml @@ -0,0 +1,53 @@ +name: samtools_view +description: filter/convert SAM/BAM/CRAM file +keywords: + - view + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - fasta: + type: optional file + description: Reference file the CRAM was created with + pattern: "*.{fasta,fa}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: filtered/converted BAM/SAM file + pattern: "*.{bam,sam}" + - cram: + type: file + description: filtered/converted CRAM file + pattern: "*.cram" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@joseespinosa" + - "@FriederikeHanssen" From 25fa996e1ae2ed50b96c5812c4337de35ca8d155 Mon Sep 17 00:00:00 2001 From: sysbiocoder Date: Fri, 8 Apr 2022 10:04:04 +0200 Subject: [PATCH 0411/1169] Ran Prettier --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 087a28a8..d46c250e 100644 --- a/modules.json +++ b/modules.json @@ -107,4 +107,4 @@ } } } -} \ No newline at end of file +} From 75c3bc45ccb65f9bd6514b012a9ec1be1432b9c5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 8 Apr 2022 10:15:25 +0200 Subject: [PATCH 0412/1169] make it local and switch vep to version 105 --- modules.json | 3 --- modules/{nf-core/modules => local}/ensemblvep/Dockerfile | 0 modules/{nf-core/modules => local}/ensemblvep/build.sh | 0 modules/{nf-core/modules => local}/ensemblvep/environment.yml | 0 modules/{nf-core/modules => local}/ensemblvep/main.nf | 4 ++-- modules/{nf-core/modules => local}/ensemblvep/meta.yml | 0 subworkflows/nf-core/annotate_structural_variants.nf | 2 +- subworkflows/nf-core/annotate_vcfanno.nf | 3 ++- 8 files changed, 5 insertions(+), 7 deletions(-) rename modules/{nf-core/modules => local}/ensemblvep/Dockerfile (100%) rename modules/{nf-core/modules => local}/ensemblvep/build.sh (100%) rename modules/{nf-core/modules => local}/ensemblvep/environment.yml (100%) rename modules/{nf-core/modules => local}/ensemblvep/main.nf (93%) rename modules/{nf-core/modules => local}/ensemblvep/meta.yml (100%) diff --git a/modules.json b/modules.json index 206224dc..50b91cae 100644 --- a/modules.json +++ b/modules.json @@ -21,9 +21,6 @@ "deepvariant": { "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, - "ensemblvep": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, "expansionhunter": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, diff --git a/modules/nf-core/modules/ensemblvep/Dockerfile b/modules/local/ensemblvep/Dockerfile similarity index 100% rename from modules/nf-core/modules/ensemblvep/Dockerfile rename to modules/local/ensemblvep/Dockerfile diff --git a/modules/nf-core/modules/ensemblvep/build.sh b/modules/local/ensemblvep/build.sh similarity index 100% rename from modules/nf-core/modules/ensemblvep/build.sh rename to modules/local/ensemblvep/build.sh diff --git a/modules/nf-core/modules/ensemblvep/environment.yml b/modules/local/ensemblvep/environment.yml similarity index 100% rename from modules/nf-core/modules/ensemblvep/environment.yml rename to modules/local/ensemblvep/environment.yml diff --git a/modules/nf-core/modules/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf similarity index 93% rename from modules/nf-core/modules/ensemblvep/main.nf rename to modules/local/ensemblvep/main.nf index c2bd055f..9927c482 100644 --- a/modules/nf-core/modules/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -4,8 +4,8 @@ process ENSEMBLVEP { conda (params.enable_conda ? "bioconda::ensembl-vep=104.3" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ensembl-vep:104.3--pl5262h4a94de4_0' : - 'quay.io/biocontainers/ensembl-vep:104.3--pl5262h4a94de4_0' }" + 'https://depot.galaxyproject.org/singularity/ensembl-vep:105.0--pl5321h4a94de4_1' : + 'quay.io/biocontainers/ensembl-vep:105.0--pl5321h4a94de4_1' }" input: tuple val(meta), path(vcf) diff --git a/modules/nf-core/modules/ensemblvep/meta.yml b/modules/local/ensemblvep/meta.yml similarity index 100% rename from modules/nf-core/modules/ensemblvep/meta.yml rename to modules/local/ensemblvep/meta.yml diff --git a/subworkflows/nf-core/annotate_structural_variants.nf b/subworkflows/nf-core/annotate_structural_variants.nf index 2b650252..b69ec843 100644 --- a/subworkflows/nf-core/annotate_structural_variants.nf +++ b/subworkflows/nf-core/annotate_structural_variants.nf @@ -4,7 +4,7 @@ include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' -include { ENSEMBLVEP } from '../../modules/nf-core/modules/ensemblvep/main' +include { ENSEMBLVEP } from '../../modules/local/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { diff --git a/subworkflows/nf-core/annotate_vcfanno.nf b/subworkflows/nf-core/annotate_vcfanno.nf index 380767b5..ce665ba5 100644 --- a/subworkflows/nf-core/annotate_vcfanno.nf +++ b/subworkflows/nf-core/annotate_vcfanno.nf @@ -12,9 +12,10 @@ workflow ANNOTATE_VCFANNO { main: ch_versions = Channel.empty() + ch_toml = file(toml) ch_placeholder = vcf.map { meta, vcf, idx -> vcf = []; [meta, vcf] } - VCFANNO (vcf, ch_placeholder, toml, resource_dir) + VCFANNO (vcf, ch_placeholder, ch_toml, resource_dir) ch_versions = ch_versions.mix(VCFANNO.out.versions) emit: From e1484fbe8a4696c42dea7731830b96733ffb07e7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 8 Apr 2022 10:20:30 +0200 Subject: [PATCH 0413/1169] update version in config --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index dba11155..24464442 100644 --- a/nextflow.config +++ b/nextflow.config @@ -29,7 +29,7 @@ params { // Annotation vep_genome = 'GRCh37' - vep_cache_version = '104' + vep_cache_version = '105' // MultiQC options multiqc_config = null From 9292b934f5607230ee768bf1f23935b56b529304 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 8 Apr 2022 13:53:07 +0200 Subject: [PATCH 0414/1169] remove dockerfile --- modules/local/ensemblvep/Dockerfile | 30 ------------------------ modules/local/ensemblvep/build.sh | 27 --------------------- modules/local/ensemblvep/environment.yml | 10 -------- 3 files changed, 67 deletions(-) delete mode 100644 modules/local/ensemblvep/Dockerfile delete mode 100644 modules/local/ensemblvep/build.sh delete mode 100644 modules/local/ensemblvep/environment.yml diff --git a/modules/local/ensemblvep/Dockerfile b/modules/local/ensemblvep/Dockerfile deleted file mode 100644 index ac1b4691..00000000 --- a/modules/local/ensemblvep/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM nfcore/base:1.14 -LABEL \ - author="Maxime Garcia" \ - description="VEP image for nf-core pipelines" \ - maintainer="maxime.garcia@scilifelab.se" - -# Install the conda environment -COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-vep-104.3/bin:$PATH - -# Setup default ARG variables -ARG GENOME=GRCh38 -ARG SPECIES=homo_sapiens -ARG VEP_VERSION=99 - -# Download Genome -RUN vep_install \ - -a c \ - -c .vep \ - -s ${SPECIES} \ - -y ${GENOME} \ - --CACHE_VERSION ${VEP_VERSION} \ - --CONVERT \ - --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-vep-104.3 > nf-core-vep-104.3.yml diff --git a/modules/local/ensemblvep/build.sh b/modules/local/ensemblvep/build.sh deleted file mode 100644 index 5fcb91df..00000000 --- a/modules/local/ensemblvep/build.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Build and push all containers - -build_push() { - GENOME=$1 - SPECIES=$2 - VEP_VERSION=$3 - VEP_TAG=$4 - - docker build \ - -t nfcore/vep:${VEP_TAG}.${GENOME} \ - software/vep/. \ - --build-arg GENOME=${GENOME} \ - --build-arg SPECIES=${SPECIES} \ - --build-arg VEP_VERSION=${VEP_VERSION} - - docker push nfcore/vep:${VEP_TAG}.${GENOME} -} - -build_push "GRCh37" "homo_sapiens" "104" "104.3" -build_push "GRCh38" "homo_sapiens" "104" "104.3" -build_push "GRCm38" "mus_musculus" "102" "104.3" -build_push "GRCm39" "mus_musculus" "104" "104.3" -build_push "CanFam3.1" "canis_lupus_familiaris" "104" "104.3" -build_push "WBcel235" "caenorhabditis_elegans" "104" "104.3" diff --git a/modules/local/ensemblvep/environment.yml b/modules/local/ensemblvep/environment.yml deleted file mode 100644 index c0731c26..00000000 --- a/modules/local/ensemblvep/environment.yml +++ /dev/null @@ -1,10 +0,0 @@ -# You can use this file to create a conda environment for this module: -# conda env create -f environment.yml -name: nf-core-vep-104.3 -channels: - - conda-forge - - bioconda - - defaults - -dependencies: - - bioconda::ensembl-vep=104.3 From f695698c50a8fc3a689650961654e2a3e7cee459 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 8 Apr 2022 16:45:03 +0200 Subject: [PATCH 0415/1169] review suggestions --- main.nf | 1 - modules/local/ensemblvep/main.nf | 9 +++++---- nextflow.config | 1 - nextflow_schema.json | 7 ------- .../{nf-core => local}/annotate_structural_variants.nf | 6 +++--- workflows/raredisease.nf | 8 ++++---- 6 files changed, 12 insertions(+), 20 deletions(-) rename subworkflows/{nf-core => local}/annotate_structural_variants.nf (83%) diff --git a/main.nf b/main.nf index 2de5ffcb..8446ff6c 100644 --- a/main.nf +++ b/main.nf @@ -28,7 +28,6 @@ params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_r params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') params.vep_cache = WorkflowMain.getGenomeAttribute(params, 'vep_cache') - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE & PRINT PARAMETER SUMMARY diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index 9927c482..54b97e3c 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -2,7 +2,7 @@ process ENSEMBLVEP { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::ensembl-vep=104.3" : null) + conda (params.enable_conda ? "bioconda::ensembl-vep=105.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ensembl-vep:105.0--pl5321h4a94de4_1' : 'quay.io/biocontainers/ensembl-vep:105.0--pl5321h4a94de4_1' }" @@ -15,9 +15,9 @@ process ENSEMBLVEP { path cache output: - tuple val(meta), path("*.ann.vcf"), emit: vcf - path "*.summary.html" , emit: report - path "versions.yml" , emit: versions + tuple val(meta), path("*.ann.vcf.gz"), emit: vcf + path "*.summary.html" , emit: report + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -40,6 +40,7 @@ process ENSEMBLVEP { --dir_cache $dir_cache \\ --fork $task.cpus \\ --vcf \\ + --compress_output bgzip \\ --stats_file ${prefix}.summary.html rm -rf $prefix diff --git a/nextflow.config b/nextflow.config index 24464442..b51aa773 100644 --- a/nextflow.config +++ b/nextflow.config @@ -28,7 +28,6 @@ params { aligner = 'bwamem2' // Annotation - vep_genome = 'GRCh37' vep_cache_version = '105' // MultiQC options diff --git a/nextflow_schema.json b/nextflow_schema.json index 8ac7e28a..9e4c1acb 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -193,13 +193,6 @@ "fa_icon": "fas fa-user-cog", "description": "Options used to facilitate the annotation of the variants.", "properties": { - "vep_genome": { - "type": "string", - "default": "GRCh37", - "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", - "fa_icon": "fas fa-book", - "enum": ["GRCh37", "GRCh38"] - }, "vep_cache_version": { "type": "string", "default": "104", diff --git a/subworkflows/nf-core/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf similarity index 83% rename from subworkflows/nf-core/annotate_structural_variants.nf rename to subworkflows/local/annotate_structural_variants.nf index b69ec843..2ddb2341 100644 --- a/subworkflows/nf-core/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -2,9 +2,9 @@ // A subworkflow to annotate structural variants. // -include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' -include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' -include { ENSEMBLVEP } from '../../modules/local/ensemblvep/main' +include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' +include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' +include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3856408d..223ec44c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -45,8 +45,9 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { CHECK_INPUT } from '../subworkflows/local/check_input' -include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' +include { CHECK_INPUT } from '../subworkflows/local/check_input' +include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' +include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -72,7 +73,6 @@ include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/annotate_structural_variants' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -162,7 +162,7 @@ workflow RAREDISEASE { ANNOTATE_STRUCTURAL_VARIANTS ( CALL_STRUCTURAL_VARIANTS.out.vcf, params.svdb_query_dbs, - params.vep_genome, + params.genome, params.vep_cache_version, params.vep_cache, ch_references.genome_fasta, From 9008f2635d1041d31eebbb6d8742e389694abf89 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 8 Apr 2022 16:47:43 +0200 Subject: [PATCH 0416/1169] update modules config --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index fea6438f..9f306995 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -202,7 +202,7 @@ process { enabled: false, ] } - withName: ENSEMBLVEP { + withName: ENSEMBLVEP_SV { ext.args = [ '--plugin LoFtool,vep_cache/LoFtool_scores.txt', '--distance 5000', From 492ffc0f4b74688d8e1e2069cc9bf193545af76d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 8 Apr 2022 16:48:42 +0200 Subject: [PATCH 0417/1169] update process name in subworkflow --- subworkflows/local/annotate_structural_variants.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 2ddb2341..7bc4ecbb 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -44,9 +44,9 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { seq_dict ) - ENSEMBLVEP(PICARD_SORTVCF.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, file(vep_cache)) + ENSEMBLVEP_SV(PICARD_SORTVCF.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, file(vep_cache)) emit: - vcf_ann = ENSEMBLVEP.out.vcf + vcf_ann = ENSEMBLVEP_SV.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 08d11c1c1a3b3602fc642fae69a51ef1779f2647 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 8 Apr 2022 20:38:25 +0200 Subject: [PATCH 0418/1169] add channel versions --- subworkflows/local/annotate_structural_variants.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 7bc4ecbb..94a50d80 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -38,13 +38,16 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ch_svdb_dbs.out_frqs.toList(), ch_svdb_dbs.vcf_dbs.toList() ) + ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) PICARD_SORTVCF(SVDB_QUERY.out.vcf, fasta, seq_dict ) + ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) ENSEMBLVEP_SV(PICARD_SORTVCF.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, file(vep_cache)) + ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) emit: vcf_ann = ENSEMBLVEP_SV.out.vcf From ddceb70ccc7b2dfad49bf060cdd01f96aa888dff Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 8 Apr 2022 21:16:13 +0200 Subject: [PATCH 0419/1169] add prettierignore to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5124c9ac..078e243b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ results/ testing/ testing* *.pyc +.prettierignore From 650f801bfc84281ee50a8b4d71cd4b5057dfebc4 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 10 Apr 2022 09:47:51 +0200 Subject: [PATCH 0420/1169] update file extension --- modules/local/ensemblvep/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index 54b97e3c..49beafa8 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -31,7 +31,7 @@ process ENSEMBLVEP { vep \\ -i $vcf \\ - -o ${prefix}.ann.vcf \\ + -o ${prefix}.ann.vcf.gz \\ $args \\ --assembly $genome \\ --species $species \\ From 0cf4f98ccee28da148995bd97392f02b5dc14754 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 10 Apr 2022 11:09:58 +0200 Subject: [PATCH 0421/1169] report as optional --- modules/local/ensemblvep/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index 49beafa8..c2264d16 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -16,7 +16,7 @@ process ENSEMBLVEP { output: tuple val(meta), path("*.ann.vcf.gz"), emit: vcf - path "*.summary.html" , emit: report + path "*.summary.html" , emit: report, optional: true path "versions.yml" , emit: versions when: From e898599e664581d3a9439a70f372271fb4066661 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 11 Apr 2022 13:50:46 +0200 Subject: [PATCH 0422/1169] review suggestions --- .prettierignore | 8 +++++++ conf/modules.config | 2 +- nextflow.config | 2 +- .../local/annotate_structural_variants.nf | 12 +++++----- workflows/raredisease.nf | 24 +++++++++---------- 5 files changed, 28 insertions(+), 20 deletions(-) create mode 100644 .prettierignore diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..5124c9ac --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +.nextflow* +work/ +data/ +results/ +.DS_Store +testing/ +testing* +*.pyc diff --git a/conf/modules.config b/conf/modules.config index 9f306995..10639817 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -207,7 +207,7 @@ process { '--plugin LoFtool,vep_cache/LoFtool_scores.txt', '--distance 5000', '--buffer_size 20000', - '--format vcf --max_sv_size 248956422 --vcf', + '--format vcf --max_sv_size 248956422', '--appris --biotype --canonical --ccds', '--domains --exclude_predicted --force_overwrite', '--humdiv --no_progress --no_stats --numbers', diff --git a/nextflow.config b/nextflow.config index b51aa773..ecafbecb 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,7 +22,7 @@ params { // Main options analysis_type = 'wgs' - annotate_sv_switch = false + annotate_sv_switch = true // Alignment aligner = 'bwamem2' diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 94a50d80..6a8ef0ce 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -40,13 +40,13 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ) ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) - PICARD_SORTVCF(SVDB_QUERY.out.vcf, - fasta, - seq_dict - ) - ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) + // PICARD_SORTVCF(SVDB_QUERY.out.vcf, + // fasta, + // seq_dict + // ) + // ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) - ENSEMBLVEP_SV(PICARD_SORTVCF.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, file(vep_cache)) + ENSEMBLVEP_SV(SVDB_QUERY.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, file(vep_cache)) ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) emit: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 223ec44c..1c87e027 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -130,12 +130,12 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) // STEP 1.6: EXPANSIONHUNTER - CALL_REPEAT_EXPANSIONS ( - ch_marked_bam.join(ch_marked_bai, by: [0]), - ch_references.genome_fasta, - ch_references.variant_catalog - ) - ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) + // CALL_REPEAT_EXPANSIONS ( + // ch_marked_bam.join(ch_marked_bai, by: [0]), + // ch_references.genome_fasta, + // ch_references.variant_catalog + // ) + // ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. @@ -175,12 +175,12 @@ workflow RAREDISEASE { // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) - ANNOTATE_VCFANNO ( - params.vcfanno_toml, - ch_dv_vcf, - ch_references.vcfanno_resources - ) - ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) + // ANNOTATE_VCFANNO ( + // params.vcfanno_toml, + // ch_dv_vcf, + // ch_references.vcfanno_resources + // ) + // ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) // // MODULE: Pipeline reporting From 6c7573243f96c2449a2bc4d3b37ffc5546d9ed90 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 11 Apr 2022 13:58:51 +0200 Subject: [PATCH 0423/1169] fix error --- nextflow.config | 2 +- .../local/annotate_structural_variants.nf | 12 +++++----- workflows/raredisease.nf | 24 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/nextflow.config b/nextflow.config index ecafbecb..b51aa773 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,7 +22,7 @@ params { // Main options analysis_type = 'wgs' - annotate_sv_switch = true + annotate_sv_switch = false // Alignment aligner = 'bwamem2' diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 6a8ef0ce..94a50d80 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -40,13 +40,13 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ) ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) - // PICARD_SORTVCF(SVDB_QUERY.out.vcf, - // fasta, - // seq_dict - // ) - // ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) + PICARD_SORTVCF(SVDB_QUERY.out.vcf, + fasta, + seq_dict + ) + ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) - ENSEMBLVEP_SV(SVDB_QUERY.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, file(vep_cache)) + ENSEMBLVEP_SV(PICARD_SORTVCF.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, file(vep_cache)) ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) emit: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 1c87e027..223ec44c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -130,12 +130,12 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) // STEP 1.6: EXPANSIONHUNTER - // CALL_REPEAT_EXPANSIONS ( - // ch_marked_bam.join(ch_marked_bai, by: [0]), - // ch_references.genome_fasta, - // ch_references.variant_catalog - // ) - // ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) + CALL_REPEAT_EXPANSIONS ( + ch_marked_bam.join(ch_marked_bai, by: [0]), + ch_references.genome_fasta, + ch_references.variant_catalog + ) + ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. @@ -175,12 +175,12 @@ workflow RAREDISEASE { // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) - // ANNOTATE_VCFANNO ( - // params.vcfanno_toml, - // ch_dv_vcf, - // ch_references.vcfanno_resources - // ) - // ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) + ANNOTATE_VCFANNO ( + params.vcfanno_toml, + ch_dv_vcf, + ch_references.vcfanno_resources + ) + ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) // // MODULE: Pipeline reporting From 749c93935b28c7abef8737b5535a00921e6e0743 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 11 Apr 2022 21:32:01 +0200 Subject: [PATCH 0424/1169] install module --- modules.json | 3 + modules/nf-core/modules/bcftools/view/main.nf | 55 ++++++++++++++++ .../nf-core/modules/bcftools/view/meta.yml | 63 +++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 modules/nf-core/modules/bcftools/view/main.nf create mode 100644 modules/nf-core/modules/bcftools/view/meta.yml diff --git a/modules.json b/modules.json index d46c250e..4b588d37 100644 --- a/modules.json +++ b/modules.json @@ -6,6 +6,9 @@ "bcftools/norm": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, + "bcftools/view": { + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + }, "bwamem2/index": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, diff --git a/modules/nf-core/modules/bcftools/view/main.nf b/modules/nf-core/modules/bcftools/view/main.nf new file mode 100644 index 00000000..ca1121a5 --- /dev/null +++ b/modules/nf-core/modules/bcftools/view/main.nf @@ -0,0 +1,55 @@ +process BCFTOOLS_VIEW { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? 'bioconda::bcftools=1.14' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0' : + 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" + + input: + tuple val(meta), path(vcf), path(index) + path(regions) + path(targets) + path(samples) + + output: + tuple val(meta), path("*.gz") , emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def regions_file = regions ? "--regions-file ${regions}" : "" + def targets_file = targets ? "--targets-file ${targets}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" + """ + bcftools view \\ + --output ${prefix}.vcf.gz \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + $args \\ + --threads $task.cpus \\ + ${vcf} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/bcftools/view/meta.yml b/modules/nf-core/modules/bcftools/view/meta.yml new file mode 100644 index 00000000..326fd1fa --- /dev/null +++ b/modules/nf-core/modules/bcftools/view/meta.yml @@ -0,0 +1,63 @@ +name: bcftools_view +description: View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF +keywords: + - variant calling + - view + - bcftools + - VCF + +tools: + - view: + description: | + View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + The vcf file to be inspected. + e.g. 'file.vcf' + - index: + type: file + description: | + The tab index for the VCF file to be inspected. + e.g. 'file.tbi' + - regions: + type: file + description: | + Optionally, restrict the operation to regions listed in this file. + e.g. 'file.vcf' + - targets: + type: file + description: | + Optionally, restrict the operation to regions listed in this file (doesn't rely upon index files) + e.g. 'file.vcf' + - samples: + type: file + description: | + Optional, file of sample names to be included or excluded. + e.g. 'file.tsv' +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF normalized output file + pattern: "*.{vcf.gz}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@abhi18av" From 79b37a92958a954b02abd58a1021ad22b694c9d4 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:32:15 +0200 Subject: [PATCH 0425/1169] fix lint --- workflows/raredisease.nf | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 779a7153..6ea2cf37 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -67,22 +67,13 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // SUBWORKFLOW: Consists entirely of nf-core/modules // -<<<<<<< HEAD -include { ALIGN } from '../subworkflows/nf-core/align' -include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' -include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' -include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/annotate_structural_variants' -======= -include { ALIGN_BWAMEM2 } from '../subworkflows/nf-core/align_bwamem2' +include { ALIGN } from '../subworkflows/nf-core/align' include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' ->>>>>>> dev +include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/annotate_structural_variants' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 79465611a8c3f6957a8d8dae269b499a7cb6edf2 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:35:51 +0200 Subject: [PATCH 0426/1169] fix lint: part 2 --- workflows/raredisease.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6ea2cf37..0c7dfab0 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -73,7 +73,6 @@ include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/annotate_structural_variants' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 9623cf75da30520c8cd50a7056e2eacda923e745 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:58:23 +0200 Subject: [PATCH 0427/1169] hidden away some params --- nextflow_schema.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 9e4c1acb..1ff70ab6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -68,7 +68,8 @@ "format": "file-path", "help_text": "If none provided, will be generated automatically from the FASTA reference", "description": "Path to FASTA genome index file.", - "fa_icon": "far fa-file-code" + "fa_icon": "far fa-file-code", + "hidden": true }, "igenomes_base": { "type": "string", @@ -115,8 +116,9 @@ "type": "string", "format": "file-path", "description": "Path to variant catalog file", - "help_text": "This parameter is mandatory for use with ExpansionHunter", - "fa_icon": "far fa-file-code" + "help_text": "Used with ExpansionHunter and if no catalogue is passed, then a default will be used.", + "fa_icon": "far fa-file-code", + "hidden": true }, "vcfanno_resources": { "type": "string", @@ -127,7 +129,7 @@ "vcfanno_toml": { "type": "string", "description": "Path to the vcfanno toml file.", - "help_text": "If toml is passed, default configurations will be used according to genome build within the context of the pipeline.", + "help_text": "If no toml is passed, default configurations will be used according to genome build within the context of the pipeline.", "fa_icon": "fas fa-file-csv" }, "vep_cache": { From 9404db99367279f42cd2a215f136cc40c089f287 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 12 Apr 2022 14:00:24 +0200 Subject: [PATCH 0428/1169] update nextflow_schema --- nextflow_schema.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 1ff70ab6..1b6909b0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -98,19 +98,22 @@ "type": "string", "format": "path", "fa_icon": "fas fa-bezier-curve", - "description": "Path to directory for gnomad vcf." + "description": "Path to directory for gnomad vcf.", + "help_text": "Path to the gnomad vcf file. If you don't provide one, gnomad annotations will not be used." }, "target_bed": { "type": "string", "format": "path", "fa_icon": "fas fa-bezier-curve", - "description": "Path to directory for target bed file." + "description": "Path to directory for target bed file.", + "help_text": "If you would like to limit your analysis to specific regions of the genome, you can pass those regions in a bed file using this option" }, "svdb_query_dbs": { "type": "string", "format": "file-path", - "description": "Path to comma-separated file containing information about the databases used for structural variant annotation.", - "fa_icon": "far fa-file-code" + "description": "Databases used for structural variant annotation.", + "fa_icon": "far fa-file-code", + "help_text": "Path to comma-separated file containing information about the databases used for structural variant annotation." }, "variant_catalog": { "type": "string", From c3bf3000e4f21c6b663e3ba45845ba9c12182ef8 Mon Sep 17 00:00:00 2001 From: Mei Wu <25568561+projectoriented@users.noreply.github.com> Date: Tue, 12 Apr 2022 14:22:59 +0200 Subject: [PATCH 0429/1169] hide away non essential params --- nextflow_schema.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 1b6909b0..ef277783 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -106,7 +106,8 @@ "format": "path", "fa_icon": "fas fa-bezier-curve", "description": "Path to directory for target bed file.", - "help_text": "If you would like to limit your analysis to specific regions of the genome, you can pass those regions in a bed file using this option" + "help_text": "If you would like to limit your analysis to specific regions of the genome, you can pass those regions in a bed file using this option", + "hidden": true }, "svdb_query_dbs": { "type": "string", @@ -127,13 +128,15 @@ "type": "string", "description": "Directory path or tar.gz archive that holds resources defined within the vcfanno toml file.", "help_text": "If no directory path is passed, default configurations will be used according to genome build within the context of the pipeline.", - "fa_icon": "fas fa-folder-open" + "fa_icon": "fas fa-folder-open", + "hidden": true }, "vcfanno_toml": { "type": "string", "description": "Path to the vcfanno toml file.", "help_text": "If no toml is passed, default configurations will be used according to genome build within the context of the pipeline.", - "fa_icon": "fas fa-file-csv" + "fa_icon": "fas fa-file-csv", + "hidden": true }, "vep_cache": { "type": "string", From 81c3bf0dbeacd31d5edbf54648386a82d80ad18f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 13 Apr 2022 00:58:21 +0200 Subject: [PATCH 0430/1169] stub works --- conf/modules.config | 10 ++++++++++ .../local/annotate_structural_variants.nf | 17 ++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 10639817..6f033751 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -202,6 +202,16 @@ process { enabled: false, ] } + withname: BCFTOOLS_VIEW { + if (params.genome == 'GRCh37') { + ext.args = '--output-type v --apply-filters PASS --exclude "INFO/clinical_genomics_mipAF > 0.40 | INFO/swegenAF > 0.40 | INFO/clingen_ngiAF > 0.40 | INFO/gnomad_svAF > 0.40 "' + } else if (params.genome == 'GRCh38') { + ext.args = '--output-type v --apply-filters PASS --exclude "INFO/swegenAF > 0.40"' + } + publishDir = [ + enabled: false, + ] + } withName: ENSEMBLVEP_SV { ext.args = [ '--plugin LoFtool,vep_cache/LoFtool_scores.txt', diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 94a50d80..673d93c1 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -4,6 +4,7 @@ include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' +include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { @@ -44,9 +45,23 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { fasta, seq_dict ) + + PICARD_SORTVCF.out.vcf + .map { + meta, vcf -> + return [meta,vcf,[]] + } + .set { ch_sortvcf } ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) - ENSEMBLVEP_SV(PICARD_SORTVCF.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, file(vep_cache)) + BCFTOOLS_VIEW(ch_sortvcf,[],[],[]) + + ENSEMBLVEP_SV(BCFTOOLS_VIEW.out.vcf, + vep_genome, + "homo_sapiens", + vep_cache_version, + file(vep_cache) + ) ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) emit: From b5848c2a72ea096b60b7995831c5646c8b939755 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 14 Apr 2022 02:29:01 +0200 Subject: [PATCH 0431/1169] stub works --- bin/sentieon_init.sh | 13 +++++ conf/genomes.config | 2 + conf/modules.config | 17 ++++++ main.nf | 1 + modules/local/sentieon/bwamem.nf | 67 ++++++++++++++++++++++++ modules/local/sentieon/bwamemindex.nf | 54 +++++++++++++++++++ nextflow.config | 1 + nextflow_schema.json | 19 ++++++- subworkflows/local/align_sentieon.nf | 24 +++++++++ subworkflows/local/prepare_genome.nf | 12 +++-- subworkflows/local/prepare_references.nf | 4 +- subworkflows/nf-core/align.nf | 22 +++++--- workflows/raredisease.nf | 6 ++- 13 files changed, 228 insertions(+), 14 deletions(-) create mode 100644 bin/sentieon_init.sh create mode 100644 modules/local/sentieon/bwamem.nf create mode 100644 modules/local/sentieon/bwamemindex.nf create mode 100644 subworkflows/local/align_sentieon.nf diff --git a/bin/sentieon_init.sh b/bin/sentieon_init.sh new file mode 100644 index 00000000..10503166 --- /dev/null +++ b/bin/sentieon_init.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# +# Sentieon initialization script +# This script takes as input the name of a environment +# variable holding the Sentieon license encoded as Base64 text +set -eu +LICENSE_ENCODED="\${!1}" +if [ "${#LICENSE_ENCODED}" -lt "1500" ]; then # Sentieon License server + export SENTIEON_LICENSE=$(echo -e "$LICENSE_ENCODED" | base64 -d) +else # Localhost license file + export SENTIEON_LICENSE=$(mktemp) + echo -e "$LICENSE_ENCODED" | base64 -d > $SENTIEON_LICENSE +fi diff --git a/conf/genomes.config b/conf/genomes.config index b870ac14..036ccbaa 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -15,6 +15,7 @@ params { fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" + sentieon = "" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -27,6 +28,7 @@ params { fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" + sentieon = "" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/conf/modules.config b/conf/modules.config index ef471b6a..77edbce1 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -39,6 +39,15 @@ process { pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" ] } + withName: SENTIEON_BWAINDEX { + ext.when = {!params.sentieonbwa_index && params.aligner == "sentieon"} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } withName: SAMTOOLS_FAIDX { publishDir = [ path: { "${params.outdir}/references" }, @@ -256,6 +265,14 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + withName: 'SENTIEON_BWAMEM' { + ext.args = '-K 10000000' + ext.prefix = { "${meta.id}.sorted.bam" } + publishDir = [ + path: { "${params.outdir}/bam" }, + enabled: false + ] + } // ANNOTATE_VCFANNO withName: "VCFANNO" { publishDir = [ diff --git a/main.nf b/main.nf index 8446ff6c..e2813f25 100644 --- a/main.nf +++ b/main.nf @@ -22,6 +22,7 @@ params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') +params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'sentieon') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf new file mode 100644 index 00000000..d661187d --- /dev/null +++ b/modules/local/sentieon/bwamem.nf @@ -0,0 +1,67 @@ +process SENTIEON_BWAMEM { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + secret 'SENTIEON_LICENSE_BASE64' + + input: + tuple val(meta), path(reads) + path fasta + path fai + path index + + output: + tuple val(meta), path('*.bam'), emit: bam + tuple val(meta), path('*.bai'), emit: bai + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' + """ + source sentieon_init.sh SENTIEON_LICENSE_BASE64 + + INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` + + $sentieon_exe bwa mem \\ + -t $task.cpus \\ + \$INDEX \\ + $reads \\ + $args \\ + | sentieon \\ + util \\ + sort \\ + -r $fasta \\ + -o $prefix \\ + -t $task.cpus \\ + $args2 \\ + --sam2bam \\ + -i - + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + bwa: \$(echo \$($sentieon_exe bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' + """ + touch ${prefix}.bam + touch ${prefix}.bai + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + bwa: \$(echo \$($sentieon_exe bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf new file mode 100644 index 00000000..ff52324c --- /dev/null +++ b/modules/local/sentieon/bwamemindex.nf @@ -0,0 +1,54 @@ +process SENTIEON_BWAINDEX { + tag "$fasta" + label 'process_high' + label 'sentieon' + + secret 'SENTIEON_LICENSE_BASE64' + + input: + path fasta + + output: + path "bwa_index" , emit: index + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' + """ + source sentieon_init.sh SENTIEON_LICENSE_BASE64 + + mkdir bwa_index + + $sentieon_exe bwa index \\ + $args \\ + -p bwa_index/${fasta.baseName} \\ + $fasta + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + bwa: \$(echo \$($sentieon_exe bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + END_VERSIONS + """ + + stub: + def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' + """ + mkdir bwa_index + + touch bwa_index/${fasta}.ann + touch bwa_index/${fasta}.pac + touch bwa_index/${fasta}.amb + touch bwa_index/${fasta}.bwt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + bwa: \$(echo \$($sentieon_exe bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + END_VERSIONS + """ +} diff --git a/nextflow.config b/nextflow.config index b51aa773..ff0a6fba 100644 --- a/nextflow.config +++ b/nextflow.config @@ -12,6 +12,7 @@ params { // Required options input = null outdir = null + sentieon_install_dir = null // References genome = null diff --git a/nextflow_schema.json b/nextflow_schema.json index ef277783..3b5e3f2f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -35,6 +35,12 @@ "help_text": "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.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" }, + "sentieon_install_dir": { + "type": "string", + "fa_icon": "fas fa-folder-open", + "description": "Directory where Sentieon binary is installed if not on $PATH", + "default": null + }, "multiqc_title": { "type": "string", "description": "MultiQC report title. Printed as page header, used for filename if not otherwise specified.", @@ -109,6 +115,15 @@ "help_text": "If you would like to limit your analysis to specific regions of the genome, you can pass those regions in a bed file using this option", "hidden": true }, + "sentieonbwa_index": { + "type": "string", + "format": "directory-path", + "default": null, + "description": "Directory for pre-built sentieon index.", + "help_text": "If none provided, will be generated automatically from the FASTA reference.", + "fa_icon": "fas fa-folder-open", + "hidden": true + }, "svdb_query_dbs": { "type": "string", "format": "file-path", @@ -189,9 +204,9 @@ "aligner": { "type": "string", "default": "bwamem2", - "description": "Specifies the alignment algorithm to use - available options are 'bwamem2'.", + "description": "Specifies the alignment algorithm to use - available options are 'bwamem2' and 'sentieon'.", "fa_icon": "fas fa-map-signs", - "enum": ["bwamem2"] + "enum": ["bwamem2", "sentieon"] } } }, diff --git a/subworkflows/local/align_sentieon.nf b/subworkflows/local/align_sentieon.nf new file mode 100644 index 00000000..bf2d955b --- /dev/null +++ b/subworkflows/local/align_sentieon.nf @@ -0,0 +1,24 @@ +// +// A subworkflow to annotate structural variants. +// + +include { SENTIEON_BWAMEM } from '../../modules/local/sentieon/bwamem' + +workflow ALIGN_SENTIEON { + take: + reads_input // channel: [ val(meta), reads_input ] + fasta // path: genome.fasta + fai // path: genome.fai + index // channel: [ /path/to/bwamem2/index/ ] + + main: + ch_versions = Channel.empty() + + SENTIEON_BWAMEM ( reads_input, fasta, fai, index ) + ch_versions = ch_versions.mix(SENTIEON_BWAMEM.out.versions) + + emit: + bam = SENTIEON_BWAMEM.out.bam + bai = SENTIEON_BWAMEM.out.bai + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index c3a92be5..203ee210 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -7,10 +7,12 @@ include { BWAMEM2_INDEX } from '../../modules/nf-cor include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/modules/gatk4/createsequencedictionary/main' include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' +include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' workflow PREPARE_GENOME { take: bwamem2_index // [mandatory] bwamem2_index + sentieon_index // [mandatory] sentieon_index fasta // [mandatory] genome.fasta fai // [mandatory] genome.fai variant_catalog // [optional] variant_catalog.json @@ -20,11 +22,15 @@ workflow PREPARE_GENOME { ch_fasta = file(fasta) ch_versions = Channel.empty() - // Fetch BWAMEM2 index or create from scratch if required + // Fetch aligner index or create from scratch if required BWAMEM2_INDEX ( ch_fasta ) - ch_bwamem2_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : Channel.fromPath(bwamem2_index).collect() + ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : Channel.fromPath(bwamem2_index).collect() ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) + SENTIEON_BWAINDEX ( ch_fasta ) + ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : Channel.fromPath(sentieon_index).collect() + ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) + if ( fai ) { ch_fai = file(fai) } else { @@ -62,7 +68,7 @@ workflow PREPARE_GENOME { emit: - bwamem2_index = ch_bwamem2_index // path: bwamem2/index + aligner_index = ch_aligner_index // path: bwamem2/index chrom_sizes = ch_chrom_sizes // path: chrom.sizes fasta = ch_fasta // path: genome.fasta fai = ch_fai // path: genome.fasta.fai diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index b484077e..6b1048c0 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -13,6 +13,7 @@ workflow PREPARE_REFERENCES { gnomad fasta // [mandatory] genome.fasta fai // [mandatory] genome.fai + sentieonbwa_index target_bed variant_catalog // [optional] variant_catalog.json vcfanno_resources // [mandatory] vcfanno resource file @@ -22,6 +23,7 @@ workflow PREPARE_REFERENCES { ch_versions = Channel.empty() PREPARE_GENOME ( bwamem2_index, + sentieonbwa_index, fasta, fai, variant_catalog, @@ -59,7 +61,7 @@ workflow PREPARE_REFERENCES { } emit: - bwamem2_index = ch_genome.bwamem2_index + aligner_index = ch_genome.aligner_index chrom_sizes = ch_genome.chrom_sizes genome_fasta = ch_genome.fasta genome_fai = ch_genome.fai diff --git a/subworkflows/nf-core/align.nf b/subworkflows/nf-core/align.nf index b97502fe..d87213c3 100644 --- a/subworkflows/nf-core/align.nf +++ b/subworkflows/nf-core/align.nf @@ -2,29 +2,37 @@ // Map to reference // -include { ALIGN_BWAMEM2 } from './align_bwamem2' +include { ALIGN_BWAMEM2 } from './align_bwamem2' +include { ALIGN_SENTIEON } from '../local/align_sentieon' workflow ALIGN { take: - aligner // string: params.aligner + aligner // string: params.aligner reads_input // channel: [ val(meta), reads_input ] + fasta // channel: [genome.fasta] + fai // channel: [genome.fai] index // channel: [ /path/to/bwamem2/index/ ] main: - ch_versions = Channel.empty() - - //bwamem2 - ALIGN_BWAMEM2 ( reads_input, index ) + ch_versions = Channel.empty() + ch_marked_bai = Channel.empty() + ch_marked_bam = Channel.empty() if( aligner == "bwamem2" ) { + ALIGN_BWAMEM2 ( reads_input, index ) ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai + ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) + } else if( aligner == "sentieon" ) { + ALIGN_SENTIEON ( reads_input, fasta, fai, index ) + ch_marked_bam = ALIGN_SENTIEON.out.bam + ch_marked_bai = ALIGN_SENTIEON.out.bai + ch_versions = ch_versions.mix(ALIGN_SENTIEON.out.versions) } else { exit 1, 'Please provide a valid aligner!' } ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) - ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) emit: marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bam ] ] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 0c7dfab0..94ec32e6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -17,6 +17,7 @@ def checkPathParamList = [ params.gnomad, params.input, params.multiqc_config, + params.sentieonbwa_index, params.svdb_query_dbs, params.vcfanno_resources, params.vep_cache @@ -107,6 +108,7 @@ workflow RAREDISEASE { params.gnomad, params.fasta, params.fasta_fai, + params.sentieonbwa_index, params.target_bed, params.variant_catalog, params.vcfanno_resources @@ -118,7 +120,9 @@ workflow RAREDISEASE { ALIGN ( params.aligner, CHECK_INPUT.out.reads, - ch_references.bwamem2_index + ch_references.genome_fasta, + ch_references.genome_fai, + ch_references.aligner_index ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) From 80fbb742ada176724e8295b3069d88afc8b2411c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 14 Apr 2022 14:16:35 +0200 Subject: [PATCH 0432/1169] fix sentieon_init --- bin/sentieon_init.sh | 2 +- conf/modules.config | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/sentieon_init.sh b/bin/sentieon_init.sh index 10503166..ea8f393a 100644 --- a/bin/sentieon_init.sh +++ b/bin/sentieon_init.sh @@ -4,7 +4,7 @@ # This script takes as input the name of a environment # variable holding the Sentieon license encoded as Base64 text set -eu -LICENSE_ENCODED="\${!1}" +LICENSE_ENCODED="${!1}" if [ "${#LICENSE_ENCODED}" -lt "1500" ]; then # Sentieon License server export SENTIEON_LICENSE=$(echo -e "$LICENSE_ENCODED" | base64 -d) else # Localhost license file diff --git a/conf/modules.config b/conf/modules.config index 77edbce1..372c321c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -266,10 +266,10 @@ process { ] } withName: 'SENTIEON_BWAMEM' { - ext.args = '-K 10000000' + ext.args = '-M -K 10000000 -R ${meta.readgroups} ' ext.prefix = { "${meta.id}.sorted.bam" } publishDir = [ - path: { "${params.outdir}/bam" }, + path: { "${params.outdir}/sentieon" }, enabled: false ] } From 75c58025e5f0a99a568c6197b06da60587121c1d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 14 Apr 2022 14:39:16 +0200 Subject: [PATCH 0433/1169] fix stubs --- modules/local/sentieon/bwamemindex.nf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index ff52324c..db46ca54 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -40,11 +40,6 @@ process SENTIEON_BWAINDEX { """ mkdir bwa_index - touch bwa_index/${fasta}.ann - touch bwa_index/${fasta}.pac - touch bwa_index/${fasta}.amb - touch bwa_index/${fasta}.bwt - cat <<-END_VERSIONS > versions.yml "${task.process}": sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") From b92bccebddd23458309f603644cc44aded2b7768 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 14 Apr 2022 17:01:01 +0200 Subject: [PATCH 0434/1169] fix CI error --- conf/modules.config | 14 ++++++++++++-- subworkflows/local/prepare_genome.nf | 19 ++++++++++++------- subworkflows/local/prepare_references.nf | 2 ++ workflows/raredisease.nf | 1 + 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 372c321c..56febcc3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -241,6 +241,14 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + withName: ".*ALIGN_SENTIEON:.*"{ + ext.when = params.aligner.equals("sentieon") + publishDir = [ + path: { "${params.outdir}/sentieon" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } withName: BWAMEM2_MEM { ext.args = '-M -K 100000000' publishDir = [ @@ -266,11 +274,13 @@ process { ] } withName: 'SENTIEON_BWAMEM' { - ext.args = '-M -K 10000000 -R ${meta.readgroups} ' - ext.prefix = { "${meta.id}.sorted.bam" } + ext.args = { "-M -K 10000000 -R ${meta.readgroups} " } + ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/sentieon" }, enabled: false + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } // ANNOTATE_VCFANNO diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 203ee210..0d29a58a 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -11,6 +11,7 @@ include { SENTIEON_BWAINDEX } from '../../modules/local/ workflow PREPARE_GENOME { take: + aligner // [mandatory] params.aligner bwamem2_index // [mandatory] bwamem2_index sentieon_index // [mandatory] sentieon_index fasta // [mandatory] genome.fasta @@ -23,13 +24,17 @@ workflow PREPARE_GENOME { ch_versions = Channel.empty() // Fetch aligner index or create from scratch if required - BWAMEM2_INDEX ( ch_fasta ) - ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : Channel.fromPath(bwamem2_index).collect() - ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) - - SENTIEON_BWAINDEX ( ch_fasta ) - ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : Channel.fromPath(sentieon_index).collect() - ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) + if (aligner == "bwamem2") { + BWAMEM2_INDEX ( ch_fasta ) + ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : Channel.fromPath(bwamem2_index).collect() + ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) + } else if (aligner == "sentieon") { + SENTIEON_BWAINDEX ( ch_fasta ) + ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : Channel.fromPath(sentieon_index).collect() + ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) + } else { + exit 1, 'Please provide a valid aligner!' + } if ( fai ) { ch_fai = file(fai) diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 6b1048c0..0ddb220c 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -9,6 +9,7 @@ include { PREPARE_GENOME } from './prepare_genome' workflow PREPARE_REFERENCES { take: + aligner // [mandatory] params.aligner bwamem2_index // [mandatory] bwamem2_index gnomad fasta // [mandatory] genome.fasta @@ -22,6 +23,7 @@ workflow PREPARE_REFERENCES { // Prepare genome ch_versions = Channel.empty() PREPARE_GENOME ( + aligner, bwamem2_index, sentieonbwa_index, fasta, diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 94ec32e6..5fd35af7 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -104,6 +104,7 @@ workflow RAREDISEASE { // STEP 0: PREPARE GENOME REFERENCES AND INDICES. PREPARE_REFERENCES ( + params.aligner, params.bwamem2_index, params.gnomad, params.fasta, From 91dbaf15f26ef44eb20e44223c1e2e98c57f0af0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 14 Apr 2022 17:10:14 +0200 Subject: [PATCH 0435/1169] fix lint error --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 56febcc3..e25ab65c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -278,7 +278,7 @@ process { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/sentieon" }, - enabled: false + enabled: false, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] From f6c39d9da10050e57c208d2c9c65f2012d4fd4df Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 15 Apr 2022 14:55:50 +0200 Subject: [PATCH 0436/1169] fix typo --- conf/modules.config | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 69e96eb9..f3d1aebd 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -204,12 +204,7 @@ process { enabled: false, ] } - withname: BCFTOOLS_VIEW { - if (params.genome == 'GRCh37') { - ext.args = '--output-type v --apply-filters PASS --exclude "INFO/clinical_genomics_mipAF > 0.40 | INFO/swegenAF > 0.40 | INFO/clingen_ngiAF > 0.40 | INFO/gnomad_svAF > 0.40 "' - } else if (params.genome == 'GRCh38') { - ext.args = '--output-type v --apply-filters PASS --exclude "INFO/swegenAF > 0.40"' - } + withName: BCFTOOLS_VIEW { publishDir = [ enabled: false, ] From 7e673750be6b91d451d293a03c6daa01760ecb7a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 17 Apr 2022 01:08:44 +0200 Subject: [PATCH 0437/1169] align subworkflow --- conf/modules.config | 46 +++++++++++- main.nf | 3 + modules/local/sentieon/bwamem.nf | 4 +- modules/local/sentieon/driver.nf | 102 +++++++++++++++++++++++++++ nextflow_schema.json | 21 ++++++ subworkflows/local/align_sentieon.nf | 58 ++++++++++++--- subworkflows/nf-core/align.nf | 15 ++-- workflows/raredisease.nf | 8 ++- 8 files changed, 237 insertions(+), 20 deletions(-) create mode 100644 modules/local/sentieon/driver.nf diff --git a/conf/modules.config b/conf/modules.config index e25ab65c..703410e4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -274,15 +274,55 @@ process { ] } withName: 'SENTIEON_BWAMEM' { - ext.args = { "-M -K 10000000 -R ${meta.readgroups} " } + ext.args = { "-M -K 10000000 -R ${meta.read_group} " } ext.prefix = { "${meta.id}.sorted" } publishDir = [ - path: { "${params.outdir}/sentieon" }, - enabled: false, + path: { "${params.outdir}/sentieon_align" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + withName: 'SENTIEON_DATAMETRICS' { + ext.args = { [ + "--algo GCBias --summary ${meta.id}.gc_summary.txt ${meta.id}.gc_metrics.txt", + "--algo MeanQualityByCycle ${meta.id}.mq_metrics.txt", + "--algo QualDistribution ${meta.id}.qd_metrics.txt", + "--algo InsertSizeMetricAlgo ${meta.id}.is_metrics.txt", + "--algo AlignmentStat ${meta.id}.aln_metrics.txt", + "--algo LocusCollector --fun score_info ${meta.id}.score.txt.gz" + ].join(' ') + } + publishDir = [ + path: { "${params.outdir}/sentieon_bam_metrics" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + withName: 'SENTIEON_LOCUSCOLLECTOR' { + ext.args = { "--algo LocusCollector --fun score_info ${meta.id}.score.txt.gz" } + publishDir = [ + path: { "${params.outdir}/sentieon_dedup" }, + mode: params.publish_dir_mode, + ] + } + withName: 'SENTIEON_DEDUP' { + ext.args = { [ + "--algo Dedup --score_info ${meta.id}.score.txt.gz", + "--metrics ${meta.id}.dedup_metrics.txt ${meta.id}.dedup.bam" + ].join(' ') + } + publishDir = [ + path: { "${params.outdir}/sentieon_dedup" }, + mode: params.publish_dir_mode, + ] + } + withName: 'SENTIEON_BQSR' { + ext.args = { "--algo QualCal ${meta.id}.recal_data.table" } + publishDir = [ + path: { "${params.outdir}/sentieon_recal" }, + mode: params.publish_dir_mode, + ] + } // ANNOTATE_VCFANNO withName: "VCFANNO" { publishDir = [ diff --git a/main.nf b/main.nf index e2813f25..e0b12a13 100644 --- a/main.nf +++ b/main.nf @@ -21,6 +21,9 @@ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') +params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') +params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') +params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'sentieon') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf index d661187d..e4864985 100644 --- a/modules/local/sentieon/bwamem.nf +++ b/modules/local/sentieon/bwamem.nf @@ -34,11 +34,11 @@ process SENTIEON_BWAMEM { \$INDEX \\ $reads \\ $args \\ - | sentieon \\ + | $sentieon_exe \\ util \\ sort \\ -r $fasta \\ - -o $prefix \\ + -o ${prefix}.bam \\ -t $task.cpus \\ $args2 \\ --sam2bam \\ diff --git a/modules/local/sentieon/driver.nf b/modules/local/sentieon/driver.nf new file mode 100644 index 00000000..46a103e7 --- /dev/null +++ b/modules/local/sentieon/driver.nf @@ -0,0 +1,102 @@ +process SENTIEON_DRIVER { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + secret 'SENTIEON_LICENSE_BASE64' + + input: + tuple val(meta), path(bam), path(bai), path(score), path(score_idx), path(recal_pre), path(recal_post) + path fasta + path fai + path known_dbsnp + path known_mills + path known_indels + + output: + tuple val(meta), path('*.bam') , emit: bam , optional: true + tuple val(meta), path('*.bai') , emit: bai , optional: true + tuple val(meta), path('*.cram') , emit: cram , optional: true + tuple val(meta), path('*.crai') , emit: crai , optional: true + tuple val(meta), path('*.vcf.gz') , emit: vcf , optional: true + tuple val(meta), path('*.vcf.gz.tbi') , emit: vcf_tbi , optional: true + tuple val(meta), path('*recal_data.table') , emit: recal_pre , optional: true + tuple val(meta), path('*recal_data.table.post') , emit: recal_post , optional: true + tuple val(meta), path('*recal.csv') , emit: recal_csv , optional: true + tuple val(meta), path('*mq_metrics.txt') , emit: mq_metrics , optional: true + tuple val(meta), path('*qd_metrics.txt') , emit: qd_metrics , optional: true + tuple val(meta), path('*gc_summary.txt') , emit: gc_summary , optional: true + tuple val(meta), path('*gc_metrics.txt') , emit: gc_metrics , optional: true + tuple val(meta), path('*aln_metrics.txt') , emit: aln_metrics , optional: true + tuple val(meta), path('*is_metrics.txt') , emit: is_metrics , optional: true + tuple val(meta), path('*dedup_metrics.txt') , emit: metrics_dedup, optional: true + tuple val(meta), path('*score.txt.gz') , emit: score , optional: true + tuple val(meta), path('*score.txt.gz.idx') , emit: score_idx , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + def ref = fasta ? "-r $fasta" : '' + def dbsnp = known_dbsnp ? "-k $known_dbsnp" : '' + def mills = known_mills ? "-k $known_mills" : '' + def indels = known_indels ? "-k $known_indels" : '' + if (args.contains('--algo Haplotyper')) { + if (known_dbsnp) { + dbsnp = '' + def args_list = args.split('--algo Haplotyper') + args_list = [ args_list[0] ] + ["--algo Haplotyper -d $known_dbsnp"] + [ args_list[-1] ] + args = args_list.join(' ') + } + } + def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' + """ + source sentieon_init.sh SENTIEON_LICENSE_BASE64 + + $sentieon_exe \\ + driver \\ + $ref \\ + -t $task.cpus \\ + $input \\ + $dbsnp \\ + $mills \\ + $indels \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' + """ + touch ${prefix}.bam' + touch ${prefix}.bai' + touch ${prefix}.cram' + touch ${prefix}.crai' + touch ${prefix}.vcf.gz' + touch ${prefix}.vcf.gz.tbi' + touch ${prefix}.recal_data.table' + touch ${prefix}.recal_data.table.post' + touch ${prefix}.recal.csv' + touch ${prefix}.dedup_metrics.txt' + touch ${prefix}.score.txt' + touch ${prefix}.score.txt.idx' + touch ${prefix}.mq_metrics.txt + touch ${prefix}.qd_metrics.txt + touch ${prefix}.gc_summary.txt + touch ${prefix}.gc_metrics.txt + touch ${prefix}.aln_metrics.txt + touch ${prefix}.is_metrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ +} diff --git a/nextflow_schema.json b/nextflow_schema.json index 3b5e3f2f..4b52c1d5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -107,6 +107,27 @@ "description": "Path to directory for gnomad vcf.", "help_text": "Path to the gnomad vcf file. If you don't provide one, gnomad annotations will not be used." }, + "known_dbsnp": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "Path to known dbSNP file.", + "hidden": true + }, + "known_indels": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "Path to known indels file.", + "hidden": true + }, + "known_mills": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "Path to known Mills file.", + "hidden": true + }, "target_bed": { "type": "string", "format": "path", diff --git a/subworkflows/local/align_sentieon.nf b/subworkflows/local/align_sentieon.nf index bf2d955b..d9022d20 100644 --- a/subworkflows/local/align_sentieon.nf +++ b/subworkflows/local/align_sentieon.nf @@ -2,14 +2,21 @@ // A subworkflow to annotate structural variants. // -include { SENTIEON_BWAMEM } from '../../modules/local/sentieon/bwamem' +include { SENTIEON_BWAMEM } from '../../modules/local/sentieon/bwamem' +include { SENTIEON_DRIVER as SENTIEON_DATAMETRICS } from '../../modules/local/sentieon/driver' +include { SENTIEON_DRIVER as SENTIEON_LOCUSCOLLECTOR } from '../../modules/local/sentieon/driver' +include { SENTIEON_DRIVER as SENTIEON_DEDUP } from '../../modules/local/sentieon/driver' +include { SENTIEON_DRIVER as SENTIEON_BQSR } from '../../modules/local/sentieon/driver' workflow ALIGN_SENTIEON { take: - reads_input // channel: [ val(meta), reads_input ] - fasta // path: genome.fasta - fai // path: genome.fai - index // channel: [ /path/to/bwamem2/index/ ] + reads_input // channel: [ val(meta), reads_input ] + fasta // path: genome.fasta + fai // path: genome.fai + index // channel: [ /path/to/bwamem2/index/ ] + known_dbsnp // path: params.known_dbsnp + known_indels // path: params.known_indels + known_mills // path: params.known_mills main: ch_versions = Channel.empty() @@ -17,8 +24,43 @@ workflow ALIGN_SENTIEON { SENTIEON_BWAMEM ( reads_input, fasta, fai, index ) ch_versions = ch_versions.mix(SENTIEON_BWAMEM.out.versions) + SENTIEON_BWAMEM.out + .bam + .join(SENTIEON_BWAMEM.out.bai) + .map { it -> it + [ [], [], [], [] ] } + .set { ch_bam_bai } + + SENTIEON_DATAMETRICS (ch_bam_bai, fasta, fai, [], [], [] ) + ch_versions = ch_versions.mix(SENTIEON_DATAMETRICS.out.versions) + + SENTIEON_LOCUSCOLLECTOR (ch_bam_bai, fasta, fai, [], [], [] ) + + ch_bam_bai + .map { meta, bam, bai, score, score_idx, recal_pre, recal_post -> [ meta, bam, bai ] } + .join(SENTIEON_LOCUSCOLLECTOR.out.score) + .join(SENTIEON_LOCUSCOLLECTOR.out.score_idx) + .map { it -> it + [ [], [] ] } + .set { ch_bam_bai_score } + + SENTIEON_DEDUP ( ch_bam_bai_score, fasta, fai, [], [], [] ) + + SENTIEON_DEDUP.out.bam + .join(SENTIEON_DEDUP.out.bai) + .map { it -> it + [ [], [], [], [] ] } + .set { ch_dedup_bam_bai } + + SENTIEON_BQSR ( ch_dedup_bam_bai, fasta, fai, known_dbsnp, known_mills, known_indels ) + emit: - bam = SENTIEON_BWAMEM.out.bam - bai = SENTIEON_BWAMEM.out.bai - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + bam = SENTIEON_DEDUP.out.bam + bai = SENTIEON_DEDUP.out.bai + marked_bam_bai = ch_dedup_bam_bai + recal_pre = SENTIEON_BQSR.out.recal_pre + mq_metrics = SENTIEON_DATAMETRICS.out.mq_metrics.ifEmpty(null) + qd_metrics = SENTIEON_DATAMETRICS.out.qd_metrics.ifEmpty(null) + gc_metrics = SENTIEON_DATAMETRICS.out.gc_metrics.ifEmpty(null) + gc_summary = SENTIEON_DATAMETRICS.out.gc_summary.ifEmpty(null) + aln_metrics = SENTIEON_DATAMETRICS.out.aln_metrics.ifEmpty(null) + is_metrics = SENTIEON_DATAMETRICS.out.is_metrics.ifEmpty(null) + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/align.nf b/subworkflows/nf-core/align.nf index d87213c3..4bb90863 100644 --- a/subworkflows/nf-core/align.nf +++ b/subworkflows/nf-core/align.nf @@ -7,11 +7,14 @@ include { ALIGN_SENTIEON } from '../local/align_sentieon' workflow ALIGN { take: - aligner // string: params.aligner - reads_input // channel: [ val(meta), reads_input ] - fasta // channel: [genome.fasta] - fai // channel: [genome.fai] - index // channel: [ /path/to/bwamem2/index/ ] + aligner // string: params.aligner + reads_input // channel: [ val(meta), reads_input ] + fasta // channel: [genome.fasta] + fai // channel: [genome.fai] + index // channel: [ /path/to/bwamem2/index/ ] + known_dbsnp // channel: [ /path/to/known_dbsnp/ ] + known_indels // channel: [ /path/to/known_indels/ ] + known_mills // channel: [ /path/to/known_mills/ ] main: ch_versions = Channel.empty() @@ -24,7 +27,7 @@ workflow ALIGN { ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) } else if( aligner == "sentieon" ) { - ALIGN_SENTIEON ( reads_input, fasta, fai, index ) + ALIGN_SENTIEON ( reads_input, fasta, fai, index, known_dbsnp, known_indels, known_mills ) ch_marked_bam = ALIGN_SENTIEON.out.bam ch_marked_bai = ALIGN_SENTIEON.out.bai ch_versions = ch_versions.mix(ALIGN_SENTIEON.out.versions) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5fd35af7..4e44ec32 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -27,6 +27,9 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } +if (params.known_dbsnp) { ch_known_dbsnp = file(params.known_dbsnp) } else { ch_known_dbsnp = [] } +if (params.known_mills) { ch_known_mills = file(params.known_mills) } else { ch_known_mills = [] } +if (params.known_indels) { ch_known_indels = file(params.known_indels) } else { ch_known_indels = [] } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -123,7 +126,10 @@ workflow RAREDISEASE { CHECK_INPUT.out.reads, ch_references.genome_fasta, ch_references.genome_fai, - ch_references.aligner_index + ch_references.aligner_index, + ch_known_dbsnp, + ch_known_indels, + ch_known_mills ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) From 31fbc2a119ac66196f24b1ff50130c9886390999 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 17 Apr 2022 01:13:27 +0200 Subject: [PATCH 0438/1169] move align subworkflow to local --- subworkflows/{nf-core => local}/align.nf | 4 ++-- workflows/raredisease.nf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename subworkflows/{nf-core => local}/align.nf (94%) diff --git a/subworkflows/nf-core/align.nf b/subworkflows/local/align.nf similarity index 94% rename from subworkflows/nf-core/align.nf rename to subworkflows/local/align.nf index 4bb90863..883bf36a 100644 --- a/subworkflows/nf-core/align.nf +++ b/subworkflows/local/align.nf @@ -2,8 +2,8 @@ // Map to reference // -include { ALIGN_BWAMEM2 } from './align_bwamem2' -include { ALIGN_SENTIEON } from '../local/align_sentieon' +include { ALIGN_BWAMEM2 } from '../nf-core/align_bwamem2' +include { ALIGN_SENTIEON } from './align_sentieon' workflow ALIGN { take: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4e44ec32..d011f9df 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -52,6 +52,7 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi include { CHECK_INPUT } from '../subworkflows/local/check_input' include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' +include { ALIGN } from '../subworkflows/local/align' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -71,7 +72,6 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { ALIGN } from '../subworkflows/nf-core/align' include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' include { QC_BAM } from '../subworkflows/nf-core/qc_bam' From 03e5320647904aa0108d746933d81cbc24fe9de9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 17 Apr 2022 01:39:11 +0200 Subject: [PATCH 0439/1169] add variant caller switch --- nextflow.config | 3 +++ nextflow_schema.json | 18 ++++++++++++++++++ subworkflows/local/align.nf | 4 ++-- subworkflows/local/align_sentieon.nf | 23 ++++++++++++----------- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/nextflow.config b/nextflow.config index ff0a6fba..f173a2a2 100644 --- a/nextflow.config +++ b/nextflow.config @@ -28,6 +28,9 @@ params { // Alignment aligner = 'bwamem2' + // Variant calling + variant_caller = 'deepvariant' + // Annotation vep_cache_version = '105' diff --git a/nextflow_schema.json b/nextflow_schema.json index 4b52c1d5..a7ff5fce 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -231,6 +231,21 @@ } } }, + "variant_calling_options": { + "title": "Variant calling options", + "type": "object", + "fa_icon": "fas fa-map-signs", + "description": "Options to adjust parameters and filtering criteria for variant calling.", + "properties": { + "variant_caller": { + "type": "string", + "default": "deepvariant", + "description": "Specifies the variant caller to use - available options are 'deepvariant' and 'sentieon'.", + "fa_icon": "fas fa-map-signs", + "enum": ["deepvariant", "sentieon"] + } + } + }, "annotation_options": { "title": "Annotation options", "type": "object", @@ -433,6 +448,9 @@ { "$ref": "#/definitions/alignment_options" }, + { + "$ref": "#/definitions/variant_calling_options" + }, { "$ref": "#/definitions/annotation_options" }, diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 883bf36a..88abc7df 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -28,8 +28,8 @@ workflow ALIGN { ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) } else if( aligner == "sentieon" ) { ALIGN_SENTIEON ( reads_input, fasta, fai, index, known_dbsnp, known_indels, known_mills ) - ch_marked_bam = ALIGN_SENTIEON.out.bam - ch_marked_bai = ALIGN_SENTIEON.out.bai + ch_marked_bam = ALIGN_SENTIEON.out.marked_bam + ch_marked_bai = ALIGN_SENTIEON.out.marked_bai ch_versions = ch_versions.mix(ALIGN_SENTIEON.out.versions) } else { exit 1, 'Please provide a valid aligner!' diff --git a/subworkflows/local/align_sentieon.nf b/subworkflows/local/align_sentieon.nf index d9022d20..b253de7f 100644 --- a/subworkflows/local/align_sentieon.nf +++ b/subworkflows/local/align_sentieon.nf @@ -19,7 +19,8 @@ workflow ALIGN_SENTIEON { known_mills // path: params.known_mills main: - ch_versions = Channel.empty() + ch_versions = Channel.empty() + ch_recal_pre = Channel.empty() SENTIEON_BWAMEM ( reads_input, fasta, fai, index ) ch_versions = ch_versions.mix(SENTIEON_BWAMEM.out.versions) @@ -44,18 +45,18 @@ workflow ALIGN_SENTIEON { SENTIEON_DEDUP ( ch_bam_bai_score, fasta, fai, [], [], [] ) - SENTIEON_DEDUP.out.bam - .join(SENTIEON_DEDUP.out.bai) - .map { it -> it + [ [], [], [], [] ] } - .set { ch_dedup_bam_bai } - - SENTIEON_BQSR ( ch_dedup_bam_bai, fasta, fai, known_dbsnp, known_mills, known_indels ) + if (params.variant_caller == "sentieon") { + SENTIEON_DEDUP.out.bam + .join(SENTIEON_DEDUP.out.bai) + .map { it -> it + [ [], [], [], [] ] } + .set { ch_dedup_bam_bai } + ch_recal_pre = SENTIEON_BQSR ( ch_dedup_bam_bai, fasta, fai, known_dbsnp, known_mills, known_indels ).out.recal_pre + } emit: - bam = SENTIEON_DEDUP.out.bam - bai = SENTIEON_DEDUP.out.bai - marked_bam_bai = ch_dedup_bam_bai - recal_pre = SENTIEON_BQSR.out.recal_pre + marked_bam = SENTIEON_DEDUP.out.bam + marked_bai = SENTIEON_DEDUP.out.bai + recal_pre = ch_recal_pre mq_metrics = SENTIEON_DATAMETRICS.out.mq_metrics.ifEmpty(null) qd_metrics = SENTIEON_DATAMETRICS.out.qd_metrics.ifEmpty(null) gc_metrics = SENTIEON_DATAMETRICS.out.gc_metrics.ifEmpty(null) From 13a4714ba68c9f553015aefeec53680c0a9536da Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 17 Apr 2022 03:46:56 +0200 Subject: [PATCH 0440/1169] reorganize configs --- conf/modules.config | 347 ++++++++++++++++++------------ subworkflows/local/prepare_bed.nf | 32 ++- subworkflows/nf-core/qc_bam.nf | 26 +-- 3 files changed, 246 insertions(+), 159 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ef471b6a..f5eae063 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -11,6 +11,10 @@ ---------------------------------------------------------------------------------------- */ +// +// General configuration options +// + process { publishDir = [ @@ -19,17 +23,44 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - // Local Subworkflows - // INPUT_CHECK - withName: SAMPLESHEET_CHECK { + withName: '.*CHECK_INPUT:SAMPLESHEET_CHECK' { publishDir = [ path: { "${params.outdir}/pipeline_info" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - // PREPARE_GENOME - withName: BWAMEM2_INDEX { + + withName: 'CUSTOM_DUMPSOFTWAREVERSIONS' { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: params.publish_dir_mode, + pattern: '*_versions.yml' + ] + } +} + +// +// Read QC options +// + +process { + withName: 'FASTQC' { + ext.args = '--quiet' + publishDir = [ + path: { "${params.outdir}/reports/fastqc/${meta.id}" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} + +// +// Genome preparation options +// + +process { + + withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:BWAMEM2_INDEX' { ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} publishDir = [ path: { "${params.outdir}/references" }, @@ -39,7 +70,8 @@ process { pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" ] } - withName: SAMTOOLS_FAIDX { + + withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:SAMTOOLS_FAIDX' { publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, @@ -48,30 +80,34 @@ process { pattern: "*fai" ] } - withName: GET_CHROM_SIZES { + + withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:GET_CHROM_SIZES' { publishDir = [ enabled: false, ] } - withName: UNTAR_VCFANNO { + + withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:UNTAR_VCFANNO' { publishDir = [ enabled: false, ] } - // PREPARE_VCF && PREPARE_BED - withName: CHECK_INPUT_VCF { + + withName: '.*PREPARE_REFERENCES:CHECK_VCF:CHECK_INPUT_VCF' { publishDir = [ enabled: false, ] } - withName: SPLIT_MULTIALLELICS_PV { + + withName: '.*PREPARE_REFERENCES:CHECK_VCF:SPLIT_MULTIALLELICS_PV' { ext.args = '--output-type z --multiallelics -both' ext.prefix = { "${meta.id}_split" } publishDir = [ enabled: false ] } - withName: REMOVE_DUPLICATES_PV { + + withName: '.*PREPARE_REFERENCES:CHECK_VCF:REMOVE_DUPLICATES_PV' { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ @@ -80,21 +116,24 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: TABIX_PV { + + withName: '.*PREPARE_REFERENCES:CHECK_VCF:TABIX_PV' { publishDir = [ path: { "${params.outdir}/processed_references" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'TABIX_PT|TABIX_PBT' { + + withName: '.*PREPARE_REFERENCES:CHECK_BED:TABIX_.*' { publishDir = [ path: { "${params.outdir}/processed_references" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'GATK_BILT' { + + withName: '.*PREPARE_REFERENCES:CHECK_BED:GATK_BILT' { ext.prefix = { "${meta.id}_target" } publishDir = [ path: { "${params.outdir}/processed_references" }, @@ -102,13 +141,15 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'GATK_ILT' { + + withName: '.*PREPARE_REFERENCES:CHECK_BED:GATK_ILT' { ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' publishDir = [ enabled: false ] } - withName: 'CAT_CAT_BAIT' { + + withName: '.*PREPARE_REFERENCES:CHECK_BED:CAT_CAT_BAIT' { ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/processed_references" }, @@ -116,207 +157,247 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - // CALL_SNV_DEEPVARIANT - withName: DEEPVARIANT { - ext.args = { "--model_type=${params.analysis_type.toUpperCase()}" } - ext.prefix = { "${meta.id}_deepvar" } - publishDir = [ - path: { "${params.outdir}/deepvariant" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: SPLIT_MULTIALLELICS_GL { - ext.args = '--output-type z --multiallelics -both' +} + +// +// Alignment options +// + +process { + withName: '.*ALIGN_BWAMEM2:.*' { + ext.when = params.aligner.equals("bwamem2") publishDir = [ - enabled: false + path: { "${params.outdir}/bwamem2" }, + mode: 'copy', + pattern: "*{stats,sorted_md.bam,sorted_md.bam.bai}", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: REMOVE_DUPLICATES_GL { - ext.args = '--output-type z --rm-dup none' - ext.prefix = { "${meta.id}_split_rmdup" } + + withName: '.*ALIGN:ALIGN_BWAMEM2:BWAMEM2_MEM' { + ext.args = '-M -K 100000000' publishDir = [ - path: { "${params.outdir}/glnexus" }, + path: { "${params.outdir}/bwamem2" }, + enabled: false, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: GLNEXUS { - ext.args = '--config DeepVariant_unfiltered' + + withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_STATS' { + ext.args = '-s --remove-overlaps' publishDir = [ - enabled: false + path: { "${params.outdir}/bwamem2" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: TABIX_GL { + + withName: '.*ALIGN:ALIGN_BWAMEM2:MARKDUPLICATES' { + ext.prefix = { "${meta.id}_sorted_md" } publishDir = [ - path: { "${params.outdir}/glnexus" }, + path: { "${params.outdir}/bwamem2" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - // CALL_REPEAT_EXPANSIONS - withName: EXPANSIONHUNTER { +} + +// +// Bam QC options +// + +process { + withName: '.*QC_BAM:PICARD_COLLECTMULTIPLEMETRICS' { publishDir = [ - path: { "${params.outdir}/expansionhunter" }, + path: { "${params.outdir}/bamqc_collectmultiplemetrics" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - // CALL_STRUCTURAL_VARIANTS - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA" { + + withName: '.*QC_BAM:QUALIMAP_BAMQC' { publishDir = [ - path: { "${params.outdir}/sv_caller" }, + path: { "${params.outdir}/bamqc_qualimap" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:TIDDIT_SV" { - ext.args = '-p 6' + + withName: '.*QC_BAM:TIDDIT_COV' { + ext.args = '-z 500 -w -u' publishDir = [ - path: { "${params.outdir}/sv_caller" }, + path: { "${params.outdir}/tiddit_coverage" }, mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: SVDB_MERGE_TIDDIT { - ext.args = '--notag --pass_only' - ext.prefix = 'tiddit' + + withName: '.*QC_BAM:UCSC_WIGTOBIGWIG' { + ext.args = '-clip' publishDir = [ - path: { "${params.outdir}/sv_caller" }, + path: { "${params.outdir}/tiddit_coverage" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: SVDB_MERGE { - ext.args = '--pass_only' + + withName: '.*QC_BAM:MOSDEPTH' { + ext.args = '--d4' publishDir = [ - path: { "${params.outdir}/sv_caller" }, + path: { "${params.outdir}/mosdepth" }, mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - // ANNOTATE_SV - withName: "SVDB_QUERY*" { +} + +// +// Repeat expansion calling options +// + +process { + withName: '.*CALL_REPEAT_EXPANSIONS:EXPANSIONHUNTER' { publishDir = [ - enabled: false, + path: { "${params.outdir}/expansionhunter" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: PICARD_SORTVCF { +} + +// +// SNV calling options +// + +process { + withName: '.*CALL_SNV_DEEPVARIANT:DEEPVARIANT' { + ext.args = { "--model_type=${params.analysis_type.toUpperCase()}" } + ext.prefix = { "${meta.id}_deepvar" } publishDir = [ - enabled: false, + path: { "${params.outdir}/deepvariant" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: ENSEMBLVEP_SV { - ext.args = [ - '--plugin LoFtool,vep_cache/LoFtool_scores.txt', - '--distance 5000', - '--buffer_size 20000', - '--format vcf --max_sv_size 248956422', - '--appris --biotype --canonical --ccds', - '--domains --exclude_predicted --force_overwrite', - '--humdiv --no_progress --no_stats --numbers', - '--polyphen p --protein --offline --regulatory --sift p --symbol --tsl', - '--uniprot' - ].join(' ') + + withName: '.*CALL_SNV_DEEPVARIANT:GLNEXUS' { + ext.args = '--config DeepVariant_unfiltered' publishDir = [ - path: { "${params.outdir}/sv_annotate" }, - mode: params.publish_dir_mode, + enabled: false ] } - // NF-CORE Subworkflows - // ALIGN_BWAMEM2 - withName: ".*ALIGN_BWAMEM2:.*"{ - ext.when = params.aligner.equals("bwamem2") + + withName: '.*CALL_SNV_DEEPVARIANT:SPLIT_MULTIALLELICS_GL' { + ext.args = '--output-type z --multiallelics -both' publishDir = [ - path: { "${params.outdir}/bwamem2" }, - mode: 'copy', - pattern: "*{stats,sorted_md.bam,sorted_md.bam.bai}", - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false ] } - withName: BWAMEM2_MEM { - ext.args = '-M -K 100000000' + + withName: '.*CALL_SNV_DEEPVARIANT:REMOVE_DUPLICATES_GL' { + ext.args = '--output-type z --rm-dup none' + ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ - path: { "${params.outdir}/bwamem2" }, - enabled: false, + path: { "${params.outdir}/glnexus" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: SAMTOOLS_STATS { - ext.args = '-s --remove-overlaps' + + withName: '.*CALL_SNV_DEEPVARIANT:TABIX_GL' { publishDir = [ - path: { "${params.outdir}/bwamem2" }, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + path: { "${params.outdir}/glnexus" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*MARKDUPLICATES' { - ext.prefix = { "${meta.id}_sorted_md" } +} + +// +// Structural variant calling options +// + +process { + withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA' { publishDir = [ - path: { "${params.outdir}/bwamem2" }, + path: { "${params.outdir}/sv_caller" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - // ANNOTATE_VCFANNO - withName: "VCFANNO" { + + withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:TIDDIT_SV' { + ext.args = '-p 6' publishDir = [ - path: { "${params.outdir}/variant_annotation" }, + path: { "${params.outdir}/sv_caller" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - // QC_BAM - withName: '.*COLLECTMULTIPLEMETRICS' { + + withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:SVDB_MERGE_TIDDIT' { + ext.args = '--notag --pass_only' + ext.prefix = 'tiddit' publishDir = [ - path: { "${params.outdir}/bamqc_collectmultiplemetrics" }, + path: { "${params.outdir}/sv_caller" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: QUALIMAP_BAMQC { - publishDir = [ - path: { "${params.outdir}/bamqc_qualimap" }, - mode: 'copy' - ] - } - withName: TIDDIT_COV { - ext.args = '-z 500 -w -u' + + withName: '.*CALL_STRUCTURAL_VARIANTS:SVDB_MERGE' { + ext.args = '--pass_only' publishDir = [ - path: { "${params.outdir}/tiddit_coverage" }, + path: { "${params.outdir}/sv_caller" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: ".*QC_BAM:UCSC_WIGTOBIGWIG" { - ext.args = '-clip' +} + +// +// Structural variant annotation options +// + +process { + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:SVDB_QUERY' { publishDir = [ - path: { "${params.outdir}/tiddit_coverage" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false, ] } - withName: MOSDEPTH { - ext.args = '--d4' + + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:PICARD_SORTVCF' { publishDir = [ - path: { "${params.outdir}/mosdepth" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false, ] } - // nf-core modules - withName: FASTQC { - ext.args = '--quiet' + + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:ENSEMBLVEP_SV' { + ext.args = [ + '--plugin LoFtool,vep_cache/LoFtool_scores.txt', + '--distance 5000', + '--buffer_size 20000', + '--format vcf --max_sv_size 248956422', + '--appris --biotype --canonical --ccds', + '--domains --exclude_predicted --force_overwrite', + '--humdiv --no_progress --no_stats --numbers', + '--polyphen p --protein --offline --regulatory --sift p --symbol --tsl', + '--uniprot' + ].join(' ') publishDir = [ - path: { "${params.outdir}/reports/fastqc/${meta.id}" }, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + path: { "${params.outdir}/sv_annotate" }, + mode: params.publish_dir_mode, ] } +} - withName: CUSTOM_DUMPSOFTWAREVERSIONS { +// +// SNV annotation options +// + +process { + withName: '.*ANNOTATE_VCFANNO:VCFANNO' { publishDir = [ - path: { "${params.outdir}/pipeline_info" }, + path: { "${params.outdir}/variant_annotation" }, mode: params.publish_dir_mode, - pattern: '*_versions.yml' + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - } diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index 72336c36..72d37c83 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -4,6 +4,7 @@ include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/modules/gatk4/bedtointervallist/main' include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/modules/gatk4/intervallisttools/main' +include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/modules/cat/cat/main' include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/modules/tabix/tabix/main' include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/modules/tabix/bgziptabix/main' @@ -35,11 +36,40 @@ workflow CHECK_BED { GATK_ILT(interval_list) ch_versions = ch_versions.mix(GATK_ILT.out.versions) + + GATK_ILT.out + .interval_list + .collect{ it[1] } + .set { ch_bait_intervals_split } + + ch_bait_intervals_split + .map { it -> it[0] + .toString() + .split("_split")[0] + .split("/")[-1] + "_bait.intervals_list" + } + .flatten() + .concat(ch_bait_intervals_split) + .toList() + .map { + id, bait -> + return [['id':id], bait] + } + .set { ch_bait_intervals_cat_in } + + CAT_CAT_BAIT ( ch_bait_intervals_cat_in ) + .file_out + .map { + id, file -> + return [file] + } + .set { ch_bait_intervals_cat_out } + } emit: bed = tab_out target_intervals = interval_list.collect{it[1]} - bait_intervals = GATK_ILT.out.interval_list.collect{it[1]} + bait_intervals = ch_bait_intervals_cat_out versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 5886f123..30c62990 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -5,7 +5,6 @@ include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' include { PICARD_COLLECTHSMETRICS } from '../../modules/nf-core/modules/picard/collecthsmetrics/main' include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' -include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/modules/cat/cat/main' include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' include { MOSDEPTH } from '../../modules/nf-core/modules/mosdepth/main' include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' @@ -29,30 +28,7 @@ workflow QC_BAM { ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions) // COLLECT HS METRICS - bait_intervals - .collect { it[0] - .toString() - .split("_split")[0] - .split("/")[-1] + "_bait.intervals_list" - } - .flatten() - .concat(bait_intervals) - .toList() - .map { - id, bait -> - return [['id':id], bait] - } - .set { bait_intervals_cat_in } - - CAT_CAT_BAIT ( bait_intervals_cat_in ) - .file_out - .map { - id, file -> - return [file] - } - .set { bait_intervals_cat_out } - - PICARD_COLLECTHSMETRICS ( bam, fasta, fai, bait_intervals_cat_out, target_intervals ) + PICARD_COLLECTHSMETRICS ( bam, fasta, fai, bait_intervals, target_intervals ) ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions) // QUALIMAP BAMQC From b7186783e8b2523b00cd9dffa2ee2357f122d2c1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 17 Apr 2022 14:41:37 +0200 Subject: [PATCH 0441/1169] fix score_index extension in driver --- modules/local/sentieon/driver.nf | 2 +- subworkflows/local/align.nf | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/local/sentieon/driver.nf b/modules/local/sentieon/driver.nf index 46a103e7..c8479933 100644 --- a/modules/local/sentieon/driver.nf +++ b/modules/local/sentieon/driver.nf @@ -31,7 +31,7 @@ process SENTIEON_DRIVER { tuple val(meta), path('*is_metrics.txt') , emit: is_metrics , optional: true tuple val(meta), path('*dedup_metrics.txt') , emit: metrics_dedup, optional: true tuple val(meta), path('*score.txt.gz') , emit: score , optional: true - tuple val(meta), path('*score.txt.gz.idx') , emit: score_idx , optional: true + tuple val(meta), path('*score.txt.gz.tbi') , emit: score_idx , optional: true path "versions.yml" , emit: versions when: diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 88abc7df..e920354b 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -18,8 +18,6 @@ workflow ALIGN { main: ch_versions = Channel.empty() - ch_marked_bai = Channel.empty() - ch_marked_bam = Channel.empty() if( aligner == "bwamem2" ) { ALIGN_BWAMEM2 ( reads_input, index ) From 71a728cab40055a31c452152193020ef40d74d35 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 17 Apr 2022 14:49:20 +0200 Subject: [PATCH 0442/1169] remove a couple of blank lines --- conf/modules.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f5eae063..62327a28 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -16,7 +16,6 @@ // process { - publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, mode: params.publish_dir_mode, @@ -59,7 +58,6 @@ process { // process { - withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:BWAMEM2_INDEX' { ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} publishDir = [ From e5e77b5c706a7b6ad37f5b1a723001240d6e0d23 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 17 Apr 2022 22:35:30 +0200 Subject: [PATCH 0443/1169] add prefix to stub --- modules/local/sentieon/driver.nf | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/modules/local/sentieon/driver.nf b/modules/local/sentieon/driver.nf index c8479933..a68a8a56 100644 --- a/modules/local/sentieon/driver.nf +++ b/modules/local/sentieon/driver.nf @@ -73,20 +73,21 @@ process SENTIEON_DRIVER { """ stub: + def prefix = task.ext.prefix ?: "${meta.id}" def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ - touch ${prefix}.bam' - touch ${prefix}.bai' - touch ${prefix}.cram' - touch ${prefix}.crai' - touch ${prefix}.vcf.gz' - touch ${prefix}.vcf.gz.tbi' - touch ${prefix}.recal_data.table' - touch ${prefix}.recal_data.table.post' - touch ${prefix}.recal.csv' - touch ${prefix}.dedup_metrics.txt' - touch ${prefix}.score.txt' - touch ${prefix}.score.txt.idx' + touch ${prefix}.bam + touch ${prefix}.bai + touch ${prefix}.cram + touch ${prefix}.crai + touch ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + touch ${prefix}.recal_data.table + touch ${prefix}.recal_data.table.post + touch ${prefix}.recal.csv + touch ${prefix}.dedup_metrics.txt + touch ${prefix}.score.txt.gz + touch ${prefix}.score.txt.gz.tbi touch ${prefix}.mq_metrics.txt touch ${prefix}.qd_metrics.txt touch ${prefix}.gc_summary.txt From 4c6f182432ce20d6861545428fbedf1ae04b7be5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 18 Apr 2022 12:13:30 +0200 Subject: [PATCH 0444/1169] add source script to stubs --- modules/local/sentieon/bwamem.nf | 2 ++ modules/local/sentieon/bwamemindex.nf | 2 ++ modules/local/sentieon/driver.nf | 2 ++ 3 files changed, 6 insertions(+) diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf index e4864985..17e8f51f 100644 --- a/modules/local/sentieon/bwamem.nf +++ b/modules/local/sentieon/bwamem.nf @@ -55,6 +55,8 @@ process SENTIEON_BWAMEM { def prefix = task.ext.prefix ?: "${meta.id}" def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ + source sentieon_init.sh SENTIEON_LICENSE_BASE64 + touch ${prefix}.bam touch ${prefix}.bai diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index db46ca54..d4e01e05 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -38,6 +38,8 @@ process SENTIEON_BWAINDEX { stub: def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ + source sentieon_init.sh SENTIEON_LICENSE_BASE64 + mkdir bwa_index cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/sentieon/driver.nf b/modules/local/sentieon/driver.nf index a68a8a56..403db233 100644 --- a/modules/local/sentieon/driver.nf +++ b/modules/local/sentieon/driver.nf @@ -76,6 +76,8 @@ process SENTIEON_DRIVER { def prefix = task.ext.prefix ?: "${meta.id}" def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ + source sentieon_init.sh SENTIEON_LICENSE_BASE64 + touch ${prefix}.bam touch ${prefix}.bai touch ${prefix}.cram From bd185aa53353ba0906e311e41124adb9b00dd0c0 Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 19 Apr 2022 11:43:14 +0200 Subject: [PATCH 0445/1169] Update stranger --- modules.json | 4 ++-- modules/nf-core/modules/stranger/main.nf | 5 ++++- modules/nf-core/modules/stranger/meta.yml | 6 +++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index c84064c7..21925b18 100644 --- a/modules.json +++ b/modules.json @@ -79,7 +79,7 @@ "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" }, "stranger": { - "git_sha": "fe4eb459fbc76fbcbf63e204b6f5b79f88dca452" + "git_sha": "a6cb75174bfbd131f3da14d8cd3e34c1a2e6e268" }, "svdb/merge": { "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" @@ -110,4 +110,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/stranger/main.nf b/modules/nf-core/modules/stranger/main.nf index 2e647627..55678bd3 100644 --- a/modules/nf-core/modules/stranger/main.nf +++ b/modules/nf-core/modules/stranger/main.nf @@ -9,6 +9,7 @@ process STRANGER { input: tuple val(meta), path(vcf) + path variant_catalog output: tuple val(meta), path("*.gz"), emit: vcf @@ -20,10 +21,12 @@ process STRANGER { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def options_variant_catalog = variant_catalog ? "--repeats-file $variant_catalog" : "" """ stranger \\ $args \\ - $vcf | gzip --no-name > ${prefix}.vcf.gz + $vcf \\ + $options_variant_catalog | gzip --no-name > ${prefix}.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/stranger/meta.yml b/modules/nf-core/modules/stranger/meta.yml index a9a280ad..0707d806 100644 --- a/modules/nf-core/modules/stranger/meta.yml +++ b/modules/nf-core/modules/stranger/meta.yml @@ -12,7 +12,7 @@ tools: documentation: https://github.com/moonso/stranger tool_dev_url: https://github.com/moonso/stranger doi: "10.5281/zenodo.4548873" - licence: ['MIT'] + licence: ["MIT"] input: - meta: @@ -24,6 +24,10 @@ input: type: file description: VCF with repeat expansions pattern: "*.{vcf.gz,vcf}" + - variant_catalog: + type: file + description: json file with repeat expansion sites to genotype + pattern: "*.{json}" output: - meta: From fb1452af21de6c3869e22a094e46937e3640edd5 Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 19 Apr 2022 15:24:12 +0200 Subject: [PATCH 0446/1169] Use same variantcatalog as used by Expansionhunter --- subworkflows/nf-core/call_repeat_expansions.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/call_repeat_expansions.nf b/subworkflows/nf-core/call_repeat_expansions.nf index 1a1f45f2..0be45a76 100644 --- a/subworkflows/nf-core/call_repeat_expansions.nf +++ b/subworkflows/nf-core/call_repeat_expansions.nf @@ -17,7 +17,7 @@ workflow CALL_REPEAT_EXPANSIONS { EXPANSIONHUNTER( bam, fasta, variant_catalog ) ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) - STRANGER ( EXPANSIONHUNTER.out.vcf ) + STRANGER ( EXPANSIONHUNTER.out.vcf, variant_catalog ) ch_versions = ch_versions.mix(STRANGER.out.versions) emit: From 42abfd79ccc1dc18821552767cc5ad444cc9f34d Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 19 Apr 2022 15:41:14 +0200 Subject: [PATCH 0447/1169] Remove unused ext.args --- conf/modules.config | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 856bf06b..993648d4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -261,7 +261,6 @@ process { ] } withName: STRANGER { - ext.args = "--repeats-file ${params.variant_catalog}" publishDir = [ path: { "${params.outdir}/stranger" }, mode: 'copy', From df5e3356de62babffe2f6ca208a5c3c48ef45a14 Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 19 Apr 2022 15:42:15 +0200 Subject: [PATCH 0448/1169] Use the same way for defining publish dir mode --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 993648d4..d973fca3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -263,7 +263,7 @@ process { withName: STRANGER { publishDir = [ path: { "${params.outdir}/stranger" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } From bb4db7488780670db73d83a5dc8f64042ec5e160 Mon Sep 17 00:00:00 2001 From: ljmesi <37740329+ljmesi@users.noreply.github.com> Date: Tue, 19 Apr 2022 16:25:38 +0200 Subject: [PATCH 0449/1169] Add empty line to the end --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 21925b18..a18a664f 100644 --- a/modules.json +++ b/modules.json @@ -110,4 +110,4 @@ } } } -} \ No newline at end of file +} From 89b080b207f532b5347361428fa2f618d6076142 Mon Sep 17 00:00:00 2001 From: Lauri Mesilaakso Date: Wed, 20 Apr 2022 07:51:46 +0200 Subject: [PATCH 0450/1169] Update subworkflows/nf-core/call_repeat_expansions.nf Co-authored-by: Anders Jemt --- subworkflows/nf-core/call_repeat_expansions.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/call_repeat_expansions.nf b/subworkflows/nf-core/call_repeat_expansions.nf index 0be45a76..b43a56d4 100644 --- a/subworkflows/nf-core/call_repeat_expansions.nf +++ b/subworkflows/nf-core/call_repeat_expansions.nf @@ -21,6 +21,6 @@ workflow CALL_REPEAT_EXPANSIONS { ch_versions = ch_versions.mix(STRANGER.out.versions) emit: - vcf = STRANGER.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] + vcf = STRANGER.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 6bacade77486cd964390ac0ee3c5d808e73b1438 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 20 Apr 2022 10:25:22 +0200 Subject: [PATCH 0451/1169] update modules --- conf/modules.config | 2 +- modules.json | 24 +++++++++---------- modules/nf-core/modules/bwamem2/mem/main.nf | 8 +++---- .../modules/gatk4/bedtointervallist/main.nf | 10 ++++---- .../gatk4/createsequencedictionary/main.nf | 9 +++---- .../modules/gatk4/intervallisttools/main.nf | 13 +++++----- .../nf-core/modules/manta/germline/main.nf | 5 ++-- .../nf-core/modules/samtools/faidx/main.nf | 6 ++--- .../nf-core/modules/samtools/index/main.nf | 6 ++--- .../nf-core/modules/samtools/merge/main.nf | 6 ++--- .../nf-core/modules/samtools/stats/main.nf | 6 ++--- modules/nf-core/modules/samtools/view/main.nf | 6 ++--- modules/nf-core/modules/untar/main.nf | 6 ++--- 13 files changed, 54 insertions(+), 53 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index d973fca3..b5b75fb0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -173,7 +173,7 @@ process { } withName: '.*ALIGN:ALIGN_BWAMEM2:BWAMEM2_MEM' { - ext.args = '-M -K 100000000' + ext.args = { "-M -K 100000000 -R ${meta.read_group}" } publishDir = [ path: { "${params.outdir}/bwamem2" }, enabled: false, diff --git a/modules.json b/modules.json index a18a664f..aa223e95 100644 --- a/modules.json +++ b/modules.json @@ -10,7 +10,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "bwamem2/mem": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "4f5274c3de0c9521f5033893ff61057a74c45ba9" }, "cat/cat": { "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641" @@ -28,19 +28,19 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "gatk4/bedtointervallist": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, "gatk4/createsequencedictionary": { - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, "gatk4/intervallisttools": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, "glnexus": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "manta/germline": { - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" + "git_sha": "ffedf09b6e84b479c9c901274f74bb33f3777243" }, "mosdepth": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -64,19 +64,19 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "samtools/faidx": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/index": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/merge": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/stats": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/view": { - "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "stranger": { "git_sha": "a6cb75174bfbd131f3da14d8cd3e34c1a2e6e268" @@ -103,11 +103,11 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "untar": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "9ae34a01d1747019fd37753ff4cafb05aec35a2b" }, "vcfanno": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/bwamem2/mem/main.nf b/modules/nf-core/modules/bwamem2/mem/main.nf index e3a3d164..978c4019 100644 --- a/modules/nf-core/modules/bwamem2/mem/main.nf +++ b/modules/nf-core/modules/bwamem2/mem/main.nf @@ -2,10 +2,10 @@ process BWAMEM2_MEM { tag "$meta.id" label 'process_high' - conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:8ee25ae85d7a2bacac3e3139db209aff3d605a18-0' : - 'quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:8ee25ae85d7a2bacac3e3139db209aff3d605a18-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:38aed4501da19db366dc7c8d52d31d94e760cfaf-0' : + 'quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:38aed4501da19db366dc7c8d52d31d94e760cfaf-0' }" input: tuple val(meta), path(reads) @@ -23,7 +23,6 @@ process BWAMEM2_MEM { def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def read_group = meta.read_group ? "-R ${meta.read_group}" : "" def samtools_command = sort_bam ? 'sort' : 'view' """ INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` @@ -31,7 +30,6 @@ process BWAMEM2_MEM { bwa-mem2 \\ mem \\ $args \\ - $read_group \\ -t $task.cpus \\ \$INDEX \\ $reads \\ diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf index c3b624a8..118f535b 100644 --- a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf +++ b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf @@ -9,7 +9,7 @@ process GATK4_BEDTOINTERVALLIST { input: tuple val(meta), path(bed) - path sequence_dict + path dict output: tuple val(meta), path('*.interval_list'), emit: interval_list @@ -21,6 +21,7 @@ process GATK4_BEDTOINTERVALLIST { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 if (!task.memory) { log.info '[GATK BedToIntervalList] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -29,9 +30,10 @@ process GATK4_BEDTOINTERVALLIST { } """ gatk --java-options "-Xmx${avail_mem}g" BedToIntervalList \\ - -I $bed \\ - -SD $sequence_dict \\ - -O ${prefix}.interval_list \\ + --INPUT $bed \\ + --OUTPUT ${prefix}.interval_list \\ + --SEQUENCE_DICTIONARY $dict \\ + --TMP_DIR . \\ $args cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf index dea77a1d..dbf37048 100644 --- a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf +++ b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf @@ -11,14 +11,15 @@ process GATK4_CREATESEQUENCEDICTIONARY { path fasta output: - path "*.dict" , emit: dict - path "versions.yml" , emit: versions + path "*.dict" , emit: dict + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' + def avail_mem = 6 if (!task.memory) { log.info '[GATK CreateSequenceDictionary] Available memory not known - defaulting to 6GB. Specify process memory requirements to change this.' @@ -26,10 +27,10 @@ process GATK4_CREATESEQUENCEDICTIONARY { avail_mem = task.memory.giga } """ - gatk --java-options "-Xmx${avail_mem}g" \\ - CreateSequenceDictionary \\ + gatk --java-options "-Xmx${avail_mem}g" CreateSequenceDictionary \\ --REFERENCE $fasta \\ --URI $fasta \\ + --TMP_DIR . \\ $args cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/gatk4/intervallisttools/main.nf b/modules/nf-core/modules/gatk4/intervallisttools/main.nf index 82c3222c..1b9b37f4 100644 --- a/modules/nf-core/modules/gatk4/intervallisttools/main.nf +++ b/modules/nf-core/modules/gatk4/intervallisttools/main.nf @@ -8,11 +8,11 @@ process GATK4_INTERVALLISTTOOLS { 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" input: - tuple val(meta), path(interval_list) + tuple val(meta), path(intervals) output: tuple val(meta), path("*_split/*/*.interval_list"), emit: interval_list - path "versions.yml" , emit: versions + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -20,6 +20,7 @@ process GATK4_INTERVALLISTTOOLS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 if (!task.memory) { log.info '[GATK IntervalListTools] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -30,10 +31,10 @@ process GATK4_INTERVALLISTTOOLS { mkdir ${prefix}_split - gatk --java-options "-Xmx${avail_mem}g" \\ - IntervalListTools \\ - -I ${interval_list} \\ - -O ${prefix}_split \\ + gatk --java-options "-Xmx${avail_mem}g" IntervalListTools \\ + --INPUT $intervals \\ + --OUTPUT ${prefix}_split \\ + --TMP_DIR . \\ $args python3 < Date: Wed, 20 Apr 2022 16:04:47 +0200 Subject: [PATCH 0452/1169] move sentieon to path --- modules/local/sentieon/bwamem.nf | 12 +++++------- modules/local/sentieon/bwamemindex.nf | 12 +++++------- modules/local/sentieon/driver.nf | 8 +++----- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf index 17e8f51f..82f6289c 100644 --- a/modules/local/sentieon/bwamem.nf +++ b/modules/local/sentieon/bwamem.nf @@ -23,13 +23,12 @@ process SENTIEON_BWAMEM { def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ source sentieon_init.sh SENTIEON_LICENSE_BASE64 INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` - $sentieon_exe bwa mem \\ + sentieon bwa mem \\ -t $task.cpus \\ \$INDEX \\ $reads \\ @@ -46,14 +45,13 @@ process SENTIEON_BWAMEM { cat <<-END_VERSIONS > versions.yml "${task.process}": - sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") - bwa: \$(echo \$($sentieon_exe bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + bwa: \$(echo \$(sentieon bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" - def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ source sentieon_init.sh SENTIEON_LICENSE_BASE64 @@ -62,8 +60,8 @@ process SENTIEON_BWAMEM { cat <<-END_VERSIONS > versions.yml "${task.process}": - sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") - bwa: \$(echo \$($sentieon_exe bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + bwa: \$(echo \$(sentieon bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') END_VERSIONS """ } diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index d4e01e05..84ce4277 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -17,26 +17,24 @@ process SENTIEON_BWAINDEX { script: def args = task.ext.args ?: '' - def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ source sentieon_init.sh SENTIEON_LICENSE_BASE64 mkdir bwa_index - $sentieon_exe bwa index \\ + sentieon bwa index \\ $args \\ -p bwa_index/${fasta.baseName} \\ $fasta cat <<-END_VERSIONS > versions.yml "${task.process}": - sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") - bwa: \$(echo \$($sentieon_exe bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + bwa: \$(echo \$(sentieon bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') END_VERSIONS """ stub: - def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ source sentieon_init.sh SENTIEON_LICENSE_BASE64 @@ -44,8 +42,8 @@ process SENTIEON_BWAINDEX { cat <<-END_VERSIONS > versions.yml "${task.process}": - sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") - bwa: \$(echo \$($sentieon_exe bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + bwa: \$(echo \$(sentieon bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') END_VERSIONS """ } diff --git a/modules/local/sentieon/driver.nf b/modules/local/sentieon/driver.nf index 403db233..845d6d42 100644 --- a/modules/local/sentieon/driver.nf +++ b/modules/local/sentieon/driver.nf @@ -52,11 +52,10 @@ process SENTIEON_DRIVER { args = args_list.join(' ') } } - def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ source sentieon_init.sh SENTIEON_LICENSE_BASE64 - $sentieon_exe \\ + sentieon \\ driver \\ $ref \\ -t $task.cpus \\ @@ -68,13 +67,12 @@ process SENTIEON_DRIVER { cat <<-END_VERSIONS > versions.yml "${task.process}": - sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" - def sentieon_exe = params.sentieon_install_dir ? "${params.sentieon_install_dir}/sentieon" : 'sentieon' """ source sentieon_init.sh SENTIEON_LICENSE_BASE64 @@ -99,7 +97,7 @@ process SENTIEON_DRIVER { cat <<-END_VERSIONS > versions.yml "${task.process}": - sentieon: \$(echo \$($sentieon_exe driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") END_VERSIONS """ } From 3a78e0bc70ec573808ab753ca702a31bb7723ca5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 20 Apr 2022 22:03:21 +0200 Subject: [PATCH 0453/1169] move secret to config --- bin/sentieon_init.sh | 13 ------------- modules/local/sentieon/bwamem.nf | 6 ------ modules/local/sentieon/bwamemindex.nf | 6 ------ modules/local/sentieon/driver.nf | 6 ------ 4 files changed, 31 deletions(-) diff --git a/bin/sentieon_init.sh b/bin/sentieon_init.sh index ea8f393a..e69de29b 100644 --- a/bin/sentieon_init.sh +++ b/bin/sentieon_init.sh @@ -1,13 +0,0 @@ -#!/bin/bash -# -# Sentieon initialization script -# This script takes as input the name of a environment -# variable holding the Sentieon license encoded as Base64 text -set -eu -LICENSE_ENCODED="${!1}" -if [ "${#LICENSE_ENCODED}" -lt "1500" ]; then # Sentieon License server - export SENTIEON_LICENSE=$(echo -e "$LICENSE_ENCODED" | base64 -d) -else # Localhost license file - export SENTIEON_LICENSE=$(mktemp) - echo -e "$LICENSE_ENCODED" | base64 -d > $SENTIEON_LICENSE -fi diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf index 82f6289c..433e2706 100644 --- a/modules/local/sentieon/bwamem.nf +++ b/modules/local/sentieon/bwamem.nf @@ -3,8 +3,6 @@ process SENTIEON_BWAMEM { label 'process_high' label 'sentieon' - secret 'SENTIEON_LICENSE_BASE64' - input: tuple val(meta), path(reads) path fasta @@ -24,8 +22,6 @@ process SENTIEON_BWAMEM { def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - source sentieon_init.sh SENTIEON_LICENSE_BASE64 - INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` sentieon bwa mem \\ @@ -53,8 +49,6 @@ process SENTIEON_BWAMEM { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - source sentieon_init.sh SENTIEON_LICENSE_BASE64 - touch ${prefix}.bam touch ${prefix}.bai diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index 84ce4277..e20cd7e4 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -3,8 +3,6 @@ process SENTIEON_BWAINDEX { label 'process_high' label 'sentieon' - secret 'SENTIEON_LICENSE_BASE64' - input: path fasta @@ -18,8 +16,6 @@ process SENTIEON_BWAINDEX { script: def args = task.ext.args ?: '' """ - source sentieon_init.sh SENTIEON_LICENSE_BASE64 - mkdir bwa_index sentieon bwa index \\ @@ -36,8 +32,6 @@ process SENTIEON_BWAINDEX { stub: """ - source sentieon_init.sh SENTIEON_LICENSE_BASE64 - mkdir bwa_index cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/sentieon/driver.nf b/modules/local/sentieon/driver.nf index 845d6d42..eff7dac5 100644 --- a/modules/local/sentieon/driver.nf +++ b/modules/local/sentieon/driver.nf @@ -3,8 +3,6 @@ process SENTIEON_DRIVER { label 'process_high' label 'sentieon' - secret 'SENTIEON_LICENSE_BASE64' - input: tuple val(meta), path(bam), path(bai), path(score), path(score_idx), path(recal_pre), path(recal_post) path fasta @@ -53,8 +51,6 @@ process SENTIEON_DRIVER { } } """ - source sentieon_init.sh SENTIEON_LICENSE_BASE64 - sentieon \\ driver \\ $ref \\ @@ -74,8 +70,6 @@ process SENTIEON_DRIVER { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - source sentieon_init.sh SENTIEON_LICENSE_BASE64 - touch ${prefix}.bam touch ${prefix}.bai touch ${prefix}.cram From 2d642364de316807abefa0b7542a7adc8c4bb2dc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 21 Apr 2022 13:59:09 +0200 Subject: [PATCH 0454/1169] fix manta --- subworkflows/nf-core/call_sv_manta.nf | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/subworkflows/nf-core/call_sv_manta.nf b/subworkflows/nf-core/call_sv_manta.nf index fed96edc..4d49447d 100644 --- a/subworkflows/nf-core/call_sv_manta.nf +++ b/subworkflows/nf-core/call_sv_manta.nf @@ -22,21 +22,23 @@ workflow CALL_SV_MANTA { .toList() .set { bai_file_list } - case_info.combine(bam_file_list) - .combine(bai_file_list) - .set { manta_input_bams } - - bed - .map { + bed.map { id, bed_file, index -> return [bed_file, index]} .set { bed_input } if (params.analysis_type == "WGS") { - MANTA ( manta_input_bams, fasta, fai, [[],[]] ) + case_info.combine(bam_file_list) + .combine(bai_file_list) + .map { it -> it + [ [], [] ] } + .set { manta_input } + MANTA ( manta_input, fasta, fai ) } else { - ch_target_bed = bed.ifEmpty([[],[]]) - MANTA ( manta_input_bams, fasta, fai, bed_input ) + case_info.combine(bam_file_list) + .combine(bai_file_list) + .combine(bed_input) + .set { manta_input } + MANTA ( manta_input, fasta, fai ) } ch_versions = MANTA.out.versions From 08e288d301407eff7844cd0ad59ff550ea258659 Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Thu, 21 Apr 2022 16:15:37 +0200 Subject: [PATCH 0455/1169] feat created local subworkflow prepare_MT_alignment --- conf/modules.config | 18 ++++++++++++ subworkflows/local/prepare_MT_alignment.nf | 32 ++++++++++++++++++++++ workflows/raredisease.nf | 9 ++++++ 3 files changed, 59 insertions(+) create mode 100644 subworkflows/local/prepare_MT_alignment.nf diff --git a/conf/modules.config b/conf/modules.config index d973fca3..89973614 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -407,3 +407,21 @@ process { ] } } + +// +// PREPARE_MT_ALLIGNMENT +// + +process { + withName: '.*PREPARE_MT_ALLIGNMENT:SAMTOOLS_VIEW_MT' { + ext.args2 = 'chrM' + } + + withName: '.*PREPARE_MT_ALLIGNMENT:GATK4_REVERTSAM_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT' + } + + withName: '.*PREPARE_MT_ALLIGNMENT:GATK4_SAMTOFASTQ_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT' + } +} diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/prepare_MT_alignment.nf new file mode 100644 index 00000000..1e8ff923 --- /dev/null +++ b/subworkflows/local/prepare_MT_alignment.nf @@ -0,0 +1,32 @@ +// +// Prepare bam files for MT allignment +// + +include { SAMTOOLS_VIEW as SAMTOOLS_VIEW_MT } from '../../modules/nf-core/modules/samtools/view/main' +include { GATK4_REVERTSAM as GATK4_REVERTSAM_MT } from '../../modules/nf-core/modules/gatk4/revertsam/main' +include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../modules/nf-core/modules/gatk4/samtofastq/main' + +workflow PREPARE_MT_ALIGNMENT { + take: + bam_cram // id: and file: bam index: bam.bai + + main: + + ch_versions = Channel.empty() + + // Outputs bam containing only MT + SAMTOOLS_VIEW_MT ( bam_cram, [] ) + ch_versions = ch_versions.mix(SAMTOOLS_VIEW_MT.out.versions.first()) + + // Removes alignment information + GATK4_REVERTSAM_MT ( SAMTOOLS_VIEW_MT.out.bam ) + ch_versions = ch_versions.mix(GATK4_REVERTSAM_MT.out.versions.first()) + + // Outputs fastq files + GATK4_SAMTOFASTQ_MT ( GATK4_REVERTSAM_MT.out.bam ) + ch_versions = ch_versions.mix(GATK4_SAMTOFASTQ_MT.out.versions.first()) + + emit: + fastq = GATK4_SAMTOFASTQ_MT.out.fastq + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 26cf3e6b..be9b1947 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -73,6 +73,7 @@ include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' +include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -177,6 +178,14 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(ch_sv_annotate.versions) } + + // STEP 2.1: MT CALLING + ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) + + PREPARE_MT_ALIGNMENT ( + ch_bam_bai + ) + ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) From a08848318be32047b20d7f82ace0697a3d908ddb Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Thu, 21 Apr 2022 16:22:14 +0200 Subject: [PATCH 0456/1169] feat added modules required for subworkflow --- modules.json | 8 +++- .../nf-core/modules/gatk4/revertsam/main.nf | 42 ++++++++++++++++++ .../nf-core/modules/gatk4/revertsam/meta.yml | 36 ++++++++++++++++ .../nf-core/modules/gatk4/samtofastq/main.nf | 43 +++++++++++++++++++ .../nf-core/modules/gatk4/samtofastq/meta.yml | 36 ++++++++++++++++ 5 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/modules/gatk4/revertsam/main.nf create mode 100644 modules/nf-core/modules/gatk4/revertsam/meta.yml create mode 100644 modules/nf-core/modules/gatk4/samtofastq/main.nf create mode 100644 modules/nf-core/modules/gatk4/samtofastq/meta.yml diff --git a/modules.json b/modules.json index a18a664f..2da9c36e 100644 --- a/modules.json +++ b/modules.json @@ -36,6 +36,12 @@ "gatk4/intervallisttools": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, + "gatk4/revertsam": { + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + }, + "gatk4/samtofastq": { + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + }, "glnexus": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, @@ -110,4 +116,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/gatk4/revertsam/main.nf b/modules/nf-core/modules/gatk4/revertsam/main.nf new file mode 100644 index 00000000..4e8e9ddc --- /dev/null +++ b/modules/nf-core/modules/gatk4/revertsam/main.nf @@ -0,0 +1,42 @@ +process GATK4_REVERTSAM { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path('*.bam'), emit: bam + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK RevertSam] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" RevertSam \\ + --INPUT $bam \\ + --OUTPUT ${prefix}.reverted.bam \\ + --TMP_DIR . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/revertsam/meta.yml b/modules/nf-core/modules/gatk4/revertsam/meta.yml new file mode 100644 index 00000000..6cc97d86 --- /dev/null +++ b/modules/nf-core/modules/gatk4/revertsam/meta.yml @@ -0,0 +1,36 @@ +name: gatk4_revertsam +description: Reverts SAM or BAM files to a previous state. +keywords: + - sam + - revert +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - bam: + type: file + description: The input bam/sam file + pattern: "*.{bam,sam}" +output: + - bam: + type: file + description: The reverted bam/sam file + pattern: "*.reverted.bam" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@kevinmenden" diff --git a/modules/nf-core/modules/gatk4/samtofastq/main.nf b/modules/nf-core/modules/gatk4/samtofastq/main.nf new file mode 100644 index 00000000..8553e419 --- /dev/null +++ b/modules/nf-core/modules/gatk4/samtofastq/main.nf @@ -0,0 +1,43 @@ +process GATK4_SAMTOFASTQ { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : + 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path('*.fastq.gz'), emit: fastq + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def output = meta.single_end ? "--FASTQ ${prefix}.fastq.gz" : "--FASTQ ${prefix}_1.fastq.gz --SECOND_END_FASTQ ${prefix}_2.fastq.gz" + + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK SamToFastq] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" SamToFastq \\ + --INPUT $bam \\ + $output \\ + --TMP_DIR . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/samtofastq/meta.yml b/modules/nf-core/modules/gatk4/samtofastq/meta.yml new file mode 100644 index 00000000..60ca6aee --- /dev/null +++ b/modules/nf-core/modules/gatk4/samtofastq/meta.yml @@ -0,0 +1,36 @@ +name: gatk4_samtofastq +description: Converts BAM/SAM file to FastQ format +keywords: + - bed + - interval list +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - bam: + type: file + description: Input SAM/BAM file + pattern: "*.{bam,sam}" +output: + - fastq: + type: file + description: converted fastq file + pattern: "*.fastq" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@kevinmenden" From 7e0368f79b064f56b5ccf0d926bc0cee26c104ee Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Fri, 22 Apr 2022 07:45:05 +0200 Subject: [PATCH 0457/1169] fix variable names --- conf/modules.config | 6 +++--- workflows/raredisease.nf | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 89973614..c365ee59 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -413,15 +413,15 @@ process { // process { - withName: '.*PREPARE_MT_ALLIGNMENT:SAMTOOLS_VIEW_MT' { + withName: '.*PREPARE_MT_ALIGNMENT:SAMTOOLS_VIEW_MT' { ext.args2 = 'chrM' } - withName: '.*PREPARE_MT_ALLIGNMENT:GATK4_REVERTSAM_MT' { + withName: '.*PREPARE_MT_ALIGNMENT:GATK4_REVERTSAM_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT' } - withName: '.*PREPARE_MT_ALLIGNMENT:GATK4_SAMTOFASTQ_MT' { + withName: '.*PREPARE_MT_ALIGNMENT:GATK4_SAMTOFASTQ_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT' } } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index be9b1947..53fc4860 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -180,10 +180,9 @@ workflow RAREDISEASE { } // STEP 2.1: MT CALLING - ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) PREPARE_MT_ALIGNMENT ( - ch_bam_bai + ch_mapped.bam_bai ) ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) From b6276e5641f8a6cd27666f659cba0137c882506a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 22 Apr 2022 10:15:55 +0200 Subject: [PATCH 0458/1169] update stranger --- modules.json | 4 ++-- modules/nf-core/modules/samtools/view/main.nf | 2 +- modules/nf-core/modules/samtools/view/meta.yml | 4 ++++ modules/nf-core/modules/stranger/main.nf | 11 +++++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/modules.json b/modules.json index aa223e95..460ca7ea 100644 --- a/modules.json +++ b/modules.json @@ -76,10 +76,10 @@ "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/view": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "12afb6b0faf3cabf769c9a2a7dd477e3f066eac0" }, "stranger": { - "git_sha": "a6cb75174bfbd131f3da14d8cd3e34c1a2e6e268" + "git_sha": "c7329a3a5730872dea512921217993cfa7acd959" }, "svdb/merge": { "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" diff --git a/modules/nf-core/modules/samtools/view/main.nf b/modules/nf-core/modules/samtools/view/main.nf index 5f14fbbf..11cfb74b 100644 --- a/modules/nf-core/modules/samtools/view/main.nf +++ b/modules/nf-core/modules/samtools/view/main.nf @@ -8,7 +8,7 @@ process SAMTOOLS_VIEW { 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: - tuple val(meta), path(input) + tuple val(meta), path(input), path(index) path fasta output: diff --git a/modules/nf-core/modules/samtools/view/meta.yml b/modules/nf-core/modules/samtools/view/meta.yml index 5604bfa7..a8b43ecc 100644 --- a/modules/nf-core/modules/samtools/view/meta.yml +++ b/modules/nf-core/modules/samtools/view/meta.yml @@ -25,6 +25,10 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" + - index: + type: optional file + description: BAM.BAI/CRAM.CRAI file + pattern: "*.{.bai,.crai}" - fasta: type: optional file description: Reference file the CRAM was created with diff --git a/modules/nf-core/modules/stranger/main.nf b/modules/nf-core/modules/stranger/main.nf index 55678bd3..ddfa0070 100644 --- a/modules/nf-core/modules/stranger/main.nf +++ b/modules/nf-core/modules/stranger/main.nf @@ -33,4 +33,15 @@ process STRANGER { stranger: \$( stranger --version ) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + stranger: \$( stranger --version ) + END_VERSIONS + """ } From 090f4b73e46463c5cbe276d9be9439f0651418ff Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Fri, 22 Apr 2022 10:18:09 +0200 Subject: [PATCH 0459/1169] feat updated samtools view module --- modules.json | 2 +- modules/nf-core/modules/samtools/view/main.nf | 8 ++++---- modules/nf-core/modules/samtools/view/meta.yml | 4 ++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/modules.json b/modules.json index 2da9c36e..1c9590f7 100644 --- a/modules.json +++ b/modules.json @@ -82,7 +82,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "samtools/view": { - "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" + "git_sha": "12afb6b0faf3cabf769c9a2a7dd477e3f066eac0" }, "stranger": { "git_sha": "a6cb75174bfbd131f3da14d8cd3e34c1a2e6e268" diff --git a/modules/nf-core/modules/samtools/view/main.nf b/modules/nf-core/modules/samtools/view/main.nf index 75aad063..11cfb74b 100644 --- a/modules/nf-core/modules/samtools/view/main.nf +++ b/modules/nf-core/modules/samtools/view/main.nf @@ -2,13 +2,13 @@ process SAMTOOLS_VIEW { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : - 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: - tuple val(meta), path(input) + tuple val(meta), path(input), path(index) path fasta output: diff --git a/modules/nf-core/modules/samtools/view/meta.yml b/modules/nf-core/modules/samtools/view/meta.yml index 5604bfa7..a8b43ecc 100644 --- a/modules/nf-core/modules/samtools/view/meta.yml +++ b/modules/nf-core/modules/samtools/view/meta.yml @@ -25,6 +25,10 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" + - index: + type: optional file + description: BAM.BAI/CRAM.CRAI file + pattern: "*.{.bai,.crai}" - fasta: type: optional file description: Reference file the CRAM was created with From 9f74a790724f399b6abc0f65192bb788d146631b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 22 Apr 2022 10:25:50 +0200 Subject: [PATCH 0460/1169] prettier int --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 460ca7ea..afc9bcab 100644 --- a/modules.json +++ b/modules.json @@ -110,4 +110,4 @@ } } } -} \ No newline at end of file +} From 9c1af90d11fc3dc70f9af5522b89cd9b1248afe3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 22 Apr 2022 11:09:14 +0200 Subject: [PATCH 0461/1169] remove init script --- bin/sentieon_init.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 bin/sentieon_init.sh diff --git a/bin/sentieon_init.sh b/bin/sentieon_init.sh deleted file mode 100644 index e69de29b..00000000 From 4632634c0a2f41cf385669654f92b156e54078b4 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 22 Apr 2022 11:14:28 +0200 Subject: [PATCH 0462/1169] change index parameter to bwa --- conf/genomes.config | 4 ++-- main.nf | 2 +- nextflow.config | 1 - nextflow_schema.json | 6 ------ 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 036ccbaa..f2628947 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -15,7 +15,7 @@ params { fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" - sentieon = "" + bwa_index = "" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -28,7 +28,7 @@ params { fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" - sentieon = "" + bwa_index = "" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/main.nf b/main.nf index e0b12a13..feded8cf 100644 --- a/main.nf +++ b/main.nf @@ -25,7 +25,7 @@ params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbs params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') -params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'sentieon') +params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa_index') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') diff --git a/nextflow.config b/nextflow.config index f173a2a2..d3910504 100644 --- a/nextflow.config +++ b/nextflow.config @@ -12,7 +12,6 @@ params { // Required options input = null outdir = null - sentieon_install_dir = null // References genome = null diff --git a/nextflow_schema.json b/nextflow_schema.json index a7ff5fce..d323842d 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -35,12 +35,6 @@ "help_text": "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.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" }, - "sentieon_install_dir": { - "type": "string", - "fa_icon": "fas fa-folder-open", - "description": "Directory where Sentieon binary is installed if not on $PATH", - "default": null - }, "multiqc_title": { "type": "string", "description": "MultiQC report title. Printed as page header, used for filename if not otherwise specified.", From a920b1f53511b0b2702354f691cec6569732a3db Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 22 Apr 2022 13:25:51 +0200 Subject: [PATCH 0463/1169] fix exe not found error --- modules/local/sentieon/bwamem.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf index 433e2706..3bae8c78 100644 --- a/modules/local/sentieon/bwamem.nf +++ b/modules/local/sentieon/bwamem.nf @@ -29,7 +29,7 @@ process SENTIEON_BWAMEM { \$INDEX \\ $reads \\ $args \\ - | $sentieon_exe \\ + | sentieon \\ util \\ sort \\ -r $fasta \\ From f23f4052cfd46abfcb2b69ef43dc99ebff17852b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 23 Apr 2022 15:25:07 +0200 Subject: [PATCH 0464/1169] make separate modules for each step --- modules/local/sentieon/bqsr.nf | 78 +++++++++++++++++++ modules/local/sentieon/datametrics.nf | 62 +++++++++++++++ modules/local/sentieon/dedup.nf | 53 +++++++++++++ modules/local/sentieon/driver.nf | 97 ------------------------ modules/local/sentieon/locuscollector.nf | 46 +++++++++++ subworkflows/local/align.nf | 4 +- subworkflows/local/align_sentieon.nf | 37 ++++----- workflows/raredisease.nf | 2 - 8 files changed, 259 insertions(+), 120 deletions(-) create mode 100644 modules/local/sentieon/bqsr.nf create mode 100644 modules/local/sentieon/datametrics.nf create mode 100644 modules/local/sentieon/dedup.nf delete mode 100644 modules/local/sentieon/driver.nf create mode 100644 modules/local/sentieon/locuscollector.nf diff --git a/modules/local/sentieon/bqsr.nf b/modules/local/sentieon/bqsr.nf new file mode 100644 index 00000000..0d036700 --- /dev/null +++ b/modules/local/sentieon/bqsr.nf @@ -0,0 +1,78 @@ +process SENTIEON_BQSR { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + input: + tuple val(meta), path(bam), path(bai), path(score), path(score_idx) + path fasta + path fai + path known_dbsnp + + output: + tuple val(meta), path('*.recal.bam') , emit: bam + tuple val(meta), path('*.recal.bai') , emit: bai + tuple val(meta), path('*recal_data.table') , emit: recal_pre + tuple val(meta), path('*recal_data.table.post') , emit: recal_post + tuple val(meta), path('*recal_result.csv') , emit: recal_csv + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + def ref = fasta ? "-r $fasta" : '' + def dbsnp = known_dbsnp ? "-k $known_dbsnp" : '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + sentieon driver \\ + -t ${task.cpus} \\ + $args \\ + $ref \\ + $input \\ + --algo QualCal \\ + $dbsnp \\ + ${prefix}.recal_table.table + + sentieon driver \\ + -t ${task.cpus} \\ + $args \\ + $ref \\ + $input \\ + -q ${prefix}.recal_data.table \\ + --algo QualCal \\ + $dbsnp \\ + $prefix.recal_data.table.post \\ + --algo ReadWriter ${prefix}.recal.bam + + sentieon driver \\ + -t ${task.cpus} \\ + --algo QualCal \\ + --plot \\ + --before ${prefix}.recal.table \\ + --after ${prefix}.table.post \\ + ${prefix}_recal_result.csv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.recal.bam + touch ${prefix}.recal.bai + touch ${prefix}.recal_data.table + touch ${prefix}.recal_data.table.post + touch ${prefix}.recal.csv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ +} diff --git a/modules/local/sentieon/datametrics.nf b/modules/local/sentieon/datametrics.nf new file mode 100644 index 00000000..9c23ecf3 --- /dev/null +++ b/modules/local/sentieon/datametrics.nf @@ -0,0 +1,62 @@ +process SENTIEON_DATAMETRICS { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + input: + tuple val(meta), path(bam), path(bai) + path fasta + path fai + + output: + tuple val(meta), path('*mq_metrics.txt') , emit: mq_metrics + tuple val(meta), path('*qd_metrics.txt') , emit: qd_metrics + tuple val(meta), path('*gc_summary.txt') , emit: gc_summary + tuple val(meta), path('*gc_metrics.txt') , emit: gc_metrics + tuple val(meta), path('*aln_metrics.txt') , emit: aln_metrics + tuple val(meta), path('*is_metrics.txt') , emit: is_metrics + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + def ref = fasta ? "-r $fasta" : '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + sentieon \\ + driver \\ + --algo GCBias --summary ${prefix}_gc_summary.txt ${prefix}_gc_metrics.txt \\ + --algo MeanQualityByCycle ${prefix}_mq_metrics.txt \\ + --algo QualDistribution ${prefix}_qd_metrics.txt \\ + --algo InsertSizeMetricAlgo ${prefix}_is_metrics.txt \\ + --algo AlignmentStat ${prefix}_aln_metrics.txt \\ + -t $task.cpus \\ + $input \\ + $ref \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.mq_metrics.txt + touch ${prefix}.qd_metrics.txt + touch ${prefix}.gc_summary.txt + touch ${prefix}.gc_metrics.txt + touch ${prefix}.aln_metrics.txt + touch ${prefix}.is_metrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ +} diff --git a/modules/local/sentieon/dedup.nf b/modules/local/sentieon/dedup.nf new file mode 100644 index 00000000..729df8cc --- /dev/null +++ b/modules/local/sentieon/dedup.nf @@ -0,0 +1,53 @@ +process SENTIEON_DEDUP { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + input: + tuple val(meta), path(bam), path(bai), path(score), path(score_idx) + path fasta + path fai + + output: + tuple val(meta), path('*.bam') , emit: bam , optional: true + tuple val(meta), path('*.bai') , emit: bai , optional: true + tuple val(meta), path('*dedup_metrics.txt') , emit: metrics_dedup, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + sentieon \\ + driver \\ + -t $task.cpus \\ + $input \\ + $args \\ + --algo Dedup \\ + --score_info $score \\ + --metrics ${prefix}_dedup_metrics.txt \\ + ${prefix}.deduped.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + touch ${prefix}.bai + touch ${prefix}.dedup_metrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ +} diff --git a/modules/local/sentieon/driver.nf b/modules/local/sentieon/driver.nf deleted file mode 100644 index eff7dac5..00000000 --- a/modules/local/sentieon/driver.nf +++ /dev/null @@ -1,97 +0,0 @@ -process SENTIEON_DRIVER { - tag "$meta.id" - label 'process_high' - label 'sentieon' - - input: - tuple val(meta), path(bam), path(bai), path(score), path(score_idx), path(recal_pre), path(recal_post) - path fasta - path fai - path known_dbsnp - path known_mills - path known_indels - - output: - tuple val(meta), path('*.bam') , emit: bam , optional: true - tuple val(meta), path('*.bai') , emit: bai , optional: true - tuple val(meta), path('*.cram') , emit: cram , optional: true - tuple val(meta), path('*.crai') , emit: crai , optional: true - tuple val(meta), path('*.vcf.gz') , emit: vcf , optional: true - tuple val(meta), path('*.vcf.gz.tbi') , emit: vcf_tbi , optional: true - tuple val(meta), path('*recal_data.table') , emit: recal_pre , optional: true - tuple val(meta), path('*recal_data.table.post') , emit: recal_post , optional: true - tuple val(meta), path('*recal.csv') , emit: recal_csv , optional: true - tuple val(meta), path('*mq_metrics.txt') , emit: mq_metrics , optional: true - tuple val(meta), path('*qd_metrics.txt') , emit: qd_metrics , optional: true - tuple val(meta), path('*gc_summary.txt') , emit: gc_summary , optional: true - tuple val(meta), path('*gc_metrics.txt') , emit: gc_metrics , optional: true - tuple val(meta), path('*aln_metrics.txt') , emit: aln_metrics , optional: true - tuple val(meta), path('*is_metrics.txt') , emit: is_metrics , optional: true - tuple val(meta), path('*dedup_metrics.txt') , emit: metrics_dedup, optional: true - tuple val(meta), path('*score.txt.gz') , emit: score , optional: true - tuple val(meta), path('*score.txt.gz.tbi') , emit: score_idx , optional: true - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def input = bam ? '-i ' + bam.sort().join(' -i ') : '' - def ref = fasta ? "-r $fasta" : '' - def dbsnp = known_dbsnp ? "-k $known_dbsnp" : '' - def mills = known_mills ? "-k $known_mills" : '' - def indels = known_indels ? "-k $known_indels" : '' - if (args.contains('--algo Haplotyper')) { - if (known_dbsnp) { - dbsnp = '' - def args_list = args.split('--algo Haplotyper') - args_list = [ args_list[0] ] + ["--algo Haplotyper -d $known_dbsnp"] + [ args_list[-1] ] - args = args_list.join(' ') - } - } - """ - sentieon \\ - driver \\ - $ref \\ - -t $task.cpus \\ - $input \\ - $dbsnp \\ - $mills \\ - $indels \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.bam - touch ${prefix}.bai - touch ${prefix}.cram - touch ${prefix}.crai - touch ${prefix}.vcf.gz - touch ${prefix}.vcf.gz.tbi - touch ${prefix}.recal_data.table - touch ${prefix}.recal_data.table.post - touch ${prefix}.recal.csv - touch ${prefix}.dedup_metrics.txt - touch ${prefix}.score.txt.gz - touch ${prefix}.score.txt.gz.tbi - touch ${prefix}.mq_metrics.txt - touch ${prefix}.qd_metrics.txt - touch ${prefix}.gc_summary.txt - touch ${prefix}.gc_metrics.txt - touch ${prefix}.aln_metrics.txt - touch ${prefix}.is_metrics.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") - END_VERSIONS - """ -} diff --git a/modules/local/sentieon/locuscollector.nf b/modules/local/sentieon/locuscollector.nf new file mode 100644 index 00000000..05724e7c --- /dev/null +++ b/modules/local/sentieon/locuscollector.nf @@ -0,0 +1,46 @@ +process SENTIEON_LOCUSCOLLECTOR { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path('*score.txt.gz') , emit: score , optional: true + tuple val(meta), path('*score.txt.gz.tbi') , emit: score_idx , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + """ + sentieon \\ + driver \\ + --algo LocusCollector \\ + --fun score_info ${idSample}_score.gz \\ + -t $task.cpus \\ + $input \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.score.txt.gz + touch ${prefix}.score.txt.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ +} diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index e920354b..3d95fb34 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -13,8 +13,6 @@ workflow ALIGN { fai // channel: [genome.fai] index // channel: [ /path/to/bwamem2/index/ ] known_dbsnp // channel: [ /path/to/known_dbsnp/ ] - known_indels // channel: [ /path/to/known_indels/ ] - known_mills // channel: [ /path/to/known_mills/ ] main: ch_versions = Channel.empty() @@ -25,7 +23,7 @@ workflow ALIGN { ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) } else if( aligner == "sentieon" ) { - ALIGN_SENTIEON ( reads_input, fasta, fai, index, known_dbsnp, known_indels, known_mills ) + ALIGN_SENTIEON ( reads_input, fasta, fai, index, known_dbsnp ) ch_marked_bam = ALIGN_SENTIEON.out.marked_bam ch_marked_bai = ALIGN_SENTIEON.out.marked_bai ch_versions = ch_versions.mix(ALIGN_SENTIEON.out.versions) diff --git a/subworkflows/local/align_sentieon.nf b/subworkflows/local/align_sentieon.nf index b253de7f..f4e5a120 100644 --- a/subworkflows/local/align_sentieon.nf +++ b/subworkflows/local/align_sentieon.nf @@ -2,11 +2,11 @@ // A subworkflow to annotate structural variants. // -include { SENTIEON_BWAMEM } from '../../modules/local/sentieon/bwamem' -include { SENTIEON_DRIVER as SENTIEON_DATAMETRICS } from '../../modules/local/sentieon/driver' -include { SENTIEON_DRIVER as SENTIEON_LOCUSCOLLECTOR } from '../../modules/local/sentieon/driver' -include { SENTIEON_DRIVER as SENTIEON_DEDUP } from '../../modules/local/sentieon/driver' -include { SENTIEON_DRIVER as SENTIEON_BQSR } from '../../modules/local/sentieon/driver' +include { SENTIEON_BWAMEM } from '../../modules/local/sentieon/bwamem' +include { SENTIEON_DATAMETRICS } from '../../modules/local/sentieon/datametrics' +include { SENTIEON_LOCUSCOLLECTOR } from '../../modules/local/sentieon/locuscollector' +include { SENTIEON_DEDUP } from '../../modules/local/sentieon/dedup' +include { SENTIEON_BQSR } from '../../modules/local/sentieon/bqsr' workflow ALIGN_SENTIEON { take: @@ -15,12 +15,12 @@ workflow ALIGN_SENTIEON { fai // path: genome.fai index // channel: [ /path/to/bwamem2/index/ ] known_dbsnp // path: params.known_dbsnp - known_indels // path: params.known_indels - known_mills // path: params.known_mills main: - ch_versions = Channel.empty() - ch_recal_pre = Channel.empty() + ch_versions = Channel.empty() + ch_bqsr_bam = Channel.empty() + ch_bqsr_bai = Channel.empty() + ch_bqsr_csv = Channel.empty() SENTIEON_BWAMEM ( reads_input, fasta, fai, index ) ch_versions = ch_versions.mix(SENTIEON_BWAMEM.out.versions) @@ -28,35 +28,36 @@ workflow ALIGN_SENTIEON { SENTIEON_BWAMEM.out .bam .join(SENTIEON_BWAMEM.out.bai) - .map { it -> it + [ [], [], [], [] ] } .set { ch_bam_bai } - SENTIEON_DATAMETRICS (ch_bam_bai, fasta, fai, [], [], [] ) + SENTIEON_DATAMETRICS (ch_bam_bai, fasta, fai ) ch_versions = ch_versions.mix(SENTIEON_DATAMETRICS.out.versions) - SENTIEON_LOCUSCOLLECTOR (ch_bam_bai, fasta, fai, [], [], [] ) + SENTIEON_LOCUSCOLLECTOR ( ch_bam_bai ) ch_bam_bai - .map { meta, bam, bai, score, score_idx, recal_pre, recal_post -> [ meta, bam, bai ] } .join(SENTIEON_LOCUSCOLLECTOR.out.score) .join(SENTIEON_LOCUSCOLLECTOR.out.score_idx) - .map { it -> it + [ [], [] ] } .set { ch_bam_bai_score } - SENTIEON_DEDUP ( ch_bam_bai_score, fasta, fai, [], [], [] ) + SENTIEON_DEDUP ( ch_bam_bai_score, fasta, fai ) if (params.variant_caller == "sentieon") { SENTIEON_DEDUP.out.bam .join(SENTIEON_DEDUP.out.bai) - .map { it -> it + [ [], [], [], [] ] } .set { ch_dedup_bam_bai } - ch_recal_pre = SENTIEON_BQSR ( ch_dedup_bam_bai, fasta, fai, known_dbsnp, known_mills, known_indels ).out.recal_pre + SENTIEON_BQSR ( ch_dedup_bam_bai, fasta, fai, known_dbsnp ) + ch_bqsr_bam = SENTIEON_BQSR.out.bam + ch_bqsr_bai = SENTIEON_BQSR.out.bai + ch_bqsr_csv = SENTIEON_BQSR.out.recal_csv } emit: marked_bam = SENTIEON_DEDUP.out.bam marked_bai = SENTIEON_DEDUP.out.bai - recal_pre = ch_recal_pre + recal_bam = ch_bqsr_bam.ifEmpty(null) + recal_bai = ch_bqsr_bai.ifEmpty(null) + recal_csv = ch_bqsr_csv.ifEmpty(null) mq_metrics = SENTIEON_DATAMETRICS.out.mq_metrics.ifEmpty(null) qd_metrics = SENTIEON_DATAMETRICS.out.qd_metrics.ifEmpty(null) gc_metrics = SENTIEON_DATAMETRICS.out.gc_metrics.ifEmpty(null) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 19519c1f..e1a34c5c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -128,8 +128,6 @@ workflow RAREDISEASE { ch_references.genome_fai, ch_references.aligner_index, ch_known_dbsnp, - ch_known_indels, - ch_known_mills ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) From a81900561c3fa38fa61d66cfee681ecf7212cd80 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 24 Apr 2022 00:37:02 +0200 Subject: [PATCH 0465/1169] modify modules config --- conf/modules.config | 21 --------------------- modules/local/sentieon/bwamemindex.nf | 4 ++-- modules/local/sentieon/dedup.nf | 14 +++++++------- 3 files changed, 9 insertions(+), 30 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f3fef0fc..7c2262fb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -217,11 +217,6 @@ process { process{ withName: '.*ALIGN_SENTIEON:.*' { ext.when = params.aligner.equals("sentieon") - publishDir = [ - path: { "${params.outdir}/sentieon" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BWAMEM' { @@ -235,15 +230,6 @@ process{ } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DATAMETRICS' { - ext.args = { [ - "--algo GCBias --summary ${meta.id}.gc_summary.txt ${meta.id}.gc_metrics.txt", - "--algo MeanQualityByCycle ${meta.id}.mq_metrics.txt", - "--algo QualDistribution ${meta.id}.qd_metrics.txt", - "--algo InsertSizeMetricAlgo ${meta.id}.is_metrics.txt", - "--algo AlignmentStat ${meta.id}.aln_metrics.txt", - "--algo LocusCollector --fun score_info ${meta.id}.score.txt.gz" - ].join(' ') - } publishDir = [ path: { "${params.outdir}/sentieon_bam_metrics" }, mode: params.publish_dir_mode, @@ -252,7 +238,6 @@ process{ } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_LOCUSCOLLECTOR' { - ext.args = { "--algo LocusCollector --fun score_info ${meta.id}.score.txt.gz" } publishDir = [ path: { "${params.outdir}/sentieon_dedup" }, mode: params.publish_dir_mode, @@ -260,11 +245,6 @@ process{ } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DEDUP' { - ext.args = { [ - "--algo Dedup --score_info ${meta.id}.score.txt.gz", - "--metrics ${meta.id}.dedup_metrics.txt ${meta.id}.dedup.bam" - ].join(' ') - } publishDir = [ path: { "${params.outdir}/sentieon_dedup" }, mode: params.publish_dir_mode, @@ -272,7 +252,6 @@ process{ } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BQSR' { - ext.args = { "--algo QualCal ${meta.id}.recal_data.table" } publishDir = [ path: { "${params.outdir}/sentieon_recal" }, mode: params.publish_dir_mode, diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index e20cd7e4..3657b338 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -7,8 +7,8 @@ process SENTIEON_BWAINDEX { path fasta output: - path "bwa_index" , emit: index - path "versions.yml", emit: versions + path "bwa_index" , emit: index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/sentieon/dedup.nf b/modules/local/sentieon/dedup.nf index 729df8cc..3537baf1 100644 --- a/modules/local/sentieon/dedup.nf +++ b/modules/local/sentieon/dedup.nf @@ -9,10 +9,10 @@ process SENTIEON_DEDUP { path fai output: - tuple val(meta), path('*.bam') , emit: bam , optional: true - tuple val(meta), path('*.bai') , emit: bai , optional: true - tuple val(meta), path('*dedup_metrics.txt') , emit: metrics_dedup, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path('*dedup.bam') , emit: bam + tuple val(meta), path('*dedup.bai') , emit: bai + tuple val(meta), path('*dedup_metrics.txt') , emit: metrics_dedup + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -30,7 +30,7 @@ process SENTIEON_DEDUP { --algo Dedup \\ --score_info $score \\ --metrics ${prefix}_dedup_metrics.txt \\ - ${prefix}.deduped.bam + ${prefix}.dedup.bam cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -41,8 +41,8 @@ process SENTIEON_DEDUP { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.bam - touch ${prefix}.bai + touch ${prefix}.dedup.bam + touch ${prefix}.dedup.bai touch ${prefix}.dedup_metrics.txt cat <<-END_VERSIONS > versions.yml From 1e5e2c905f388a0586d71048375a0b621105ef9f Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Wed, 27 Apr 2022 09:02:03 +0200 Subject: [PATCH 0466/1169] feat added samplesheet github test-data path to test.config --- conf/test.config | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/conf/test.config b/conf/test.config index 6355730a..39ed52da 100644 --- a/conf/test.config +++ b/conf/test.config @@ -17,14 +17,16 @@ params { // Limit resources so that this can run on GitHub Actions max_cpus = 2 max_memory = '6.GB' - max_time = '6.h' + max_time = '2.h' // Input data // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/nf-core/raredisease/dev/assets/samplesheet.csv' + //input = 'https://raw.githubusercontent.com/nf-core/raredisease/dev/assets/samplesheet.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_MT.csv' // Genome references - fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + //fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + fasta = '/home/lucia.penaperez/data_tests/Homo_sapiens_assembly38_chr20_chrM.fasta' // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' From d3caec322b34b6356a5f822c790eef1ed7b1e820 Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Thu, 28 Apr 2022 08:53:05 +0200 Subject: [PATCH 0467/1169] Path to fasta file needs to be fixed --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 39ed52da..9b6d00dd 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,7 +26,7 @@ params { // Genome references //fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' - fasta = '/home/lucia.penaperez/data_tests/Homo_sapiens_assembly38_chr20_chrM.fasta' + //fasta = 'Path_to_Homo_sapiens_assembly38_chr20_chrM.fasta' // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' From 964b577c01e6301129db924893a3f16be1fc91f6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 28 Apr 2022 14:07:32 +0200 Subject: [PATCH 0468/1169] module update --- modules.json | 4 ++-- modules/nf-core/modules/picard/collecthsmetrics/main.nf | 9 +++++---- modules/nf-core/modules/picard/collecthsmetrics/meta.yml | 7 ++++--- modules/nf-core/modules/untar/main.nf | 6 +++--- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/modules.json b/modules.json index afc9bcab..b47998ae 100644 --- a/modules.json +++ b/modules.json @@ -49,7 +49,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/collecthsmetrics": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "35231d394940dca2291ac2321c8f9b2e3b039905" }, "picard/collectmultiplemetrics": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" @@ -103,7 +103,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "untar": { - "git_sha": "9ae34a01d1747019fd37753ff4cafb05aec35a2b" + "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9" }, "vcfanno": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" diff --git a/modules/nf-core/modules/picard/collecthsmetrics/main.nf b/modules/nf-core/modules/picard/collecthsmetrics/main.nf index 3acf8bb8..ef7a9b9f 100644 --- a/modules/nf-core/modules/picard/collecthsmetrics/main.nf +++ b/modules/nf-core/modules/picard/collecthsmetrics/main.nf @@ -15,8 +15,8 @@ process PICARD_COLLECTHSMETRICS { path target_intervals output: - tuple val(meta), path("*collecthsmetrics.txt"), emit: hs_metrics - path "versions.yml" , emit: versions + tuple val(meta), path("*_metrics") , emit: metrics + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -41,7 +41,8 @@ process PICARD_COLLECTHSMETRICS { -BAIT_INTERVALS $bait_intervals \\ -TARGET_INTERVALS $target_intervals \\ -INPUT $bam \\ - -OUTPUT ${prefix}_collecthsmetrics.txt + -OUTPUT ${prefix}.CollectHsMetrics.coverage_metrics + cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -52,7 +53,7 @@ process PICARD_COLLECTHSMETRICS { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_collecthsmetrics.txt + touch ${prefix}.CollectHsMetrics.coverage_metrics cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/picard/collecthsmetrics/meta.yml b/modules/nf-core/modules/picard/collecthsmetrics/meta.yml index 4b94909f..dc9d647a 100644 --- a/modules/nf-core/modules/picard/collecthsmetrics/meta.yml +++ b/modules/nf-core/modules/picard/collecthsmetrics/meta.yml @@ -57,10 +57,11 @@ output: type: file description: File containing software versions pattern: "versions.yml" - - hs_metrics: + - metrics: type: file - description: The metrics file. - pattern: "*_collecthsmetrics.txt" + description: Alignment metrics files generated by picard + pattern: "*_{metrics}" authors: - "@projectoriented" + - "@matthdsm" diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index bbfa0bfe..058d1764 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -2,10 +2,10 @@ process UNTAR { tag "$archive" label 'process_low' - conda (params.enable_conda ? "conda-forge::tar=1.34" : null) + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv2/biocontainers_v1.2.0_cv2.img' : - 'biocontainers/biocontainers:v1.2.0_cv2' }" + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" input: tuple val(meta), path(archive) From 4299eb54cad65d6b78700d210780ebe220c16240 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 28 Apr 2022 14:46:29 +0200 Subject: [PATCH 0469/1169] review suggestions --- conf/modules.config | 1 + modules/local/sentieon/bqsr.nf | 7 +++---- modules/local/sentieon/bwamemindex.nf | 5 +++-- modules/local/sentieon/datametrics.nf | 14 +++++++------- modules/local/sentieon/dedup.nf | 2 +- modules/local/sentieon/locuscollector.nf | 5 +++-- nextflow.config | 1 + nextflow_schema.json | 7 +++++++ 8 files changed, 26 insertions(+), 16 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 7c2262fb..4d797d3d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -245,6 +245,7 @@ process{ } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DEDUP' { + ext.args = { $params.rmdup ? "--rmdup" : '' } publishDir = [ path: { "${params.outdir}/sentieon_dedup" }, mode: params.publish_dir_mode, diff --git a/modules/local/sentieon/bqsr.nf b/modules/local/sentieon/bqsr.nf index 0d036700..870b0771 100644 --- a/modules/local/sentieon/bqsr.nf +++ b/modules/local/sentieon/bqsr.nf @@ -23,14 +23,13 @@ process SENTIEON_BQSR { script: def args = task.ext.args ?: '' def input = bam ? '-i ' + bam.sort().join(' -i ') : '' - def ref = fasta ? "-r $fasta" : '' def dbsnp = known_dbsnp ? "-k $known_dbsnp" : '' def prefix = task.ext.prefix ?: "${meta.id}" """ sentieon driver \\ -t ${task.cpus} \\ + -r $fasta \\ $args \\ - $ref \\ $input \\ --algo QualCal \\ $dbsnp \\ @@ -38,8 +37,8 @@ process SENTIEON_BQSR { sentieon driver \\ -t ${task.cpus} \\ + -r $fasta \\ $args \\ - $ref \\ $input \\ -q ${prefix}.recal_data.table \\ --algo QualCal \\ @@ -68,7 +67,7 @@ process SENTIEON_BQSR { touch ${prefix}.recal.bai touch ${prefix}.recal_data.table touch ${prefix}.recal_data.table.post - touch ${prefix}.recal.csv + touch ${prefix}_recal_result.csv cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index 3657b338..90b1f356 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -14,13 +14,14 @@ process SENTIEON_BWAINDEX { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ? "-p bwa_index/${task.ext.prefix}" : "-p bwa_index/${fasta.baseName}" """ mkdir bwa_index sentieon bwa index \\ $args \\ - -p bwa_index/${fasta.baseName} \\ + $prefix \\ $fasta cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/sentieon/datametrics.nf b/modules/local/sentieon/datametrics.nf index 9c23ecf3..5ae0beec 100644 --- a/modules/local/sentieon/datametrics.nf +++ b/modules/local/sentieon/datametrics.nf @@ -34,8 +34,8 @@ process SENTIEON_DATAMETRICS { --algo InsertSizeMetricAlgo ${prefix}_is_metrics.txt \\ --algo AlignmentStat ${prefix}_aln_metrics.txt \\ -t $task.cpus \\ + -r $fasta \\ $input \\ - $ref \\ $args cat <<-END_VERSIONS > versions.yml @@ -47,12 +47,12 @@ process SENTIEON_DATAMETRICS { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.mq_metrics.txt - touch ${prefix}.qd_metrics.txt - touch ${prefix}.gc_summary.txt - touch ${prefix}.gc_metrics.txt - touch ${prefix}.aln_metrics.txt - touch ${prefix}.is_metrics.txt + touch ${prefix}_mq_metrics.txt + touch ${prefix}_qd_metrics.txt + touch ${prefix}_gc_summary.txt + touch ${prefix}_gc_metrics.txt + touch ${prefix}_aln_metrics.txt + touch ${prefix}_is_metrics.txt cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/dedup.nf b/modules/local/sentieon/dedup.nf index 3537baf1..350d0a3a 100644 --- a/modules/local/sentieon/dedup.nf +++ b/modules/local/sentieon/dedup.nf @@ -43,7 +43,7 @@ process SENTIEON_DEDUP { """ touch ${prefix}.dedup.bam touch ${prefix}.dedup.bai - touch ${prefix}.dedup_metrics.txt + touch ${prefix}_dedup_metrics.txt cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/locuscollector.nf b/modules/local/sentieon/locuscollector.nf index 05724e7c..0bcac45a 100644 --- a/modules/local/sentieon/locuscollector.nf +++ b/modules/local/sentieon/locuscollector.nf @@ -17,11 +17,12 @@ process SENTIEON_LOCUSCOLLECTOR { script: def args = task.ext.args ?: '' def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + def prefix = task.ext.prefix ? "${task.ext.prefix}_score.txt.gz" : "${meta.id}_score.txt.gz" """ sentieon \\ driver \\ --algo LocusCollector \\ - --fun score_info ${idSample}_score.gz \\ + --fun score_info $prefix \\ -t $task.cpus \\ $input \\ $args @@ -33,7 +34,7 @@ process SENTIEON_LOCUSCOLLECTOR { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ? "${task.ext.prefix}_score.gz" : "${meta.id}_score.gz" """ touch ${prefix}.score.txt.gz touch ${prefix}.score.txt.gz.tbi diff --git a/nextflow.config b/nextflow.config index d3910504..74ac8787 100644 --- a/nextflow.config +++ b/nextflow.config @@ -26,6 +26,7 @@ params { // Alignment aligner = 'bwamem2' + rmdup = false // Variant calling variant_caller = 'deepvariant' diff --git a/nextflow_schema.json b/nextflow_schema.json index d323842d..56a72db5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -222,6 +222,13 @@ "description": "Specifies the alignment algorithm to use - available options are 'bwamem2' and 'sentieon'.", "fa_icon": "fas fa-map-signs", "enum": ["bwamem2", "sentieon"] + }, + "rmdup": { + "type": "boolean", + "default": false, + "description": "Specifies whether duplicates reads should be removed prior to variant calling.", + "fa_icon": "fas fa-map-signs", + "hidden": true } } }, From 3bcceda99ce1963bacfb9819b4d64fb5e16a064f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 28 Apr 2022 14:47:23 +0200 Subject: [PATCH 0470/1169] review suggestions --- workflows/raredisease.nf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e1a34c5c..f6150b22 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -145,12 +145,12 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) // STEP 1.6: EXPANSIONHUNTER AND STRANGER - CALL_REPEAT_EXPANSIONS ( - ch_mapped.bam_bai, - ch_references.genome_fasta, - ch_references.variant_catalog - ) - ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) + // CALL_REPEAT_EXPANSIONS ( + // ch_mapped.bam_bai, + // ch_references.genome_fasta, + // ch_references.variant_catalog + // ) + // ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. From 9014df54103940c71fcff65392987dfd4ebce7c7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 29 Apr 2022 00:14:31 +0200 Subject: [PATCH 0471/1169] reorder program arguments --- modules/local/sentieon/datametrics.nf | 10 +++++----- modules/local/sentieon/dedup.nf | 4 ++-- modules/local/sentieon/locuscollector.nf | 6 ++---- workflows/raredisease.nf | 14 +++++++------- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/modules/local/sentieon/datametrics.nf b/modules/local/sentieon/datametrics.nf index 5ae0beec..8e713648 100644 --- a/modules/local/sentieon/datametrics.nf +++ b/modules/local/sentieon/datametrics.nf @@ -28,15 +28,15 @@ process SENTIEON_DATAMETRICS { """ sentieon \\ driver \\ + -t $task.cpus \\ + -r $fasta \\ + $input \\ + $args \\ --algo GCBias --summary ${prefix}_gc_summary.txt ${prefix}_gc_metrics.txt \\ --algo MeanQualityByCycle ${prefix}_mq_metrics.txt \\ --algo QualDistribution ${prefix}_qd_metrics.txt \\ --algo InsertSizeMetricAlgo ${prefix}_is_metrics.txt \\ - --algo AlignmentStat ${prefix}_aln_metrics.txt \\ - -t $task.cpus \\ - -r $fasta \\ - $input \\ - $args + --algo AlignmentStat ${prefix}_aln_metrics.txt cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/dedup.nf b/modules/local/sentieon/dedup.nf index 350d0a3a..45cc25e0 100644 --- a/modules/local/sentieon/dedup.nf +++ b/modules/local/sentieon/dedup.nf @@ -10,7 +10,7 @@ process SENTIEON_DEDUP { output: tuple val(meta), path('*dedup.bam') , emit: bam - tuple val(meta), path('*dedup.bai') , emit: bai + tuple val(meta), path('*dedup.bam.bai') , emit: bai tuple val(meta), path('*dedup_metrics.txt') , emit: metrics_dedup path "versions.yml" , emit: versions @@ -42,7 +42,7 @@ process SENTIEON_DEDUP { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.dedup.bam - touch ${prefix}.dedup.bai + touch ${prefix}.dedup.bam.bai touch ${prefix}_dedup_metrics.txt cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/sentieon/locuscollector.nf b/modules/local/sentieon/locuscollector.nf index 0bcac45a..627e5f24 100644 --- a/modules/local/sentieon/locuscollector.nf +++ b/modules/local/sentieon/locuscollector.nf @@ -15,17 +15,15 @@ process SENTIEON_LOCUSCOLLECTOR { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' def input = bam ? '-i ' + bam.sort().join(' -i ') : '' def prefix = task.ext.prefix ? "${task.ext.prefix}_score.txt.gz" : "${meta.id}_score.txt.gz" """ sentieon \\ driver \\ - --algo LocusCollector \\ - --fun score_info $prefix \\ -t $task.cpus \\ $input \\ - $args + --algo LocusCollector \\ + --fun score_info $prefix cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f6150b22..3dc4451e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -144,13 +144,13 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) - // STEP 1.6: EXPANSIONHUNTER AND STRANGER - // CALL_REPEAT_EXPANSIONS ( - // ch_mapped.bam_bai, - // ch_references.genome_fasta, - // ch_references.variant_catalog - // ) - // ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) + STEP 1.6: EXPANSIONHUNTER AND STRANGER + CALL_REPEAT_EXPANSIONS ( + ch_mapped.bam_bai, + ch_references.genome_fasta, + ch_references.variant_catalog + ) + ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. From 760b7a8266751cd6c319e078804eed770d717dc5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 29 Apr 2022 00:27:22 +0200 Subject: [PATCH 0472/1169] comment --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3dc4451e..e1a34c5c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -144,7 +144,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) - STEP 1.6: EXPANSIONHUNTER AND STRANGER + // STEP 1.6: EXPANSIONHUNTER AND STRANGER CALL_REPEAT_EXPANSIONS ( ch_mapped.bam_bai, ch_references.genome_fasta, From 839678f7617aa6493684a147483a9b532a02a8d0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 29 Apr 2022 01:16:43 +0200 Subject: [PATCH 0473/1169] fix qc bam subworkflow --- subworkflows/nf-core/qc_bam.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 30c62990..26bfcf72 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -48,7 +48,7 @@ workflow QC_BAM { emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] - hs_metrics = PICARD_COLLECTHSMETRICS.out.hs_metrics // channel: [ val(meta), path(metrics) ] + hs_metrics = PICARD_COLLECTHSMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] From 5219eb0a1b568cd2c529382d661c1c6c980b23b0 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Fri, 29 Apr 2022 10:06:59 +0200 Subject: [PATCH 0474/1169] Update modules.json fix added a blank line at the end of the file Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 1c9590f7..859e770d 100644 --- a/modules.json +++ b/modules.json @@ -116,4 +116,4 @@ } } } -} \ No newline at end of file +} From 406fd3e3757ff128ef24f4257f20adafdfd42db1 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Fri, 29 Apr 2022 10:08:43 +0200 Subject: [PATCH 0475/1169] Update conf/test.config fix uncommented genome fasta reference Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 9b6d00dd..e4745675 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,7 +25,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_MT.csv' // Genome references - //fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' //fasta = 'Path_to_Homo_sapiens_assembly38_chr20_chrM.fasta' // Variant catalog file From c33b22a134bc63d5fc5689699d97d859df4974b3 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Fri, 29 Apr 2022 10:08:43 +0200 Subject: [PATCH 0476/1169] Update conf/test.config fix uncommented genome fasta reference Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 9b6d00dd..e4745675 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,7 +25,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_MT.csv' // Genome references - //fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' + fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' //fasta = 'Path_to_Homo_sapiens_assembly38_chr20_chrM.fasta' // Variant catalog file From 8104914f49cd55857b2ab4b064a6e9527aaed0f0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 29 Apr 2022 17:20:50 +0200 Subject: [PATCH 0477/1169] review suggestions --- conf/genomes.config | 6 ++++-- conf/modules.config | 7 +++++-- main.nf | 2 +- modules/local/sentieon/bqsr.nf | 2 +- modules/local/sentieon/bwamemindex.nf | 10 +++++----- modules/local/sentieon/datametrics.nf | 2 +- modules/local/sentieon/dedup.nf | 2 +- modules/local/sentieon/locuscollector.nf | 2 +- workflows/raredisease.nf | 6 +++--- 9 files changed, 22 insertions(+), 17 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index f2628947..6f3e9423 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -15,7 +15,8 @@ params { fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" - bwa_index = "" + bwa = "" + known_dbsnp = "" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -28,7 +29,8 @@ params { fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" - bwa_index = "" + bwa = "" + known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/conf/modules.config b/conf/modules.config index 4d797d3d..76ce3d09 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -225,7 +225,7 @@ process{ publishDir = [ path: { "${params.outdir}/sentieon_align" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -233,7 +233,7 @@ process{ publishDir = [ path: { "${params.outdir}/sentieon_bam_metrics" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -241,6 +241,7 @@ process{ publishDir = [ path: { "${params.outdir}/sentieon_dedup" }, mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -249,6 +250,7 @@ process{ publishDir = [ path: { "${params.outdir}/sentieon_dedup" }, mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -256,6 +258,7 @@ process{ publishDir = [ path: { "${params.outdir}/sentieon_recal" }, mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } diff --git a/main.nf b/main.nf index feded8cf..bee83c8c 100644 --- a/main.nf +++ b/main.nf @@ -25,7 +25,7 @@ params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbs params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') -params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa_index') +params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') diff --git a/modules/local/sentieon/bqsr.nf b/modules/local/sentieon/bqsr.nf index 870b0771..8cc350a3 100644 --- a/modules/local/sentieon/bqsr.nf +++ b/modules/local/sentieon/bqsr.nf @@ -22,7 +22,7 @@ process SENTIEON_BQSR { script: def args = task.ext.args ?: '' - def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + def input = bam.sort().collect{"-i $it"}.join(' ') def dbsnp = known_dbsnp ? "-k $known_dbsnp" : '' def prefix = task.ext.prefix ?: "${meta.id}" """ diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index 90b1f356..3a03fd32 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -7,7 +7,7 @@ process SENTIEON_BWAINDEX { path fasta output: - path "bwa_index" , emit: index + path "bwa" , emit: index path "versions.yml" , emit: versions when: @@ -15,13 +15,13 @@ process SENTIEON_BWAINDEX { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ? "-p bwa_index/${task.ext.prefix}" : "-p bwa_index/${fasta.baseName}" + def prefix = task.ext.prefix ? "bwa/${task.ext.prefix}" : "bwa/${fasta.baseName}" """ - mkdir bwa_index + mkdir bwa sentieon bwa index \\ $args \\ - $prefix \\ + -p $prefix \\ $fasta cat <<-END_VERSIONS > versions.yml @@ -33,7 +33,7 @@ process SENTIEON_BWAINDEX { stub: """ - mkdir bwa_index + mkdir bwa cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/datametrics.nf b/modules/local/sentieon/datametrics.nf index 8e713648..1b8ee74c 100644 --- a/modules/local/sentieon/datametrics.nf +++ b/modules/local/sentieon/datametrics.nf @@ -22,7 +22,7 @@ process SENTIEON_DATAMETRICS { script: def args = task.ext.args ?: '' - def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + def input = bam.sort().collect{"-i $it"}.join(' ') def ref = fasta ? "-r $fasta" : '' def prefix = task.ext.prefix ?: "${meta.id}" """ diff --git a/modules/local/sentieon/dedup.nf b/modules/local/sentieon/dedup.nf index 45cc25e0..c135bdbe 100644 --- a/modules/local/sentieon/dedup.nf +++ b/modules/local/sentieon/dedup.nf @@ -19,7 +19,7 @@ process SENTIEON_DEDUP { script: def args = task.ext.args ?: '' - def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + def input = bam.sort().collect{"-i $it"}.join(' ') def prefix = task.ext.prefix ?: "${meta.id}" """ sentieon \\ diff --git a/modules/local/sentieon/locuscollector.nf b/modules/local/sentieon/locuscollector.nf index 627e5f24..7b4faaf2 100644 --- a/modules/local/sentieon/locuscollector.nf +++ b/modules/local/sentieon/locuscollector.nf @@ -15,7 +15,7 @@ process SENTIEON_LOCUSCOLLECTOR { task.ext.when == null || task.ext.when script: - def input = bam ? '-i ' + bam.sort().join(' -i ') : '' + def input = bam.sort().collect{"-i $it"}.join(' ') def prefix = task.ext.prefix ? "${task.ext.prefix}_score.txt.gz" : "${meta.id}_score.txt.gz" """ sentieon \\ diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e1a34c5c..eab21f1e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -27,9 +27,9 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -if (params.known_dbsnp) { ch_known_dbsnp = file(params.known_dbsnp) } else { ch_known_dbsnp = [] } -if (params.known_mills) { ch_known_mills = file(params.known_mills) } else { ch_known_mills = [] } -if (params.known_indels) { ch_known_indels = file(params.known_indels) } else { ch_known_indels = [] } +ch_known_dbsnp = params.known_dbsnp ? file(params.known_dbsnp) : [] +ch_known_mills = params.known_mills ? file(params.known_mills) : [] +ch_known_indels = params.known_indels ? file(params.known_indels) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From c5db2f38751e88ffe4e9aa9188abe43f7721194f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 30 Apr 2022 02:31:51 +0200 Subject: [PATCH 0478/1169] review suggestion add index --- conf/genomes.config | 6 ++-- main.nf | 3 +- modules/local/sentieon/bqsr.nf | 35 ++++++++++++------------ nextflow_schema.json | 7 +++++ subworkflows/local/align.nf | 23 ++++++++-------- subworkflows/local/align_sentieon.nf | 13 +++++---- subworkflows/local/prepare_references.nf | 26 +++++++++++++++--- workflows/raredisease.nf | 14 ++++++---- 8 files changed, 81 insertions(+), 46 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 6f3e9423..8c1f4857 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -16,7 +16,8 @@ params { bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" bwa = "" - known_dbsnp = "" + dbsnp = "" + dbsnp_tbi = "" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -30,7 +31,8 @@ params { bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" bwa = "" - known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" + dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" + dbsnp_tbi = "" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/main.nf b/main.nf index bee83c8c..5e7f77df 100644 --- a/main.nf +++ b/main.nf @@ -21,7 +21,8 @@ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') -params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') +params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'dbsnp') +params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'dbsnp_tbi') params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') diff --git a/modules/local/sentieon/bqsr.nf b/modules/local/sentieon/bqsr.nf index 8cc350a3..c17be4a5 100644 --- a/modules/local/sentieon/bqsr.nf +++ b/modules/local/sentieon/bqsr.nf @@ -4,18 +4,19 @@ process SENTIEON_BQSR { label 'sentieon' input: - tuple val(meta), path(bam), path(bai), path(score), path(score_idx) + tuple val(meta), path(bam), path(bai) path fasta path fai path known_dbsnp + path known_dbsnp_tbi output: - tuple val(meta), path('*.recal.bam') , emit: bam - tuple val(meta), path('*.recal.bai') , emit: bai - tuple val(meta), path('*recal_data.table') , emit: recal_pre - tuple val(meta), path('*recal_data.table.post') , emit: recal_post - tuple val(meta), path('*recal_result.csv') , emit: recal_csv - path "versions.yml" , emit: versions + tuple val(meta), path('*_recal.bam') , emit: bam + tuple val(meta), path('*_recal.bam.bai') , emit: bai + tuple val(meta), path('*_recal_data.table') , emit: recal_pre + tuple val(meta), path('*_recal_data.table_post') , emit: recal_post + tuple val(meta), path('*_recal_result.csv') , emit: recal_csv + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -33,25 +34,25 @@ process SENTIEON_BQSR { $input \\ --algo QualCal \\ $dbsnp \\ - ${prefix}.recal_table.table + ${prefix}_recal_data.table sentieon driver \\ -t ${task.cpus} \\ -r $fasta \\ $args \\ $input \\ - -q ${prefix}.recal_data.table \\ + -q ${prefix}_recal_data.table \\ --algo QualCal \\ $dbsnp \\ - $prefix.recal_data.table.post \\ - --algo ReadWriter ${prefix}.recal.bam + ${prefix}_recal_data.table_post \\ + --algo ReadWriter ${prefix}_recal.bam sentieon driver \\ -t ${task.cpus} \\ --algo QualCal \\ --plot \\ - --before ${prefix}.recal.table \\ - --after ${prefix}.table.post \\ + --before ${prefix}_recal_data.table \\ + --after ${prefix}_recal_data.table_post \\ ${prefix}_recal_result.csv cat <<-END_VERSIONS > versions.yml @@ -63,10 +64,10 @@ process SENTIEON_BQSR { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.recal.bam - touch ${prefix}.recal.bai - touch ${prefix}.recal_data.table - touch ${prefix}.recal_data.table.post + touch ${prefix}_recal.bam + touch ${prefix}_recal.bam.bai + touch ${prefix}_recal_data.table + touch ${prefix}_recal_data.table_post touch ${prefix}_recal_result.csv cat <<-END_VERSIONS > versions.yml diff --git a/nextflow_schema.json b/nextflow_schema.json index 56a72db5..caaaf293 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -108,6 +108,13 @@ "description": "Path to known dbSNP file.", "hidden": true }, + "known_dbsnp_tbi": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "Path to known dbSNP file index.", + "hidden": true + }, "known_indels": { "type": "string", "format": "path", diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 3d95fb34..65c5277a 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -7,12 +7,13 @@ include { ALIGN_SENTIEON } from './align_sentieon' workflow ALIGN { take: - aligner // string: params.aligner - reads_input // channel: [ val(meta), reads_input ] - fasta // channel: [genome.fasta] - fai // channel: [genome.fai] - index // channel: [ /path/to/bwamem2/index/ ] - known_dbsnp // channel: [ /path/to/known_dbsnp/ ] + aligner // string: params.aligner + reads_input // channel: [ val(meta), reads_input ] + fasta // channel: [genome.fasta] + fai // channel: [genome.fai] + index // channel: [ /path/to/bwamem2/index/ ] + known_dbsnp // channel: [ /path/to/known_dbsnp ] + known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] main: ch_versions = Channel.empty() @@ -23,7 +24,7 @@ workflow ALIGN { ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) } else if( aligner == "sentieon" ) { - ALIGN_SENTIEON ( reads_input, fasta, fai, index, known_dbsnp ) + ALIGN_SENTIEON ( reads_input, fasta, fai, index, known_dbsnp, known_dbsnp_tbi ) ch_marked_bam = ALIGN_SENTIEON.out.marked_bam ch_marked_bai = ALIGN_SENTIEON.out.marked_bai ch_versions = ch_versions.mix(ALIGN_SENTIEON.out.versions) @@ -34,9 +35,9 @@ workflow ALIGN { ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) emit: - marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bam ] ] - marked_bai = ch_marked_bai // channel: [ val(meta), [ marked_bai ] ] - bam_bai = ch_bam_bai // channel: [ val(meta), [ marked_bam, marked_bai ] ] + marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bam ] ] + marked_bai = ch_marked_bai // channel: [ val(meta), [ marked_bai ] ] + bam_bai = ch_bam_bai // channel: [ val(meta), [ marked_bam, marked_bai ] ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/align_sentieon.nf b/subworkflows/local/align_sentieon.nf index f4e5a120..9949b5d5 100644 --- a/subworkflows/local/align_sentieon.nf +++ b/subworkflows/local/align_sentieon.nf @@ -10,11 +10,12 @@ include { SENTIEON_BQSR } from '../../modules/local/sentieon/bqsr' workflow ALIGN_SENTIEON { take: - reads_input // channel: [ val(meta), reads_input ] - fasta // path: genome.fasta - fai // path: genome.fai - index // channel: [ /path/to/bwamem2/index/ ] - known_dbsnp // path: params.known_dbsnp + reads_input // channel: [ val(meta), reads_input ] + fasta // path: genome.fasta + fai // path: genome.fai + index // channel: [ /path/to/bwamem2/index/ ] + known_dbsnp // path: params.known_dbsnp + known_dbsnp_tbi // path: params.known_dbsnp main: ch_versions = Channel.empty() @@ -46,7 +47,7 @@ workflow ALIGN_SENTIEON { SENTIEON_DEDUP.out.bam .join(SENTIEON_DEDUP.out.bai) .set { ch_dedup_bam_bai } - SENTIEON_BQSR ( ch_dedup_bam_bai, fasta, fai, known_dbsnp ) + SENTIEON_BQSR ( ch_dedup_bam_bai, fasta, fai, known_dbsnp, known_dbsnp_tbi ) ch_bqsr_bam = SENTIEON_BQSR.out.bam ch_bqsr_bai = SENTIEON_BQSR.out.bai ch_bqsr_csv = SENTIEON_BQSR.out.recal_csv diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 0ddb220c..204e6c56 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -2,18 +2,21 @@ // Prepare reference files // -include { CHECK_BED } from './prepare_bed' -include { CHECK_VCF } from './prepare_vcf' -include { PREPARE_GENOME } from './prepare_genome' +include { CHECK_BED } from './prepare_bed' +include { CHECK_VCF } from './prepare_vcf' +include { PREPARE_GENOME } from './prepare_genome' +include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/modules/tabix/tabix/main' workflow PREPARE_REFERENCES { take: aligner // [mandatory] params.aligner bwamem2_index // [mandatory] bwamem2_index - gnomad fasta // [mandatory] genome.fasta fai // [mandatory] genome.fai + gnomad + known_dbsnp + known_dbsnp_tbi sentieonbwa_index target_bed variant_catalog // [optional] variant_catalog.json @@ -34,6 +37,19 @@ workflow PREPARE_REFERENCES { .set { ch_genome } ch_versions = ch_versions.mix(ch_genome.versions) + // Dbsnp vcf + ch_dbsnp_vcf = Channel.empty() + ch_dbsnp_tbi = Channel.empty() + if (!known_dbsnp_tbi && known_dbsnp) { + ch_dbsnp_vcf = file(known_dbsnp) + TABIX_DBSNP([[id:'dbsnp'], ch_dbsnp_vcf]) + ch_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect {it[1]} + ch_versions = ch_versions.mix(TABIX_DBSNP.out.versions) + } else if (known_dbsnp_tbi && known_dbsnp) { + ch_dbsnp_vcf = file(known_dbsnp) + ch_dbsnp_tbi = file(known_dbsnp_tbi) + } + // Gnomad vcf ch_gnomad_vcf = Channel.empty() ch_gnomad_idx = Channel.empty() @@ -70,6 +86,8 @@ workflow PREPARE_REFERENCES { sequence_dict = ch_genome.sequence_dict variant_catalog = ch_genome.variant_catalog vcfanno_resources = ch_genome.vcfanno_resources + known_dbsnp = ch_dbsnp_vcf + known_dbsnp_tbi = ch_dbsnp_tbi gnomad_vcf = ch_gnomad_vcf gnomad_idx = ch_gnomad_idx target_bed = ch_target_bed diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index eab21f1e..6014b968 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -27,9 +27,10 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -ch_known_dbsnp = params.known_dbsnp ? file(params.known_dbsnp) : [] -ch_known_mills = params.known_mills ? file(params.known_mills) : [] -ch_known_indels = params.known_indels ? file(params.known_indels) : [] +ch_known_dbsnp = params.known_dbsnp ? file(params.known_dbsnp) : [] +ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? file(params.known_dbsnp_tbi) : [] +ch_known_mills = params.known_mills ? file(params.known_mills) : [] +ch_known_indels = params.known_indels ? file(params.known_indels) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -109,9 +110,11 @@ workflow RAREDISEASE { PREPARE_REFERENCES ( params.aligner, params.bwamem2_index, - params.gnomad, params.fasta, params.fasta_fai, + params.gnomad, + params.known_dbsnp, + params.known_dbsnp_tbi, params.sentieonbwa_index, params.target_bed, params.variant_catalog, @@ -127,7 +130,8 @@ workflow RAREDISEASE { ch_references.genome_fasta, ch_references.genome_fai, ch_references.aligner_index, - ch_known_dbsnp, + ch_references.known_dbsnp, + ch_references.known_dbsnp_tbi ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) From cf862359fbf4ac5c18e336985d0fb3c7e015f5a5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 30 Apr 2022 02:52:14 +0200 Subject: [PATCH 0479/1169] update prepare references --- subworkflows/local/prepare_references.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 204e6c56..65e5e83c 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -41,13 +41,13 @@ workflow PREPARE_REFERENCES { ch_dbsnp_vcf = Channel.empty() ch_dbsnp_tbi = Channel.empty() if (!known_dbsnp_tbi && known_dbsnp) { - ch_dbsnp_vcf = file(known_dbsnp) - TABIX_DBSNP([[id:'dbsnp'], ch_dbsnp_vcf]) + TABIX_DBSNP([[id:'dbsnp'], file(known_dbsnp)]) + ch_dbsnp_vcf = Channel.fromPath(known_dbsnp) ch_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect {it[1]} ch_versions = ch_versions.mix(TABIX_DBSNP.out.versions) } else if (known_dbsnp_tbi && known_dbsnp) { - ch_dbsnp_vcf = file(known_dbsnp) - ch_dbsnp_tbi = file(known_dbsnp_tbi) + ch_dbsnp_vcf = Channel.fromPath(known_dbsnp) + ch_dbsnp_tbi = Channel.fromPath(known_dbsnp_tbi) } // Gnomad vcf From 955617d75b59961031405ccc998439083cbf8692 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 30 Apr 2022 02:56:00 +0200 Subject: [PATCH 0480/1169] dbsnp to knowndbsnp --- conf/genomes.config | 8 ++++---- main.nf | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 8c1f4857..df8e17de 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -16,8 +16,8 @@ params { bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" bwa = "" - dbsnp = "" - dbsnp_tbi = "" + known_dbsnp = "" + known_dbsnp_tbi = "" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -31,8 +31,8 @@ params { bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" bwa = "" - dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" - dbsnp_tbi = "" + known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" + known_dbsnp_tbi = "" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/main.nf b/main.nf index 5e7f77df..832ef29a 100644 --- a/main.nf +++ b/main.nf @@ -21,8 +21,8 @@ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') -params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'dbsnp') -params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'dbsnp_tbi') +params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') +params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') From e64ee2c2ac27cbb9a7ddef4d00a936187f4d0052 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 2 May 2022 11:49:30 +0200 Subject: [PATCH 0481/1169] review suggestions --- modules/local/sentieon/bqsr.nf | 5 ++++- modules/local/sentieon/datametrics.nf | 1 - modules/local/sentieon/dedup.nf | 8 ++++---- modules/local/sentieon/locuscollector.nf | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/local/sentieon/bqsr.nf b/modules/local/sentieon/bqsr.nf index c17be4a5..f3f7c432 100644 --- a/modules/local/sentieon/bqsr.nf +++ b/modules/local/sentieon/bqsr.nf @@ -23,6 +23,8 @@ process SENTIEON_BQSR { script: def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def args3 = task.ext.args3 ?: '' def input = bam.sort().collect{"-i $it"}.join(' ') def dbsnp = known_dbsnp ? "-k $known_dbsnp" : '' def prefix = task.ext.prefix ?: "${meta.id}" @@ -39,7 +41,7 @@ process SENTIEON_BQSR { sentieon driver \\ -t ${task.cpus} \\ -r $fasta \\ - $args \\ + $args2 \\ $input \\ -q ${prefix}_recal_data.table \\ --algo QualCal \\ @@ -49,6 +51,7 @@ process SENTIEON_BQSR { sentieon driver \\ -t ${task.cpus} \\ + $args3 --algo QualCal \\ --plot \\ --before ${prefix}_recal_data.table \\ diff --git a/modules/local/sentieon/datametrics.nf b/modules/local/sentieon/datametrics.nf index 1b8ee74c..af227579 100644 --- a/modules/local/sentieon/datametrics.nf +++ b/modules/local/sentieon/datametrics.nf @@ -23,7 +23,6 @@ process SENTIEON_DATAMETRICS { script: def args = task.ext.args ?: '' def input = bam.sort().collect{"-i $it"}.join(' ') - def ref = fasta ? "-r $fasta" : '' def prefix = task.ext.prefix ?: "${meta.id}" """ sentieon \\ diff --git a/modules/local/sentieon/dedup.nf b/modules/local/sentieon/dedup.nf index c135bdbe..18c31a1d 100644 --- a/modules/local/sentieon/dedup.nf +++ b/modules/local/sentieon/dedup.nf @@ -30,7 +30,7 @@ process SENTIEON_DEDUP { --algo Dedup \\ --score_info $score \\ --metrics ${prefix}_dedup_metrics.txt \\ - ${prefix}.dedup.bam + ${prefix}_dedup.bam cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -39,10 +39,10 @@ process SENTIEON_DEDUP { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.dedup.bam - touch ${prefix}.dedup.bam.bai + touch ${prefix}_dedup.bam + touch ${prefix}_dedup.bam.bai touch ${prefix}_dedup_metrics.txt cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/sentieon/locuscollector.nf b/modules/local/sentieon/locuscollector.nf index 7b4faaf2..c143b61a 100644 --- a/modules/local/sentieon/locuscollector.nf +++ b/modules/local/sentieon/locuscollector.nf @@ -34,8 +34,8 @@ process SENTIEON_LOCUSCOLLECTOR { stub: def prefix = task.ext.prefix ? "${task.ext.prefix}_score.gz" : "${meta.id}_score.gz" """ - touch ${prefix}.score.txt.gz - touch ${prefix}.score.txt.gz.tbi + touch ${prefix}_score.txt.gz + touch ${prefix}_score.txt.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": From d49d23f342dc00522a766cda866064d73edb4ec2 Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Tue, 3 May 2022 10:25:03 +0200 Subject: [PATCH 0482/1169] feat updating modules for MT subworkflow --- modules.json | 8 ++++---- modules/nf-core/modules/gatk4/revertsam/main.nf | 11 +++++++++++ modules/nf-core/modules/gatk4/samtofastq/main.nf | 13 +++++++++++++ modules/nf-core/modules/samtools/view/main.nf | 12 ++++++++++++ 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index 57838160..477f963b 100644 --- a/modules.json +++ b/modules.json @@ -37,10 +37,10 @@ "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, "gatk4/revertsam": { - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + "git_sha": "f231291e7730654158cbd3f10b82c292e27fa273" }, "gatk4/samtofastq": { - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce" }, "glnexus": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" @@ -82,7 +82,7 @@ "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/view": { - "git_sha": "12afb6b0faf3cabf769c9a2a7dd477e3f066eac0" + "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce" }, "stranger": { "git_sha": "c7329a3a5730872dea512921217993cfa7acd959" @@ -116,4 +116,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/gatk4/revertsam/main.nf b/modules/nf-core/modules/gatk4/revertsam/main.nf index 4e8e9ddc..3084658d 100644 --- a/modules/nf-core/modules/gatk4/revertsam/main.nf +++ b/modules/nf-core/modules/gatk4/revertsam/main.nf @@ -39,4 +39,15 @@ process GATK4_REVERTSAM { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.reverted.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/gatk4/samtofastq/main.nf b/modules/nf-core/modules/gatk4/samtofastq/main.nf index 8553e419..d8d94d69 100644 --- a/modules/nf-core/modules/gatk4/samtofastq/main.nf +++ b/modules/nf-core/modules/gatk4/samtofastq/main.nf @@ -40,4 +40,17 @@ process GATK4_SAMTOFASTQ { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.fastq.gz + touch ${prefix}_1.fastq.gz + touch ${prefix}_2.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/samtools/view/main.nf b/modules/nf-core/modules/samtools/view/main.nf index 11cfb74b..55194e88 100644 --- a/modules/nf-core/modules/samtools/view/main.nf +++ b/modules/nf-core/modules/samtools/view/main.nf @@ -41,4 +41,16 @@ process SAMTOOLS_VIEW { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + touch ${prefix}.cram + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } From 8e1aa70dacf7899842feeeb8409e73a3be48a00e Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Tue, 3 May 2022 10:29:44 +0200 Subject: [PATCH 0483/1169] fix added a blank line at the end of modules.json --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 477f963b..c38ff5e9 100644 --- a/modules.json +++ b/modules.json @@ -116,4 +116,4 @@ } } } -} \ No newline at end of file +} From 0f11df268ba951ab7cf4ddcc921b9d02104e41d7 Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 4 May 2022 11:15:51 +0200 Subject: [PATCH 0484/1169] added dnascope modules --- modules/local/sentieon/dnamodelapply.nf | 47 +++++++++++++++++++ modules/local/sentieon/dnascope.nf | 60 +++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 modules/local/sentieon/dnamodelapply.nf create mode 100644 modules/local/sentieon/dnascope.nf diff --git a/modules/local/sentieon/dnamodelapply.nf b/modules/local/sentieon/dnamodelapply.nf new file mode 100644 index 00000000..adaef748 --- /dev/null +++ b/modules/local/sentieon/dnamodelapply.nf @@ -0,0 +1,47 @@ +process SENTIEON_DNAMODELAPPLY { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + input: + tuple val(meta), path(vcf), path(vcf_idx) + path fasta + path fai + path ml_model + + output: + tuple val(meta), path("*_dnascope_ml.vcf") , emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + sentieon driver \\ + -t $task.cpus \\ + -r $fasta \\ + --algo DNAModelApply \\ + --model $ml_model \\ + -v $vcf \\ + ${prefix}_dnascope_ml.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_dnascope_ml.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g" ) + END_VERSIONS + """ +} diff --git a/modules/local/sentieon/dnascope.nf b/modules/local/sentieon/dnascope.nf new file mode 100644 index 00000000..9343ed84 --- /dev/null +++ b/modules/local/sentieon/dnascope.nf @@ -0,0 +1,60 @@ +process SENTIEON_DNASCOPE { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + input: + tuple val(meta), path(bam), path(bai) + path fasta + path fai + path known_dbsnp + path known_dbsnp_tbi + path ml_model + val pcrfree + + output: + tuple val(meta), path("*_dnascope.vcf"), path("*_dnascope.vcf.idx") , emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def args3 = task.ext.args3 ?: '' + def dbsnp = known_dbsnp ? "-d ${known_dbsnp}" : '' + def model = ml_model ? "--model ${ml_model}" : '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + sentieon driver \\ + -t $task.cpus \\ + -r $fasta \\ + $args \\ + -i $bam \\ + --algo DNAscope \\ + $dbsnp \\ + $args2 \\ + $args3 \\ + $model \\ + ${prefix}_dnascope.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_dnascope.vcf + touch ${prefix}_dnascope.vcf.idx + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g" ) + END_VERSIONS + """ +} From fddf0664ef95e55018cf325d350f74e884dc8d21 Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 4 May 2022 12:34:08 +0200 Subject: [PATCH 0485/1169] added dnascope options --- nextflow.config | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nextflow.config b/nextflow.config index 74ac8787..9af0347e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -31,6 +31,11 @@ params { // Variant calling variant_caller = 'deepvariant' + // Dnascope SNV calling + pcrfree = true + call_interval = null + variant_types = 'snp, indel' + // Annotation vep_cache_version = '105' From 98a2984479490ef1588c6ea21747b537d1b6d938 Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 4 May 2022 13:28:06 +0200 Subject: [PATCH 0486/1169] added sentieon calling options --- conf/modules.config | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index f0853872..06db1bba 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -264,6 +264,36 @@ process{ } +// +// Sentieon SNV calling options +// + +process { + withName: '.*CALL_SENTIEON:.*' { + ext.when = params.variant_caller.equals("sentieon") + } + + withName: '.*CALL_SNV:CALL_SENTIEON:SENTIEON_DNASCOPE' { + ext.args = { params.call_interval ? "--interval ${params.call_interval}" : '' } + ext.args2 = { params.variant_types ? "--var_type ${params.variant_types}" : '' } + ext.args3 = { params.pcrfree ? "--pcr_indel_model NONE" : '' } + publishDir = [ + path: { "${params.outdir}/sentieon_dnascope" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_SNV:CALL_SENTIEON:SENTIEON_DNAMODELAPPLY' { + publishDir = [ + path: { "${params.outdir}/sentieon_dnamodelapply" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + +} + // // Bam QC options // From d2318bb4e4ab34e5fdec2f07ba0a9ad95bcbaf6d Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 4 May 2022 13:54:54 +0200 Subject: [PATCH 0487/1169] added pcrfree variable --- nextflow_schema.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index caaaf293..47d1be3f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -251,6 +251,12 @@ "description": "Specifies the variant caller to use - available options are 'deepvariant' and 'sentieon'.", "fa_icon": "fas fa-map-signs", "enum": ["deepvariant", "sentieon"] + }, + "pcrfree": { + "type": "boolean", + "default": true, + "description": "indicates whether the sample is PCR Free or not. Set to true for PCR Free samples.", + "fa_icon": "fas fa-map-signs" } } }, From ffbea5f1d61b5f52b72cb5e013b73de1af1cb1df Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 4 May 2022 14:05:13 +0200 Subject: [PATCH 0488/1169] fixed spaces --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 9af0347e..52c0049b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -34,7 +34,7 @@ params { // Dnascope SNV calling pcrfree = true call_interval = null - variant_types = 'snp, indel' + variant_type = 'snp, indel' // Annotation vep_cache_version = '105' From 28bd2ec8f6124c53752d03e91082a40269f1e1f6 Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 4 May 2022 14:26:21 +0200 Subject: [PATCH 0489/1169] fixed spaces --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 52c0049b..23403c36 100644 --- a/nextflow.config +++ b/nextflow.config @@ -32,7 +32,7 @@ params { variant_caller = 'deepvariant' // Dnascope SNV calling - pcrfree = true + pcrfree = true call_interval = null variant_type = 'snp, indel' From df88f39e1e5e0ee8efbb2bf382a56c4ea9cbfc75 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 4 May 2022 17:21:03 +0200 Subject: [PATCH 0490/1169] use secret --- bin/sentieon_init.sh | 13 +++++++++++++ conf/genomes.config | 2 +- modules/local/sentieon/bqsr.nf | 9 ++++++++- modules/local/sentieon/bwamem.nf | 7 +++++++ modules/local/sentieon/bwamemindex.nf | 7 +++++++ modules/local/sentieon/datametrics.nf | 7 +++++++ modules/local/sentieon/dedup.nf | 7 +++++++ modules/local/sentieon/locuscollector.nf | 7 +++++++ 8 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 bin/sentieon_init.sh diff --git a/bin/sentieon_init.sh b/bin/sentieon_init.sh new file mode 100644 index 00000000..ea8f393a --- /dev/null +++ b/bin/sentieon_init.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# +# Sentieon initialization script +# This script takes as input the name of a environment +# variable holding the Sentieon license encoded as Base64 text +set -eu +LICENSE_ENCODED="${!1}" +if [ "${#LICENSE_ENCODED}" -lt "1500" ]; then # Sentieon License server + export SENTIEON_LICENSE=$(echo -e "$LICENSE_ENCODED" | base64 -d) +else # Localhost license file + export SENTIEON_LICENSE=$(mktemp) + echo -e "$LICENSE_ENCODED" | base64 -d > $SENTIEON_LICENSE +fi diff --git a/conf/genomes.config b/conf/genomes.config index df8e17de..967379b5 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -30,7 +30,7 @@ params { fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" - bwa = "" + bwa = "${params.local_genomes}/bwa/" known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" diff --git a/modules/local/sentieon/bqsr.nf b/modules/local/sentieon/bqsr.nf index f3f7c432..dbc1c68e 100644 --- a/modules/local/sentieon/bqsr.nf +++ b/modules/local/sentieon/bqsr.nf @@ -3,6 +3,8 @@ process SENTIEON_BQSR { label 'process_high' label 'sentieon' + secret 'SENTIEON_LICENSE_BASE64' + input: tuple val(meta), path(bam), path(bai) path fasta @@ -29,6 +31,11 @@ process SENTIEON_BQSR { def dbsnp = known_dbsnp ? "-k $known_dbsnp" : '' def prefix = task.ext.prefix ?: "${meta.id}" """ + if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + echo "Initializing SENTIEON_LICENSE env variable" + source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + fi + sentieon driver \\ -t ${task.cpus} \\ -r $fasta \\ @@ -51,7 +58,7 @@ process SENTIEON_BQSR { sentieon driver \\ -t ${task.cpus} \\ - $args3 + $args3 \\ --algo QualCal \\ --plot \\ --before ${prefix}_recal_data.table \\ diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf index 3bae8c78..ed029806 100644 --- a/modules/local/sentieon/bwamem.nf +++ b/modules/local/sentieon/bwamem.nf @@ -3,6 +3,8 @@ process SENTIEON_BWAMEM { label 'process_high' label 'sentieon' + secret 'SENTIEON_LICENSE_BASE64' + input: tuple val(meta), path(reads) path fasta @@ -24,6 +26,11 @@ process SENTIEON_BWAMEM { """ INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` + if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + echo "Initializing SENTIEON_LICENSE env variable" + source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + fi + sentieon bwa mem \\ -t $task.cpus \\ \$INDEX \\ diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index 3a03fd32..62114fb3 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -3,6 +3,8 @@ process SENTIEON_BWAINDEX { label 'process_high' label 'sentieon' + secret 'SENTIEON_LICENSE_BASE64' + input: path fasta @@ -19,6 +21,11 @@ process SENTIEON_BWAINDEX { """ mkdir bwa + if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + echo "Initializing SENTIEON_LICENSE env variable" + source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + fi + sentieon bwa index \\ $args \\ -p $prefix \\ diff --git a/modules/local/sentieon/datametrics.nf b/modules/local/sentieon/datametrics.nf index af227579..39dd325b 100644 --- a/modules/local/sentieon/datametrics.nf +++ b/modules/local/sentieon/datametrics.nf @@ -3,6 +3,8 @@ process SENTIEON_DATAMETRICS { label 'process_high' label 'sentieon' + secret 'SENTIEON_LICENSE_BASE64' + input: tuple val(meta), path(bam), path(bai) path fasta @@ -25,6 +27,11 @@ process SENTIEON_DATAMETRICS { def input = bam.sort().collect{"-i $it"}.join(' ') def prefix = task.ext.prefix ?: "${meta.id}" """ + if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + echo "Initializing SENTIEON_LICENSE env variable" + source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + fi + sentieon \\ driver \\ -t $task.cpus \\ diff --git a/modules/local/sentieon/dedup.nf b/modules/local/sentieon/dedup.nf index 18c31a1d..2a8a1ade 100644 --- a/modules/local/sentieon/dedup.nf +++ b/modules/local/sentieon/dedup.nf @@ -3,6 +3,8 @@ process SENTIEON_DEDUP { label 'process_high' label 'sentieon' + secret 'SENTIEON_LICENSE_BASE64' + input: tuple val(meta), path(bam), path(bai), path(score), path(score_idx) path fasta @@ -22,6 +24,11 @@ process SENTIEON_DEDUP { def input = bam.sort().collect{"-i $it"}.join(' ') def prefix = task.ext.prefix ?: "${meta.id}" """ + if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + echo "Initializing SENTIEON_LICENSE env variable" + source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + fi + sentieon \\ driver \\ -t $task.cpus \\ diff --git a/modules/local/sentieon/locuscollector.nf b/modules/local/sentieon/locuscollector.nf index c143b61a..64ce88b3 100644 --- a/modules/local/sentieon/locuscollector.nf +++ b/modules/local/sentieon/locuscollector.nf @@ -3,6 +3,8 @@ process SENTIEON_LOCUSCOLLECTOR { label 'process_high' label 'sentieon' + secret 'SENTIEON_LICENSE_BASE64' + input: tuple val(meta), path(bam), path(bai) @@ -18,6 +20,11 @@ process SENTIEON_LOCUSCOLLECTOR { def input = bam.sort().collect{"-i $it"}.join(' ') def prefix = task.ext.prefix ? "${task.ext.prefix}_score.txt.gz" : "${meta.id}_score.txt.gz" """ + if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + echo "Initializing SENTIEON_LICENSE env variable" + source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + fi + sentieon \\ driver \\ -t $task.cpus \\ From 34605312d287649e7afa3cca246a491a290371e4 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Thu, 5 May 2022 07:09:57 +0200 Subject: [PATCH 0491/1169] Update subworkflows/local/prepare_MT_alignment.nf Co-authored-by: Anders Jemt --- subworkflows/local/prepare_MT_alignment.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/prepare_MT_alignment.nf index 1e8ff923..16654ffa 100644 --- a/subworkflows/local/prepare_MT_alignment.nf +++ b/subworkflows/local/prepare_MT_alignment.nf @@ -11,7 +11,6 @@ workflow PREPARE_MT_ALIGNMENT { bam_cram // id: and file: bam index: bam.bai main: - ch_versions = Channel.empty() // Outputs bam containing only MT From 578118f9fd14ecf2f0c2d8b61671a6796e582eca Mon Sep 17 00:00:00 2001 From: Lucpen Date: Thu, 5 May 2022 07:57:38 +0200 Subject: [PATCH 0492/1169] feat changed config file to take GRCh37 too --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 16cb9739..a6b54758 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -414,7 +414,7 @@ process { process { withName: '.*PREPARE_MT_ALIGNMENT:SAMTOOLS_VIEW_MT' { - ext.args2 = 'chrM' + ext.args2 = { (params.genome == "GRCh37") ? "MT" : "chrM" } } withName: '.*PREPARE_MT_ALIGNMENT:GATK4_REVERTSAM_MT' { From a22ceab5ab76cabe25cfc45ad4db3d430291180c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 5 May 2022 14:28:17 +0200 Subject: [PATCH 0493/1169] bash conditional --- modules/local/sentieon/bqsr.nf | 4 ++-- modules/local/sentieon/bwamem.nf | 4 ++-- modules/local/sentieon/bwamemindex.nf | 4 ++-- modules/local/sentieon/datametrics.nf | 4 ++-- modules/local/sentieon/dedup.nf | 4 ++-- modules/local/sentieon/locuscollector.nf | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/local/sentieon/bqsr.nf b/modules/local/sentieon/bqsr.nf index dbc1c68e..75d7dbac 100644 --- a/modules/local/sentieon/bqsr.nf +++ b/modules/local/sentieon/bqsr.nf @@ -31,9 +31,9 @@ process SENTIEON_BQSR { def dbsnp = known_dbsnp ? "-k $known_dbsnp" : '' def prefix = task.ext.prefix ?: "${meta.id}" """ - if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" - source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + source sentieon_init.sh SENTIEON_LICENSE_BASE64 fi sentieon driver \\ diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf index ed029806..9ce6d113 100644 --- a/modules/local/sentieon/bwamem.nf +++ b/modules/local/sentieon/bwamem.nf @@ -26,9 +26,9 @@ process SENTIEON_BWAMEM { """ INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` - if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" - source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + source sentieon_init.sh SENTIEON_LICENSE_BASE64 fi sentieon bwa mem \\ diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index 62114fb3..59e71fb7 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -21,9 +21,9 @@ process SENTIEON_BWAINDEX { """ mkdir bwa - if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" - source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + source sentieon_init.sh SENTIEON_LICENSE_BASE64 fi sentieon bwa index \\ diff --git a/modules/local/sentieon/datametrics.nf b/modules/local/sentieon/datametrics.nf index 39dd325b..012054b7 100644 --- a/modules/local/sentieon/datametrics.nf +++ b/modules/local/sentieon/datametrics.nf @@ -27,9 +27,9 @@ process SENTIEON_DATAMETRICS { def input = bam.sort().collect{"-i $it"}.join(' ') def prefix = task.ext.prefix ?: "${meta.id}" """ - if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" - source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + source sentieon_init.sh SENTIEON_LICENSE_BASE64 fi sentieon \\ diff --git a/modules/local/sentieon/dedup.nf b/modules/local/sentieon/dedup.nf index 2a8a1ade..074df701 100644 --- a/modules/local/sentieon/dedup.nf +++ b/modules/local/sentieon/dedup.nf @@ -24,9 +24,9 @@ process SENTIEON_DEDUP { def input = bam.sort().collect{"-i $it"}.join(' ') def prefix = task.ext.prefix ?: "${meta.id}" """ - if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" - source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + source sentieon_init.sh SENTIEON_LICENSE_BASE64 fi sentieon \\ diff --git a/modules/local/sentieon/locuscollector.nf b/modules/local/sentieon/locuscollector.nf index 64ce88b3..c5448117 100644 --- a/modules/local/sentieon/locuscollector.nf +++ b/modules/local/sentieon/locuscollector.nf @@ -20,9 +20,9 @@ process SENTIEON_LOCUSCOLLECTOR { def input = bam.sort().collect{"-i $it"}.join(' ') def prefix = task.ext.prefix ? "${task.ext.prefix}_score.txt.gz" : "${meta.id}_score.txt.gz" """ - if [ ! -n \${SENTIEON_LICENSE_BASE64+x} ]; then + if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" - source sentieon_init.sh \${SENTIEON_LICENSE_BASE64} + source sentieon_init.sh SENTIEON_LICENSE_BASE64 fi sentieon \\ From b4dc4078c3d563ad043d78e9bc62679c37ca54d1 Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Thu, 5 May 2022 16:01:19 +0200 Subject: [PATCH 0494/1169] feat updated paths in test.config --- conf/test.config | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/conf/test.config b/conf/test.config index e4745675..a037cda4 100644 --- a/conf/test.config +++ b/conf/test.config @@ -21,19 +21,17 @@ params { // Input data // TODO nf-core: Give any required params for the test so that command line flags are not needed - //input = 'https://raw.githubusercontent.com/nf-core/raredisease/dev/assets/samplesheet.csv' input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_MT.csv' // Genome references - fasta = 'https://github.com/nf-core/test-datasets/raw/sarek/reference/chr20_hg38/Homo_sapiens_assembly38_chr20.fasta' - //fasta = 'Path_to_Homo_sapiens_assembly38_chr20_chrM.fasta' + fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' // Variant catalog file - variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/repeat_expansions.json' + variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' // Variant annotation - vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/vcfanno_grch38_small_test.tar.gz' - vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/grch38_vcfanno_config_-v0.2-_chr20.toml' + vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_grch38_small_test.tar.gz' + vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' - target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/target_chr20.bed' + target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' } From 44fa13b7fd871ce141b435ea100655a836db27d1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 5 May 2022 17:38:52 +0200 Subject: [PATCH 0495/1169] v1.2.1 --- modules.json | 11 ++-- .../nf-core/modules/cnvpytor/callcnvs/main.nf | 22 +++---- .../modules/cnvpytor/callcnvs/meta.yml | 11 ++-- .../modules/cnvpytor/histogram/main.nf | 16 ++--- .../modules/cnvpytor/histogram/meta.yml | 4 ++ .../modules/cnvpytor/importreaddepth/main.nf | 10 ++-- .../modules/cnvpytor/importreaddepth/meta.yml | 1 + .../modules/cnvpytor/partition/main.nf | 15 ++--- .../modules/cnvpytor/partition/meta.yml | 4 ++ modules/nf-core/modules/cnvpytor/view/main.nf | 58 +++++++++++++++++++ .../nf-core/modules/cnvpytor/view/meta.yml | 56 ++++++++++++++++++ 11 files changed, 170 insertions(+), 38 deletions(-) create mode 100644 modules/nf-core/modules/cnvpytor/view/main.nf create mode 100644 modules/nf-core/modules/cnvpytor/view/meta.yml diff --git a/modules.json b/modules.json index 35c978e4..7c5711c7 100644 --- a/modules.json +++ b/modules.json @@ -16,16 +16,19 @@ "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641" }, "cnvpytor/callcnvs": { - "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" + "git_sha": "26311aba2ace0eda4201651abe9276dbd8c2aef0" }, "cnvpytor/histogram": { - "git_sha": "cb54d1ebd77de5b482cae89ed9e51fa6ef97d3ee" + "git_sha": "19cfb4e95196d0e8cc14a67ecb8f1ed0b0fcc3a7" }, "cnvpytor/importreaddepth": { - "git_sha": "67c1bc9568cfc40cf7038c7be13b976fe76d76a1" + "git_sha": "19cfb4e95196d0e8cc14a67ecb8f1ed0b0fcc3a7" }, "cnvpytor/partition": { - "git_sha": "cb54d1ebd77de5b482cae89ed9e51fa6ef97d3ee" + "git_sha": "19cfb4e95196d0e8cc14a67ecb8f1ed0b0fcc3a7" + }, + "cnvpytor/view": { + "git_sha": "ea1f5daf449190dd3b8550c1307f14aa3371413d" }, "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf index 17675cde..092f6def 100644 --- a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf +++ b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf @@ -2,43 +2,43 @@ process CNVPYTOR_CALLCNVS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) + conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:1.0--py39h6a678da_2': - 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" + 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': + 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" input: tuple val(meta), path(pytor) + val bin_sizes output: - tuple val(meta), path("*.tsv"), emit: cnvs - path "versions.yml" , emit: versions + tuple val(meta), path("${pytor.baseName}.pytor") , emit: pytor + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '1000' + def bins = bin_sizes ?: '1000' def prefix = task.ext.prefix ?: "${meta.id}" """ cnvpytor \\ -root $pytor \\ - -call $args > ${prefix}.tsv + -call $bin_sizes cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) END_VERSIONS """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.tsv + touch ${pytor.baseName}.pytor cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) END_VERSIONS """ } diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/meta.yml b/modules/nf-core/modules/cnvpytor/callcnvs/meta.yml index edfc462a..6ba46b6f 100644 --- a/modules/nf-core/modules/cnvpytor/callcnvs/meta.yml +++ b/modules/nf-core/modules/cnvpytor/callcnvs/meta.yml @@ -17,8 +17,11 @@ input: e.g. [ id:'test'] - pytor: type: file - description: cnvpytor root file + description: pytor file containing partitions of read depth histograms using mean-shift method pattern: "*.{pytor}" + - bin_sizes: + type: string + description: list of binsizes separated by space e.g. "1000 10000" and "1000" output: - meta: @@ -26,10 +29,10 @@ output: description: | Groovy Map containing sample information e.g. [ id:'test' ] - - cnvs: + - pytor: type: file - description: file containing identified copy numer variations - pattern: "*.{tsv}" + description: pytor files containing cnv calls + pattern: "*.{pytor}" - versions: type: file description: File containing software versions diff --git a/modules/nf-core/modules/cnvpytor/histogram/main.nf b/modules/nf-core/modules/cnvpytor/histogram/main.nf index 9e59c6b8..fd2ebe14 100644 --- a/modules/nf-core/modules/cnvpytor/histogram/main.nf +++ b/modules/nf-core/modules/cnvpytor/histogram/main.nf @@ -2,13 +2,15 @@ process CNVPYTOR_HISTOGRAM { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) + conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:1.0--py39h6a678da_2': - 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" + 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': + 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" input: tuple val(meta), path(pytor) + val bin_sizes + output: tuple val(meta), path("${pytor.baseName}.pytor") , emit: pytor @@ -18,15 +20,15 @@ process CNVPYTOR_HISTOGRAM { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '1000' + def bins = bin_sizes ?: '1000' """ cnvpytor \\ -root $pytor \\ - -his $args + -his $bins cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) END_VERSIONS """ @@ -36,7 +38,7 @@ process CNVPYTOR_HISTOGRAM { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) END_VERSIONS """ } diff --git a/modules/nf-core/modules/cnvpytor/histogram/meta.yml b/modules/nf-core/modules/cnvpytor/histogram/meta.yml index fcad2221..ecd48b9a 100644 --- a/modules/nf-core/modules/cnvpytor/histogram/meta.yml +++ b/modules/nf-core/modules/cnvpytor/histogram/meta.yml @@ -22,6 +22,9 @@ input: type: file description: pytor file containing read depth data pattern: "*.{pytor}" + - bin_sizes: + type: string + description: list of binsizes separated by space e.g. "1000 10000" and "1000" output: - meta: @@ -40,3 +43,4 @@ output: authors: - "@sima-r" + - "@ramprasadn" diff --git a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf index 162da719..6f9abae9 100644 --- a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf +++ b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf @@ -2,10 +2,10 @@ process CNVPYTOR_IMPORTREADDEPTH { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) + conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:1.0--py39h6a678da_2': - 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" + 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': + 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" input: tuple val(meta), path(input_file), path(index) @@ -32,7 +32,7 @@ process CNVPYTOR_IMPORTREADDEPTH { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) END_VERSIONS """ @@ -43,7 +43,7 @@ process CNVPYTOR_IMPORTREADDEPTH { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) END_VERSIONS """ } diff --git a/modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml b/modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml index 1cf3c0d0..8b58887e 100644 --- a/modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml +++ b/modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml @@ -52,3 +52,4 @@ output: authors: - "@sima-r" + - "@ramprasadn" diff --git a/modules/nf-core/modules/cnvpytor/partition/main.nf b/modules/nf-core/modules/cnvpytor/partition/main.nf index 0311bdfc..6d7a9c6b 100644 --- a/modules/nf-core/modules/cnvpytor/partition/main.nf +++ b/modules/nf-core/modules/cnvpytor/partition/main.nf @@ -2,13 +2,14 @@ process CNVPYTOR_PARTITION { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::cnvpytor=1.0" : null) + conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:1.0--py39h6a678da_2': - 'quay.io/biocontainers/cnvpytor:1.0--py39h6a678da_2' }" + 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': + 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" input: tuple val(meta), path(pytor) + val bin_sizes output: tuple val(meta), path("${pytor.baseName}.pytor"), emit: pytor @@ -18,15 +19,15 @@ process CNVPYTOR_PARTITION { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def bins = bin_sizes ?: '1000' """ cnvpytor \\ -root $pytor \\ - -partition $args + -partition $bins cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) END_VERSIONS """ @@ -36,7 +37,7 @@ process CNVPYTOR_PARTITION { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/^.*pyCNVnator //; s/Using.*\$//' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) END_VERSIONS """ } diff --git a/modules/nf-core/modules/cnvpytor/partition/meta.yml b/modules/nf-core/modules/cnvpytor/partition/meta.yml index a72cea4c..17b5e199 100644 --- a/modules/nf-core/modules/cnvpytor/partition/meta.yml +++ b/modules/nf-core/modules/cnvpytor/partition/meta.yml @@ -22,6 +22,9 @@ input: type: file description: pytor file containing read depth data pattern: "*.{pytor}" + - bin_sizes: + type: string + description: list of binsizes separated by space e.g. "1000 10000" and "1000" output: - meta: @@ -40,3 +43,4 @@ output: authors: - "@sima-r" + - "@ramprasadn" diff --git a/modules/nf-core/modules/cnvpytor/view/main.nf b/modules/nf-core/modules/cnvpytor/view/main.nf new file mode 100644 index 00000000..ad2249b8 --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/view/main.nf @@ -0,0 +1,58 @@ +process CNVPYTOR_VIEW { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': + 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" + + input: + tuple val(meta), path(pytor) + val bin_sizes + val output_format + + output: + tuple val(meta), path("*.vcf"), emit: vcf , optional: true + tuple val(meta), path("*.tsv"), emit: tsv , optional: true + tuple val(meta), path("*.xls"), emit: xls , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def output_suffix = output_format ?: 'vcf' + def bins = bin_sizes ?: '1000' + """ + + python3 < versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + END_VERSIONS + """ + + stub: + def output_suffix = output_format ?: 'vcf' + """ + touch ${pytor.baseName}.${output_suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/cnvpytor/view/meta.yml b/modules/nf-core/modules/cnvpytor/view/meta.yml new file mode 100644 index 00000000..1392e90e --- /dev/null +++ b/modules/nf-core/modules/cnvpytor/view/meta.yml @@ -0,0 +1,56 @@ +name: cnvpytor_view +description: view function to generate vcfs +keywords: + - cnv calling +tools: + - cnvpytor: + description: calling CNVs using read depth + homepage: https://github.com/abyzovlab/CNVpytor + documentation: https://github.com/abyzovlab/CNVpytor + tool_dev_url: https://github.com/abyzovlab/CNVpytor + doi: "10.1101/2021.01.27.428472v1" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - pytor: + type: file + description: pytor file containing read depth data + pattern: "*.{pytor}" + - bin_sizes: + type: string + description: list of binsizes separated by space e.g. "1000 10000" and "1000" + - output_format: + type: string + description: output format of the cnv calls. Valid entries are "tsv", "vcf", and "xls" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - tsv: + type: file + description: tsv file containing cnv calls + pattern: "*.{tsv}" + - vcf: + type: file + description: vcf file containing cnv calls + pattern: "*.{vcf}" + - xls: + type: file + description: xls file containing cnv calls + pattern: "*.{xls}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@sima-r" + - "@ramprasadn" From f92a9339b0f3ebe4521f99dd3d6e0c7d4dd87963 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 5 May 2022 18:22:00 +0200 Subject: [PATCH 0496/1169] update subworkflow --- nextflow.config | 1 + nextflow_schema.json | 6 ++++++ subworkflows/nf-core/call_cnv_cnvpytor.nf | 16 ++++++++++------ subworkflows/nf-core/call_structural_variants.nf | 15 ++++++++------- workflows/raredisease.nf | 3 ++- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/nextflow.config b/nextflow.config index 44ce8b41..8331319d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -33,6 +33,7 @@ params { // CNVpytor cnvpytor_chr = null + cnvpytor_binsizes = 10000 // Annotation vep_cache_version = '105' diff --git a/nextflow_schema.json b/nextflow_schema.json index 839c6096..3e229ac0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -265,6 +265,12 @@ "default": null, "description": "Chromosome names must be specified the same way as they are described in the sam/bam/cram header, e.g., chrX or X. One can specify multiple chromosomes separated by space.", "fa_icon": "fas fa-map-signs" + }, + "cnvpytor_binsizes": { + "type": "string", + "default": "10000", + "description": "List of binsizes separated by space e.g. '1000 10000' and '1000'", + "fa_icon": "fas fa-map-signs" } } }, diff --git a/subworkflows/nf-core/call_cnv_cnvpytor.nf b/subworkflows/nf-core/call_cnv_cnvpytor.nf index 2ae9e69a..58eeb2a9 100644 --- a/subworkflows/nf-core/call_cnv_cnvpytor.nf +++ b/subworkflows/nf-core/call_cnv_cnvpytor.nf @@ -6,26 +6,30 @@ include { CNVPYTOR_IMPORTREADDEPTH as GENERATE_PYTOR } from '../../modules/nf-co include { CNVPYTOR_HISTOGRAM as HISTOGRAMS } from '../../modules/nf-core/modules/cnvpytor/histogram/main' include { CNVPYTOR_PARTITION as PARTITIONS } from '../../modules/nf-core/modules/cnvpytor/partition/main' include { CNVPYTOR_CALLCNVS as CALL_CNVS } from '../../modules/nf-core/modules/cnvpytor/callcnvs/main' +include { CNVPYTOR_VIEW as VIEW } from '../../modules/nf-core/modules/cnvpytor/view/main' workflow CALL_CNV_CNVPYTOR { take: bam // channel: [ val(meta), path(bam)] bai // channel: [ val(meta), path(bai) ] case_info // channel: [ case_id ] + binsizes // channel: [ val(binsize) ] + fasta // channel: [ path(fasta) ] + fai // channel: [ path(fai) ] main: ch_versions = Channel.empty() - GENERATE_PYTOR(bam.join(bai, by: [0]),[],[]) - HISTOGRAMS(GENERATE_PYTOR.out.pytor) - PARTITIONS(HISTOGRAMS.out.pytor) - CALL_CNVS(PARTITIONS.out.pytor) + GENERATE_PYTOR(bam.join(bai, by: [0]), fasta, fai) + HISTOGRAMS(GENERATE_PYTOR.out.pytor, binsizes) + PARTITIONS(HISTOGRAMS.out.pytor, binsizes) + CALL_CNVS(PARTITIONS.out.pytor, binsizes) + VIEW(CALL_CNVS.out.pytor, binsizes, "vcf") ch_versions = ch_versions.mix(CALL_CNVS.out.versions) - //TO DO : tsv2vcf emit: - candidate_cnvs_tsv = CALL_CNVS.out.cnvs // channel: [ val(meta), path(*.tsv) ] + candidate_cnvs_tsv = VIEW.out.vcf // channel: [ val(meta), path(*.tsv) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index 8d30d96f..da072a86 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -10,12 +10,13 @@ include { CALL_CNV_CNVPYTOR } from './call_cnv_cnvpytor' workflow CALL_STRUCTURAL_VARIANTS { take: - bam // channel: [ val(meta), path(bam) ] - bai // channel: [ val(meta), path(bai) ] - fasta // channel: [ path(genome.fasta) ] - fai // channel: [ path(genome.fai) ] - case_info // channel: [ val(case_info) ] - target_bed // channel: [ path(target.bed) ] + bam // channel: [ val(meta), path(bam) ] + bai // channel: [ val(meta), path(bai) ] + fasta // channel: [ path(genome.fasta) ] + fai // channel: [ path(genome.fai) ] + case_info // channel: [ val(case_info) ] + target_bed // channel: [ path(target.bed) ] + cnvpytor_bins // channel: [ val("binsizes") ] main: ch_versions = Channel.empty() @@ -35,7 +36,7 @@ workflow CALL_STRUCTURAL_VARIANTS { ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) //cnvpytor - CALL_CNV_CNVPYTOR ( bam, bai, case_info ) + CALL_CNV_CNVPYTOR ( bam, bai, case_info, cnvpytor_bins, fasta, fai) .candidate_cnvs_tsv .collect{it[1]} .set {cnvpytor_tsv } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6014b968..8adc3239 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -172,7 +172,8 @@ workflow RAREDISEASE { ch_references.genome_fasta, ch_references.genome_fai, CHECK_INPUT.out.case_info, - ch_references.target_bed + ch_references.target_bed, + params.cnvpytor_binsizes ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) From e64b5fddbb22bb8247ba546015aae9d96f1c919a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 5 May 2022 20:06:01 +0200 Subject: [PATCH 0497/1169] update channel names from tsv to vcf --- nextflow.config | 2 +- subworkflows/nf-core/call_cnv_cnvpytor.nf | 2 +- subworkflows/nf-core/call_structural_variants.nf | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/nextflow.config b/nextflow.config index 8331319d..21e86445 100644 --- a/nextflow.config +++ b/nextflow.config @@ -33,7 +33,7 @@ params { // CNVpytor cnvpytor_chr = null - cnvpytor_binsizes = 10000 + cnvpytor_binsizes = '10000' // Annotation vep_cache_version = '105' diff --git a/subworkflows/nf-core/call_cnv_cnvpytor.nf b/subworkflows/nf-core/call_cnv_cnvpytor.nf index 58eeb2a9..21fb4dff 100644 --- a/subworkflows/nf-core/call_cnv_cnvpytor.nf +++ b/subworkflows/nf-core/call_cnv_cnvpytor.nf @@ -29,7 +29,7 @@ workflow CALL_CNV_CNVPYTOR { ch_versions = ch_versions.mix(CALL_CNVS.out.versions) emit: - candidate_cnvs_tsv = VIEW.out.vcf // channel: [ val(meta), path(*.tsv) ] + candidate_cnvs_vcf = VIEW.out.vcf // channel: [ val(meta), path(*.tsv) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index da072a86..4e85163d 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -37,22 +37,22 @@ workflow CALL_STRUCTURAL_VARIANTS { //cnvpytor CALL_CNV_CNVPYTOR ( bam, bai, case_info, cnvpytor_bins, fasta, fai) - .candidate_cnvs_tsv + .candidate_cnvs_vcf .collect{it[1]} - .set {cnvpytor_tsv } + .set {cnvpytor_vcf } ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) //merge tiddit_vcf .combine(manta_vcf) - .combine(manta_vcf) + .combine(cnvpytor_vcf) .toList() .set { vcf_list } case_info.combine(vcf_list) .set { merge_input_vcfs } - SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta"] ) + SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta","cnvpytor"] ) emit: From 4d326c9b8c60b194143d67bab8acacca5a14d989 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 5 May 2022 20:34:43 +0200 Subject: [PATCH 0498/1169] update prefix --- conf/modules.config | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index a0017cc8..027b80c2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -388,6 +388,7 @@ process { process { withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA' { + ext.prefix = { "${meta.id}_manta" } publishDir = [ path: { "${params.outdir}/sv_caller" }, mode: params.publish_dir_mode, @@ -396,43 +397,52 @@ process { } withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:TIDDIT_SV' { - ext.args = '-p 6' + ext.args = '-p 6' publishDir = [ path: { "${params.outdir}/sv_caller" }, mode: params.publish_dir_mode, ] } + withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:SVDB_MERGE_TIDDIT' { + ext.args = '--notag --pass_only' + ext.prefix = { "${meta.id}_tiddit" } + publishDir = [ + path: { "${params.outdir}/sv_caller" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:GENERATE_PYTOR" { - ext.args = {params.cnvpytor_chr ? "-chrom ${params.cnvpytor_chr}" : '' } + ext.args = { params.cnvpytor_chr ? "-chrom ${params.cnvpytor_chr}" : '' } + ext.prefix = { "${meta.id}_cnvpytor" } } withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:HISTOGRAMS" { - ext.args = '10000 100000' + publishDir = [ + enabled: false + ] } withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:PARTITIONS" { - ext.args = '10000 100000' + publishDir = [ + enabled: false + ] } withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:CALL_CNVS" { - ext.args = '10000' publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, + enabled: false ] } - withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:SVDB_MERGE_TIDDIT' { - ext.args = '--notag --pass_only' - ext.prefix = 'tiddit' + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:VIEW" { publishDir = [ path: { "${params.outdir}/sv_caller" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } - withName: '.*CALL_STRUCTURAL_VARIANTS:SVDB_MERGE' { ext.args = '--pass_only' publishDir = [ From d97eaee36814936f3d21d8dfe4e9aa68e155714e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 6 May 2022 13:02:45 +0200 Subject: [PATCH 0499/1169] update svdb --- modules.json | 4 ++-- modules/nf-core/modules/svdb/merge/main.nf | 6 +++--- modules/nf-core/modules/svdb/query/main.nf | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules.json b/modules.json index b8363713..1a88854d 100644 --- a/modules.json +++ b/modules.json @@ -91,10 +91,10 @@ "git_sha": "c7329a3a5730872dea512921217993cfa7acd959" }, "svdb/merge": { - "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" + "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" }, "svdb/query": { - "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" + "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" }, "tabix/bgziptabix": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 4a39940c..0d56fea2 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -2,10 +2,10 @@ process SVDB_MERGE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.6.0" : null) + conda (params.enable_conda ? "bioconda::svdb=2.6.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.6.0--py39h5371cbf_0': - 'quay.io/biocontainers/svdb:2.6.0--py39h5371cbf_0' }" + 'https://depot.galaxyproject.org/singularity/svdb:2.6.1--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.6.1--py39h5371cbf_0' }" input: tuple val(meta), path(vcfs) diff --git a/modules/nf-core/modules/svdb/query/main.nf b/modules/nf-core/modules/svdb/query/main.nf index c669b5a5..dbab5259 100644 --- a/modules/nf-core/modules/svdb/query/main.nf +++ b/modules/nf-core/modules/svdb/query/main.nf @@ -2,10 +2,10 @@ process SVDB_QUERY { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.6.0" : null) + conda (params.enable_conda ? "bioconda::svdb=2.6.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.6.0--py39h5371cbf_0': - 'quay.io/biocontainers/svdb:2.6.0--py39h5371cbf_0' }" + 'https://depot.galaxyproject.org/singularity/svdb:2.6.1--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.6.1--py39h5371cbf_0' }" input: tuple val(meta), path(vcf) From 7cc756d9738dbe3578539e0bb0209cf77b27ca16 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 6 May 2022 13:08:42 +0200 Subject: [PATCH 0500/1169] update cnvpytor --- modules.json | 8 ++++---- .../nf-core/modules/cnvpytor/callcnvs/main.nf | 1 - modules/nf-core/modules/cnvpytor/view/main.nf | 16 +++++++++------- modules/nf-core/modules/cnvpytor/view/meta.yml | 4 ++-- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/modules.json b/modules.json index 7c5711c7..4a914080 100644 --- a/modules.json +++ b/modules.json @@ -16,7 +16,7 @@ "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641" }, "cnvpytor/callcnvs": { - "git_sha": "26311aba2ace0eda4201651abe9276dbd8c2aef0" + "git_sha": "1ccea5ff4d3dffbf9a8e53032481cc9246d4e23d" }, "cnvpytor/histogram": { "git_sha": "19cfb4e95196d0e8cc14a67ecb8f1ed0b0fcc3a7" @@ -28,7 +28,7 @@ "git_sha": "19cfb4e95196d0e8cc14a67ecb8f1ed0b0fcc3a7" }, "cnvpytor/view": { - "git_sha": "ea1f5daf449190dd3b8550c1307f14aa3371413d" + "git_sha": "af73544010cc9563ec7d7160aeb825ae28ec217f" }, "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -97,10 +97,10 @@ "git_sha": "c7329a3a5730872dea512921217993cfa7acd959" }, "svdb/merge": { - "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" + "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" }, "svdb/query": { - "git_sha": "a973b68200da801be1c2e27b8fd72d7256f5db6b" + "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" }, "tabix/bgziptabix": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf index 092f6def..69c9d40e 100644 --- a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf +++ b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf @@ -20,7 +20,6 @@ process CNVPYTOR_CALLCNVS { script: def bins = bin_sizes ?: '1000' - def prefix = task.ext.prefix ?: "${meta.id}" """ cnvpytor \\ -root $pytor \\ diff --git a/modules/nf-core/modules/cnvpytor/view/main.nf b/modules/nf-core/modules/cnvpytor/view/main.nf index ad2249b8..1bb61a38 100644 --- a/modules/nf-core/modules/cnvpytor/view/main.nf +++ b/modules/nf-core/modules/cnvpytor/view/main.nf @@ -8,7 +8,7 @@ process CNVPYTOR_VIEW { 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" input: - tuple val(meta), path(pytor) + tuple val(meta), path(pytor_files) val bin_sizes val output_format @@ -23,17 +23,18 @@ process CNVPYTOR_VIEW { script: def output_suffix = output_format ?: 'vcf' - def bins = bin_sizes ?: '1000' + def bins = bin_sizes ?: '1000' + def input = pytor_files.join(" ") + def prefix = task.ext.prefix ?: "${meta.id}" """ python3 < versions.yml "${task.process}": diff --git a/modules/nf-core/modules/cnvpytor/view/meta.yml b/modules/nf-core/modules/cnvpytor/view/meta.yml index 1392e90e..e4e68fad 100644 --- a/modules/nf-core/modules/cnvpytor/view/meta.yml +++ b/modules/nf-core/modules/cnvpytor/view/meta.yml @@ -17,9 +17,9 @@ input: description: | Groovy Map containing sample information e.g. [ id:'test' ] - - pytor: + - pytor_files: type: file - description: pytor file containing read depth data + description: pytor file containing cnv calls. To merge calls from multiple samples use a list of files. pattern: "*.{pytor}" - bin_sizes: type: string From 2e0b6f4f233fdd238b51b8a271341314b6c5d4e8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 6 May 2022 13:10:39 +0200 Subject: [PATCH 0501/1169] update subworkflow --- conf/modules.config | 2 +- subworkflows/nf-core/call_cnv_cnvpytor.nf | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 027b80c2..aeaf1217 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -416,7 +416,6 @@ process { withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:GENERATE_PYTOR" { ext.args = { params.cnvpytor_chr ? "-chrom ${params.cnvpytor_chr}" : '' } - ext.prefix = { "${meta.id}_cnvpytor" } } withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:HISTOGRAMS" { @@ -438,6 +437,7 @@ process { } withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:VIEW" { + ext.prefix = { "${meta.id}_cnvpytor" } publishDir = [ path: { "${params.outdir}/sv_caller" }, mode: params.publish_dir_mode, diff --git a/subworkflows/nf-core/call_cnv_cnvpytor.nf b/subworkflows/nf-core/call_cnv_cnvpytor.nf index 21fb4dff..6c1705c2 100644 --- a/subworkflows/nf-core/call_cnv_cnvpytor.nf +++ b/subworkflows/nf-core/call_cnv_cnvpytor.nf @@ -22,11 +22,29 @@ workflow CALL_CNV_CNVPYTOR { ch_versions = Channel.empty() GENERATE_PYTOR(bam.join(bai, by: [0]), fasta, fai) + ch_versions = ch_versions.mix(GENERATE_PYTOR.out.versions.first()) + HISTOGRAMS(GENERATE_PYTOR.out.pytor, binsizes) + ch_versions = ch_versions.mix(HISTOGRAMS.out.versions.first()) + PARTITIONS(HISTOGRAMS.out.pytor, binsizes) + ch_versions = ch_versions.mix(PARTITIONS.out.versions.first()) + CALL_CNVS(PARTITIONS.out.pytor, binsizes) - VIEW(CALL_CNVS.out.pytor, binsizes, "vcf") - ch_versions = ch_versions.mix(CALL_CNVS.out.versions) + ch_versions = ch_versions.mix(CALL_CNVS.out.versions.first()) + + CALL_CNVS.out + .pytor + .collect{it[1]} + .toList() + .set { file_list } + + case_info + .combine(file_list) + .set { ch_pytor } + + VIEW(ch_pytor, binsizes, "vcf") + ch_versions = ch_versions.mix(VIEW.out.versions.first()) emit: candidate_cnvs_vcf = VIEW.out.vcf // channel: [ val(meta), path(*.tsv) ] From 7dddd1b40d90a4a7ecb56aa678638fb7de0b70e7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 6 May 2022 13:28:30 +0200 Subject: [PATCH 0502/1169] fix lint error --- modules/nf-core/modules/svdb/merge/main.nf | 6 +++--- modules/nf-core/modules/svdb/query/main.nf | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 4a39940c..0d56fea2 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -2,10 +2,10 @@ process SVDB_MERGE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.6.0" : null) + conda (params.enable_conda ? "bioconda::svdb=2.6.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.6.0--py39h5371cbf_0': - 'quay.io/biocontainers/svdb:2.6.0--py39h5371cbf_0' }" + 'https://depot.galaxyproject.org/singularity/svdb:2.6.1--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.6.1--py39h5371cbf_0' }" input: tuple val(meta), path(vcfs) diff --git a/modules/nf-core/modules/svdb/query/main.nf b/modules/nf-core/modules/svdb/query/main.nf index c669b5a5..dbab5259 100644 --- a/modules/nf-core/modules/svdb/query/main.nf +++ b/modules/nf-core/modules/svdb/query/main.nf @@ -2,10 +2,10 @@ process SVDB_QUERY { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.6.0" : null) + conda (params.enable_conda ? "bioconda::svdb=2.6.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.6.0--py39h5371cbf_0': - 'quay.io/biocontainers/svdb:2.6.0--py39h5371cbf_0' }" + 'https://depot.galaxyproject.org/singularity/svdb:2.6.1--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.6.1--py39h5371cbf_0' }" input: tuple val(meta), path(vcf) From a792aad248d689930c56fcac87e7f5477dd5ceef Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 6 May 2022 13:38:26 +0200 Subject: [PATCH 0503/1169] change default bin size --- nextflow.config | 2 +- nextflow_schema.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 21e86445..2e2194f7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -33,7 +33,7 @@ params { // CNVpytor cnvpytor_chr = null - cnvpytor_binsizes = '10000' + cnvpytor_binsizes = '1000' // Annotation vep_cache_version = '105' diff --git a/nextflow_schema.json b/nextflow_schema.json index 3e229ac0..186aa161 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -268,7 +268,7 @@ }, "cnvpytor_binsizes": { "type": "string", - "default": "10000", + "default": "1000", "description": "List of binsizes separated by space e.g. '1000 10000' and '1000'", "fa_icon": "fas fa-map-signs" } From 45af2da0a65eb3234e775c9e6963dc7a70a74e67 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Mon, 9 May 2022 09:34:25 +0200 Subject: [PATCH 0504/1169] Adds switch for gens --- nextflow.config | 1 + workflows/raredisease.nf | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/nextflow.config b/nextflow.config index b51aa773..a32aed61 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,6 +23,7 @@ params { // Main options analysis_type = 'wgs' annotate_sv_switch = false + gens_switch = false // Alignment aligner = 'bwamem2' diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f9ee2912..0369cfc7 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -165,18 +165,20 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) // STEP 2.1: GENS - GENS ( - ch_marked_bam.join(ch_marked_bai, by: [0]), - CALL_SNV_DEEPVARIANT.out.vcf, - ch_references.genome_fasta, - ch_references.genome_fai, - file(params.gens_interval_list), - file(params.gens_pon), - file(params.gens_gnomad_pos), - CHECK_INPUT.out.case_info, - ch_references.sequence_dict - ) - ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) + if (params.gens_switch) { + GENS ( + ch_marked_bam.join(ch_marked_bai, by: [0]), + CALL_SNV_DEEPVARIANT.out.vcf, + ch_references.genome_fasta, + ch_references.genome_fai, + file(params.gens_interval_list), + file(params.gens_pon), + file(params.gens_gnomad_pos), + CHECK_INPUT.out.case_info, + ch_references.sequence_dict + ) + ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) + } ch_sv_annotate = Channel.empty() if (params.annotate_sv_switch) { From f6e306f45fe232ef04fd5f640630ef1da53afefc Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Mon, 9 May 2022 09:53:19 +0200 Subject: [PATCH 0505/1169] Removes collectreadcounts warning if disabled --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index cfcc6d9d..b5568e7e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -303,7 +303,7 @@ process { ] } - withName: ".*GENS:COLLECTREADCOUNTS" { + withName: GATK4_COLLECTREADCOUNTS { ext.args = '--interval-merging-rule OVERLAPPING_ONLY' } From 9fcfc6c9c1ac0452e16e4a1a0483efc29f1547f2 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Mon, 9 May 2022 09:54:59 +0200 Subject: [PATCH 0506/1169] Tests using actual id for collectreadcounts --- modules/local/gatk4/collectreadcounts/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index cca747fc..598a8676 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -1,5 +1,5 @@ process GATK4_COLLECTREADCOUNTS { - tag "wutface" + tag "$meta.id" label 'process_medium' conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) From 82ce56de86694bf28ec481f51ce1555e7325788c Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Mon, 9 May 2022 09:57:45 +0200 Subject: [PATCH 0507/1169] Updates gens to use ch_mapped --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 0369cfc7..ddfd81a4 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -167,7 +167,7 @@ workflow RAREDISEASE { // STEP 2.1: GENS if (params.gens_switch) { GENS ( - ch_marked_bam.join(ch_marked_bai, by: [0]), + ch_mapped.bam_bai, CALL_SNV_DEEPVARIANT.out.vcf, ch_references.genome_fasta, ch_references.genome_fai, From 4ec7e49d2ce4535f0ea305e52df5bdf3dc328a48 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 10 May 2022 11:32:18 +0200 Subject: [PATCH 0508/1169] Removes vestigial FastQC options --- conf/modules.config | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5a034f98..9c51dd6f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -450,7 +450,7 @@ process { mode: params.publish_dir_mode, ] } - + withName: GATK4_COLLECTREADCOUNTS { ext.args = '--interval-merging-rule OVERLAPPING_ONLY' } @@ -461,10 +461,6 @@ process { mode: 'copy' ] } - - // nf-core modules - withName: FASTQC { - ext.args = '--quiet' } // From 1520727e4f83c9e8cb1b153d5b84adab80636ec1 Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 11 May 2022 11:18:43 +0200 Subject: [PATCH 0509/1169] removed the pcrfree variable from input section --- modules/local/sentieon/dnascope.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sentieon/dnascope.nf b/modules/local/sentieon/dnascope.nf index 9343ed84..27d5b905 100644 --- a/modules/local/sentieon/dnascope.nf +++ b/modules/local/sentieon/dnascope.nf @@ -10,7 +10,7 @@ process SENTIEON_DNASCOPE { path known_dbsnp path known_dbsnp_tbi path ml_model - val pcrfree + output: tuple val(meta), path("*_dnascope.vcf"), path("*_dnascope.vcf.idx") , emit: vcf From 4a59fb27a4c12aec7e3f61ce4ef06bfdae0279cd Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Thu, 12 May 2022 12:13:17 +0200 Subject: [PATCH 0510/1169] Applied prettier --- modules/local/gatk4/collectreadcounts/meta.yml | 4 ++-- modules/local/gatk4/denoisereadcounts/meta.yml | 4 ++-- modules/local/gens/meta.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/local/gatk4/collectreadcounts/meta.yml b/modules/local/gatk4/collectreadcounts/meta.yml index 6aa4a3dd..6da91b16 100644 --- a/modules/local/gatk4/collectreadcounts/meta.yml +++ b/modules/local/gatk4/collectreadcounts/meta.yml @@ -1,5 +1,5 @@ name: gatk4_collectreadcounts -description: +description: keywords: - bam - interval list @@ -13,7 +13,7 @@ tools: homepage: https://gatk.broadinstitute.org/hc/en-us documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s doi: 10.1158/1538-7445.AM2017-3590 - licence: ['Apache-2.0'] + licence: ["Apache-2.0"] input: - meta: type: map diff --git a/modules/local/gatk4/denoisereadcounts/meta.yml b/modules/local/gatk4/denoisereadcounts/meta.yml index 5edf4cde..6e343e8e 100644 --- a/modules/local/gatk4/denoisereadcounts/meta.yml +++ b/modules/local/gatk4/denoisereadcounts/meta.yml @@ -1,5 +1,5 @@ name: gatk4_denoisereadcounts -description: +description: keywords: - hdf5 - interval list @@ -12,7 +12,7 @@ tools: homepage: https://gatk.broadinstitute.org/hc/en-us documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s doi: 10.1158/1538-7445.AM2017-3590 - licence: ['Apache-2.0'] + licence: ["Apache-2.0"] input: - meta: type: map diff --git a/modules/local/gens/meta.yml b/modules/local/gens/meta.yml index 9907d667..44d0e7b7 100644 --- a/modules/local/gens/meta.yml +++ b/modules/local/gens/meta.yml @@ -1,5 +1,5 @@ name: gens -description: +description: keywords: - bed - vcf From ee7f5440cba9a4f8dda0979bcf60d6f4d965bd23 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Thu, 12 May 2022 12:37:39 +0200 Subject: [PATCH 0511/1169] Removes memory fix in local copy of markduplicates --- modules/nf-core/modules/picard/markduplicates/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index 9125bbf9..5a30974a 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -26,7 +26,7 @@ process PICARD_MARKDUPLICATES { if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga * 14 / 15 as long + avail_mem = task.memory.giga } """ mkdir tmp From 2c2d3ce844d10ee885317c574ce44c34f5ba6745 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 May 2022 11:31:17 +0200 Subject: [PATCH 0512/1169] added sentieon snv calling subworkflow --- subworkflows/local/call_snv_sentieon.nf | 37 +++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 subworkflows/local/call_snv_sentieon.nf diff --git a/subworkflows/local/call_snv_sentieon.nf b/subworkflows/local/call_snv_sentieon.nf new file mode 100644 index 00000000..41931484 --- /dev/null +++ b/subworkflows/local/call_snv_sentieon.nf @@ -0,0 +1,37 @@ +// +// A subworkflow to call SNVs by sentieon dnascope with a machine learning model. +// + +include { SENTIEON_DNASCOPE } from '../../modules/local/sentieon/dnascope' +include { SENTIEON_DNAMODELAPPLY } from '../../modules/local/sentieon/dnamodelapply' + +workflow calling_sentieon { + take: + input // channel: [ val(meta), bam, bai ] + fasta // path: genome.fasta + fai // path: genome.fai + known_dbsnp // path: params.known_dbsnp + known_dbsnp_tbi // path: params.known_dbsnp + ml_model // path: params.ml_model + + main: + ch_versions = Channel.empty() + ch_dnascope_vcf = Channel.empty() + ch_dnamodelapply_vcf = Channel.empty() + + SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, ml_model ) + ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions) + + SENTIEON_DNASCOPE.out + .vcf + .set { ch_dnascope_vcf } + + SENTIEON_DNAMODELAPPLY ( ch_dnascope_vcf, fasta, fai, ml_model ) + ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions) + ch_dnamodelapply_vcf = SENTIEON_DNAMODELAPPLY.out.vcf + + emit: + dnascope_vcf = ch_dnascope_vcf.ifEmpty(null) + dnamodelapply_vcf = ch_dnamodelapply_vcf.ifEmpty(null) + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} From f3cb081f08403d3385dfc5dcc8a634c50bca7801 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 May 2022 12:47:00 +0200 Subject: [PATCH 0513/1169] changed the workflow name --- subworkflows/local/call_snv_sentieon.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/call_snv_sentieon.nf b/subworkflows/local/call_snv_sentieon.nf index 41931484..3e5d3640 100644 --- a/subworkflows/local/call_snv_sentieon.nf +++ b/subworkflows/local/call_snv_sentieon.nf @@ -5,7 +5,7 @@ include { SENTIEON_DNASCOPE } from '../../modules/local/sentieon/dnascope' include { SENTIEON_DNAMODELAPPLY } from '../../modules/local/sentieon/dnamodelapply' -workflow calling_sentieon { +workflow CALL_SNV_SENTIEON { take: input // channel: [ val(meta), bam, bai ] fasta // path: genome.fasta From 00768efe244511730ca8fdb7ebdf2e3d5386a94c Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 May 2022 12:47:52 +0200 Subject: [PATCH 0514/1169] added a workflow includig sentieon and deepvariant --- subworkflows/local/call_SNV.nf | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 subworkflows/local/call_SNV.nf diff --git a/subworkflows/local/call_SNV.nf b/subworkflows/local/call_SNV.nf new file mode 100644 index 00000000..7f8906e0 --- /dev/null +++ b/subworkflows/local/call_SNV.nf @@ -0,0 +1,45 @@ +// +// call Single-nucleotide Varinats +// + +include { CALL_SNV_DEEPVARIANT } from '../nf-core/call_snv_deepvariant' +include { CALL_SNV_SENTIEON } from './calling_sentieon' + +ml_model = file("https://s3.amazonaws.com/sentieon-release/other/SentieonDNAscopeModel1.0.model") + +workflow CALL_SNV { + take: + variant_caller // string: params.variant_caller + input // channel: [ val(meta), path(bam), path(bai) ] + fasta // channel: [genome.fasta] + fai // channel: [genome.fai] + known_dbsnp // channel: [ /path/to/known_dbsnp ] + known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] + ml_model // channel: [ /path/to/ml_model ] + case_info // channel: [ case_id ] + + main: + ch_versions = Channel.empty() + + if (variant_caller == "deepvariat") { + CALL_SNV_DEEPVARIANT ( input, fasta, fai, case_info ) + ch_vcf = CALL_SNV_DEEPVARIANT.out.vcf + ch_tabix = CALL_SNV_DEEPVARIANT.out.tabix + ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) + + } else if ( variant_caller == "sentieon" ) { + CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, ml_model ) + ch_vcf_dnascope = CALL_SNV_SENTIEON.out.dnascope_vcf + ch_vcf = CALL_SNV_SENTIEON.out.dnamodelapply_vcf + ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) + } else { + exit 1, 'Please provide a valid variant caller!' + } + + + emit: + vcf = ch_vcf + vcf_dnascope = ch_vcf_dnascope.ifEmpty(null) + tabix = ch_tabix.ifEmpty(null) + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} \ No newline at end of file From 1fc8a41e06ae6ce7c969fdcb35a7fe053cdbdbe2 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 May 2022 12:54:30 +0200 Subject: [PATCH 0515/1169] corrections --- conf/modules.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 00ae964f..11c8c778 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -269,11 +269,11 @@ process{ // process { - withName: '.*CALL_SENTIEON:.*' { + withName: '.*CALL_SNV_SENTIEON:.*' { ext.when = params.variant_caller.equals("sentieon") } - withName: '.*CALL_SNV:CALL_SENTIEON:SENTIEON_DNASCOPE' { + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { ext.args = { params.call_interval ? "--interval ${params.call_interval}" : '' } ext.args2 = { params.variant_types ? "--var_type ${params.variant_types}" : '' } ext.args3 = { params.pcrfree ? "--pcr_indel_model NONE" : '' } @@ -284,7 +284,7 @@ process { ] } - withName: '.*CALL_SNV:CALL_SENTIEON:SENTIEON_DNAMODELAPPLY' { + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNAMODELAPPLY' { publishDir = [ path: { "${params.outdir}/sentieon_dnamodelapply" }, mode: params.publish_dir_mode, From a13cc3e87b495a3f62526b12d92511752d000888 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 May 2022 16:17:42 +0200 Subject: [PATCH 0516/1169] added vcf index --- modules/local/sentieon/dnamodelapply.nf | 6 ++++-- modules/local/sentieon/dnascope.nf | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/local/sentieon/dnamodelapply.nf b/modules/local/sentieon/dnamodelapply.nf index adaef748..dcb3b27d 100644 --- a/modules/local/sentieon/dnamodelapply.nf +++ b/modules/local/sentieon/dnamodelapply.nf @@ -10,8 +10,9 @@ process SENTIEON_DNAMODELAPPLY { path ml_model output: - tuple val(meta), path("*_dnascope_ml.vcf") , emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*_dnascope_ml.vcf") , emit: vcf + tuple val(meta), path("*_dnascope_ml.vcf.idx") , emit: vcf_index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -38,6 +39,7 @@ process SENTIEON_DNAMODELAPPLY { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_dnascope_ml.vcf + touch ${prefix}_dnascope_ml.vcf.idx cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/dnascope.nf b/modules/local/sentieon/dnascope.nf index 27d5b905..b9c9f109 100644 --- a/modules/local/sentieon/dnascope.nf +++ b/modules/local/sentieon/dnascope.nf @@ -11,10 +11,10 @@ process SENTIEON_DNASCOPE { path known_dbsnp_tbi path ml_model - output: - tuple val(meta), path("*_dnascope.vcf"), path("*_dnascope.vcf.idx") , emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*_dnascope.vcf") , emit: vcf + tuple val(meta), path("*_dnascope.vcf.idx") , emit: vcf_index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when From 277d0d24ad69d01ba0369b3575cb8f94e1cf28aa Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 May 2022 16:18:42 +0200 Subject: [PATCH 0517/1169] fixed spaces --- subworkflows/local/call_SNV.nf | 44 ++++++++++++++++------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/subworkflows/local/call_SNV.nf b/subworkflows/local/call_SNV.nf index 7f8906e0..b4d5d095 100644 --- a/subworkflows/local/call_SNV.nf +++ b/subworkflows/local/call_SNV.nf @@ -4,42 +4,38 @@ include { CALL_SNV_DEEPVARIANT } from '../nf-core/call_snv_deepvariant' include { CALL_SNV_SENTIEON } from './calling_sentieon' - -ml_model = file("https://s3.amazonaws.com/sentieon-release/other/SentieonDNAscopeModel1.0.model") workflow CALL_SNV { take: - variant_caller // string: params.variant_caller - input // channel: [ val(meta), path(bam), path(bai) ] - fasta // channel: [genome.fasta] - fai // channel: [genome.fai] - known_dbsnp // channel: [ /path/to/known_dbsnp ] - known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] - ml_model // channel: [ /path/to/ml_model ] - case_info // channel: [ case_id ] + variant_caller // string: params.variant_caller + input // channel: [ val(meta), path(bam), path(bai) ] + fasta // channel: [genome.fasta] + fai // channel: [genome.fai] + known_dbsnp // channel: [ /path/to/known_dbsnp ] + known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] + ml_model // channel: [ /path/to/ml_model ] + case_info // channel: [ case_id ] main: ch_versions = Channel.empty() if (variant_caller == "deepvariat") { - CALL_SNV_DEEPVARIANT ( input, fasta, fai, case_info ) - ch_vcf = CALL_SNV_DEEPVARIANT.out.vcf - ch_tabix = CALL_SNV_DEEPVARIANT.out.tabix - ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) + CALL_SNV_DEEPVARIANT ( input, fasta, fai, case_info ) + ch_vcf = CALL_SNV_DEEPVARIANT.out.vcf + ch_vcf_index = CALL_SNV_DEEPVARIANT.out.tabix + ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) } else if ( variant_caller == "sentieon" ) { CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, ml_model ) - ch_vcf_dnascope = CALL_SNV_SENTIEON.out.dnascope_vcf - ch_vcf = CALL_SNV_SENTIEON.out.dnamodelapply_vcf - ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) + ch_vcf = CALL_SNV_SENTIEON.out.vcf + ch_vcf_index = CALL_SNV_SENTIEON.out.vcf_index + ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) } else { exit 1, 'Please provide a valid variant caller!' } - - + emit: - vcf = ch_vcf - vcf_dnascope = ch_vcf_dnascope.ifEmpty(null) - tabix = ch_tabix.ifEmpty(null) - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] -} \ No newline at end of file + vcf = ch_vcf + vcf_index = ch_vcf_index + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} From d126c60c961d5121b81f9b944d688b93370f25c9 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 May 2022 16:19:46 +0200 Subject: [PATCH 0518/1169] added a condition to run dnamodelapply --- subworkflows/local/call_snv_sentieon.nf | 32 ++++++++++++++----------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/subworkflows/local/call_snv_sentieon.nf b/subworkflows/local/call_snv_sentieon.nf index 3e5d3640..4a7ed010 100644 --- a/subworkflows/local/call_snv_sentieon.nf +++ b/subworkflows/local/call_snv_sentieon.nf @@ -12,26 +12,30 @@ workflow CALL_SNV_SENTIEON { fai // path: genome.fai known_dbsnp // path: params.known_dbsnp known_dbsnp_tbi // path: params.known_dbsnp - ml_model // path: params.ml_model + ml_model // path: params.ml_model main: ch_versions = Channel.empty() - ch_dnascope_vcf = Channel.empty() - ch_dnamodelapply_vcf = Channel.empty() - SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, ml_model ) - ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions) + SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, ml_model ) + ch_vcf = SENTIEON_DNASCOPE.out.vcf + ch_vcf_index = SENTIEON_DNASCOPE.out.vcf_index + ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions) - SENTIEON_DNASCOPE.out - .vcf - .set { ch_dnascope_vcf } + if ( ml_model ) { - SENTIEON_DNAMODELAPPLY ( ch_dnascope_vcf, fasta, fai, ml_model ) - ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions) - ch_dnamodelapply_vcf = SENTIEON_DNAMODELAPPLY.out.vcf + ch_vcf. + .join( ch_vcf_index ) + .set { ch_vcf_idx } + + SENTIEON_DNAMODELAPPLY ( ch_vcf_idx, fasta, fai, ml_model ) + ch_vcf = SENTIEON_DNAMODELAPPLY.out.vcf + ch_vcf_index = SENTIEON_DNAMODELAPPLY.out.vcf_index + ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions) + } emit: - dnascope_vcf = ch_dnascope_vcf.ifEmpty(null) - dnamodelapply_vcf = ch_dnamodelapply_vcf.ifEmpty(null) - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf = ch_vcf + vcf_index = ch_vcf_index + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From f83a8e060a738c4c0cd956178fd07844a1f6f904 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 May 2022 16:29:29 +0200 Subject: [PATCH 0519/1169] fixed spaces --- subworkflows/local/call_SNV.nf | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/subworkflows/local/call_SNV.nf b/subworkflows/local/call_SNV.nf index b4d5d095..a14141ac 100644 --- a/subworkflows/local/call_SNV.nf +++ b/subworkflows/local/call_SNV.nf @@ -7,14 +7,14 @@ include { CALL_SNV_SENTIEON } from './calling_sentieon' workflow CALL_SNV { take: - variant_caller // string: params.variant_caller - input // channel: [ val(meta), path(bam), path(bai) ] - fasta // channel: [genome.fasta] - fai // channel: [genome.fai] - known_dbsnp // channel: [ /path/to/known_dbsnp ] - known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] - ml_model // channel: [ /path/to/ml_model ] - case_info // channel: [ case_id ] + variant_caller // string: params.variant_caller + input // channel: [ val(meta), path(bam), path(bai) ] + fasta // channel: [genome.fasta] + fai // channel: [genome.fai] + known_dbsnp // channel: [ /path/to/known_dbsnp ] + known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] + ml_model // channel: [ /path/to/ml_model ] + case_info // channel: [ case_id ] main: ch_versions = Channel.empty() @@ -33,9 +33,9 @@ workflow CALL_SNV { } else { exit 1, 'Please provide a valid variant caller!' } - - emit: - vcf = ch_vcf - vcf_index = ch_vcf_index - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + + emit: + vcf = ch_vcf + vcf_index = ch_vcf_index + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 8fa5cbf69035ef761018133ccda1521fe2aaea3c Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 May 2022 16:32:05 +0200 Subject: [PATCH 0520/1169] corrections --- nextflow.config | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/nextflow.config b/nextflow.config index cfba667a..2e00056b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -30,17 +30,15 @@ params { // Variant calling variant_caller = 'deepvariant' - -<<<<<<< HEAD + // Dnascope SNV calling pcrfree = true call_interval = null variant_type = 'snp, indel' -======= + // CNVpytor cnvpytor_chr = null cnvpytor_binsizes = '1000' ->>>>>>> dev // Annotation vep_cache_version = '105' From 27de68767b6baf647b06c4e3f1351a873fab03c2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 14 May 2022 14:28:48 +0200 Subject: [PATCH 0521/1169] add empty lines to module.config --- conf/modules.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 11c8c778..60ef78a2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -272,18 +272,18 @@ process { withName: '.*CALL_SNV_SENTIEON:.*' { ext.when = params.variant_caller.equals("sentieon") } - + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { ext.args = { params.call_interval ? "--interval ${params.call_interval}" : '' } ext.args2 = { params.variant_types ? "--var_type ${params.variant_types}" : '' } ext.args3 = { params.pcrfree ? "--pcr_indel_model NONE" : '' } - publishDir = [ + publishDir = [ path: { "${params.outdir}/sentieon_dnascope" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNAMODELAPPLY' { publishDir = [ path: { "${params.outdir}/sentieon_dnamodelapply" }, @@ -291,7 +291,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + } // From 657bb6cdd519eb5ffe84aa5d958b20006e20c442 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Mon, 16 May 2022 12:01:49 +0200 Subject: [PATCH 0522/1169] Add flowchart --- docs/images/raredisease_workflow.svg | 910 ++++++++++++++++++++++++ docs/images/raredisease_workflow_v0.png | Bin 0 -> 172170 bytes 2 files changed, 910 insertions(+) create mode 100644 docs/images/raredisease_workflow.svg create mode 100644 docs/images/raredisease_workflow_v0.png diff --git a/docs/images/raredisease_workflow.svg b/docs/images/raredisease_workflow.svg new file mode 100644 index 00000000..a05e65d5 --- /dev/null +++ b/docs/images/raredisease_workflow.svg @@ -0,0 +1,910 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bam + + + + + Preprocessing, mapping etc +bwamem2, MarkDuplicates +Sentieon: bwamem, Locuscollector, Dedup + + + + Reports +MultiQC, Peddy, plink, rhocall + + + + + Variant calling + + SV +ExpansionHunter, CNVpytor, Manta, tiddit/sv + Mitochondria +According to GATK Best Practices +Mutect2, eKLIPse + SNV + short indels +Deepvariant +Sentieon: DNAscope, DNAModelApply + + + + + + + Variant annotation and prioritization + + SV +VCFanno, VEP, Gens + Mitochondria +Haplogrep, HmtNote, gnomAD_mt + SNV + short indels +VCFanno, CADD, VEP + + + + + + Outputs +VCFs, inputs for scout, Gens + + + + + vcf + + + + + + vcf + + + + + + vcf + + + + + + + fastq + + + + dev + + + + + + diff --git a/docs/images/raredisease_workflow_v0.png b/docs/images/raredisease_workflow_v0.png new file mode 100644 index 0000000000000000000000000000000000000000..f48034d0a7f7f87bc728ba425ae2afe457096a02 GIT binary patch literal 172170 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 Date: Mon, 16 May 2022 12:16:38 +0200 Subject: [PATCH 0523/1169] Increased icons size --- docs/images/raredisease_workflow.svg | 162 ++++++++++++------------ docs/images/raredisease_workflow_v0.png | Bin 172170 -> 266322 bytes 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/docs/images/raredisease_workflow.svg b/docs/images/raredisease_workflow.svg index a05e65d5..5aedaf7f 100644 --- a/docs/images/raredisease_workflow.svg +++ b/docs/images/raredisease_workflow.svg @@ -3,12 +3,12 @@ + originx="5.8501525" + originy="12.591079" /> @@ -112,10 +112,10 @@ hide_knots="false" /> + transform="translate(5.8501515,12.591079)"> + id="g1311" + inkscape:export-filename="/Users/gwennabreton/Documents/GMS-RD-DNA/nf-core_raredisease/pipeline-flowcharts/nf-core-raredisease/raredisease_workflow_v0.png" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300"> + transform="translate(0,0.41424555)"> Preprocessing, mapping etcPreprocessing, mapping etc + id="tspan1508"> bwamem2, MarkDuplicates + id="tspan1512">bwamem2, MarkDuplicates Sentieon: bwamem, Locuscollector, Dedup + id="tspan1516">Sentieon: bwamem, Locuscollector, Dedup ReportsReports + id="tspan1522"> MultiQC, Peddy, plink, rhocall + id="tspan1526">MultiQC, Peddy, plink, rhocall + transform="translate(0,0.81806251)"> Variant calling + id="tspan1530">Variant calling @@ -549,19 +549,19 @@ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Maven Pro';-inkscape-font-specification:'Maven Pro';white-space:pre;shape-inside:url(#rect17389);fill:#000000">SV + id="tspan1534">SV ExpansionHunter, ExpansionHunter, CNVpytor, Manta, CNVpytor, Manta, tiddit/sv + id="tspan1542">tiddit/sv MitochondriaMitochondria + id="tspan1544"> According to GATK According to GATK Best Practices + id="tspan1552">Best Practices Mutect2, eKLIPse + id="tspan1556">Mutect2, eKLIPse SNV + short indelsSNV + short indels + id="tspan1560"> Deepvariant + id="tspan1564">Deepvariant Sentieon: DNAscope, Sentieon: DNAscope, DNAModelApply + id="tspan1572">DNAModelApply + transform="translate(0,2.5826905)"> Variant annotation and prioritization + id="tspan1576">Variant annotation and prioritization @@ -657,13 +657,13 @@ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Maven Pro';-inkscape-font-specification:'Maven Pro';white-space:pre;shape-inside:url(#rect17389-8);fill:#000000">SV + id="tspan1580">SV VCFanno, VEP, Gens + id="tspan1584">VCFanno, VEP, Gens Mitochondria + id="tspan1586">Mitochondria Haplogrep, HmtNote, Haplogrep, HmtNote, gnomAD_mt + id="tspan1592">gnomAD_mt SNV + short indels + id="tspan1594">SNV + short indels VCFanno, CADD, VEP + id="tspan1598">VCFanno, CADD, VEP @@ -721,21 +721,21 @@ y="0">OutputsOutputs + id="tspan1602"> VCFs, inputs for scout, Gens + id="tspan1606">VCFs, inputs for scout, Gens @@ -838,12 +838,12 @@ + inkscape:original-d="M 16.205895,-11.047027 V 4.5963258 L 48.667882,10.853613 81.129873,4.5963258 V -11.047027 Z" /> + transform="translate(0.77458502,9.5250003)"> dev + id="tspan1610">dev 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%0AX`TP|Kr-gw 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 Date: Mon, 16 May 2022 12:17:43 +0200 Subject: [PATCH 0524/1169] Added flowchart image - included workflow overview - created subsection with in-progress flowchart --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f2008807..4d2d39bd 100644 --- a/README.md +++ b/README.md @@ -40,10 +40,20 @@ On release, automated continuous integration tests run the pipeline on a full-si > Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) -The different steps and corresponding tools are represented in the flowchart below. Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). +

+ +

+ +Note that it is possible to include/exclude certain tools or steps. + +### Work in progress flowchart +Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). + + + ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) From b32f8813b2b1e66a32fb8c2a49373174be3aa7cc Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Mon, 16 May 2022 10:22:22 +0000 Subject: [PATCH 0525/1169] Template update for nf-core/tools version 2.4 --- .github/workflows/awsfulltest.yml | 3 - .github/workflows/awstest.yml | 3 - .github/workflows/branch.yml | 3 +- .github/workflows/ci.yml | 2 - .github/workflows/fix-linting.yml | 55 ++++++++++ .github/workflows/linting.yml | 4 +- .github/workflows/linting_comment.yml | 1 - .prettierignore | 9 ++ README.md | 25 ++--- assets/email_template.html | 142 ++++++++------------------ bin/check_samplesheet.py | 16 ++- nextflow.config | 2 +- 12 files changed, 135 insertions(+), 130 deletions(-) create mode 100644 .github/workflows/fix-linting.yml create mode 100644 .prettierignore diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index da3a4b97..d4af2878 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -28,6 +28,3 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" } profiles: test_full,aws_tower - nextflow_config: | - process.errorStrategy = 'retry' - process.maxRetries = 3 diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index c2ffb8ff..18e6e776 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -23,6 +23,3 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test-${{ github.sha }}" } profiles: test,aws_tower - nextflow_config: | - process.errorStrategy = 'retry' - process.maxRetries = 3 diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index b946d7ec..26015bbe 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,7 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/raredisease' run: | - "{ [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/raredisease ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]]" + { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/raredisease ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets @@ -42,4 +42,3 @@ jobs: Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false -# diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3493ffe1..17805659 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,5 +48,3 @@ jobs: # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results - -# diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml new file mode 100644 index 00000000..62912841 --- /dev/null +++ b/.github/workflows/fix-linting.yml @@ -0,0 +1,55 @@ +name: Fix linting from a comment +on: + issue_comment: + types: [created] + +jobs: + deploy: + # Only run if comment is on a PR with the main repo, and if it contains the magic keywords + if: > + contains(github.event.comment.html_url, '/pull/') && + contains(github.event.comment.body, '@nf-core-bot fix linting') && + github.repository == 'nf-core/raredisease' + runs-on: ubuntu-latest + steps: + # Use the @nf-core-bot token to check out so we can push later + - uses: actions/checkout@v3 + with: + token: ${{ secrets.nf_core_bot_auth_token }} + + # Action runs on the issue comment, so we don't get the PR by default + # Use the gh cli to check out the PR + - name: Checkout Pull Request + run: gh pr checkout ${{ github.event.issue.number }} + env: + GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} + + - uses: actions/setup-node@v2 + + - name: Install Prettier + run: npm install -g prettier @prettier/plugin-php + + # Check that we actually need to fix something + - name: Run 'prettier --check' + id: prettier_status + run: | + if prettier --check ${GITHUB_WORKSPACE}; then + echo "::set-output name=result::pass" + else + echo "::set-output name=result::fail" + fi + + - name: Run 'prettier --write' + if: steps.prettier_status.outputs.result == 'fail' + run: prettier --write ${GITHUB_WORKSPACE} + + - name: Commit & push changes + if: steps.prettier_status.outputs.result == 'fail' + run: | + git config user.email "core@nf-co.re" + git config user.name "nf-core-bot" + git config push.default upstream + git add . + git status + git commit -m "[automated] Fix linting with Prettier" + git push diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index e9cf5de3..77358dee 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -48,7 +48,7 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ - - uses: actions/setup-python@v1 + - uses: actions/setup-python@v3 with: python-version: "3.6" architecture: "x64" @@ -78,5 +78,3 @@ jobs: lint_log.txt lint_results.md PR_number.txt - -# diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 91c487a1..04758f61 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -26,4 +26,3 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} path: linting-logs/lint_results.md -# diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..d0e7ae58 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +email_template.html +.nextflow* +work/ +data/ +results/ +.DS_Store +testing/ +testing* +*.pyc diff --git a/README.md b/README.md index 9cb5003c..662490e9 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,19 @@ -# ![nf-core/raredisease](docs/images/nf-core/raredisease_logo_light.png#gh-light-mode-only) ![nf-core/raredisease](docs/images/nf-core/raredisease_logo_dark.png#gh-dark-mode-only) +# ![nf-core/raredisease](docs/images/nf-core-raredisease_logo_light.png#gh-light-mode-only) ![nf-core/raredisease](docs/images/nf-core-raredisease_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/raredisease/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/raredisease/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+linting%22) -[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/raredisease/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) - -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) -[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) -[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) -[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) - -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/raredisease) -[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core) -[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?logo=Amazon%20AWS)](https://nf-co.re/raredisease/results) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8)](https://doi.org/10.5281/zenodo.XXXXXXX) + +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) +[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?logo=anaconda)](https://docs.conda.io/en/latest/) +[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?logo=docker)](https://www.docker.com/) +[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg)](https://sylabs.io/docs/) +[![Launch on Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/raredisease) + +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?logo=slack)](https://nfcore.slack.com/channels/raredisease) +[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?logo=twitter)](https://twitter.com/nf_core) +[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction diff --git a/assets/email_template.html b/assets/email_template.html index 94874386..f7f3e4ef 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,111 +1,53 @@ - - - - + + + + - - - nf-core/raredisease Pipeline Report - - -
+ + diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 5473b624..3652c63c 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -98,7 +98,7 @@ def _validate_pair(self, row): if row[self._first_col] and row[self._second_col]: row[self._single_col] = False assert ( - Path(row[self._first_col]).suffixes == Path(row[self._second_col]).suffixes + Path(row[self._first_col]).suffixes[-2:] == Path(row[self._second_col]).suffixes[-2:] ), "FASTQ pairs must have the same file extensions." else: row[self._single_col] = True @@ -129,6 +129,16 @@ def validate_unique_samples(self): row[self._sample_col] = f"{sample}_T{seen[sample]}" +def read_head(handle, num_lines=10): + """Read the specified number of lines from the current position in the file.""" + lines = [] + for idx, line in enumerate(handle): + if idx == num_lines: + break + lines.append(line) + return "".join(lines) + + def sniff_format(handle): """ Detect the tabular format. @@ -144,13 +154,13 @@ def sniff_format(handle): https://docs.python.org/3/glossary.html#term-text-file """ - peek = handle.read(2048) + peek = read_head(handle) + handle.seek(0) sniffer = csv.Sniffer() if not sniffer.has_header(peek): logger.critical(f"The given sample sheet does not appear to contain a header.") sys.exit(1) dialect = sniffer.sniff(peek) - handle.seek(0) return dialect diff --git a/nextflow.config b/nextflow.config index 387828ad..cfa6b251 100644 --- a/nextflow.config +++ b/nextflow.config @@ -159,7 +159,7 @@ trace { } dag { enabled = true - file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg" + file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.html" } manifest { From e3def69d2b9b759ec3411ebd49aa7216fea65ebf Mon Sep 17 00:00:00 2001 From: Gwennid Date: Mon, 16 May 2022 15:22:26 +0200 Subject: [PATCH 0526/1169] Replaced html by md syntax --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4d2d39bd..80d1e963 100644 --- a/README.md +++ b/README.md @@ -40,20 +40,16 @@ On release, automated continuous integration tests run the pipeline on a full-si > Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) -

- -

+![nf-core/raredisease Workflow](docs/images/raredisease_workflow_v0.png) Note that it is possible to include/exclude certain tools or steps. ### Work in progress flowchart - +![nf-core/raredisease work in progress](https://docs.google.com/drawings/d/e/2PACX-1vTam7xjHBQTo1QsOpMUpd5F2vUZK5aXuf51OpSBaaV_2xMwfS1oN6GgVeQEJHjNNXRtCVHdGjCVFyzO/pub?w=2268&h=2268) Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). - - ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) From b95bdb454d44dd65fd7abf0ead0ae4281ba191d3 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Mon, 16 May 2022 15:35:17 +0200 Subject: [PATCH 0527/1169] Added prettier ignore command --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 80d1e963..8cde14ee 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,10 @@ On release, automated continuous integration tests run the pipeline on a full-si > Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) -![nf-core/raredisease Workflow](docs/images/raredisease_workflow_v0.png) + +

+ +

Note that it is possible to include/exclude certain tools or steps. From f111a0662d2e49961abca855af39db3a28cdd7bc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 16 May 2022 16:28:42 +0200 Subject: [PATCH 0528/1169] functional subworkflow --- conf/genomes.config | 2 ++ conf/modules.config | 9 ++++-- main.nf | 1 + modules/local/sentieon/dnascope.nf | 14 ++++---- nextflow.config | 6 ++-- nextflow_schema.json | 26 +++++++++++---- .../local/{call_SNV.nf => call_snv.nf} | 32 +++++++++---------- subworkflows/local/call_snv_sentieon.nf | 30 ++++++++--------- subworkflows/local/prepare_references.nf | 6 ++-- workflows/raredisease.nf | 21 ++++++------ 10 files changed, 81 insertions(+), 66 deletions(-) rename subworkflows/local/{call_SNV.nf => call_snv.nf} (56%) diff --git a/conf/genomes.config b/conf/genomes.config index 967379b5..7adf8135 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -18,6 +18,7 @@ params { bwa = "" known_dbsnp = "" known_dbsnp_tbi = "" + ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -33,6 +34,7 @@ params { bwa = "${params.local_genomes}/bwa/" known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" + ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/conf/modules.config b/conf/modules.config index 60ef78a2..7b7801bc 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -274,9 +274,12 @@ process { } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { - ext.args = { params.call_interval ? "--interval ${params.call_interval}" : '' } - ext.args2 = { params.variant_types ? "--var_type ${params.variant_types}" : '' } - ext.args3 = { params.pcrfree ? "--pcr_indel_model NONE" : '' } + ext.args2 = { [ + params.call_interval ? "--interval ${params.call_interval}" : '', + params.variant_type ? "--var_type ${params.variant_type}" : '', + params.pcrfree ? "--pcr_indel_model NONE" : '' + ].join(" ") + } publishDir = [ path: { "${params.outdir}/sentieon_dnascope" }, mode: params.publish_dir_mode, diff --git a/main.nf b/main.nf index 832ef29a..159e4ed8 100644 --- a/main.nf +++ b/main.nf @@ -25,6 +25,7 @@ params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbs params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') +params.ml_model = WorkflowMain.getGenomeAttribute(params, 'ml_model') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') diff --git a/modules/local/sentieon/dnascope.nf b/modules/local/sentieon/dnascope.nf index b9c9f109..3f33d196 100644 --- a/modules/local/sentieon/dnascope.nf +++ b/modules/local/sentieon/dnascope.nf @@ -10,21 +10,20 @@ process SENTIEON_DNASCOPE { path known_dbsnp path known_dbsnp_tbi path ml_model - + output: tuple val(meta), path("*_dnascope.vcf") , emit: vcf tuple val(meta), path("*_dnascope.vcf.idx") , emit: vcf_index - path "versions.yml" , emit: versions + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - def args3 = task.ext.args3 ?: '' - def dbsnp = known_dbsnp ? "-d ${known_dbsnp}" : '' - def model = ml_model ? "--model ${ml_model}" : '' + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def dbsnp = known_dbsnp ? "-d ${known_dbsnp}" : '' + def model = ml_model ? "--model ${ml_model}" : '' def prefix = task.ext.prefix ?: "${meta.id}" """ @@ -36,7 +35,6 @@ process SENTIEON_DNASCOPE { --algo DNAscope \\ $dbsnp \\ $args2 \\ - $args3 \\ $model \\ ${prefix}_dnascope.vcf diff --git a/nextflow.config b/nextflow.config index cfba667a..368c1197 100644 --- a/nextflow.config +++ b/nextflow.config @@ -31,16 +31,14 @@ params { // Variant calling variant_caller = 'deepvariant' -<<<<<<< HEAD // Dnascope SNV calling pcrfree = true call_interval = null - variant_type = 'snp, indel' -======= + variant_type = 'snp,indel' + // CNVpytor cnvpytor_chr = null cnvpytor_binsizes = '1000' ->>>>>>> dev // Annotation vep_cache_version = '105' diff --git a/nextflow_schema.json b/nextflow_schema.json index e49a4dc7..6f715732 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -129,6 +129,13 @@ "description": "Path to known Mills file.", "hidden": true }, + "ml_model": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "Path to sentieon machine learning model file.", + "hidden": true + }, "target_bed": { "type": "string", "format": "path", @@ -245,18 +252,25 @@ "fa_icon": "fas fa-map-signs", "description": "Options to adjust parameters and filtering criteria for variant calling.", "properties": { + "pcrfree": { + "type": "boolean", + "default": true, + "description": "indicates whether the sample is PCR Free or not. Set to true for PCR Free samples.", + "fa_icon": "fas fa-map-signs" + }, + "variant_type": { + "type": "string", + "default": "SNP", + "description": "Specifies the variant types for sentieon variant caller.", + "fa_icon": "fas fa-map-signs", + "enum": ["snp", "indel", "snp,indel"] + }, "variant_caller": { "type": "string", "default": "deepvariant", "description": "Specifies the variant caller to use - available options are 'deepvariant' and 'sentieon'.", "fa_icon": "fas fa-map-signs", "enum": ["deepvariant", "sentieon"] - }, - "pcrfree": { - "type": "boolean", - "default": true, - "description": "indicates whether the sample is PCR Free or not. Set to true for PCR Free samples.", - "fa_icon": "fas fa-map-signs" } } }, diff --git a/subworkflows/local/call_SNV.nf b/subworkflows/local/call_snv.nf similarity index 56% rename from subworkflows/local/call_SNV.nf rename to subworkflows/local/call_snv.nf index b4d5d095..a3f855ca 100644 --- a/subworkflows/local/call_SNV.nf +++ b/subworkflows/local/call_snv.nf @@ -3,11 +3,11 @@ // include { CALL_SNV_DEEPVARIANT } from '../nf-core/call_snv_deepvariant' -include { CALL_SNV_SENTIEON } from './calling_sentieon' - +include { CALL_SNV_SENTIEON } from './call_snv_sentieon' + workflow CALL_SNV { take: - variant_caller // string: params.variant_caller + variant_caller // string: params.variant_caller input // channel: [ val(meta), path(bam), path(bai) ] fasta // channel: [genome.fasta] fai // channel: [genome.fai] @@ -15,27 +15,27 @@ workflow CALL_SNV { known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] ml_model // channel: [ /path/to/ml_model ] case_info // channel: [ case_id ] - + main: ch_versions = Channel.empty() - if (variant_caller == "deepvariat") { + if (variant_caller == "deepvariant") { CALL_SNV_DEEPVARIANT ( input, fasta, fai, case_info ) - ch_vcf = CALL_SNV_DEEPVARIANT.out.vcf - ch_vcf_index = CALL_SNV_DEEPVARIANT.out.tabix - ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) - + ch_vcf = CALL_SNV_DEEPVARIANT.out.vcf + ch_tabix = CALL_SNV_DEEPVARIANT.out.tabix + ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) + } else if ( variant_caller == "sentieon" ) { CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, ml_model ) - ch_vcf = CALL_SNV_SENTIEON.out.vcf - ch_vcf_index = CALL_SNV_SENTIEON.out.vcf_index - ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) + ch_vcf = CALL_SNV_SENTIEON.out.vcf + ch_tabix = CALL_SNV_SENTIEON.out.tabix + ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) } else { exit 1, 'Please provide a valid variant caller!' } - + emit: - vcf = ch_vcf - vcf_index = ch_vcf_index - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf = ch_vcf + tabix = ch_tabix + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/call_snv_sentieon.nf b/subworkflows/local/call_snv_sentieon.nf index 4a7ed010..0c360975 100644 --- a/subworkflows/local/call_snv_sentieon.nf +++ b/subworkflows/local/call_snv_sentieon.nf @@ -7,35 +7,33 @@ include { SENTIEON_DNAMODELAPPLY } from '../../modules/local/sentieon/dnamod workflow CALL_SNV_SENTIEON { take: - input // channel: [ val(meta), bam, bai ] - fasta // path: genome.fasta - fai // path: genome.fai - known_dbsnp // path: params.known_dbsnp - known_dbsnp_tbi // path: params.known_dbsnp - ml_model // path: params.ml_model + input // channel: [ val(meta), bam, bai ] + fasta // path: genome.fasta + fai // path: genome.fai + dbsnp // path: params.known_dbsnp + dbsnp_index // path: params.known_dbsnp + ml_model // path: params.ml_model main: ch_versions = Channel.empty() SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, ml_model ) - ch_vcf = SENTIEON_DNASCOPE.out.vcf - ch_vcf_index = SENTIEON_DNASCOPE.out.vcf_index + ch_vcf = SENTIEON_DNASCOPE.out.vcf + ch_index = SENTIEON_DNASCOPE.out.vcf_index ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions) if ( ml_model ) { - ch_vcf. - .join( ch_vcf_index ) - .set { ch_vcf_idx } + ch_vcf_idx = ch_vcf.join( ch_index ) SENTIEON_DNAMODELAPPLY ( ch_vcf_idx, fasta, fai, ml_model ) - ch_vcf = SENTIEON_DNAMODELAPPLY.out.vcf - ch_vcf_index = SENTIEON_DNAMODELAPPLY.out.vcf_index + ch_vcf = SENTIEON_DNAMODELAPPLY.out.vcf + ch_index = SENTIEON_DNAMODELAPPLY.out.vcf_index ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions) } emit: - vcf = ch_vcf - vcf_index = ch_vcf_index - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf = ch_vcf + tabix = ch_index + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 65e5e83c..6ab7ec2b 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -42,12 +42,12 @@ workflow PREPARE_REFERENCES { ch_dbsnp_tbi = Channel.empty() if (!known_dbsnp_tbi && known_dbsnp) { TABIX_DBSNP([[id:'dbsnp'], file(known_dbsnp)]) - ch_dbsnp_vcf = Channel.fromPath(known_dbsnp) + ch_dbsnp_vcf = file(known_dbsnp) ch_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect {it[1]} ch_versions = ch_versions.mix(TABIX_DBSNP.out.versions) } else if (known_dbsnp_tbi && known_dbsnp) { - ch_dbsnp_vcf = Channel.fromPath(known_dbsnp) - ch_dbsnp_tbi = Channel.fromPath(known_dbsnp_tbi) + ch_dbsnp_vcf = file(known_dbsnp) + ch_dbsnp_tbi = file(known_dbsnp_tbi) } // Gnomad vcf diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index d6b4f245..1bc6fd80 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -27,10 +27,7 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -ch_known_dbsnp = params.known_dbsnp ? file(params.known_dbsnp) : [] -ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? file(params.known_dbsnp_tbi) : [] -ch_known_mills = params.known_mills ? file(params.known_mills) : [] -ch_known_indels = params.known_indels ? file(params.known_indels) : [] +ch_ml_model = params.ml_model ? file(params.ml_model) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -54,6 +51,7 @@ include { CHECK_INPUT } from '../subworkflows/local/check_input include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' include { ALIGN } from '../subworkflows/local/align' +include { CALL_SNV } from '../subworkflows/local/call_snv' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -74,7 +72,6 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { CALL_SNV_DEEPVARIANT } from '../subworkflows/nf-core/call_snv_deepvariant' include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' @@ -159,13 +156,17 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. - CALL_SNV_DEEPVARIANT ( + CALL_SNV ( + params.variant_caller, ch_mapped.bam_bai, ch_references.genome_fasta, ch_references.genome_fai, + ch_references.known_dbsnp, + ch_references.known_dbsnp_tbi, + ch_ml_model, CHECK_INPUT.out.case_info ) - ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) + ch_versions = ch_versions.mix(CALL_SNV.out.versions) CALL_STRUCTURAL_VARIANTS ( ch_mapped.marked_bam, @@ -192,16 +193,16 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(ch_sv_annotate.versions) } - + // STEP 2.1: MT CALLING - + PREPARE_MT_ALIGNMENT ( ch_mapped.bam_bai ) ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) // STEP 3: VARIANT ANNOTATION - ch_dv_vcf = CALL_SNV_DEEPVARIANT.out.vcf.join(CALL_SNV_DEEPVARIANT.out.tabix, by: [0]) + ch_dv_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) ANNOTATE_VCFANNO ( params.vcfanno_toml, From f17f8f9689ed6aa73013426b6996cc293ab0189e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 16 May 2022 16:57:39 +0200 Subject: [PATCH 0529/1169] add tabix --- subworkflows/local/call_snv.nf | 6 +++--- subworkflows/local/call_snv_sentieon.nf | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index a3f855ca..a809f8a3 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -35,7 +35,7 @@ workflow CALL_SNV { } emit: - vcf = ch_vcf - tabix = ch_tabix - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf = ch_vcf + tabix = ch_tabix + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/call_snv_sentieon.nf b/subworkflows/local/call_snv_sentieon.nf index 0c360975..53d916dc 100644 --- a/subworkflows/local/call_snv_sentieon.nf +++ b/subworkflows/local/call_snv_sentieon.nf @@ -2,8 +2,9 @@ // A subworkflow to call SNVs by sentieon dnascope with a machine learning model. // -include { SENTIEON_DNASCOPE } from '../../modules/local/sentieon/dnascope' -include { SENTIEON_DNAMODELAPPLY } from '../../modules/local/sentieon/dnamodelapply' +include { SENTIEON_DNASCOPE } from '../../modules/local/sentieon/dnascope' +include { SENTIEON_DNAMODELAPPLY } from '../../modules/local/sentieon/dnamodelapply' +include { TABIX_TABIX as TABIX_SENTIEON } from '../../modules/nf-core/modules/tabix/tabix/main' workflow CALL_SNV_SENTIEON { take: @@ -32,8 +33,10 @@ workflow CALL_SNV_SENTIEON { ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions) } + TABIX_SENTIEON (ch_vcf) + emit: vcf = ch_vcf - tabix = ch_index + tabix = TABIX_SENTIEON.out.tbi versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From c808d1e8936ac47fc4135cc05aefe2a9f3426c31 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 17 May 2022 08:27:13 +0200 Subject: [PATCH 0530/1169] updates default variant type in schema --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 6f715732..5ae90684 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -260,7 +260,7 @@ }, "variant_type": { "type": "string", - "default": "SNP", + "default": "snp", "description": "Specifies the variant types for sentieon variant caller.", "fa_icon": "fas fa-map-signs", "enum": ["snp", "indel", "snp,indel"] From ae229f468d4d62e4ec37f453567f5e95d33b1a90 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 17 May 2022 09:04:51 +0200 Subject: [PATCH 0531/1169] fix lint errors --- nextflow.config | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 368c1197..bd481028 100644 --- a/nextflow.config +++ b/nextflow.config @@ -33,7 +33,6 @@ params { // Dnascope SNV calling pcrfree = true - call_interval = null variant_type = 'snp,indel' // CNVpytor From 6ca3e33614d3a30cd6848b843cc4016a2bfc4638 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 17 May 2022 09:27:19 +0200 Subject: [PATCH 0532/1169] fix editorconfig --- conf/modules.config | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 7b7801bc..16c3e639 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -275,11 +275,9 @@ process { withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { ext.args2 = { [ - params.call_interval ? "--interval ${params.call_interval}" : '', - params.variant_type ? "--var_type ${params.variant_type}" : '', - params.pcrfree ? "--pcr_indel_model NONE" : '' - ].join(" ") - } + params.variant_type ? "--var_type ${params.variant_type}" : '', + params.pcrfree ? "--pcr_indel_model NONE" : '' + ].join(" ") } publishDir = [ path: { "${params.outdir}/sentieon_dnascope" }, mode: params.publish_dir_mode, From 6485c95d3ddc1afd4de5a6c289215e63a4300540 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 17 May 2022 10:12:28 +0200 Subject: [PATCH 0533/1169] fix editorlint errors --- conf/modules.config | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 16c3e639..ee22d8d7 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -261,7 +261,6 @@ process{ saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - } // @@ -275,10 +274,10 @@ process { withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { ext.args2 = { [ - params.variant_type ? "--var_type ${params.variant_type}" : '', - params.pcrfree ? "--pcr_indel_model NONE" : '' - ].join(" ") } - publishDir = [ + params.variant_type ? "--var_type ${params.variant_type}" : '', + params.pcrfree ? "--pcr_indel_model NONE" : '' + ].join(" ") } + publishDir = [ path: { "${params.outdir}/sentieon_dnascope" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -286,13 +285,12 @@ process { } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNAMODELAPPLY' { - publishDir = [ + publishDir = [ path: { "${params.outdir}/sentieon_dnamodelapply" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - } // From b52c959f606e24f7adee181140091dee7f4363ba Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 17 May 2022 16:11:06 +0200 Subject: [PATCH 0534/1169] add call intervals --- conf/genomes.config | 6 ++++-- conf/modules.config | 9 ++++++--- main.nf | 1 + nextflow_schema.json | 7 +++++++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 7adf8135..7c4bcadb 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -13,9 +13,10 @@ params { 'GRCh37' { fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" + bwa = "" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + call_interval = "" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" - bwa = "" known_dbsnp = "" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" @@ -29,9 +30,10 @@ params { 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" + bwa = "${params.local_genomes}/bwa/" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + call_interval = "" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" - bwa = "${params.local_genomes}/bwa/" known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" diff --git a/conf/modules.config b/conf/modules.config index ee22d8d7..d0912f4f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -274,8 +274,9 @@ process { withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { ext.args2 = { [ - params.variant_type ? "--var_type ${params.variant_type}" : '', - params.pcrfree ? "--pcr_indel_model NONE" : '' + params.variant_type ? "--var_type ${params.variant_type}" : '', + params.pcrfree ? "--pcr_indel_model NONE" : '', + params.call_interval ? "--interval ${params.call_interval}" : '' ].join(" ") } publishDir = [ path: { "${params.outdir}/sentieon_dnascope" }, @@ -353,6 +354,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + withName: STRANGER { publishDir = [ path: { "${params.outdir}/stranger" }, @@ -472,6 +474,7 @@ process { mode: params.publish_dir_mode, ] } + withName: '.*CALL_STRUCTURAL_VARIANTS:SVDB_MERGE' { ext.args = '--pass_only' publishDir = [ @@ -532,7 +535,7 @@ process { } // -// PREPARE_MT_ALLIGNMENT +// PREPARE_MT_ALIGNMENT // process { diff --git a/main.nf b/main.nf index 159e4ed8..84323d7c 100644 --- a/main.nf +++ b/main.nf @@ -20,6 +20,7 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') +params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') diff --git a/nextflow_schema.json b/nextflow_schema.json index 5ae90684..3f68b9ee 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -252,6 +252,13 @@ "fa_icon": "fas fa-map-signs", "description": "Options to adjust parameters and filtering criteria for variant calling.", "properties": { + "call_interval": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "Interval in the reference that will be used in the software", + "hidden": true + }, "pcrfree": { "type": "boolean", "default": true, From f0841c91b421e6276a24a416da6436b037e3ce29 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 18 May 2022 15:41:34 +0200 Subject: [PATCH 0535/1169] Fixed alignment --- docs/images/raredisease_workflow.png | Bin 0 -> 265967 bytes docs/images/raredisease_workflow.svg | 396 ++++++++++++++------------- 2 files changed, 204 insertions(+), 192 deletions(-) create mode 100644 docs/images/raredisease_workflow.png diff --git a/docs/images/raredisease_workflow.png b/docs/images/raredisease_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc112e276b0a98a52964561d56a437c35025e59 GIT binary patch literal 265967 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

L9D>x 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

J>$MsWbb4Z6 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 literal 0 HcmV?d00001 diff --git a/docs/images/raredisease_workflow.svg b/docs/images/raredisease_workflow.svg index 5aedaf7f..012f2c59 100644 --- a/docs/images/raredisease_workflow.svg +++ b/docs/images/raredisease_workflow.svg @@ -9,6 +9,9 @@ id="svg1159" inkscape:version="1.1.2 (b8e25be8, 2022-02-05)" sodipodi:docname="raredisease_workflow.svg" + inkscape:export-filename="/Users/gwennabreton/Documents/GMS-RD-DNA/nf-core_raredisease/pipeline-flowcharts/nf-core-raredisease/raredisease_workflow.png" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" @@ -24,9 +27,9 @@ inkscape:pagecheckerboard="0" inkscape:document-units="mm" showgrid="false" - inkscape:zoom="1" - inkscape:cx="-10.5" - inkscape:cy="350.5" + inkscape:zoom="0.93303299" + inkscape:cx="199.88575" + inkscape:cy="320.99615" inkscape:window-width="1792" inkscape:window-height="989" inkscape:window-x="0" @@ -365,6 +368,30 @@ apply_with_radius="true" only_selected="false" hide_knots="false" /> + + + + + inkscape:transform-center-y="-13.397346" /> Preprocessing, mapping etcPreprocessing, mapping etc + id="tspan3373"> bwamem2, MarkDuplicates + id="tspan3377">bwamem2, MarkDuplicates Sentieon: bwamem, Locuscollector, Dedup + id="tspan3381">Sentieon: bwamem, Locuscollector, Dedup + inkscape:transform-center-y="-9.6355011" /> ReportsReports + id="tspan3387"> MultiQC, Peddy, plink, rhocall + id="tspan3391">MultiQC, Peddy, plink, rhocall + + - + id="g2510"> + Variant calling + id="g1657"> Variant calling - - SV + id="tspan3399">SV ExpansionHunter, CNVpytor, Manta, tiddit/sv - MitochondriaExpansionHunter, CNVpytor, Manta, tiddit/sv + Mitochondria + id="tspan3409"> According to GATK Best Practices + x="473.05078" + y="263.66196" + id="tspan3415">According to GATK Best Practices Mutect2, eKLIPse - SNV + short indelsMutect2, eKLIPse + SNV + short indels + id="tspan3425"> Deepvariant + x="48.398438" + y="263.66196" + id="tspan3431">Deepvariant Sentieon: DNAscope, DNAModelApply - + x="48.398438" + y="278.66196" + id="tspan3435">Sentieon: DNAscope, DNAModelApply - + id="g1676" + transform="translate(-110.84655,44.76017)"> + Variant annotation and prioritization + id="g1631" + transform="translate(0,-0.44417142)"> Variant annotation and prioritization - - SV + id="tspan3445">SV VCFanno, VEP, Gens - VCFanno, VEP, Gens + Mitochondria + id="tspan3451">Mitochondria Haplogrep, HmtNote, gnomAD_mt - Haplogrep, HmtNote, gnomAD_mt + SNV + short indels + id="tspan3459">SNV + short indels VCFanno, CADD, VEP - + x="55" + y="377.35532" + id="tspan3463">VCFanno, CADD, VEP + inkscape:transform-center-y="-9.6355011" /> OutputsOutputs + id="tspan3467"> VCFs, inputs for scout, Gens + id="tspan3471">VCFs, inputs for scout, Gens dev + id="tspan3475">dev Date: Wed, 18 May 2022 15:42:05 +0200 Subject: [PATCH 0536/1169] Modified PNG file name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8cde14ee..1b1a0a20 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ On release, automated continuous integration tests run the pipeline on a full-si

- +

Note that it is possible to include/exclude certain tools or steps. From 9c29a55618fdf2b7838a68ef959412afc07a606f Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 18 May 2022 15:42:52 +0200 Subject: [PATCH 0537/1169] Remove older version --- docs/images/raredisease_workflow_v0.png | Bin 266322 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/raredisease_workflow_v0.png diff --git a/docs/images/raredisease_workflow_v0.png b/docs/images/raredisease_workflow_v0.png deleted file mode 100644 index 00d0a3a4b7076ce44e703d02b54909dd3af14d58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266322 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%0AX`TP|Kr-gw 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 Date: Wed, 18 May 2022 15:46:47 +0200 Subject: [PATCH 0538/1169] review suggestions --- conf/genomes.config | 2 +- conf/modules.config | 3 +-- modules/local/sentieon/dnamodelapply.nf | 12 ++++++------ modules/local/sentieon/dnascope.nf | 23 +++++++++++++---------- subworkflows/local/call_snv.nf | 3 ++- subworkflows/local/call_snv_sentieon.nf | 20 +++++++++----------- workflows/raredisease.nf | 3 ++- 7 files changed, 34 insertions(+), 32 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 7c4bcadb..53f2f180 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -30,7 +30,7 @@ params { 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" - bwa = "${params.local_genomes}/bwa/" + bwa = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.{amb,ann,bwt,pac,sa}" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" call_interval = "" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" diff --git a/conf/modules.config b/conf/modules.config index d0912f4f..a3c1aa9b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -275,8 +275,7 @@ process { withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { ext.args2 = { [ params.variant_type ? "--var_type ${params.variant_type}" : '', - params.pcrfree ? "--pcr_indel_model NONE" : '', - params.call_interval ? "--interval ${params.call_interval}" : '' + params.pcrfree ? "--pcr_indel_model NONE" : '' ].join(" ") } publishDir = [ path: { "${params.outdir}/sentieon_dnascope" }, diff --git a/modules/local/sentieon/dnamodelapply.nf b/modules/local/sentieon/dnamodelapply.nf index dcb3b27d..3be8ec10 100644 --- a/modules/local/sentieon/dnamodelapply.nf +++ b/modules/local/sentieon/dnamodelapply.nf @@ -10,9 +10,9 @@ process SENTIEON_DNAMODELAPPLY { path ml_model output: - tuple val(meta), path("*_dnascope_ml.vcf") , emit: vcf - tuple val(meta), path("*_dnascope_ml.vcf.idx") , emit: vcf_index - path "versions.yml" , emit: versions + tuple val(meta), path("*_dnascope_ml.vcf.gz") , emit: vcf + tuple val(meta), path("*_dnascope_ml.vcf.gz.tbi") , emit: vcf_index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -27,7 +27,7 @@ process SENTIEON_DNAMODELAPPLY { --algo DNAModelApply \\ --model $ml_model \\ -v $vcf \\ - ${prefix}_dnascope_ml.vcf + ${prefix}_dnascope_ml.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -38,8 +38,8 @@ process SENTIEON_DNAMODELAPPLY { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_dnascope_ml.vcf - touch ${prefix}_dnascope_ml.vcf.idx + touch ${prefix}_dnascope_ml.vcf.gz + touch ${prefix}_dnascope_ml.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/dnascope.nf b/modules/local/sentieon/dnascope.nf index 3f33d196..c4d7cf14 100644 --- a/modules/local/sentieon/dnascope.nf +++ b/modules/local/sentieon/dnascope.nf @@ -9,22 +9,24 @@ process SENTIEON_DNASCOPE { path fai path known_dbsnp path known_dbsnp_tbi + path call_interval path ml_model output: - tuple val(meta), path("*_dnascope.vcf") , emit: vcf - tuple val(meta), path("*_dnascope.vcf.idx") , emit: vcf_index + tuple val(meta), path("*_dnascope.vcf.gz") , emit: vcf + tuple val(meta), path("*_dnascope.vcf.gz.tbi") , emit: vcf_index path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - def dbsnp = known_dbsnp ? "-d ${known_dbsnp}" : '' - def model = ml_model ? "--model ${ml_model}" : '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def interval = call_interval ? "--interval ${call_interval}" : '' + def dbsnp = known_dbsnp ? "-d ${known_dbsnp}" : '' + def model = ml_model ? "--model ${ml_model}" : '' + def prefix = task.ext.prefix ?: "${meta.id}" """ sentieon driver \\ @@ -34,9 +36,10 @@ process SENTIEON_DNASCOPE { -i $bam \\ --algo DNAscope \\ $dbsnp \\ + $interval \\ $args2 \\ $model \\ - ${prefix}_dnascope.vcf + ${prefix}_dnascope.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -47,8 +50,8 @@ process SENTIEON_DNASCOPE { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_dnascope.vcf - touch ${prefix}_dnascope.vcf.idx + touch ${prefix}_dnascope.vcf.gz + touch ${prefix}_dnascope.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index a809f8a3..8af1eb4d 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -13,6 +13,7 @@ workflow CALL_SNV { fai // channel: [genome.fai] known_dbsnp // channel: [ /path/to/known_dbsnp ] known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] + call_interval // channel: [ /path/to/call_intervals ] ml_model // channel: [ /path/to/ml_model ] case_info // channel: [ case_id ] @@ -26,7 +27,7 @@ workflow CALL_SNV { ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) } else if ( variant_caller == "sentieon" ) { - CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, ml_model ) + CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, call_interval, ml_model ) ch_vcf = CALL_SNV_SENTIEON.out.vcf ch_tabix = CALL_SNV_SENTIEON.out.tabix ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) diff --git a/subworkflows/local/call_snv_sentieon.nf b/subworkflows/local/call_snv_sentieon.nf index 53d916dc..f9f2c3cf 100644 --- a/subworkflows/local/call_snv_sentieon.nf +++ b/subworkflows/local/call_snv_sentieon.nf @@ -4,21 +4,21 @@ include { SENTIEON_DNASCOPE } from '../../modules/local/sentieon/dnascope' include { SENTIEON_DNAMODELAPPLY } from '../../modules/local/sentieon/dnamodelapply' -include { TABIX_TABIX as TABIX_SENTIEON } from '../../modules/nf-core/modules/tabix/tabix/main' workflow CALL_SNV_SENTIEON { take: - input // channel: [ val(meta), bam, bai ] - fasta // path: genome.fasta - fai // path: genome.fai - dbsnp // path: params.known_dbsnp - dbsnp_index // path: params.known_dbsnp - ml_model // path: params.ml_model + input // channel: [ val(meta), bam, bai ] + fasta // path: genome.fasta + fai // path: genome.fai + dbsnp // path: params.known_dbsnp + dbsnp_index // path: params.known_dbsnp + call_interval // path: params.call_interval + ml_model // path: params.ml_model main: ch_versions = Channel.empty() - SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, ml_model ) + SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, call_interval, ml_model ) ch_vcf = SENTIEON_DNASCOPE.out.vcf ch_index = SENTIEON_DNASCOPE.out.vcf_index ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions) @@ -33,10 +33,8 @@ workflow CALL_SNV_SENTIEON { ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions) } - TABIX_SENTIEON (ch_vcf) - emit: vcf = ch_vcf - tabix = TABIX_SENTIEON.out.tbi + tabix = ch_index versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 1bc6fd80..e1133bdd 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -27,7 +27,8 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -ch_ml_model = params.ml_model ? file(params.ml_model) : [] +ch_ml_model = params.ml_model ? file(params.ml_model) : [] +ch_call_interval = params.call_interval ? file(params.call_interval) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From c0ff3e68f7d2c1c57bad84fc8a4e2f2233c9abff Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 18 May 2022 15:51:04 +0200 Subject: [PATCH 0539/1169] fix input channel mismatch for callsnv --- workflows/raredisease.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e1133bdd..b19580bf 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -164,6 +164,7 @@ workflow RAREDISEASE { ch_references.genome_fai, ch_references.known_dbsnp, ch_references.known_dbsnp_tbi, + ch_call_interval, ch_ml_model, CHECK_INPUT.out.case_info ) From 1f91aaa54f09a2f7c5f331f584d2145bab0376d9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 18 May 2022 16:08:56 +0200 Subject: [PATCH 0540/1169] Update conf/genomes.config Co-authored-by: Anders Jemt --- conf/genomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index 53f2f180..5dda2207 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -30,7 +30,7 @@ params { 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" - bwa = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.{amb,ann,bwt,pac,sa}" + bwa = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.fasta.{amb,ann,bwt,pac,sa}" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" call_interval = "" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" From eca1291337ea3759685e8f31c79535df564c3227 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 19 May 2022 13:22:11 +0200 Subject: [PATCH 0541/1169] add index --- modules/local/ensemblvep/main.nf | 2 +- .../local/annotate_structural_variants.nf | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index c2264d16..0094ae79 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -8,7 +8,7 @@ process ENSEMBLVEP { 'quay.io/biocontainers/ensembl-vep:105.0--pl5321h4a94de4_1' }" input: - tuple val(meta), path(vcf) + tuple val(meta), path(vcf), path(index) val genome val species val cache_version diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 673d93c1..07bd8902 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -2,10 +2,11 @@ // A subworkflow to annotate structural variants. // -include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' -include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' -include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' -include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' +include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' +include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' +include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' +include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' +include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { @@ -55,8 +56,17 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) BCFTOOLS_VIEW(ch_sortvcf,[],[],[]) + ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) - ENSEMBLVEP_SV(BCFTOOLS_VIEW.out.vcf, + TABIX_SV_ANNO (BCFTOOLS_VIEW.out.vcf) + ch_versions = ch_versions.mix(TABIX_SV_ANNO.out.versions) + + BCFTOOLS_VIEW.out + .vcf + .join(TABIX_SV_ANNO.out.tbi) + .set { ch_vep_in } + + ENSEMBLVEP_SV(ch_vep_in, vep_genome, "homo_sapiens", vep_cache_version, From 1b67c275bf366dc571119bf82be33b28c58cc998 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Wed, 25 May 2022 10:32:32 +0200 Subject: [PATCH 0542/1169] removes tmp fix from local copy of markduplicates --- modules/nf-core/modules/picard/markduplicates/main.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index 5a30974a..e754a587 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -29,8 +29,6 @@ process PICARD_MARKDUPLICATES { avail_mem = task.memory.giga } """ - mkdir tmp - export _JAVA_OPTIONS=-Djava.io.tmpdir=./tmp picard \\ -Xmx${avail_mem}g \\ MarkDuplicates \\ From 0ac1dd378ff5fa712c38e30bae3964f5b40e6fe1 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 27 May 2022 11:57:11 +0200 Subject: [PATCH 0543/1169] Adds gens_switch to nextflow_schema.json --- nextflow_schema.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index 186aa161..19e8dc66 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -214,6 +214,12 @@ "default": false, "description": "Specifies whether or not to run annotate structural variant subworkflow.", "fa_icon": "fas fa-book" + }, + "gens_switch": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to run gens preprocessing subworkflow.", + "fa_icon": "fas fa-book" } } }, From fc23319e5b3c07e0a0dff2c3e27afa941d9a4de5 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Fri, 27 May 2022 12:08:25 +0200 Subject: [PATCH 0544/1169] Run prettier --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49783c0c..3caefff5 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Note that it is possible to include/exclude certain tools or steps. ### Work in progress flowchart -![nf-core/raredisease work in progress](https://docs.google.com/drawings/d/e/2PACX-1vTam7xjHBQTo1QsOpMUpd5F2vUZK5aXuf51OpSBaaV_2xMwfS1oN6GgVeQEJHjNNXRtCVHdGjCVFyzO/pub?w=2268&h=2268) +![nf-core/raredisease work in progress](https://docs.google.com/drawings/d/e/2PACX-1vTam7xjHBQTo1QsOpMUpd5F2vUZK5aXuf51OpSBaaV_2xMwfS1oN6GgVeQEJHjNNXRtCVHdGjCVFyzO/pub?w=2268&h=2268) Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). From 51f3a8c13edd4bd977fb4e06d67e8c28dc3a385a Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Wed, 1 Jun 2022 08:16:22 +0200 Subject: [PATCH 0545/1169] Changes CALL_SNV_DEEPVARIANT to CALL_SNV --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 83836751..735bb207 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -186,7 +186,7 @@ workflow RAREDISEASE { if (params.gens_switch) { GENS ( ch_mapped.bam_bai, - CALL_SNV_DEEPVARIANT.out.vcf, + CALL_SNV.out.vcf, ch_references.genome_fasta, ch_references.genome_fai, file(params.gens_interval_list), From 38ac11b7435dcadee34f4693c98cb32d417637b7 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 1 Jun 2022 10:37:22 +0200 Subject: [PATCH 0546/1169] Created wgsmetricsalgo.nf from datametrics.nf --- modules/local/sentieon/wgsmetricsalgo.nf | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 modules/local/sentieon/wgsmetricsalgo.nf diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf new file mode 100644 index 00000000..012054b7 --- /dev/null +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -0,0 +1,68 @@ +process SENTIEON_DATAMETRICS { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + secret 'SENTIEON_LICENSE_BASE64' + + input: + tuple val(meta), path(bam), path(bai) + path fasta + path fai + + output: + tuple val(meta), path('*mq_metrics.txt') , emit: mq_metrics + tuple val(meta), path('*qd_metrics.txt') , emit: qd_metrics + tuple val(meta), path('*gc_summary.txt') , emit: gc_summary + tuple val(meta), path('*gc_metrics.txt') , emit: gc_metrics + tuple val(meta), path('*aln_metrics.txt') , emit: aln_metrics + tuple val(meta), path('*is_metrics.txt') , emit: is_metrics + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def input = bam.sort().collect{"-i $it"}.join(' ') + def prefix = task.ext.prefix ?: "${meta.id}" + """ + if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then + echo "Initializing SENTIEON_LICENSE env variable" + source sentieon_init.sh SENTIEON_LICENSE_BASE64 + fi + + sentieon \\ + driver \\ + -t $task.cpus \\ + -r $fasta \\ + $input \\ + $args \\ + --algo GCBias --summary ${prefix}_gc_summary.txt ${prefix}_gc_metrics.txt \\ + --algo MeanQualityByCycle ${prefix}_mq_metrics.txt \\ + --algo QualDistribution ${prefix}_qd_metrics.txt \\ + --algo InsertSizeMetricAlgo ${prefix}_is_metrics.txt \\ + --algo AlignmentStat ${prefix}_aln_metrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_mq_metrics.txt + touch ${prefix}_qd_metrics.txt + touch ${prefix}_gc_summary.txt + touch ${prefix}_gc_metrics.txt + touch ${prefix}_aln_metrics.txt + touch ${prefix}_is_metrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ +} From fc29d3093424f9d696011236ed43f7a167a4fc95 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 1 Jun 2022 10:52:57 +0200 Subject: [PATCH 0547/1169] Modified to wgsmetricsalgo algorithm --- modules/local/sentieon/wgsmetricsalgo.nf | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index 012054b7..f3935665 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -1,6 +1,6 @@ process SENTIEON_DATAMETRICS { tag "$meta.id" - label 'process_high' + label 'process_medium' label 'sentieon' secret 'SENTIEON_LICENSE_BASE64' @@ -11,12 +11,7 @@ process SENTIEON_DATAMETRICS { path fai output: - tuple val(meta), path('*mq_metrics.txt') , emit: mq_metrics - tuple val(meta), path('*qd_metrics.txt') , emit: qd_metrics - tuple val(meta), path('*gc_summary.txt') , emit: gc_summary - tuple val(meta), path('*gc_metrics.txt') , emit: gc_metrics - tuple val(meta), path('*aln_metrics.txt') , emit: aln_metrics - tuple val(meta), path('*is_metrics.txt') , emit: is_metrics + tuple val(meta), path('*wgs_metrics.txt') , emit: wgs_metrics path "versions.yml" , emit: versions when: @@ -38,11 +33,7 @@ process SENTIEON_DATAMETRICS { -r $fasta \\ $input \\ $args \\ - --algo GCBias --summary ${prefix}_gc_summary.txt ${prefix}_gc_metrics.txt \\ - --algo MeanQualityByCycle ${prefix}_mq_metrics.txt \\ - --algo QualDistribution ${prefix}_qd_metrics.txt \\ - --algo InsertSizeMetricAlgo ${prefix}_is_metrics.txt \\ - --algo AlignmentStat ${prefix}_aln_metrics.txt + --algo WgsMetricsAlgo ${prefix}_wgs_metrics.txt \\ cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -53,12 +44,7 @@ process SENTIEON_DATAMETRICS { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_mq_metrics.txt - touch ${prefix}_qd_metrics.txt - touch ${prefix}_gc_summary.txt - touch ${prefix}_gc_metrics.txt - touch ${prefix}_aln_metrics.txt - touch ${prefix}_is_metrics.txt + touch ${prefix}_wgs_metrics.txt cat <<-END_VERSIONS > versions.yml "${task.process}": From fa67309937b6e58a88005105f445e04fd16a30a6 Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Wed, 1 Jun 2022 15:49:31 +0200 Subject: [PATCH 0548/1169] feat started working on subworkflow --- subworkflows/local/align_MT.nf | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 subworkflows/local/align_MT.nf diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf new file mode 100644 index 00000000..7d062594 --- /dev/null +++ b/subworkflows/local/align_MT.nf @@ -0,0 +1,45 @@ +// +// Prepare bam files for MT allignment +// + +include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' +include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' +include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' +include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' +include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' + +workflow ALIGN_MT { + take: + fastq // TO DO d: and file: bam index: bam.bai + + main: + ch_versions = Channel.empty() + + // Outputs bam files + BWAMEM2_MEM_MT ( fastq ) + ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) + + // Merges bam files + GATK4_MERGEBAMALIGNMENT_MT ( BWAMEM2_MEM_MT.out.bam ) + ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) + + // Marks duplicates + PICARD_MARKDUPLICATES_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) + ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) + + // Calls variants with Mutect2 + GATK4_MUTECT2_MT ( PICARD_MARKDUPLICATES_MT.out.bam ) + ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) + + // Haplocheck + HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) + ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) + + + emit: + vcf = GATK4_MUTECT2_MT.out.vcf + tbi = GATK4_MUTECT2_MT.out.tbi + txt = HAPLOCHECK_MT.out.txt + html = HAPLOCHECK_MT.out.html + versions = ch_versions // channel: [ versions.yml ] +} From 981fb572833b0896309c80458a737ce03661c73e Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Wed, 1 Jun 2022 16:44:54 +0200 Subject: [PATCH 0549/1169] feat added subw to main and added input data --- subworkflows/local/align_MT.nf | 9 ++++++--- workflows/raredisease.nf | 13 ++++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 7d062594..9827a1b0 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -11,16 +11,19 @@ include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../mo workflow ALIGN_MT { take: fastq // TO DO d: and file: bam index: bam.bai + fasta + fai + dict main: ch_versions = Channel.empty() // Outputs bam files - BWAMEM2_MEM_MT ( fastq ) + BWAMEM2_MEM_MT ( fastq , fasta, true) ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) // Merges bam files - GATK4_MERGEBAMALIGNMENT_MT ( BWAMEM2_MEM_MT.out.bam ) + GATK4_MERGEBAMALIGNMENT_MT ( BWAMEM2_MEM_MT.out.bam, fasta, dict ) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) // Marks duplicates @@ -28,7 +31,7 @@ workflow ALIGN_MT { ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) // Calls variants with Mutect2 - GATK4_MUTECT2_MT ( PICARD_MARKDUPLICATES_MT.out.bam ) + GATK4_MUTECT2_MT ( PICARD_MARKDUPLICATES_MT.out.bam, fasta, fai, dict, [], [], [], [] ) ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) // Haplocheck diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index b19580bf..71bf39b2 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -77,6 +77,7 @@ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' +include { ALIGN_MT } from '../subworkflows/local/align_MT' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -196,13 +197,23 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(ch_sv_annotate.versions) } - // STEP 2.1: MT CALLING + // STEP 2.1: PREPARING MT ALIGNMENT PREPARE_MT_ALIGNMENT ( ch_mapped.bam_bai ) ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) + // STEP 2.2: MT ALLIGNMENT + + ALIGN_MT ( + PREPARE_MT_ALIGNMENT.out.fastq, + ch_references.genome_fasta, + ch_references.genome_fai, + ch_references.sequence_dict + ) + ch_versions = ch_versions.mix(ALIGN_MT.out.versions) + // STEP 3: VARIANT ANNOTATION ch_dv_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) From 91ddc66b631b77752b7d01e1162f226ff542ea4c Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 15:59:13 +0200 Subject: [PATCH 0550/1169] Implements suggested change to publishDir --- conf/modules.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index a533aeb6..ee26aefd 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -489,7 +489,8 @@ process { withName: GENS { publishDir = [ path: { "${params.outdir}/gens" }, - mode: 'copy' + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } From 3906da54aefc400899b44751e96cb1ff77b6b1a6 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 16:00:36 +0200 Subject: [PATCH 0551/1169] Removes gatk4/haplotypecaller module --- modules.json | 5 +- .../modules/gatk4/haplotypecaller/main.nf | 54 ------------- .../modules/gatk4/haplotypecaller/meta.yml | 75 ------------------- 3 files changed, 1 insertion(+), 133 deletions(-) delete mode 100644 modules/nf-core/modules/gatk4/haplotypecaller/main.nf delete mode 100644 modules/nf-core/modules/gatk4/haplotypecaller/meta.yml diff --git a/modules.json b/modules.json index 6c518b3e..f882a05a 100644 --- a/modules.json +++ b/modules.json @@ -51,9 +51,6 @@ "gatk4/createsequencedictionary": { "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, - "gatk4/haplotypecaller": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, "gatk4/intervallisttools": { "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, @@ -137,4 +134,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/gatk4/haplotypecaller/main.nf b/modules/nf-core/modules/gatk4/haplotypecaller/main.nf deleted file mode 100644 index 33871fcf..00000000 --- a/modules/nf-core/modules/gatk4/haplotypecaller/main.nf +++ /dev/null @@ -1,54 +0,0 @@ -process GATK4_HAPLOTYPECALLER { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" - - input: - tuple val(meta), path(input), path(input_index), path(intervals) - path fasta - path fai - path dict - path dbsnp - path dbsnp_tbi - - output: - tuple val(meta), path("*.vcf.gz"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def interval_option = intervals ? "-L ${intervals}" : "" - def dbsnp_option = dbsnp ? "-D ${dbsnp}" : "" - def avail_mem = 3 - if (!task.memory) { - log.info '[GATK HaplotypeCaller] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - """ - gatk \\ - --java-options "-Xmx${avail_mem}g" \\ - HaplotypeCaller \\ - -R $fasta \\ - -I $input \\ - ${dbsnp_option} \\ - ${interval_option} \\ - -O ${prefix}.vcf.gz \\ - $args \\ - --tmp-dir . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/gatk4/haplotypecaller/meta.yml b/modules/nf-core/modules/gatk4/haplotypecaller/meta.yml deleted file mode 100644 index 81851a96..00000000 --- a/modules/nf-core/modules/gatk4/haplotypecaller/meta.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: gatk4_haplotypecaller -description: Call germline SNPs and indels via local re-assembly of haplotypes -keywords: - - gatk4 - - haplotypecaller - - haplotype -tools: - - gatk4: - description: | - Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools - with a primary focus on variant discovery and genotyping. Its powerful processing engine - and high-performance computing features make it capable of taking on projects of any size. - homepage: https://gatk.broadinstitute.org/hc/en-us - documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s - doi: 10.1158/1538-7445.AM2017-3590 - licence: ["Apache-2.0"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: - type: file - description: BAM/CRAM file from alignment - pattern: "*.{bam,cram}" - - input_index: - type: file - description: BAI/CRAI file from alignment - pattern: "*.{bai,crai}" - - intervals: - type: file - description: Bed file with the genomic regions included in the library (optional) - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - - fai: - type: file - description: Index of reference fasta file - pattern: "fasta.fai" - - dict: - type: file - description: GATK sequence dictionary - pattern: "*.dict" - - dbsnp: - type: file - description: VCF file containing known sites (optional) - - dbsnp_tbi: - type: file - description: VCF index of dbsnp (optional) - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - vcf: - type: file - description: Compressed VCF file - pattern: "*.vcf.gz" - - tbi: - type: file - description: Index of VCF file - pattern: "*.vcf.gz.tbi" - -authors: - - "@suzannejin" - - "@FriederikeHanssen" From 7074cf44a988c154099e68ce51248b536c03c0b2 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 16:01:58 +0200 Subject: [PATCH 0552/1169] Removes debug lines --- subworkflows/local/gens.nf | 3 --- 1 file changed, 3 deletions(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 5f7b0616..23511954 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -24,9 +24,6 @@ workflow GENS { [meta, bam, bai, []] }.set { ch_bam } - bam.view() - ch_bam.view() - COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) From 73f108bae67dfc86eb7b85f4fcd0ca48f35f096f Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 16:03:35 +0200 Subject: [PATCH 0553/1169] Removes unused mapping --- subworkflows/local/gens.nf | 3 --- 1 file changed, 3 deletions(-) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 23511954..e88b27f6 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -20,9 +20,6 @@ workflow GENS { main: ch_versions = Channel.empty() - bam.map { meta, bam, bai -> - [meta, bam, bai, []] - }.set { ch_bam } COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) From a67d2cf0eedd1942f12ec635260649f36fa78dfd Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 16:05:46 +0200 Subject: [PATCH 0554/1169] Implements suggestions --- modules/local/gens/main.nf | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index 9ea940b4..e8033e9c 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -2,10 +2,7 @@ process GENS { tag "$meta.id" label 'process_medium' - //conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'raysloks/gens_preproc:1.0.1' : - 'raysloks/gens_preproc:1.0.1' }" + container 'raysloks/gens_preproc:1.0.1' input: tuple val(meta), path(read_counts) From 96f9fc6816fcb9f9e228ea5ec9832bb111a57ff3 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 16:14:38 +0200 Subject: [PATCH 0555/1169] Implements suggestion --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index ee26aefd..33b9e890 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -482,7 +482,7 @@ process { ] } - withName: GATK4_COLLECTREADCOUNTS { + withName: '.*GENS:COLLECTREADCOUNTS' { ext.args = '--interval-merging-rule OVERLAPPING_ONLY' } From 52a45822ec082730ad08987a1f67781d6f806da1 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 16:33:47 +0200 Subject: [PATCH 0556/1169] Adds gens params to nextflow_schema.json --- nextflow_schema.json | 67 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index a5420d3b..12742886 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,7 +10,10 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": ["input", "outdir"], + "required": [ + "input", + "outdir" + ], "properties": { "input": { "type": "string", @@ -200,6 +203,30 @@ "fa_icon": "fas fa-map-marker-alt", "description": "Local directory base for genome references that map to the config.", "help_text": "This folder is a flat structure with file names that map to the config." + }, + "gens_interval_list": { + "type": "string", + "format": "file-path", + "fa_icon": "fas fa-bezier-curve", + "description": "Path to interval list for Gens.", + "help_text": "This file contains the binning intervals used for CollectReadCounts.", + "hidden": true + }, + "gens_pon": { + "type": "string", + "format": "file-path", + "fa_icon": "far fa-file-code", + "description": "Path to panel of normals for Gens.", + "help_text": "The panel used to run DenoiseReadCounts.", + "hidden": true + }, + "gens_gnomad_pos": { + "type": "string", + "format": "file-path", + "fa_icon": "far fa-bezier-curve", + "description": "Path to a list of common SNP locations for Gens.", + "help_text": "Locations of gnomad SNPs with a high enough BAF.", + "hidden": true } } }, @@ -214,7 +241,11 @@ "default": "wgs", "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", - "enum": ["wgs", "wes", "mito"] + "enum": [ + "wgs", + "wes", + "mito" + ] }, "annotate_sv_switch": { "type": "boolean", @@ -241,7 +272,10 @@ "default": "bwamem2", "description": "Specifies the alignment algorithm to use - available options are 'bwamem2' and 'sentieon'.", "fa_icon": "fas fa-map-signs", - "enum": ["bwamem2", "sentieon"] + "enum": [ + "bwamem2", + "sentieon" + ] }, "rmdup": { "type": "boolean", @@ -276,14 +310,21 @@ "default": "snp", "description": "Specifies the variant types for sentieon variant caller.", "fa_icon": "fas fa-map-signs", - "enum": ["snp", "indel", "snp,indel"] + "enum": [ + "snp", + "indel", + "snp,indel" + ] }, "variant_caller": { "type": "string", "default": "deepvariant", "description": "Specifies the variant caller to use - available options are 'deepvariant' and 'sentieon'.", "fa_icon": "fas fa-map-signs", - "enum": ["deepvariant", "sentieon"] + "enum": [ + "deepvariant", + "sentieon" + ] } } }, @@ -318,7 +359,10 @@ "default": "104", "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", - "enum": ["104", "105"] + "enum": [ + "104", + "105" + ] } } }, @@ -429,7 +473,14 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "move" + ], "hidden": true }, "email_on_fail": { @@ -528,4 +579,4 @@ "$ref": "#/definitions/generic_options" } ] -} +} \ No newline at end of file From 7c99fb65cb4fe367e39755781478cdf74191db47 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 16:40:17 +0200 Subject: [PATCH 0557/1169] Adds stubs to the new modules --- modules/local/gatk4/collectreadcounts/main.nf | 11 +++++++++++ modules/local/gatk4/denoisereadcounts/main.nf | 12 ++++++++++++ modules/local/gens/main.nf | 14 ++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index 598a8676..de6fed4f 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -42,4 +42,15 @@ process GATK4_COLLECTREADCOUNTS { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.hdf5 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/local/gatk4/denoisereadcounts/main.nf b/modules/local/gatk4/denoisereadcounts/main.nf index a22aefdb..8ca2e8a7 100644 --- a/modules/local/gatk4/denoisereadcounts/main.nf +++ b/modules/local/gatk4/denoisereadcounts/main.nf @@ -39,4 +39,16 @@ process GATK4_DENOISEREADCOUNTS { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.standardizedCR.tsv + touch ${prefix}.denoisedCR.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index e8033e9c..f6cd8eb5 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -34,4 +34,18 @@ process GENS { generate_gens_data.pl: \$(echo \$(generate_gens_data.pl --version 2>&1)) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.baf.bed.gz + touch ${prefix}.baf.bed.gz.tbi + touch ${prefix}.cov.bed.gz + touch ${prefix}.cov.bed.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + generate_gens_data.pl: \$(echo \$(generate_gens_data.pl --version 2>&1)) + END_VERSIONS + """ } From 1aca1165d81ed7e9b4691bf6ee96f27d0ee137f6 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 16:44:35 +0200 Subject: [PATCH 0558/1169] Adds default: null to new params --- nextflow_schema.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index 12742886..f70b9023 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -207,6 +207,7 @@ "gens_interval_list": { "type": "string", "format": "file-path", + "default": null, "fa_icon": "fas fa-bezier-curve", "description": "Path to interval list for Gens.", "help_text": "This file contains the binning intervals used for CollectReadCounts.", @@ -215,6 +216,7 @@ "gens_pon": { "type": "string", "format": "file-path", + "default": null, "fa_icon": "far fa-file-code", "description": "Path to panel of normals for Gens.", "help_text": "The panel used to run DenoiseReadCounts.", @@ -223,6 +225,7 @@ "gens_gnomad_pos": { "type": "string", "format": "file-path", + "default": null, "fa_icon": "far fa-bezier-curve", "description": "Path to a list of common SNP locations for Gens.", "help_text": "Locations of gnomad SNPs with a high enough BAF.", From a3cb5ae5be89c226a6d43f7cfe7a1b166a7c64db Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 16:54:00 +0200 Subject: [PATCH 0559/1169] Run prettier --- modules.json | 2 +- nextflow_schema.json | 43 ++++++++----------------------------------- 2 files changed, 9 insertions(+), 36 deletions(-) diff --git a/modules.json b/modules.json index f882a05a..60f0b643 100644 --- a/modules.json +++ b/modules.json @@ -134,4 +134,4 @@ } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index f70b9023..98e67b1a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,10 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": [ - "input", - "outdir" - ], + "required": ["input", "outdir"], "properties": { "input": { "type": "string", @@ -244,11 +241,7 @@ "default": "wgs", "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", - "enum": [ - "wgs", - "wes", - "mito" - ] + "enum": ["wgs", "wes", "mito"] }, "annotate_sv_switch": { "type": "boolean", @@ -275,10 +268,7 @@ "default": "bwamem2", "description": "Specifies the alignment algorithm to use - available options are 'bwamem2' and 'sentieon'.", "fa_icon": "fas fa-map-signs", - "enum": [ - "bwamem2", - "sentieon" - ] + "enum": ["bwamem2", "sentieon"] }, "rmdup": { "type": "boolean", @@ -313,21 +303,14 @@ "default": "snp", "description": "Specifies the variant types for sentieon variant caller.", "fa_icon": "fas fa-map-signs", - "enum": [ - "snp", - "indel", - "snp,indel" - ] + "enum": ["snp", "indel", "snp,indel"] }, "variant_caller": { "type": "string", "default": "deepvariant", "description": "Specifies the variant caller to use - available options are 'deepvariant' and 'sentieon'.", "fa_icon": "fas fa-map-signs", - "enum": [ - "deepvariant", - "sentieon" - ] + "enum": ["deepvariant", "sentieon"] } } }, @@ -362,10 +345,7 @@ "default": "104", "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", - "enum": [ - "104", - "105" - ] + "enum": ["104", "105"] } } }, @@ -476,14 +456,7 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], "hidden": true }, "email_on_fail": { @@ -582,4 +555,4 @@ "$ref": "#/definitions/generic_options" } ] -} \ No newline at end of file +} From 7307805baaa79d297ec704ec1d1093829f36fc21 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Tue, 7 Jun 2022 17:05:48 +0200 Subject: [PATCH 0560/1169] Adds new params to main.nf --- main.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main.nf b/main.nf index 84323d7c..d9dda4c9 100644 --- a/main.nf +++ b/main.nf @@ -34,6 +34,9 @@ params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_c params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') params.vep_cache = WorkflowMain.getGenomeAttribute(params, 'vep_cache') +params.gens_interval_list = WorkflowMain.getGenomeAttribute(params, 'gens_interval_list') +params.gens_pon = WorkflowMain.getGenomeAttribute(params, 'gens_pon') +params.gens_gnomad_pos = WorkflowMain.getGenomeAttribute(params, 'gens_gnomad_pos') /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 23f613b77897396e5b8fe99af0d17e7e5955f7ed Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 7 Jun 2022 17:30:22 +0200 Subject: [PATCH 0561/1169] add roh --- conf/modules.config | 11 +++- modules.json | 3 + modules/nf-core/modules/bcftools/roh/main.nf | 61 +++++++++++++++++++ modules/nf-core/modules/bcftools/roh/meta.yml | 55 +++++++++++++++++ subworkflows/local/annotate_snvs.nf | 49 +++++++++++++++ subworkflows/nf-core/annotate_vcfanno.nf | 24 -------- workflows/raredisease.nf | 20 +++--- 7 files changed, 191 insertions(+), 32 deletions(-) create mode 100644 modules/nf-core/modules/bcftools/roh/main.nf create mode 100644 modules/nf-core/modules/bcftools/roh/meta.yml create mode 100644 subworkflows/local/annotate_snvs.nf delete mode 100644 subworkflows/nf-core/annotate_vcfanno.nf diff --git a/conf/modules.config b/conf/modules.config index 4d1038db..47e9f6c3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -530,7 +530,16 @@ process { // process { - withName: '.*ANNOTATE_VCFANNO:VCFANNO' { + withName: '.*ANNOTATE_SNVS:VCFANNO' { + publishDir = [ + path: { "${params.outdir}/variant_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { + ext.args = { "--samples ${meta.id}" } publishDir = [ path: { "${params.outdir}/variant_annotation" }, mode: params.publish_dir_mode, diff --git a/modules.json b/modules.json index 60f0b643..41606171 100644 --- a/modules.json +++ b/modules.json @@ -6,6 +6,9 @@ "bcftools/norm": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, + "bcftools/roh": { + "git_sha": "b0dba3ee7543dc89a00575fb619408de97cd889d" + }, "bcftools/view": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, diff --git a/modules/nf-core/modules/bcftools/roh/main.nf b/modules/nf-core/modules/bcftools/roh/main.nf new file mode 100644 index 00000000..890b6fad --- /dev/null +++ b/modules/nf-core/modules/bcftools/roh/main.nf @@ -0,0 +1,61 @@ +process BCFTOOLS_ROH { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': + 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" + + input: + tuple val(meta), path(vcf), path(tbi) + path af_file + path genetic_map + path regions_file + path samples_file + path targets_file + + output: + tuple val(meta), path("*.roh"), emit: roh + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def af_read = af_file ? "--AF-file ${af_file}" : '' + def gen_map = genetic_map ? "--genetic-map ${genetic_map}" : '' + def reg_file = regions_file ? "--regions-file ${regions_file}" : '' + def samp_file = samples_file ? "--samples-file ${samples_file}" : '' + def targ_file = targets_file ? "--targets-file ${targets_file}" : '' + """ + bcftools \\ + roh \\ + $args \\ + $af_read \\ + $gen_map \\ + $reg_file \\ + $samp_file \\ + $targ_file \\ + -o ${prefix}.roh \\ + $vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.roh + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/bcftools/roh/meta.yml b/modules/nf-core/modules/bcftools/roh/meta.yml new file mode 100644 index 00000000..fd03d4ce --- /dev/null +++ b/modules/nf-core/modules/bcftools/roh/meta.yml @@ -0,0 +1,55 @@ +name: "bcftools_roh" +description: A program for detecting runs of homo/autozygosity. Only bi-allelic sites are considered. +keywords: + - roh +tools: + - "roh": + description: "A program for detecting runs of homo/autozygosity. Only bi-allelic sites are considered." + homepage: https://www.htslib.org/ + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF file + pattern: "*.{vcf,.vcf.gz}" + - af_file: + type: file + description: "Read allele frequencies from a tab-delimited file containing the columns: CHROM\tPOS\tREF,ALT\tAF." + - genetic_map: + type: file + description: "Genetic map in the format required also by IMPUTE2." + - regions_file: + type: file + description: "Regions can be specified either on command line or in a VCF, BED, or tab-delimited file (the default)." + - samples_file: + type: file + description: "File of sample names to include or exclude if prefixed with '^'." + - targets_file: + type: file + description: "Targets can be specified either on command line or in a VCF, BED, or tab-delimited file (the default)." + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - roh: + type: file + description: Contains site-specific and/or per-region runs of homo/autozygosity calls. + pattern: "*.{roh}" + +authors: + - "@ramprasadn" diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf new file mode 100644 index 00000000..9fcb2ce5 --- /dev/null +++ b/subworkflows/local/annotate_snvs.nf @@ -0,0 +1,49 @@ +// +// A subworkflow to annotate snvs +// + +include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' +include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/bcftools/roh/main' + + +workflow ANNOTATE_SNVS { + + take: + vcf + vcfanno_resource_dir + vcfanno_toml + vep_genome + vep_cache_version + vep_cache + fasta + gnomad_af + samples + + main: + ch_versions = Channel.empty() + ch_toml = file(vcfanno_toml) + + vcf.map { meta, vcf, idx -> + return [meta, []] + } + .set { ch_placeholder } + + VCFANNO (vcf, ch_placeholder, ch_toml, vcfanno_resource_dir) + ch_versions = ch_versions.mix(VCFANNO.out.versions) + + vcf.map { meta, vcf, idx -> + return [ vcf, idx ] + } + .set { ch_roh_vcfs} + + samples + .combine(ch_roh_vcfs) + .set { ch_roh_input } + + ch_roh_input.view() + BCFTOOLS_ROH (ch_roh_input, gnomad_af, [], [], [], []) + + emit: + vcf_ann = VCFANNO.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/subworkflows/nf-core/annotate_vcfanno.nf b/subworkflows/nf-core/annotate_vcfanno.nf deleted file mode 100644 index ce665ba5..00000000 --- a/subworkflows/nf-core/annotate_vcfanno.nf +++ /dev/null @@ -1,24 +0,0 @@ -// -// Annotate with VCFanno -// - -include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' - -workflow ANNOTATE_VCFANNO { - take: - toml // channel: path(toml) - vcf // channel: [ val(meta), path(vcf), path(tbi) ] - resource_dir // channel: path(resource_dir) - - main: - ch_versions = Channel.empty() - ch_toml = file(toml) - - ch_placeholder = vcf.map { meta, vcf, idx -> vcf = []; [meta, vcf] } - VCFANNO (vcf, ch_placeholder, ch_toml, resource_dir) - ch_versions = ch_versions.mix(VCFANNO.out.versions) - - emit: - annotated_vcf = VCFANNO.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] -} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index b19580bf..29b16d12 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -50,9 +50,11 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // include { CHECK_INPUT } from '../subworkflows/local/check_input' include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' +include { ANNOTATE_SNVS } from '../subworkflows/local/annotate_snvs' include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' include { ALIGN } from '../subworkflows/local/align' include { CALL_SNV } from '../subworkflows/local/call_snv' +include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -74,9 +76,7 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' include { QC_BAM } from '../subworkflows/nf-core/qc_bam' -include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -204,14 +204,20 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) // STEP 3: VARIANT ANNOTATION - ch_dv_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) + ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) - ANNOTATE_VCFANNO ( + ANNOTATE_SNVS ( + ch_vcf, + ch_references.vcfanno_resources, params.vcfanno_toml, - ch_dv_vcf, - ch_references.vcfanno_resources + params.genome, + params.vep_cache_version, + params.vep_cache, + ch_references.genome_fasta, + ch_references.gnomad_vcf, + CHECK_INPUT.out.samples ) - ch_versions = ch_versions.mix(ANNOTATE_VCFANNO.out.versions) + ch_versions = ch_versions.mix(ANNOTATE_SNVS.out.versions) // // MODULE: Pipeline reporting From f3373e669fddfa49407ca862fbd19008e37a4f68 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Jun 2022 08:04:09 +0200 Subject: [PATCH 0562/1169] add comment --- subworkflows/local/annotate_snvs.nf | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 9fcb2ce5..9fc83a3a 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -23,6 +23,9 @@ workflow ANNOTATE_SNVS { ch_versions = Channel.empty() ch_toml = file(vcfanno_toml) + // + // annotate vcfanno + // vcf.map { meta, vcf, idx -> return [meta, []] } @@ -31,6 +34,9 @@ workflow ANNOTATE_SNVS { VCFANNO (vcf, ch_placeholder, ch_toml, vcfanno_resource_dir) ch_versions = ch_versions.mix(VCFANNO.out.versions) + // + // annotate rhocall + // vcf.map { meta, vcf, idx -> return [ vcf, idx ] } @@ -41,7 +47,7 @@ workflow ANNOTATE_SNVS { .set { ch_roh_input } ch_roh_input.view() - BCFTOOLS_ROH (ch_roh_input, gnomad_af, [], [], [], []) + BCFTOOLS_ROH (ch_roh_input, gnomad_af.collect{it[1]}, [], [], [], []) emit: vcf_ann = VCFANNO.out.vcf From 7707b6da7b6be5a2483c0a2b185fcfd9548c7d07 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Jun 2022 08:13:41 +0200 Subject: [PATCH 0563/1169] remove view --- subworkflows/local/annotate_snvs.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 9fc83a3a..11cb7e58 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -46,7 +46,6 @@ workflow ANNOTATE_SNVS { .combine(ch_roh_vcfs) .set { ch_roh_input } - ch_roh_input.view() BCFTOOLS_ROH (ch_roh_input, gnomad_af.collect{it[1]}, [], [], [], []) emit: From 4a1b0e0069f9f63ee114e35a7b1988df2d165720 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Jun 2022 14:00:19 +0200 Subject: [PATCH 0564/1169] add tab file --- conf/genomes.config | 4 ++++ conf/modules.config | 9 ++++++++ main.nf | 2 ++ modules/nf-core/modules/bcftools/roh/main.nf | 2 +- nextflow_schema.json | 14 ++++++++++++ subworkflows/local/annotate_snvs.nf | 2 +- subworkflows/local/prepare_references.nf | 24 ++++++++++++++++---- 7 files changed, 51 insertions(+), 6 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 5dda2207..4a4c01fc 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -17,6 +17,8 @@ params { bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" call_interval = "" gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" + gnomad_af = "" + gnomad_af_tbi = "" known_dbsnp = "" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" @@ -34,6 +36,8 @@ params { bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" call_interval = "" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" + gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" + gnomad_af_tbi = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" diff --git a/conf/modules.config b/conf/modules.config index 47e9f6c3..6533ac13 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -165,6 +165,15 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + + withName: '.*PREPARE_REFERENCES:TABIX_GNOMAD_AF' { + ext.args = '-s 1 -b 2 -e 2' + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } // diff --git a/main.nf b/main.nf index 84323d7c..775656f6 100644 --- a/main.nf +++ b/main.nf @@ -22,6 +22,8 @@ params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') +params.gnomad_af = WorkflowMain.getGenomeAttribute(params, 'gnomad_af') +params.gnomad_tbi = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_tbi') params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') diff --git a/modules/nf-core/modules/bcftools/roh/main.nf b/modules/nf-core/modules/bcftools/roh/main.nf index 890b6fad..83ac4e65 100644 --- a/modules/nf-core/modules/bcftools/roh/main.nf +++ b/modules/nf-core/modules/bcftools/roh/main.nf @@ -9,7 +9,7 @@ process BCFTOOLS_ROH { input: tuple val(meta), path(vcf), path(tbi) - path af_file + tuple path(af_file), path(af_file_tbi) path genetic_map path regions_file path samples_file diff --git a/nextflow_schema.json b/nextflow_schema.json index 3f68b9ee..6a50cd32 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -101,6 +101,20 @@ "description": "Path to directory for gnomad vcf.", "help_text": "Path to the gnomad vcf file. If you don't provide one, gnomad annotations will not be used." }, + "gnomad_af": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-bezier-curve", + "description": "Path to the gnomad tab file with allele frequencies.", + "help_text": "Path to the gnomad tab file with CHR/START/REF,ALT/AF. Can be generated from gnomad annoations vcf" + }, + "gnomad_af_tbi": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-bezier-curve", + "description": "Path to the index file for the gnomad tab file with allele frequencies.", + "help_text": "Path to the index of gnomad tab file with CHR/START/REF,ALT/AF" + }, "known_dbsnp": { "type": "string", "format": "path", diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 11cb7e58..cb118f3b 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -46,7 +46,7 @@ workflow ANNOTATE_SNVS { .combine(ch_roh_vcfs) .set { ch_roh_input } - BCFTOOLS_ROH (ch_roh_input, gnomad_af.collect{it[1]}, [], [], [], []) + BCFTOOLS_ROH (ch_roh_input, gnomad_af, [], [], [], []) emit: vcf_ann = VCFANNO.out.vcf diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 6ab7ec2b..c98d8bd7 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -2,10 +2,11 @@ // Prepare reference files // -include { CHECK_BED } from './prepare_bed' -include { CHECK_VCF } from './prepare_vcf' -include { PREPARE_GENOME } from './prepare_genome' -include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/modules/tabix/tabix/main' +include { CHECK_BED } from './prepare_bed' +include { CHECK_VCF } from './prepare_vcf' +include { PREPARE_GENOME } from './prepare_genome' +include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/modules/tabix/tabix/main' +include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/modules/tabix/tabix/main' workflow PREPARE_REFERENCES { @@ -15,6 +16,8 @@ workflow PREPARE_REFERENCES { fasta // [mandatory] genome.fasta fai // [mandatory] genome.fai gnomad + gnomad_af + gnomad_af_tbi known_dbsnp known_dbsnp_tbi sentieonbwa_index @@ -63,6 +66,18 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(CHECK_VCF.out.versions) } + // Gnomad tab + ch_gnomad_af = Channel.empty() + if (!gnomad_af_tbi && gnomad_af) { + ch_gnomad_tab = [[id:'gnomad'], file(gnomad_af)] + TABIX_GNOMAD_AF(ch_gnomad_tab) + ch_gnomad_tbi = TABIX_GNOMAD_AF.out.tbi + ch_gnomad_af = ch_gnomad_tab.join(ch_gnomad_tbi) + ch_versions = ch_versions.mix(CHECK_VCF.out.versions) + } else if (!gnomad_af_tbi && gnomad_af) { + ch_gnomad_af = [[id:'gnomad'], file(gnomad_af), file(gnomad_af_tbi)] + } + // Target bed ch_target_bed = Channel.empty() ch_target_intervals = Channel.empty() @@ -90,6 +105,7 @@ workflow PREPARE_REFERENCES { known_dbsnp_tbi = ch_dbsnp_tbi gnomad_vcf = ch_gnomad_vcf gnomad_idx = ch_gnomad_idx + gnomad_af = ch_gnomad_af target_bed = ch_target_bed target_intervals = ch_target_intervals bait_intervals = ch_bait_intervals From 5ff2defbdfe49f35f20e4c9a4a396f78bdc4778c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Jun 2022 14:00:45 +0200 Subject: [PATCH 0565/1169] modify input to prepare references --- workflows/raredisease.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 29b16d12..9f808d32 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -112,6 +112,8 @@ workflow RAREDISEASE { params.fasta, params.fasta_fai, params.gnomad, + params.gnomad_af, + params.gnomad_af_tbi, params.known_dbsnp, params.known_dbsnp_tbi, params.sentieonbwa_index, @@ -214,7 +216,7 @@ workflow RAREDISEASE { params.vep_cache_version, params.vep_cache, ch_references.genome_fasta, - ch_references.gnomad_vcf, + ch_references.gnomad_af, CHECK_INPUT.out.samples ) ch_versions = ch_versions.mix(ANNOTATE_SNVS.out.versions) From a17e0e18d4a4cad9bf137691cb0fbf0ba22b34fe Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Jun 2022 14:29:24 +0200 Subject: [PATCH 0566/1169] fix variable name conflicts --- main.nf | 2 +- subworkflows/local/prepare_references.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 775656f6..dd0efcfe 100644 --- a/main.nf +++ b/main.nf @@ -23,7 +23,7 @@ params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') params.gnomad_af = WorkflowMain.getGenomeAttribute(params, 'gnomad_af') -params.gnomad_tbi = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_tbi') +params.gnomad_af_tbi = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_tbi') params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index c98d8bd7..288cab2e 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -72,10 +72,10 @@ workflow PREPARE_REFERENCES { ch_gnomad_tab = [[id:'gnomad'], file(gnomad_af)] TABIX_GNOMAD_AF(ch_gnomad_tab) ch_gnomad_tbi = TABIX_GNOMAD_AF.out.tbi - ch_gnomad_af = ch_gnomad_tab.join(ch_gnomad_tbi) + ch_gnomad_af = ch_gnomad_tab.join(ch_gnomad_tbi).collect{ it -> return [it[1], it[2]]} ch_versions = ch_versions.mix(CHECK_VCF.out.versions) - } else if (!gnomad_af_tbi && gnomad_af) { - ch_gnomad_af = [[id:'gnomad'], file(gnomad_af), file(gnomad_af_tbi)] + } else if (gnomad_af_tbi && gnomad_af) { + ch_gnomad_af = [file(gnomad_af), file(gnomad_af_tbi)] } // Target bed From 30194ef8197c9633f07d253683ce5f01a5144784 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:12:27 +0200 Subject: [PATCH 0567/1169] revert rohcall --- modules/nf-core/modules/bcftools/roh/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/modules/bcftools/roh/main.nf b/modules/nf-core/modules/bcftools/roh/main.nf index 83ac4e65..890b6fad 100644 --- a/modules/nf-core/modules/bcftools/roh/main.nf +++ b/modules/nf-core/modules/bcftools/roh/main.nf @@ -9,7 +9,7 @@ process BCFTOOLS_ROH { input: tuple val(meta), path(vcf), path(tbi) - tuple path(af_file), path(af_file_tbi) + path af_file path genetic_map path regions_file path samples_file From 0fbe94bddd3b597e9d78005d07d4d2bd2c8387d9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:34:13 +0200 Subject: [PATCH 0568/1169] update bcftools/roh --- modules.json | 2 +- modules/nf-core/modules/bcftools/roh/main.nf | 2 +- modules/nf-core/modules/bcftools/roh/meta.yml | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules.json b/modules.json index 41606171..7ead82c1 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "bcftools/roh": { - "git_sha": "b0dba3ee7543dc89a00575fb619408de97cd889d" + "git_sha": "c079ee20250f5676c53b145fdd00f9defe91f112" }, "bcftools/view": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" diff --git a/modules/nf-core/modules/bcftools/roh/main.nf b/modules/nf-core/modules/bcftools/roh/main.nf index 890b6fad..83ac4e65 100644 --- a/modules/nf-core/modules/bcftools/roh/main.nf +++ b/modules/nf-core/modules/bcftools/roh/main.nf @@ -9,7 +9,7 @@ process BCFTOOLS_ROH { input: tuple val(meta), path(vcf), path(tbi) - path af_file + tuple path(af_file), path(af_file_tbi) path genetic_map path regions_file path samples_file diff --git a/modules/nf-core/modules/bcftools/roh/meta.yml b/modules/nf-core/modules/bcftools/roh/meta.yml index fd03d4ce..fa0fd088 100644 --- a/modules/nf-core/modules/bcftools/roh/meta.yml +++ b/modules/nf-core/modules/bcftools/roh/meta.yml @@ -23,6 +23,9 @@ input: - af_file: type: file description: "Read allele frequencies from a tab-delimited file containing the columns: CHROM\tPOS\tREF,ALT\tAF." + - af_file_tbi: + type: file + description: "tbi index of af_file." - genetic_map: type: file description: "Genetic map in the format required also by IMPUTE2." From c3dd6690ed1f8ab214a0cc8b8dd0fc5af4381a48 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:39:08 +0200 Subject: [PATCH 0569/1169] prettier --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49783c0c..3caefff5 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Note that it is possible to include/exclude certain tools or steps. ### Work in progress flowchart -![nf-core/raredisease work in progress](https://docs.google.com/drawings/d/e/2PACX-1vTam7xjHBQTo1QsOpMUpd5F2vUZK5aXuf51OpSBaaV_2xMwfS1oN6GgVeQEJHjNNXRtCVHdGjCVFyzO/pub?w=2268&h=2268) +![nf-core/raredisease work in progress](https://docs.google.com/drawings/d/e/2PACX-1vTam7xjHBQTo1QsOpMUpd5F2vUZK5aXuf51OpSBaaV_2xMwfS1oN6GgVeQEJHjNNXRtCVHdGjCVFyzO/pub?w=2268&h=2268) Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). From e80b143bfc18843dd7d7e20b0e4f5971cb969909 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:57:49 +0200 Subject: [PATCH 0570/1169] fix spacing --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 6533ac13..1a8e0d19 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -547,7 +547,7 @@ process { ] } - withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { + withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { ext.args = { "--samples ${meta.id}" } publishDir = [ path: { "${params.outdir}/variant_annotation" }, From 1d5529b00e26ea27d4cdd6ed12ed3c72a62ddde3 Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Thu, 9 Jun 2022 09:35:21 +0200 Subject: [PATCH 0571/1169] Removes meta_vcf --- modules/local/gens/main.nf | 6 +++--- subworkflows/local/gens.nf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index f6cd8eb5..70671ee8 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -6,12 +6,12 @@ process GENS { input: tuple val(meta), path(read_counts) - tuple val(meta_vcf), path(vcf) - path gnomad_positions + tuple path(vcf) + path gnomad_positions output: tuple val(meta), path('*.cov.bed.gz'), emit: cov - tuple val(meta_vcf), path('*.baf.bed.gz'), emit: baf + tuple val(meta), path('*.baf.bed.gz'), emit: baf path "versions.yml" , emit: versions script: diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index e88b27f6..f4dd6f3b 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -27,7 +27,7 @@ workflow GENS { DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions) - GENS_GENERATE ( DENOISEREADCOUNTS.out.standardized_read_counts, vcf, gnomad_pos ) + GENS_GENERATE ( DENOISEREADCOUNTS.out.standardized_read_counts, vcf.map { meta, vcf -> vcf }, gnomad_pos ) ch_versions = ch_versions.mix(GENS_GENERATE.out.versions) emit: From 991ad1970a02770753d4f7dd280b9bd8afb4b43d Mon Sep 17 00:00:00 2001 From: Emil Bertilsson Date: Thu, 9 Jun 2022 09:39:21 +0200 Subject: [PATCH 0572/1169] Fixes single element tuple --- modules/local/gens/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index 70671ee8..f4e113c5 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -6,7 +6,7 @@ process GENS { input: tuple val(meta), path(read_counts) - tuple path(vcf) + path vcf path gnomad_positions output: From 9bf1bf193fc0abc773bd36d39b417a11b3dd3dee Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Jun 2022 17:16:59 +0200 Subject: [PATCH 0573/1169] update readme --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index e19d7301..1ef9bcba 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,6 @@ > > You can follow the work in the [dev](https://github.com/nf-core/raredisease/tree/dev) branch. - - **nf-core/raredisease** is a bioinformatics best-practice analysis pipeline for call and score variants from WGS/WES of rare disease patients. The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! From b0eed811daf391b3d9ab80faca50f94a4ccc87aa Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Jun 2022 17:33:03 +0200 Subject: [PATCH 0574/1169] install rhocall --- modules.json | 3 ++ .../nf-core/modules/rhocall/annotate/main.nf | 51 ++++++++++++++++++ .../nf-core/modules/rhocall/annotate/meta.yml | 54 +++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 modules/nf-core/modules/rhocall/annotate/main.nf create mode 100644 modules/nf-core/modules/rhocall/annotate/meta.yml diff --git a/modules.json b/modules.json index 7ead82c1..7fb17a8a 100644 --- a/modules.json +++ b/modules.json @@ -90,6 +90,9 @@ "qualimap/bamqc": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, + "rhocall/annotate": { + "git_sha": "17a4e931427b5b144c0d0227a3ea49347ba7457a" + }, "samtools/faidx": { "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, diff --git a/modules/nf-core/modules/rhocall/annotate/main.nf b/modules/nf-core/modules/rhocall/annotate/main.nf new file mode 100644 index 00000000..95d647b1 --- /dev/null +++ b/modules/nf-core/modules/rhocall/annotate/main.nf @@ -0,0 +1,51 @@ +process RHOCALL_ANNOTATE { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::rhocall=0.5.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/rhocall:0.5.1--py39hbf8eff0_0': + 'quay.io/biocontainers/rhocall:0.5.1--py39hbf8eff0_0' }" + + input: + tuple val(meta), path(vcf), path(tbi) + tuple val(meta), path(roh) + path bed + + output: + tuple val(meta), path("*_rhocall.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def az_bed = bed ? "-b ${bed}" : '' + """ + rhocall \\ + annotate \\ + $args \\ + $az_bed \\ + -r $roh \\ + -o ${prefix}_rhocall.vcf \\ + $vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rhocall: \$(echo \$(rhocall --version 2>&1) | sed 's/rhocall, version //' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_rhocall.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rhocall: \$(echo \$(rhocall --version 2>&1) | sed 's/rhocall, version //' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/rhocall/annotate/meta.yml b/modules/nf-core/modules/rhocall/annotate/meta.yml new file mode 100644 index 00000000..4ece9d2b --- /dev/null +++ b/modules/nf-core/modules/rhocall/annotate/meta.yml @@ -0,0 +1,54 @@ +name: "rhocall_annotate" +description: "Markup VCF file using rho-calls." +keywords: + - roh + - rhocall +tools: + - "rhocall": + description: "Call regions of homozygosity and make tentative UPD calls." + homepage: "https://github.com/dnil/rhocall" + documentation: "https://github.com/dnil/rhocall" + tool_dev_url: "https://github.com/dnil" + doi: "" + licence: "['GPL v3']" + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: vcf file + pattern: "*.{vcf,vcf.gz}" + - tbi: + type: file + description: vcf index file + pattern: "*.{tbi}" + - roh: + type: file + description: Bcftools roh style TSV file with CHR,POS,AZ,QUAL + pattern: "*.{roh}" + - bed: + type: file + description: BED file with AZ windows. + pattern: "*.{bed}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: vcf file + pattern: "*.{vcf,vcf.gz}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@ramprasadn" From ed57b2020935cad1aa22631cb8bbcddb342ba489 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Jun 2022 18:04:57 +0200 Subject: [PATCH 0575/1169] add rhocall to subworkflow --- conf/modules.config | 11 ++++++++++- subworkflows/local/annotate_snvs.nf | 22 ++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1a8e0d19..c323775e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -548,7 +548,16 @@ process { } withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { - ext.args = { "--samples ${meta.id}" } + ext.args = { "--samples ${meta.id} --skip-indels " } + publishDir = [ + path: { "${params.outdir}/variant_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ANNOTATE_SNVS:RHOCALL_ANNOTATE' { + ext.args = { "--v14 " } publishDir = [ path: { "${params.outdir}/variant_annotation" }, mode: params.publish_dir_mode, diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index cb118f3b..5376bbc6 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -2,8 +2,9 @@ // A subworkflow to annotate snvs // -include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' -include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/bcftools/roh/main' +include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' +include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/bcftools/roh/main' +include { RHOCALL_ANNOTATE } from '../../modules/nf-core/modules/rhocall/annotate/main' workflow ANNOTATE_SNVS { @@ -43,11 +44,28 @@ workflow ANNOTATE_SNVS { .set { ch_roh_vcfs} samples + .branch { it -> + affected: it.phenotype == "2" + unaffected: it.phenotype == "1" + } + .set {ch_phenotype} + + ch_phenotype.affected .combine(ch_roh_vcfs) .set { ch_roh_input } BCFTOOLS_ROH (ch_roh_input, gnomad_af, [], [], [], []) + BCFTOOLS_ROH.out.roh + .map { meta, roh -> + new_meta = [:] + new_meta.id = meta.case_id + return [new_meta, roh] + } + .set { ch_roh_rhocall} + + RHOCALL_ANNOTATE (vcf, ch_roh_rhocall, []) + emit: vcf_ann = VCFANNO.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] From 7c3a557fe26c7f926346b672a4bc8b6392cb75d4 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Jun 2022 22:48:40 +0200 Subject: [PATCH 0576/1169] change output --- subworkflows/local/annotate_snvs.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 5376bbc6..ed91a430 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -67,6 +67,6 @@ workflow ANNOTATE_SNVS { RHOCALL_ANNOTATE (vcf, ch_roh_rhocall, []) emit: - vcf_ann = VCFANNO.out.vcf + vcf_ann = RHOCALL_ANNOTATE.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 13784cf87a2ba895ad7b2f49c1a25ef8c51144f8 Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Tue, 14 Jun 2022 14:09:19 +0200 Subject: [PATCH 0577/1169] feat installed modules and updated markdup and bwamem2 --- modules.json | 13 ++- .../modules/gatk4/mergebamalignment/main.nf | 57 ++++++++++++ .../modules/gatk4/mergebamalignment/meta.yml | 46 ++++++++++ modules/nf-core/modules/gatk4/mutect2/main.nf | 74 +++++++++++++++ .../nf-core/modules/gatk4/mutect2/meta.yml | 89 +++++++++++++++++++ modules/nf-core/modules/haplocheck/main.nf | 44 +++++++++ modules/nf-core/modules/haplocheck/meta.yml | 55 ++++++++++++ .../modules/picard/markduplicates/main.nf | 12 +-- 8 files changed, 382 insertions(+), 8 deletions(-) create mode 100644 modules/nf-core/modules/gatk4/mergebamalignment/main.nf create mode 100644 modules/nf-core/modules/gatk4/mergebamalignment/meta.yml create mode 100644 modules/nf-core/modules/gatk4/mutect2/main.nf create mode 100644 modules/nf-core/modules/gatk4/mutect2/meta.yml create mode 100644 modules/nf-core/modules/haplocheck/main.nf create mode 100644 modules/nf-core/modules/haplocheck/meta.yml diff --git a/modules.json b/modules.json index 60f0b643..1b497897 100644 --- a/modules.json +++ b/modules.json @@ -54,6 +54,12 @@ "gatk4/intervallisttools": { "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, + "gatk4/mergebamalignment": { + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" + }, + "gatk4/mutect2": { + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" + }, "gatk4/revertsam": { "git_sha": "f231291e7730654158cbd3f10b82c292e27fa273" }, @@ -63,6 +69,9 @@ "glnexus": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, + "haplocheck": { + "git_sha": "f5615c3db63a2bda7a1dbfaeae447cac3161d7b9" + }, "manta/germline": { "git_sha": "ffedf09b6e84b479c9c901274f74bb33f3777243" }, @@ -79,7 +88,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/markduplicates": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "63db63757cab03cfa7a02c0d0f134b66fbfadea6" }, "picard/sortvcf": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" @@ -134,4 +143,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/gatk4/mergebamalignment/main.nf b/modules/nf-core/modules/gatk4/mergebamalignment/main.nf new file mode 100644 index 00000000..ff51de06 --- /dev/null +++ b/modules/nf-core/modules/gatk4/mergebamalignment/main.nf @@ -0,0 +1,57 @@ +process GATK4_MERGEBAMALIGNMENT { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" + + input: + tuple val(meta), path(aligned), path(unmapped) + path fasta + path dict + + output: + tuple val(meta), path('*.bam'), emit: bam + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK MergeBamAlignment] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" MergeBamAlignment \\ + --UNMAPPED_BAM $unmapped \\ + --ALIGNED_BAM $aligned \\ + --OUTPUT ${prefix}.bam \\ + --REFERENCE_SEQUENCE $fasta \\ + --TMP_DIR . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/mergebamalignment/meta.yml b/modules/nf-core/modules/gatk4/mergebamalignment/meta.yml new file mode 100644 index 00000000..b4bff490 --- /dev/null +++ b/modules/nf-core/modules/gatk4/mergebamalignment/meta.yml @@ -0,0 +1,46 @@ +name: gatk4_mergebamalignment +description: Merge unmapped with mapped BAM files +keywords: + - bam + - merge +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - aligned: + type: file + description: The aligned bam file + pattern: "*.{bam}" + - unaligned: + type: file + description: The unmaped bam file + pattern: "*.{bam}" + - fasta: + type: file + description: The reference fasta file + - dict: + type: file + description: GATK sequence dictionary +output: + - bam: + type: file + description: The merged bam file + pattern: "*.bam" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@kevinmenden" diff --git a/modules/nf-core/modules/gatk4/mutect2/main.nf b/modules/nf-core/modules/gatk4/mutect2/main.nf new file mode 100644 index 00000000..abec0d73 --- /dev/null +++ b/modules/nf-core/modules/gatk4/mutect2/main.nf @@ -0,0 +1,74 @@ +process GATK4_MUTECT2 { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" + + input: + tuple val(meta), path(input), path(input_index), path(intervals) + path fasta + path fai + path dict + path germline_resource + path germline_resource_tbi + path panel_of_normals + path panel_of_normals_tbi + + output: + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi + tuple val(meta), path("*.stats") , emit: stats + tuple val(meta), path("*.f1r2.tar.gz"), optional:true, emit: f1r2 + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def inputs = input.collect{ "--input $it"}.join(" ") + def interval_command = intervals ? "--intervals $intervals" : "" + def pon_command = panel_of_normals ? "--panel-of-normals $panel_of_normals" : "" + def gr_command = germline_resource ? "--germline-resource $germline_resource" : "" + + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK Mutect2] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" Mutect2 \\ + $inputs \\ + --output ${prefix}.vcf.gz \\ + --reference $fasta \\ + $pon_command \\ + $gr_command \\ + $interval_command \\ + --tmp-dir . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + touch ${prefix}.vcf.gz.stats + touch ${prefix}.f1r2.tar.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gatk4/mutect2/meta.yml b/modules/nf-core/modules/gatk4/mutect2/meta.yml new file mode 100644 index 00000000..aa0a02aa --- /dev/null +++ b/modules/nf-core/modules/gatk4/mutect2/meta.yml @@ -0,0 +1,89 @@ +name: gatk4_mutect2 +description: Call somatic SNVs and indels via local assembly of haplotypes. +keywords: + - gatk4 + - mutect2 + - haplotype + - somatic +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - input: + type: list + description: list of BAM files, also able to take CRAM as an input + pattern: "*.{bam/cram}" + - input_index: + type: list + description: list of BAM file indexes, also able to take CRAM indexes as an input + pattern: "*.{bam.bai/cram.crai}" + - intervals: + type: File/string + description: Specify region the tools is run on. + pattern: ".{bed,interval_list}/chrM" + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fasta.fai" + - dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" + - germline_resource: + type: file + description: Population vcf of germline sequencing, containing allele fractions. + pattern: "*.vcf.gz" + - germline_resource_tbi: + type: file + description: Index file for the germline resource. + pattern: "*.vcf.gz.tbi" + - panel_of_normals: + type: file + description: vcf file to be used as a panel of normals. + pattern: "*.vcf.gz" + - panel_of_normals_tbi: + type: file + description: Index for the panel of normals. + pattern: "*.vcf.gz.tbi" + +output: + - vcf: + type: file + description: compressed vcf file + pattern: "*.vcf.gz" + - tbi: + type: file + description: Index of vcf file + pattern: "*vcf.gz.tbi" + - stats: + type: file + description: Stats file that pairs with output vcf file + pattern: "*vcf.gz.stats" + - f1r2: + type: file + description: file containing information to be passed to LearnReadOrientationModel (only outputted when tumor_normal_pair mode is run) + pattern: "*.f1r2.tar.gz" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@GCJMackenzie" diff --git a/modules/nf-core/modules/haplocheck/main.nf b/modules/nf-core/modules/haplocheck/main.nf new file mode 100644 index 00000000..08c1c76b --- /dev/null +++ b/modules/nf-core/modules/haplocheck/main.nf @@ -0,0 +1,44 @@ +process HAPLOCHECK { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::haplocheck=1.3.3" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/haplocheck:1.3.3--h4a94de4_0': + 'quay.io/biocontainers/haplocheck:1.3.3--h4a94de4_0' }" + + input: + tuple val(meta), path(vcf) + + output: + tuple val(meta), path("*.txt") , emit: txt + tuple val(meta), path("*.html"), emit: html + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + haplocheck --raw --out $prefix $vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + haplocheck: \$(echo \$(haplocheck --version 2>&1) | cut -f 2 -d " " ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.raw.txt + touch ${prefix}.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + haplocheck: \$(echo \$(haplocheck --version 2>&1) | cut -f 2 -d " " ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/haplocheck/meta.yml b/modules/nf-core/modules/haplocheck/meta.yml new file mode 100644 index 00000000..79da6a40 --- /dev/null +++ b/modules/nf-core/modules/haplocheck/meta.yml @@ -0,0 +1,55 @@ +name: "haplocheck" +description: | + Haplocheck detects contamination patterns in mtDNA AND WGS sequencing studies by analyzing + the mitochondrial DNA. Haplocheck also works as a proxy tool for nDNA studies and provides + users a graphical report to investigate the contamination further. Internally, it uses the + Haplogrep tool, that supports rCRS and RSRS mitochondrial versions. +keywords: + - mitochondrial + - mtDNA + - contamination +tools: + - "haplocheck": + description: "Detects in-sample contamination in mtDNA or WGS sequencing studies by analyzing the mitochondrial content." + homepage: "https://github.com/genepi/haplocheck" + documentation: "https://github.com/genepi/haplocheck" + tool_dev_url: "https://github.com/genepi/haplocheck" + doi: 10.1101/gr.256545.119 + licence: "['MIT']" + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + + - vcf: + type: file + description: VCF file + pattern: "*.{vcf.gz}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + + - txt: + type: file + description: Raw report in txt format + pattern: "*.{txt}" + + - html: + type: file + description: Haplocheck HTML report + pattern: "*.{html}" + +authors: + - "@lmtani" diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index e754a587..87f913d4 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -2,10 +2,10 @@ process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.2" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.2--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.2--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -33,9 +33,9 @@ process PICARD_MARKDUPLICATES { -Xmx${avail_mem}g \\ MarkDuplicates \\ $args \\ - I=$bam \\ - O=${prefix}.bam \\ - M=${prefix}.MarkDuplicates.metrics.txt + --INPUT $bam \\ + --OUTPUT ${prefix}.bam \\ + --METRICS_FILE ${prefix}.MarkDuplicates.metrics.txt cat <<-END_VERSIONS > versions.yml "${task.process}": From 60011ea82fe4574cc3eac451fc32a00d97a9a480 Mon Sep 17 00:00:00 2001 From: Lucia Pena Perez Date: Wed, 15 Jun 2022 07:55:37 +0200 Subject: [PATCH 0578/1169] feat changing module conf and adjusting parameters for align_MT --- conf/modules.config | 10 ++++++++++ subworkflows/local/align_MT.nf | 18 +++++++++++------- subworkflows/local/prepare_MT_alignment.nf | 1 + workflows/raredisease.nf | 8 +++++--- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 4d1038db..8dacdc36 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -556,3 +556,13 @@ process { ext.args = '--VALIDATION_STRINGENCY LENIENT' } } + +// +// ALIGN_MT +// + +process { + withName: '.*ALIGN_MT:GATK4_MERGEBAMALIGNMENT_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT' + } +} diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 9827a1b0..d7579e15 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -10,20 +10,24 @@ include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../mo workflow ALIGN_MT { take: - fastq // TO DO d: and file: bam index: bam.bai - fasta - fai - dict + fastq // Fastq + ubam // unmapped bam + index // channel: [ /path/to/bwamem2/index/ ] + fasta // channel: [genome.fasta] + dict // channel: [genome.dict] + fai // channel: [genome.fai] main: ch_versions = Channel.empty() // Outputs bam files - BWAMEM2_MEM_MT ( fastq , fasta, true) - ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) + BWAMEM2_MEM_MT ( fastq , index, true) + ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) + ch_mt_bam = BWAMEM2_MEM_MT.out.bam + ch_fastq_ubam = ch_mt_bam.join(ubam, by: [0]) // Merges bam files - GATK4_MERGEBAMALIGNMENT_MT ( BWAMEM2_MEM_MT.out.bam, fasta, dict ) + GATK4_MERGEBAMALIGNMENT_MT ( ch_fastq_ubam, fasta, dict ) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) // Marks duplicates diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/prepare_MT_alignment.nf index 16654ffa..7a05cb96 100644 --- a/subworkflows/local/prepare_MT_alignment.nf +++ b/subworkflows/local/prepare_MT_alignment.nf @@ -27,5 +27,6 @@ workflow PREPARE_MT_ALIGNMENT { emit: fastq = GATK4_SAMTOFASTQ_MT.out.fastq + bam = GATK4_REVERTSAM_MT.out.bam versions = ch_versions // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 71bf39b2..dd41532e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -208,9 +208,11 @@ workflow RAREDISEASE { ALIGN_MT ( PREPARE_MT_ALIGNMENT.out.fastq, - ch_references.genome_fasta, - ch_references.genome_fai, - ch_references.sequence_dict + PREPARE_MT_ALIGNMENT.out.bam, + ch_references.aligner_index, + ch_references.genome_fasta, + ch_references.sequence_dict, + ch_references.genome_fai ) ch_versions = ch_versions.mix(ALIGN_MT.out.versions) From 6dc3ec4fe6ce1e5eb53a1551a1729803cf77f0a9 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 15 Jun 2022 11:51:05 +0200 Subject: [PATCH 0579/1169] Fixed alignment --- modules/local/sentieon/wgsmetricsalgo.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index f3935665..1b019ff7 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -11,8 +11,8 @@ process SENTIEON_DATAMETRICS { path fai output: - tuple val(meta), path('*wgs_metrics.txt') , emit: wgs_metrics - path "versions.yml" , emit: versions + tuple val(meta), path('*wgs_metrics.txt'), emit: wgs_metrics + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when From 42c970b5c4f07fea1babccd5f74d279371ae762c Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 15 Jun 2022 15:11:29 +0200 Subject: [PATCH 0580/1169] Update nextflow_schema.json Fixed typo --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 6a50cd32..d69c3d0a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -99,14 +99,14 @@ "format": "path", "fa_icon": "fas fa-bezier-curve", "description": "Path to directory for gnomad vcf.", - "help_text": "Path to the gnomad vcf file. If you don't provide one, gnomad annotations will not be used." + "help_text": "Path to the gnomad annotations vcf file. If you don't provide one, gnomad annotations will not be used." }, "gnomad_af": { "type": "string", "format": "path", "fa_icon": "fas fa-bezier-curve", "description": "Path to the gnomad tab file with allele frequencies.", - "help_text": "Path to the gnomad tab file with CHR/START/REF,ALT/AF. Can be generated from gnomad annoations vcf" + "help_text": "Path to the gnomad tab file with CHR/START/REF,ALT/AF. Can be generated from the gnomad annotations vcf." }, "gnomad_af_tbi": { "type": "string", From 79dfbaf777a342c178032e42f69abf31de218401 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 15 Jun 2022 15:26:48 +0200 Subject: [PATCH 0581/1169] Fixed readme prettier error --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49783c0c..3caefff5 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Note that it is possible to include/exclude certain tools or steps. ### Work in progress flowchart -![nf-core/raredisease work in progress](https://docs.google.com/drawings/d/e/2PACX-1vTam7xjHBQTo1QsOpMUpd5F2vUZK5aXuf51OpSBaaV_2xMwfS1oN6GgVeQEJHjNNXRtCVHdGjCVFyzO/pub?w=2268&h=2268) +![nf-core/raredisease work in progress](https://docs.google.com/drawings/d/e/2PACX-1vTam7xjHBQTo1QsOpMUpd5F2vUZK5aXuf51OpSBaaV_2xMwfS1oN6GgVeQEJHjNNXRtCVHdGjCVFyzO/pub?w=2268&h=2268) Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). From 17ab103e8ca614254c740a7895a18f6bf5c687f4 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 27 Jun 2022 10:07:15 +0200 Subject: [PATCH 0582/1169] feat continue fixing --- conf/modules.config | 8 ++++++++ conf/test.config | 2 ++ main.nf | 1 + subworkflows/local/align_MT.nf | 23 ++++++++++++++++++++++- workflows/raredisease.nf | 6 ++++-- 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 8dacdc36..eac09e19 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -565,4 +565,12 @@ process { withName: '.*ALIGN_MT:GATK4_MERGEBAMALIGNMENT_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT' } + + withName: '.*ALIGN_MT:PICARD_MARKDUPLICATES_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT' + } + + withName: '.*ALIGN_MT:GATK4_MUTECT2_MT' { + ext.args = '--mitochondria' + } } diff --git a/conf/test.config b/conf/test.config index a037cda4..74733d94 100644 --- a/conf/test.config +++ b/conf/test.config @@ -34,4 +34,6 @@ params { vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' + + intervals_mt='https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' } diff --git a/main.nf b/main.nf index 84323d7c..b6559672 100644 --- a/main.nf +++ b/main.nf @@ -22,6 +22,7 @@ params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') +params.intervals_mt = WorkflowMain.getGenomeAttribute(params, 'intervals_mt') params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index d7579e15..66806a40 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -5,6 +5,7 @@ include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' +include { SAMTOOLS_INDEX as SMATOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' @@ -16,6 +17,7 @@ workflow ALIGN_MT { fasta // channel: [genome.fasta] dict // channel: [genome.dict] fai // channel: [genome.fai] + intervals_mt //intervals of MT main: ch_versions = Channel.empty() @@ -32,10 +34,29 @@ workflow ALIGN_MT { // Marks duplicates PICARD_MARKDUPLICATES_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) + + + ch_bam_markdup = PICARD_MARKDUPLICATES_MT.out.bam ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) + // Index bam file + SMATOOLS_INDEX_MT(PICARD_MARKDUPLICATES_MT.out.bam) + ch_bai = Channel.fromPath(SMATOOLS_INDEX_MT.out.bai) + ch2=PICARD_MARKDUPLICATES_MT.out.bam.join(ch_bai, by: [0]) + //ch3=ch2.join([], by:[0]) + + + ch_versions = ch_versions.mix(SMATOOLS_INDEX_MT.out.versions.first()) + + + //PICARD_MARKDUPLICATES_MT.out.bam + //.map {meta, bam -> + // return[meta,bam,SMATOOLS_INDEX_MT.out.bai, intervals_mt] + // }.set {ch3} + + // Calls variants with Mutect2 - GATK4_MUTECT2_MT ( PICARD_MARKDUPLICATES_MT.out.bam, fasta, fai, dict, [], [], [], [] ) + GATK4_MUTECT2_MT ( [ch2, intervals_mt ], fasta, fai, dict, [], [], [], [] ) ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) // Haplocheck diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index dd41532e..7836619c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -16,6 +16,7 @@ def checkPathParamList = [ params.fasta_fai, params.gnomad, params.input, + params.intervals_mt, params.multiqc_config, params.sentieonbwa_index, params.svdb_query_dbs, @@ -205,14 +206,15 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) // STEP 2.2: MT ALLIGNMENT - + ch_int = Channel.fromPath(params.intervals_mt) ALIGN_MT ( PREPARE_MT_ALIGNMENT.out.fastq, PREPARE_MT_ALIGNMENT.out.bam, ch_references.aligner_index, ch_references.genome_fasta, ch_references.sequence_dict, - ch_references.genome_fai + ch_references.genome_fai, + ch_int ) ch_versions = ch_versions.mix(ALIGN_MT.out.versions) From a314f1f74b394cc33c306dde5c56a449f9efbefe Mon Sep 17 00:00:00 2001 From: lucpen Date: Wed, 29 Jun 2022 11:27:51 +0200 Subject: [PATCH 0583/1169] fix input for mutect and changed modules.config --- conf/modules.config | 13 ++++-- modules.json | 3 ++ modules/nf-core/modules/samtools/sort/main.nf | 42 ++++++++++++++++++ .../nf-core/modules/samtools/sort/meta.yml | 44 +++++++++++++++++++ subworkflows/local/align_MT.nf | 36 ++++++--------- 5 files changed, 112 insertions(+), 26 deletions(-) create mode 100644 modules/nf-core/modules/samtools/sort/main.nf create mode 100644 modules/nf-core/modules/samtools/sort/meta.yml diff --git a/conf/modules.config b/conf/modules.config index eac09e19..dd6f9850 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -549,7 +549,7 @@ process { } withName: '.*PREPARE_MT_ALIGNMENT:GATK4_REVERTSAM_MT' { - ext.args = '--VALIDATION_STRINGENCY LENIENT' + ext.args = '--OUTPUT_BY_READGROUP false --VALIDATION_STRINGENCY LENIENT --ATTRIBUTE_TO_CLEAR FT --ATTRIBUTE_TO_CLEAR CO --SORT_ORDER queryname --RESTORE_ORIGINAL_QUALITIES false' } withName: '.*PREPARE_MT_ALIGNMENT:GATK4_SAMTOFASTQ_MT' { @@ -563,14 +563,19 @@ process { process { withName: '.*ALIGN_MT:GATK4_MERGEBAMALIGNMENT_MT' { - ext.args = '--VALIDATION_STRINGENCY LENIENT' + ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' + ext.prefix = { "${meta.id}_merged" } } withName: '.*ALIGN_MT:PICARD_MARKDUPLICATES_MT' { - ext.args = '--VALIDATION_STRINGENCY LENIENT' + ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true --OPTICAL_DUPLICATE_PIXEL_DISTANCE 2500 --ASSUME_SORT_ORDER queryname --CLEAR_DT false --ADD_PG_TAG_TO_READS false' + } + + withName: '.*ALIGN_MT:SMATOOLS_SORT_MT' { + ext.prefix = { "${meta.id}_sorted" } } withName: '.*ALIGN_MT:GATK4_MUTECT2_MT' { - ext.args = '--mitochondria' + ext.args = '--mitochondria-mode TRUE' } } diff --git a/modules.json b/modules.json index 1b497897..bfaeceb2 100644 --- a/modules.json +++ b/modules.json @@ -105,6 +105,9 @@ "samtools/merge": { "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, + "samtools/sort": { + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + }, "samtools/stats": { "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf new file mode 100644 index 00000000..b4fc1cbe --- /dev/null +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -0,0 +1,42 @@ +process SAMTOOLS_SORT { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.bam"), emit: bam + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + """ + samtools sort $args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml new file mode 100644 index 00000000..a820c55a --- /dev/null +++ b/modules/nf-core/modules/samtools/sort/meta.yml @@ -0,0 +1,44 @@ +name: samtools_sort +description: Sort SAM/BAM/CRAM file +keywords: + - sort + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@ewels" diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 66806a40..788941fc 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -6,6 +6,7 @@ include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../mo include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' include { SAMTOOLS_INDEX as SMATOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_SORT as SMATOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' @@ -34,40 +35,31 @@ workflow ALIGN_MT { // Marks duplicates PICARD_MARKDUPLICATES_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) - - - ch_bam_markdup = PICARD_MARKDUPLICATES_MT.out.bam ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) - // Index bam file - SMATOOLS_INDEX_MT(PICARD_MARKDUPLICATES_MT.out.bam) - ch_bai = Channel.fromPath(SMATOOLS_INDEX_MT.out.bai) - ch2=PICARD_MARKDUPLICATES_MT.out.bam.join(ch_bai, by: [0]) - //ch3=ch2.join([], by:[0]) - + // Sort bam file + SMATOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) + ch_versions = ch_versions.mix(SMATOOLS_SORT_MT.out.versions.first()) + // Index bam file + SMATOOLS_INDEX_MT(SMATOOLS_SORT_MT.out.bam) + ch2=SMATOOLS_SORT_MT.out.bam.join(SMATOOLS_INDEX_MT.out.bai, by: [0]) + ch3=ch2.combine(intervals_mt) ch_versions = ch_versions.mix(SMATOOLS_INDEX_MT.out.versions.first()) - - - //PICARD_MARKDUPLICATES_MT.out.bam - //.map {meta, bam -> - // return[meta,bam,SMATOOLS_INDEX_MT.out.bai, intervals_mt] - // }.set {ch3} - - + // Calls variants with Mutect2 - GATK4_MUTECT2_MT ( [ch2, intervals_mt ], fasta, fai, dict, [], [], [], [] ) + GATK4_MUTECT2_MT ( ch3, fasta, fai, dict, [], [], [], [] ) ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) // Haplocheck - HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) - ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) + // HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) + // ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) emit: vcf = GATK4_MUTECT2_MT.out.vcf tbi = GATK4_MUTECT2_MT.out.tbi - txt = HAPLOCHECK_MT.out.txt - html = HAPLOCHECK_MT.out.html + // txt = HAPLOCHECK_MT.out.txt + // html = HAPLOCHECK_MT.out.html versions = ch_versions // channel: [ versions.yml ] } From 190bba327efd3cb81e01fe13dcd9c1eb193a7a15 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 29 Jun 2022 13:42:44 +0200 Subject: [PATCH 0584/1169] Review suggestions --- conf/modules.config | 6 +++--- nextflow_schema.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index c323775e..73eb827c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -541,7 +541,7 @@ process { process { withName: '.*ANNOTATE_SNVS:VCFANNO' { publishDir = [ - path: { "${params.outdir}/variant_annotation" }, + path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] @@ -550,7 +550,7 @@ process { withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { ext.args = { "--samples ${meta.id} --skip-indels " } publishDir = [ - path: { "${params.outdir}/variant_annotation" }, + path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] @@ -559,7 +559,7 @@ process { withName: '.*ANNOTATE_SNVS:RHOCALL_ANNOTATE' { ext.args = { "--v14 " } publishDir = [ - path: { "${params.outdir}/variant_annotation" }, + path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] diff --git a/nextflow_schema.json b/nextflow_schema.json index 6a50cd32..8f72aff7 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -104,14 +104,14 @@ "gnomad_af": { "type": "string", "format": "path", - "fa_icon": "fas fa-bezier-curve", + "fa_icon": "fas fa-file", "description": "Path to the gnomad tab file with allele frequencies.", "help_text": "Path to the gnomad tab file with CHR/START/REF,ALT/AF. Can be generated from gnomad annoations vcf" }, "gnomad_af_tbi": { "type": "string", "format": "path", - "fa_icon": "fas fa-bezier-curve", + "fa_icon": "fas fa-file", "description": "Path to the index file for the gnomad tab file with allele frequencies.", "help_text": "Path to the index of gnomad tab file with CHR/START/REF,ALT/AF" }, From c95714af09ba4c4d96a5465d8cdc4f42c1b8842b Mon Sep 17 00:00:00 2001 From: lucpen Date: Thu, 30 Jun 2022 09:31:02 +0200 Subject: [PATCH 0585/1169] Feat added addorreplacereadgroups --- conf/modules.config | 6 ++- modules.json | 3 ++ .../picard/addorreplacereadgroups/main.nf | 53 +++++++++++++++++++ .../picard/addorreplacereadgroups/meta.yml | 46 ++++++++++++++++ subworkflows/local/align_MT.nf | 21 +++++--- 5 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 modules/nf-core/modules/picard/addorreplacereadgroups/main.nf create mode 100644 modules/nf-core/modules/picard/addorreplacereadgroups/meta.yml diff --git a/conf/modules.config b/conf/modules.config index dd6f9850..14c221b0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -562,13 +562,17 @@ process { // process { + withName: '.*ALIGN_MT:BWAMEM2_MEM_MT' { + ext.args = { "-M -K 100000000" } + } + withName: '.*ALIGN_MT:GATK4_MERGEBAMALIGNMENT_MT' { ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}_merged" } } withName: '.*ALIGN_MT:PICARD_MARKDUPLICATES_MT' { - ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true --OPTICAL_DUPLICATE_PIXEL_DISTANCE 2500 --ASSUME_SORT_ORDER queryname --CLEAR_DT false --ADD_PG_TAG_TO_READS false' + ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' } withName: '.*ALIGN_MT:SMATOOLS_SORT_MT' { diff --git a/modules.json b/modules.json index bfaeceb2..1e4fd609 100644 --- a/modules.json +++ b/modules.json @@ -81,6 +81,9 @@ "multiqc": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, + "picard/addorreplacereadgroups": { + "git_sha": "63db63757cab03cfa7a02c0d0f134b66fbfadea6" + }, "picard/collecthsmetrics": { "git_sha": "35231d394940dca2291ac2321c8f9b2e3b039905" }, diff --git a/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf b/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf new file mode 100644 index 00000000..aff83c9f --- /dev/null +++ b/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf @@ -0,0 +1,53 @@ +process PICARD_ADDORREPLACEREADGROUPS { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::picard=2.27.2" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.27.2--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.2--hdfd78af_0' }" + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.bam"), emit: bam + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def ID = task.ext.id ?: "id" + def LIBRARY= task.ext.library ?: "library" + def PLATFORM= task.ext.platform ?: "illumina" + def BARCODE= task.ext.barcode ?: "barcode" + def SAMPLE= task.ext.sample ?: "sample" + def INDEX= task.ext.index ?: "index" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard AddOrReplaceReadGroups] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + AddOrReplaceReadGroups \\ + -Xmx${avail_mem}g \\ + --INPUT ${bam} \\ + --OUTPUT ${prefix}.bam \\ + --RGID ${ID} \\ + --RGLB ${LIBRARY} \\ + --RGPL ${PLATFORM} \\ + --RGPU ${BARCODE} \\ + --RGSM ${SAMPLE} \\ + --CREATE_INDEX true + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/picard/addorreplacereadgroups/meta.yml b/modules/nf-core/modules/picard/addorreplacereadgroups/meta.yml new file mode 100644 index 00000000..e013bf4b --- /dev/null +++ b/modules/nf-core/modules/picard/addorreplacereadgroups/meta.yml @@ -0,0 +1,46 @@ +name: picard_addorreplacereadgroups +description: Assigns all the reads in a file to a single new read-group +keywords: + - add + - replace + - read-group +tools: + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360037226472-AddOrReplaceReadGroups-Picard- + tool_dev_url: https://github.com/broadinstitute/picard + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Input BAM file + pattern: "*.{bam}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - bam: + type: file + description: Output BAM file + pattern: "*.{bam}" + +authors: + - "@sateeshperi" + - "@mjcipriano" + - "@hseabolt" diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 788941fc..3026578c 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -2,13 +2,14 @@ // Prepare bam files for MT allignment // -include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' -include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' -include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' -include { SAMTOOLS_INDEX as SMATOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_SORT as SMATOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' -include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' -include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' +include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' +include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' +include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/modules/picard/addorreplacereadgroups/main' +include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' +include { SAMTOOLS_INDEX as SMATOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_SORT as SMATOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' +include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' +include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' workflow ALIGN_MT { take: @@ -33,8 +34,12 @@ workflow ALIGN_MT { GATK4_MERGEBAMALIGNMENT_MT ( ch_fastq_ubam, fasta, dict ) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) + // Add read group to merged bam file + PICARD_ADDORREPLACEREADGROUPS_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) + ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) + // Marks duplicates - PICARD_MARKDUPLICATES_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) + PICARD_MARKDUPLICATES_MT ( PICARD_ADDORREPLACEREADGROUPS_MT.out.bam ) ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) // Sort bam file From baf390a3ad01bcd8292a0e6d4899696da81188a1 Mon Sep 17 00:00:00 2001 From: sima-r Date: Mon, 4 Jul 2022 12:40:51 +0200 Subject: [PATCH 0586/1169] added tnscope module which calls mt varinats --- conf/modules.config | 11 +++++++ modules/local/sentieon/tnscope.nf | 52 +++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 modules/local/sentieon/tnscope.nf diff --git a/conf/modules.config b/conf/modules.config index 4d1038db..250f3b4e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -556,3 +556,14 @@ process { ext.args = '--VALIDATION_STRINGENCY LENIENT' } } + +// +// SENTIEON_TNSCOPE_MT_CALL +// + +process { + withName: '.*SENTIEON_TNSCOPE' { + ext.args = { (params.genome == "GRCh37") ? " --interval MT " : "--interval chrM" } + ext.args2 = " --min_init_normal_lod 0,5 --min_normal_lod 2,0 --min_init_tumor_lod 1,0 --min_tumor_lod 2,8 --trim_soft_clip " + } +} \ No newline at end of file diff --git a/modules/local/sentieon/tnscope.nf b/modules/local/sentieon/tnscope.nf new file mode 100644 index 00000000..d3080ac3 --- /dev/null +++ b/modules/local/sentieon/tnscope.nf @@ -0,0 +1,52 @@ +process SENTIEON_TNSCOPE { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + input: + tuple val(meta), path(bam), path(bai) + path fasta + path fai + + output: + tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz") , emit: vcf + tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz.tbi") , emit: vcf_index + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def interval = task.ext.args ?: '' + def call_settings = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + sentieon driver \\ + -t $task.cpus \\ + -r $fasta \\ + -i $bam \\ + $interval \\ + --algo TNscope \\ + --tumor_sample ${meta.id} \\ + $call_settings \\ + ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz + touch ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g" ) + END_VERSIONS + """ +} From 6abe375d2b34e354000d11c34367d0ef3b7c15c5 Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 5 Jul 2022 13:26:55 +0200 Subject: [PATCH 0587/1169] fixed spaces --- modules/local/sentieon/tnscope.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/sentieon/tnscope.nf b/modules/local/sentieon/tnscope.nf index d3080ac3..13d75554 100644 --- a/modules/local/sentieon/tnscope.nf +++ b/modules/local/sentieon/tnscope.nf @@ -26,10 +26,10 @@ process SENTIEON_TNSCOPE { -t $task.cpus \\ -r $fasta \\ -i $bam \\ - $interval \\ + $interval \\ --algo TNscope \\ --tumor_sample ${meta.id} \\ - $call_settings \\ + $call_settings \\ ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz cat <<-END_VERSIONS > versions.yml From 401f5401b85362fe55fef7fda453a4bf4276ea1b Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 5 Jul 2022 13:39:53 +0200 Subject: [PATCH 0588/1169] fixed scpaces --- conf/modules.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 250f3b4e..31a2a113 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -562,8 +562,8 @@ process { // process { - withName: '.*SENTIEON_TNSCOPE' { + withName: '.*SENTIEON_TNSCOPE' { ext.args = { (params.genome == "GRCh37") ? " --interval MT " : "--interval chrM" } ext.args2 = " --min_init_normal_lod 0,5 --min_normal_lod 2,0 --min_init_tumor_lod 1,0 --min_tumor_lod 2,8 --trim_soft_clip " - } -} \ No newline at end of file + } +} From 33bbed677a7581ce4a5cf2ae6da44f0ce698599b Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 5 Jul 2022 13:47:31 +0200 Subject: [PATCH 0589/1169] fixed spaces --- modules/local/sentieon/tnscope.nf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/local/sentieon/tnscope.nf b/modules/local/sentieon/tnscope.nf index 13d75554..fb0b49c5 100644 --- a/modules/local/sentieon/tnscope.nf +++ b/modules/local/sentieon/tnscope.nf @@ -9,17 +9,17 @@ process SENTIEON_TNSCOPE { path fai output: - tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz") , emit: vcf - tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz.tbi") , emit: vcf_index - path "versions.yml" , emit: versions + tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz") , emit: vcf + tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz.tbi") , emit: vcf_index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def interval = task.ext.args ?: '' - def call_settings = task.ext.args2 ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def interval = task.ext.args ?: '' + def call_settings = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ sentieon driver \\ From ce440fb8ea95ab619709317181ef83147b2731d3 Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 5 Jul 2022 13:51:31 +0200 Subject: [PATCH 0590/1169] fixed spaces --- modules/local/sentieon/tnscope.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/sentieon/tnscope.nf b/modules/local/sentieon/tnscope.nf index fb0b49c5..d16b5ab9 100644 --- a/modules/local/sentieon/tnscope.nf +++ b/modules/local/sentieon/tnscope.nf @@ -26,10 +26,10 @@ process SENTIEON_TNSCOPE { -t $task.cpus \\ -r $fasta \\ -i $bam \\ - $interval \\ + $interval \\ --algo TNscope \\ --tumor_sample ${meta.id} \\ - $call_settings \\ + $call_settings \\ ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz cat <<-END_VERSIONS > versions.yml From d030692e9e2f2646e9dd4dd4d24e634888fba7ce Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 6 Jul 2022 10:55:46 +0200 Subject: [PATCH 0591/1169] Fix alignment (extra spaces) Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- modules/local/sentieon/wgsmetricsalgo.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index 1b019ff7..40f000e6 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -20,7 +20,7 @@ process SENTIEON_DATAMETRICS { script: def args = task.ext.args ?: '' def input = bam.sort().collect{"-i $it"}.join(' ') - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" From f9e44e9b43988b0d4740cf99289467a8cb2fc350 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 6 Jul 2022 10:56:52 +0200 Subject: [PATCH 0592/1169] Removed extra backslashes Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- modules/local/sentieon/wgsmetricsalgo.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index 40f000e6..77871567 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -33,7 +33,7 @@ process SENTIEON_DATAMETRICS { -r $fasta \\ $input \\ $args \\ - --algo WgsMetricsAlgo ${prefix}_wgs_metrics.txt \\ + --algo WgsMetricsAlgo ${prefix}_wgs_metrics.txt cat <<-END_VERSIONS > versions.yml "${task.process}": From 99fbf96729606eb93c3289d3778549c4d9382f62 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 6 Jul 2022 10:57:59 +0200 Subject: [PATCH 0593/1169] Fixed alignment (extra spaces) Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- modules/local/sentieon/wgsmetricsalgo.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index 77871567..ac944bb7 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -42,7 +42,7 @@ process SENTIEON_DATAMETRICS { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_wgs_metrics.txt From cddf475985cc7980509758a231fdbace59ca162e Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 6 Jul 2022 10:59:56 +0200 Subject: [PATCH 0594/1169] Fixed alignment --- modules/local/sentieon/wgsmetricsalgo.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index ac944bb7..37221b98 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -20,7 +20,7 @@ process SENTIEON_DATAMETRICS { script: def args = task.ext.args ?: '' def input = bam.sort().collect{"-i $it"}.join(' ') - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" From cd8363c7c6f24d32f4e01ec861da6dc0c03f0ee3 Mon Sep 17 00:00:00 2001 From: Lucas Taniguti Date: Sat, 9 Jul 2022 09:48:18 -0300 Subject: [PATCH 0595/1169] fix: add RG diring the alignment step (bwamem2) --- conf/modules.config | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 14c221b0..d2881e36 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -545,6 +545,7 @@ process { process { withName: '.*PREPARE_MT_ALIGNMENT:SAMTOOLS_VIEW_MT' { + ext.args = { "-h " } ext.args2 = { (params.genome == "GRCh37") ? "MT" : "chrM" } } @@ -563,7 +564,7 @@ process { process { withName: '.*ALIGN_MT:BWAMEM2_MEM_MT' { - ext.args = { "-M -K 100000000" } + ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } } withName: '.*ALIGN_MT:GATK4_MERGEBAMALIGNMENT_MT' { @@ -573,12 +574,13 @@ process { withName: '.*ALIGN_MT:PICARD_MARKDUPLICATES_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' + ext.prefix = { "${meta.id}_markduplicates" } } withName: '.*ALIGN_MT:SMATOOLS_SORT_MT' { ext.prefix = { "${meta.id}_sorted" } } - + withName: '.*ALIGN_MT:GATK4_MUTECT2_MT' { ext.args = '--mitochondria-mode TRUE' } From b324d963dd74b9fbf48bbb5d10ef8e40e1137caf Mon Sep 17 00:00:00 2001 From: Lucas Taniguti Date: Sat, 9 Jul 2022 09:50:00 -0300 Subject: [PATCH 0596/1169] wip: cosmetic changes --- subworkflows/local/align_MT.nf | 18 +++++++++--------- subworkflows/local/prepare_MT_alignment.nf | 2 +- workflows/raredisease.nf | 7 ++----- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 3026578c..07d25520 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -13,13 +13,13 @@ include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } fr workflow ALIGN_MT { take: - fastq // Fastq - ubam // unmapped bam - index // channel: [ /path/to/bwamem2/index/ ] - fasta // channel: [genome.fasta] - dict // channel: [genome.dict] - fai // channel: [genome.fai] - intervals_mt //intervals of MT + fastq // channel: [ val(meta), path('*.fastq.gz') ] + ubam // channel: [ val(meta), path('*.bam') ] + index // channel: [ /path/to/bwamem2/index/ ] + fasta // channel: [ genome.fasta ] + dict // channel: [ genome.dict ] + fai // channel: [ genome.fai ] + intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] main: ch_versions = Channel.empty() @@ -41,7 +41,7 @@ workflow ALIGN_MT { // Marks duplicates PICARD_MARKDUPLICATES_MT ( PICARD_ADDORREPLACEREADGROUPS_MT.out.bam ) ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) - + // Sort bam file SMATOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) ch_versions = ch_versions.mix(SMATOOLS_SORT_MT.out.versions.first()) @@ -51,7 +51,7 @@ workflow ALIGN_MT { ch2=SMATOOLS_SORT_MT.out.bam.join(SMATOOLS_INDEX_MT.out.bai, by: [0]) ch3=ch2.combine(intervals_mt) ch_versions = ch_versions.mix(SMATOOLS_INDEX_MT.out.versions.first()) - + // Calls variants with Mutect2 GATK4_MUTECT2_MT ( ch3, fasta, fai, dict, [], [], [], [] ) ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/prepare_MT_alignment.nf index 7a05cb96..83e4cc3f 100644 --- a/subworkflows/local/prepare_MT_alignment.nf +++ b/subworkflows/local/prepare_MT_alignment.nf @@ -8,7 +8,7 @@ include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../modules/nf-core/ workflow PREPARE_MT_ALIGNMENT { take: - bam_cram // id: and file: bam index: bam.bai + bam // channel: [ val(meta), file(bam), file(bai) ] main: ch_versions = Channel.empty() diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 7836619c..49012a7f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -199,10 +199,7 @@ workflow RAREDISEASE { } // STEP 2.1: PREPARING MT ALIGNMENT - - PREPARE_MT_ALIGNMENT ( - ch_mapped.bam_bai - ) + PREPARE_MT_ALIGNMENT ( ch_mapped.bam_bai ) ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) // STEP 2.2: MT ALLIGNMENT @@ -211,7 +208,7 @@ workflow RAREDISEASE { PREPARE_MT_ALIGNMENT.out.fastq, PREPARE_MT_ALIGNMENT.out.bam, ch_references.aligner_index, - ch_references.genome_fasta, + ch_references.genome_fasta, ch_references.sequence_dict, ch_references.genome_fai, ch_int From f7fe1fd8418f0a13958577f313f412d0935bc839 Mon Sep 17 00:00:00 2001 From: Lucas Taniguti Date: Sat, 9 Jul 2022 09:50:46 -0300 Subject: [PATCH 0597/1169] feat: uncomment haplocheck process --- subworkflows/local/align_MT.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 07d25520..2eb661af 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -57,14 +57,14 @@ workflow ALIGN_MT { ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) // Haplocheck - // HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) - // ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) + HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) + ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) emit: vcf = GATK4_MUTECT2_MT.out.vcf tbi = GATK4_MUTECT2_MT.out.tbi - // txt = HAPLOCHECK_MT.out.txt - // html = HAPLOCHECK_MT.out.html + txt = HAPLOCHECK_MT.out.txt + html = HAPLOCHECK_MT.out.html versions = ch_versions // channel: [ versions.yml ] } From f63c3fbdb825e44f6b9086b0574ff8166232c75c Mon Sep 17 00:00:00 2001 From: Lucas Taniguti Date: Sat, 9 Jul 2022 09:51:59 -0300 Subject: [PATCH 0598/1169] tests: add temporary tests - usefull to quickly run only mito subworkflow --- tests/config/nextflow.config | 33 +++++++++++++++++ tests/config/test_data.config | 22 +++++++++++ tests/subworkflows/local/align_MT/main.nf | 37 +++++++++++++++++++ .../local/align_MT/nextflow.config | 7 ++++ 4 files changed, 99 insertions(+) create mode 100644 tests/config/nextflow.config create mode 100644 tests/config/test_data.config create mode 100644 tests/subworkflows/local/align_MT/main.nf create mode 100644 tests/subworkflows/local/align_MT/nextflow.config diff --git a/tests/config/nextflow.config b/tests/config/nextflow.config new file mode 100644 index 00000000..2c672d49 --- /dev/null +++ b/tests/config/nextflow.config @@ -0,0 +1,33 @@ +params { + outdir = "output/" + publish_dir_mode = "copy" + enable_conda = false + singularity_pull_docker_container = false +} + +process { + cpus = 2 + memory = 3.GB + time = 2.h +} + +if ("$PROFILE" == "singularity") { + singularity.enabled = true + singularity.autoMounts = true +} else if ("$PROFILE" == "conda") { + params.enable_conda = true +} else { + docker.enabled = true + docker.userEmulation = true + docker.runOptions = "--platform linux/x86_64" +} + +// Increase time available to build Conda environment +conda { createTimeout = "120 min" } + +// Load test_data.config containing paths to test data +includeConfig 'test_data.config' + +manifest { + nextflowVersion = '!>=21.10.0' +} diff --git a/tests/config/test_data.config b/tests/config/test_data.config new file mode 100644 index 00000000..cabb8f72 --- /dev/null +++ b/tests/config/test_data.config @@ -0,0 +1,22 @@ +// Base directory for test data +// TODO: Commit these files to nf-core/test-datasets if we want to keep testing with them +def test_data_dir1 = "https://raw.githubusercontent.com/lmtani/wf-human-mito/main" + +def test_data_dir2 = "https://gist.github.com/lmtani/f5f164e34c9e7aba44474d93c7108eb3/raw/e529b386f39a8efc2c6512d0bb8975c2a0c1ce59" + +params { + test_data { + 'mini_human_genome' { + 'alignment' { + bam = "${test_data_dir2}/NA12878_aligned.bam" + bai = "${test_data_dir2}/NA12878_aligned.bam.bai" + } + fasta = "${test_data_dir1}/tests/data/Homo_sapiens_assembly38_chrM_and_alt.fasta" + fai = "${test_data_dir1}/tests/data/Homo_sapiens_assembly38_chrM_and_alt.fasta.fai" + dict = "${test_data_dir1}/tests/data/Homo_sapiens_assembly38_chrM_and_alt.dict" + } + 'mitochondria' { + intervals_mt = "${test_data_dir1}/data/non_control_region.chrM.interval_list" + } + } +} diff --git a/tests/subworkflows/local/align_MT/main.nf b/tests/subworkflows/local/align_MT/main.nf new file mode 100644 index 00000000..96721c02 --- /dev/null +++ b/tests/subworkflows/local/align_MT/main.nf @@ -0,0 +1,37 @@ +#!/usr/bin/env nextflow + +nextflow.enable.dsl = 2 + +include { BWAMEM2_INDEX } from '../../../../modules/nf-core/modules/bwamem2/index/main' + +include { PREPARE_MT_ALIGNMENT } from '../../../../subworkflows/local/prepare_MT_alignment' +include { ALIGN_MT } from '../../../../subworkflows/local/align_MT' + + + + +workflow align_mt { + input = [ [ id:'A', sample:'NA12878', single_end: false], // meta map + file(params.test_data['mini_human_genome']['alignment']['bam'], checkIfExists: true), + file(params.test_data['mini_human_genome']['alignment']['bai'], checkIfExists: true), + ] + + fasta = [ file(params.test_data['mini_human_genome']['fasta'], checkIfExists: true) ] + fai = [ file(params.test_data['mini_human_genome']['fai'], checkIfExists: true) ] + dict = [ file(params.test_data['mini_human_genome']['dict'], checkIfExists: true) ] + intervals_mt = [ file(params.test_data['mitochondria']['intervals_mt'], checkIfExists: true ) ] + + PREPARE_MT_ALIGNMENT ( input ) + + BWAMEM2_INDEX ( fasta ) + + ALIGN_MT ( + PREPARE_MT_ALIGNMENT.out.fastq, + PREPARE_MT_ALIGNMENT.out.bam, + BWAMEM2_INDEX.out.index, + fasta, + dict, + fai, + intervals_mt + ) +} diff --git a/tests/subworkflows/local/align_MT/nextflow.config b/tests/subworkflows/local/align_MT/nextflow.config new file mode 100644 index 00000000..06309122 --- /dev/null +++ b/tests/subworkflows/local/align_MT/nextflow.config @@ -0,0 +1,7 @@ +process { + publishDir = [ + path: { "${params.outdir}/workspace/${task.process.tokenize(':')[-1].toLowerCase()}" }, + mode: "copy", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] +} From 43dfa10943df37599965844ad9bf74058fb88130 Mon Sep 17 00:00:00 2001 From: Lucas Taniguti Date: Sat, 9 Jul 2022 10:18:24 -0300 Subject: [PATCH 0599/1169] wip: add reminder comment --- subworkflows/local/align_MT.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 2eb661af..9650c051 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -57,6 +57,8 @@ workflow ALIGN_MT { ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) // Haplocheck + // TODO: probably it will be outside this subworkflow as we want to run + // with the VCF with the variants from the shifted alignment (to solve the mt circularity issue) HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) From 83e72a68dc14286f30b4fe8af2d7020fe19846ab Mon Sep 17 00:00:00 2001 From: sima-r Date: Thu, 14 Jul 2022 13:03:35 +0200 Subject: [PATCH 0600/1169] updated cnvpytor modules --- modules.json | 10 +++++----- modules/nf-core/modules/cnvpytor/callcnvs/main.nf | 4 ++-- modules/nf-core/modules/cnvpytor/histogram/main.nf | 4 ++-- .../nf-core/modules/cnvpytor/importreaddepth/main.nf | 4 ++-- modules/nf-core/modules/cnvpytor/partition/main.nf | 4 ++-- modules/nf-core/modules/cnvpytor/view/main.nf | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules.json b/modules.json index 60f0b643..c3a63b58 100644 --- a/modules.json +++ b/modules.json @@ -19,19 +19,19 @@ "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641" }, "cnvpytor/callcnvs": { - "git_sha": "1ccea5ff4d3dffbf9a8e53032481cc9246d4e23d" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "cnvpytor/histogram": { - "git_sha": "19cfb4e95196d0e8cc14a67ecb8f1ed0b0fcc3a7" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "cnvpytor/importreaddepth": { - "git_sha": "19cfb4e95196d0e8cc14a67ecb8f1ed0b0fcc3a7" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "cnvpytor/partition": { - "git_sha": "19cfb4e95196d0e8cc14a67ecb8f1ed0b0fcc3a7" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "cnvpytor/view": { - "git_sha": "af73544010cc9563ec7d7160aeb825ae28ec217f" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf index 69c9d40e..021cd879 100644 --- a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf +++ b/modules/nf-core/modules/cnvpytor/callcnvs/main.nf @@ -27,7 +27,7 @@ process CNVPYTOR_CALLCNVS { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ @@ -37,7 +37,7 @@ process CNVPYTOR_CALLCNVS { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ } diff --git a/modules/nf-core/modules/cnvpytor/histogram/main.nf b/modules/nf-core/modules/cnvpytor/histogram/main.nf index fd2ebe14..2abb96e6 100644 --- a/modules/nf-core/modules/cnvpytor/histogram/main.nf +++ b/modules/nf-core/modules/cnvpytor/histogram/main.nf @@ -28,7 +28,7 @@ process CNVPYTOR_HISTOGRAM { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ @@ -38,7 +38,7 @@ process CNVPYTOR_HISTOGRAM { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ } diff --git a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf index 6f9abae9..fd09d1c7 100644 --- a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf +++ b/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf @@ -32,7 +32,7 @@ process CNVPYTOR_IMPORTREADDEPTH { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ @@ -43,7 +43,7 @@ process CNVPYTOR_IMPORTREADDEPTH { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ } diff --git a/modules/nf-core/modules/cnvpytor/partition/main.nf b/modules/nf-core/modules/cnvpytor/partition/main.nf index 6d7a9c6b..d32741ba 100644 --- a/modules/nf-core/modules/cnvpytor/partition/main.nf +++ b/modules/nf-core/modules/cnvpytor/partition/main.nf @@ -27,7 +27,7 @@ process CNVPYTOR_PARTITION { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ @@ -37,7 +37,7 @@ process CNVPYTOR_PARTITION { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ } diff --git a/modules/nf-core/modules/cnvpytor/view/main.nf b/modules/nf-core/modules/cnvpytor/view/main.nf index 1bb61a38..153f43e8 100644 --- a/modules/nf-core/modules/cnvpytor/view/main.nf +++ b/modules/nf-core/modules/cnvpytor/view/main.nf @@ -42,7 +42,7 @@ process CNVPYTOR_VIEW { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ @@ -54,7 +54,7 @@ process CNVPYTOR_VIEW { cat <<-END_VERSIONS > versions.yml "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' )) + cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) END_VERSIONS """ } From fed792c222408226d16099b10a39f6485182f6fa Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Tue, 26 Jul 2022 16:41:18 +0200 Subject: [PATCH 0601/1169] Renamed process --- modules/local/sentieon/wgsmetricsalgo.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index 37221b98..f6c25b0e 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -1,4 +1,4 @@ -process SENTIEON_DATAMETRICS { +process SENTIEON_WGSMETRICSALGO { tag "$meta.id" label 'process_medium' label 'sentieon' From e550b57932bf1c1691e2d664610db2b8bfd56efc Mon Sep 17 00:00:00 2001 From: sima-r Date: Mon, 4 Jul 2022 12:40:51 +0200 Subject: [PATCH 0602/1169] added tnscope module which calls mt varinats --- conf/modules.config | 11 +++++++ modules/local/sentieon/tnscope.nf | 52 +++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 modules/local/sentieon/tnscope.nf diff --git a/conf/modules.config b/conf/modules.config index 33b9e890..e94b7cea 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -568,3 +568,14 @@ process { ext.args = '--VALIDATION_STRINGENCY LENIENT' } } + +// +// SENTIEON_TNSCOPE_MT_CALL +// + +process { + withName: '.*SENTIEON_TNSCOPE' { + ext.args = { (params.genome == "GRCh37") ? " --interval MT " : "--interval chrM" } + ext.args2 = " --min_init_normal_lod 0,5 --min_normal_lod 2,0 --min_init_tumor_lod 1,0 --min_tumor_lod 2,8 --trim_soft_clip " + } +} \ No newline at end of file diff --git a/modules/local/sentieon/tnscope.nf b/modules/local/sentieon/tnscope.nf new file mode 100644 index 00000000..d3080ac3 --- /dev/null +++ b/modules/local/sentieon/tnscope.nf @@ -0,0 +1,52 @@ +process SENTIEON_TNSCOPE { + tag "$meta.id" + label 'process_high' + label 'sentieon' + + input: + tuple val(meta), path(bam), path(bai) + path fasta + path fai + + output: + tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz") , emit: vcf + tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz.tbi") , emit: vcf_index + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def interval = task.ext.args ?: '' + def call_settings = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + sentieon driver \\ + -t $task.cpus \\ + -r $fasta \\ + -i $bam \\ + $interval \\ + --algo TNscope \\ + --tumor_sample ${meta.id} \\ + $call_settings \\ + ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz + touch ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g" ) + END_VERSIONS + """ +} From 51a6863ca71d20823d7de3f1aaf9d9c602b6e571 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 9 Aug 2022 17:02:10 +0200 Subject: [PATCH 0603/1169] Revert "added tnscope module which calls mt varinats" This reverts commit e550b57932bf1c1691e2d664610db2b8bfd56efc. --- conf/modules.config | 11 ------- modules/local/sentieon/tnscope.nf | 52 ------------------------------- 2 files changed, 63 deletions(-) delete mode 100644 modules/local/sentieon/tnscope.nf diff --git a/conf/modules.config b/conf/modules.config index e94b7cea..33b9e890 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -568,14 +568,3 @@ process { ext.args = '--VALIDATION_STRINGENCY LENIENT' } } - -// -// SENTIEON_TNSCOPE_MT_CALL -// - -process { - withName: '.*SENTIEON_TNSCOPE' { - ext.args = { (params.genome == "GRCh37") ? " --interval MT " : "--interval chrM" } - ext.args2 = " --min_init_normal_lod 0,5 --min_normal_lod 2,0 --min_init_tumor_lod 1,0 --min_tumor_lod 2,8 --trim_soft_clip " - } -} \ No newline at end of file diff --git a/modules/local/sentieon/tnscope.nf b/modules/local/sentieon/tnscope.nf deleted file mode 100644 index d3080ac3..00000000 --- a/modules/local/sentieon/tnscope.nf +++ /dev/null @@ -1,52 +0,0 @@ -process SENTIEON_TNSCOPE { - tag "$meta.id" - label 'process_high' - label 'sentieon' - - input: - tuple val(meta), path(bam), path(bai) - path fasta - path fai - - output: - tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz") , emit: vcf - tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz.tbi") , emit: vcf_index - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def interval = task.ext.args ?: '' - def call_settings = task.ext.args2 ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - sentieon driver \\ - -t $task.cpus \\ - -r $fasta \\ - -i $bam \\ - $interval \\ - --algo TNscope \\ - --tumor_sample ${meta.id} \\ - $call_settings \\ - ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz - touch ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g" ) - END_VERSIONS - """ -} From 1d017e33f738641ef8e9c5e8fd3e67816781479c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 9 Aug 2022 19:44:07 +0200 Subject: [PATCH 0604/1169] install modules --- modules.json | 12 +++ .../nf-core/modules/genmod/annotate/main.nf | 46 +++++++++++ .../nf-core/modules/genmod/annotate/meta.yml | 40 ++++++++++ .../nf-core/modules/genmod/compound/main.nf | 46 +++++++++++ .../nf-core/modules/genmod/compound/meta.yml | 40 ++++++++++ modules/nf-core/modules/genmod/models/main.nf | 52 ++++++++++++ .../nf-core/modules/genmod/models/meta.yml | 49 ++++++++++++ modules/nf-core/modules/genmod/score/main.nf | 55 +++++++++++++ modules/nf-core/modules/genmod/score/meta.yml | 53 ++++++++++++ subworkflows/local/genmod.nf | 80 +++++++++++++++++++ 10 files changed, 473 insertions(+) create mode 100644 modules/nf-core/modules/genmod/annotate/main.nf create mode 100644 modules/nf-core/modules/genmod/annotate/meta.yml create mode 100644 modules/nf-core/modules/genmod/compound/main.nf create mode 100644 modules/nf-core/modules/genmod/compound/meta.yml create mode 100644 modules/nf-core/modules/genmod/models/main.nf create mode 100644 modules/nf-core/modules/genmod/models/meta.yml create mode 100644 modules/nf-core/modules/genmod/score/main.nf create mode 100644 modules/nf-core/modules/genmod/score/meta.yml create mode 100644 subworkflows/local/genmod.nf diff --git a/modules.json b/modules.json index c3a63b58..cd5019f7 100644 --- a/modules.json +++ b/modules.json @@ -60,6 +60,18 @@ "gatk4/samtofastq": { "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce" }, + "genmod/annotate": { + "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" + }, + "genmod/compound": { + "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" + }, + "genmod/models": { + "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" + }, + "genmod/score": { + "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" + }, "glnexus": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, diff --git a/modules/nf-core/modules/genmod/annotate/main.nf b/modules/nf-core/modules/genmod/annotate/main.nf new file mode 100644 index 00000000..b7ecd3fc --- /dev/null +++ b/modules/nf-core/modules/genmod/annotate/main.nf @@ -0,0 +1,46 @@ +process GENMOD_ANNOTATE { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::genmod=3.7.4" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/genmod:3.7.4--pyh5e36f6f_0': + 'quay.io/biocontainers/genmod:3.7.4--pyh5e36f6f_0' }" + + input: + tuple val(meta), path(input_vcf) + + output: + tuple val(meta), path("*_annotate.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + genmod \\ + annotate \\ + $args \\ + --outfile ${prefix}_annotate.vcf \\ + $input_vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_annotate.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/genmod/annotate/meta.yml b/modules/nf-core/modules/genmod/annotate/meta.yml new file mode 100644 index 00000000..5df7f666 --- /dev/null +++ b/modules/nf-core/modules/genmod/annotate/meta.yml @@ -0,0 +1,40 @@ +name: "genmod_annotate" +description: for annotating regions, frequencies, cadd scores +keywords: + - annotate + - genmod +tools: + - "genmod": + description: "Annotate genetic inheritance models in variant files" + homepage: "https://github.com/Clinical-Genomics/genmod" + documentation: "https://github.com/Clinical-Genomics/genmod" + tool_dev_url: "https://github.com/moonso" + doi: "" + licence: "['MIT']" +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_vcf: + type: file + description: VCF file + pattern: "*.{vcf}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: vcf + description: Annotated VCF file + pattern: "*.{vcf}" + +authors: + - "@ramprasadn" diff --git a/modules/nf-core/modules/genmod/compound/main.nf b/modules/nf-core/modules/genmod/compound/main.nf new file mode 100644 index 00000000..848cbea3 --- /dev/null +++ b/modules/nf-core/modules/genmod/compound/main.nf @@ -0,0 +1,46 @@ +process GENMOD_COMPOUND { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::genmod=3.7.4" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/genmod:3.7.4--pyh5e36f6f_0': + 'quay.io/biocontainers/genmod:3.7.4--pyh5e36f6f_0' }" + + input: + tuple val(meta), path(input_vcf) + + output: + tuple val(meta), path("*_compound.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + genmod \\ + compound \\ + $args \\ + --outfile ${prefix}_compound.vcf \\ + $input_vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_compound.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/genmod/compound/meta.yml b/modules/nf-core/modules/genmod/compound/meta.yml new file mode 100644 index 00000000..27fb3cdf --- /dev/null +++ b/modules/nf-core/modules/genmod/compound/meta.yml @@ -0,0 +1,40 @@ +name: "genmod_compound" +description: Score compounds +keywords: + - compound + - genmod +tools: + - "genmod": + description: "Annotate genetic inheritance models in variant files" + homepage: "https://github.com/Clinical-Genomics/genmod" + documentation: "https://github.com/Clinical-Genomics/genmod" + tool_dev_url: "https://github.com/moonso" + doi: "" + licence: "['MIT']" +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_vcf: + type: file + description: VCF file + pattern: "*.{vcf}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] # + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: Output VCF file + pattern: "*.{vcf}" + +authors: + - "@ramprasadn" diff --git a/modules/nf-core/modules/genmod/models/main.nf b/modules/nf-core/modules/genmod/models/main.nf new file mode 100644 index 00000000..f571eb32 --- /dev/null +++ b/modules/nf-core/modules/genmod/models/main.nf @@ -0,0 +1,52 @@ +process GENMOD_MODELS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::genmod=3.7.4 conda-forge::python=3.4.5" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/genmod:3.7.4--pyh5e36f6f_0': + 'quay.io/biocontainers/genmod:3.7.4--pyh5e36f6f_0' }" + + input: + tuple val(meta), path(input_vcf) + path (fam) + path (reduced_penetrance) + + output: + tuple val(meta), path("*_models.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def family_file = fam ? "--family_file ${fam}" : "" + def pen_file = reduced_penetrance ? "--reduced_penetrance ${reduced_penetrance}" : "" + """ + genmod \\ + models \\ + $args \\ + $pen_file \\ + $family_file \\ + --outfile ${prefix}_models.vcf \\ + $input_vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_models.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/genmod/models/meta.yml b/modules/nf-core/modules/genmod/models/meta.yml new file mode 100644 index 00000000..42c80f7a --- /dev/null +++ b/modules/nf-core/modules/genmod/models/meta.yml @@ -0,0 +1,49 @@ +name: "genmod_models" +description: annotate models of inheritance +keywords: + - models + - genmod +tools: + - "genmod": + description: "Annotate genetic inheritance models in variant files" + homepage: "https://github.com/Clinical-Genomics/genmod" + documentation: "https://github.com/Clinical-Genomics/genmod" + tool_dev_url: "https://github.com/moonso" + doi: "" + licence: "['MIT']" +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_vcf: + type: file + description: vcf file + pattern: "*.{vcf}" + - reduced_penetrance: + type: file + description: file with gene ids that have reduced penetrance + pattern: "*.{tsv}" + - family_file: + type: file + description: ped file + pattern: "*.{ped}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: Output VCF file + pattern: "*.{vcf}" + +authors: + - "@ramprasadn" diff --git a/modules/nf-core/modules/genmod/score/main.nf b/modules/nf-core/modules/genmod/score/main.nf new file mode 100644 index 00000000..4059a0f4 --- /dev/null +++ b/modules/nf-core/modules/genmod/score/main.nf @@ -0,0 +1,55 @@ +process GENMOD_SCORE { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::genmod=3.7.4" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/genmod:3.7.4--pyh5e36f6f_0': + 'quay.io/biocontainers/genmod:3.7.4--pyh5e36f6f_0' }" + + input: + tuple val(meta), path(input_vcf) + path (fam) + path (reduced_penetrance) + path (score_config) + + output: + tuple val(meta), path("*_score.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def family_file = fam ? "--family_file ${fam}" : "" + def pen_file = reduced_penetrance ? "--reduced_penetrance ${reduced_penetrance}" : "" + def config_file = score_config ? "--score_config ${score_config}" : "" + """ + genmod \\ + score \\ + $args \\ + $pen_file \\ + $family_file \\ + $config_file \\ + --outfile ${prefix}_score.vcf \\ + $input_vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_score.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/genmod/score/meta.yml b/modules/nf-core/modules/genmod/score/meta.yml new file mode 100644 index 00000000..324b45e0 --- /dev/null +++ b/modules/nf-core/modules/genmod/score/meta.yml @@ -0,0 +1,53 @@ +name: "genmod_score" +description: Score the variants of a vcf based on their annotation +keywords: + - score + - genmod +tools: + - "genmod": + description: "Annotate genetic inheritance models in variant files" + homepage: "https://github.com/Clinical-Genomics/genmod" + documentation: "https://github.com/Clinical-Genomics/genmod" + tool_dev_url: "https://github.com/moonso" + doi: "" + licence: "['MIT']" +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_vcf: + type: file + description: vcf file + pattern: "*.{vcf}" + - reduced_penetrance: + type: file + description: file with gene ids that have reduced penetrance + pattern: "*.{tsv}" + - family_file: + type: file + description: ped file + pattern: "*.{ped}" + - score_config: + type: file + description: rank model config file + pattern: "*.{ini}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: Output VCF file + pattern: "*.{vcf}" + +authors: + - "@ramprasadn" diff --git a/subworkflows/local/genmod.nf b/subworkflows/local/genmod.nf new file mode 100644 index 00000000..07bd8902 --- /dev/null +++ b/subworkflows/local/genmod.nf @@ -0,0 +1,80 @@ +// +// A subworkflow to annotate structural variants. +// + +include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' +include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' +include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' +include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' +include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' + +workflow ANNOTATE_STRUCTURAL_VARIANTS { + + take: + vcf // channel: [ val(meta), path(vcf) ] + sv_dbs // file: dbs.csv + vep_genome + vep_cache_version + vep_cache + fasta // file: genome.fasta + seq_dict // file: genome.dict + + main: + ch_versions = Channel.empty() + + Channel.fromPath(sv_dbs) + .splitCsv ( header:true ) + .multiMap { row -> + vcf_dbs: row.filename + in_frqs: row.in_freq_info_key + in_occs: row.in_allele_count_info_key + out_frqs: row.out_freq_info_key + out_occs: row.out_allele_count_info_key + } + .set { ch_svdb_dbs } + + SVDB_QUERY(vcf, + ch_svdb_dbs.in_occs.toList(), + ch_svdb_dbs.in_frqs.toList(), + ch_svdb_dbs.out_occs.toList(), + ch_svdb_dbs.out_frqs.toList(), + ch_svdb_dbs.vcf_dbs.toList() + ) + ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) + + PICARD_SORTVCF(SVDB_QUERY.out.vcf, + fasta, + seq_dict + ) + + PICARD_SORTVCF.out.vcf + .map { + meta, vcf -> + return [meta,vcf,[]] + } + .set { ch_sortvcf } + ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) + + BCFTOOLS_VIEW(ch_sortvcf,[],[],[]) + ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) + + TABIX_SV_ANNO (BCFTOOLS_VIEW.out.vcf) + ch_versions = ch_versions.mix(TABIX_SV_ANNO.out.versions) + + BCFTOOLS_VIEW.out + .vcf + .join(TABIX_SV_ANNO.out.tbi) + .set { ch_vep_in } + + ENSEMBLVEP_SV(ch_vep_in, + vep_genome, + "homo_sapiens", + vep_cache_version, + file(vep_cache) + ) + ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) + + emit: + vcf_ann = ENSEMBLVEP_SV.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} From 45cfe042287e29c38ec40e7051eee49bf34563cd Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 10 Aug 2022 10:07:49 +0200 Subject: [PATCH 0605/1169] sv genmod --- conf/genomes.config | 4 ++ main.nf | 2 + modules/local/create_pedfile.nf | 38 +++++++++++++++ nextflow_schema.json | 14 ++++++ subworkflows/local/genmod.nf | 85 ++++++++------------------------- workflows/raredisease.nf | 27 +++++++++-- 6 files changed, 101 insertions(+), 69 deletions(-) create mode 100644 modules/local/create_pedfile.nf diff --git a/conf/genomes.config b/conf/genomes.config index 5dda2207..3f5976d2 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -20,6 +20,8 @@ params { known_dbsnp = "" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" + reduced_penetrance = "" + score_config = "" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -37,6 +39,8 @@ params { known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" + reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" + score_config = "${params.local_genomes}/rank_model_-v1.31-.ini" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/main.nf b/main.nf index d9dda4c9..f1f49f85 100644 --- a/main.nf +++ b/main.nf @@ -27,6 +27,8 @@ params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbs params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') params.ml_model = WorkflowMain.getGenomeAttribute(params, 'ml_model') +params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_penetrance') +params.score_config = WorkflowMain.getGenomeAttribute(params, 'score_config') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') diff --git a/modules/local/create_pedfile.nf b/modules/local/create_pedfile.nf new file mode 100644 index 00000000..3ff30041 --- /dev/null +++ b/modules/local/create_pedfile.nf @@ -0,0 +1,38 @@ +process MAKE_PED { + tag "make_ped" + + conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'quay.io/biocontainers/python:3.9--1' }" + + input: + path samplesheet + + output: + path '*.ped' , emit: ped + + when: + task.ext.when == null || task.ext.when + + script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ + """ + export INPUT_FILE=${samplesheet} + export OUTPUT_FILE="familyinfo.ped" + + python3 < - vcf_dbs: row.filename - in_frqs: row.in_freq_info_key - in_occs: row.in_allele_count_info_key - out_frqs: row.out_freq_info_key - out_occs: row.out_allele_count_info_key - } - .set { ch_svdb_dbs } - - SVDB_QUERY(vcf, - ch_svdb_dbs.in_occs.toList(), - ch_svdb_dbs.in_frqs.toList(), - ch_svdb_dbs.out_occs.toList(), - ch_svdb_dbs.out_frqs.toList(), - ch_svdb_dbs.vcf_dbs.toList() - ) - ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) - - PICARD_SORTVCF(SVDB_QUERY.out.vcf, - fasta, - seq_dict - ) - - PICARD_SORTVCF.out.vcf - .map { - meta, vcf -> - return [meta,vcf,[]] - } - .set { ch_sortvcf } - ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) - - BCFTOOLS_VIEW(ch_sortvcf,[],[],[]) - ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) - - TABIX_SV_ANNO (BCFTOOLS_VIEW.out.vcf) - ch_versions = ch_versions.mix(TABIX_SV_ANNO.out.versions) - - BCFTOOLS_VIEW.out - .vcf - .join(TABIX_SV_ANNO.out.tbi) - .set { ch_vep_in } - - ENSEMBLVEP_SV(ch_vep_in, - vep_genome, - "homo_sapiens", - vep_cache_version, - file(vep_cache) - ) - ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) + GENMOD_ANNOTATE(vcf) + ch_versions = ch_versions.mix(GENMOD_ANNOTATE.out.versions) + GENMOD_MODELS(GENMOD_ANNOTATE.out.vcf, ped, reduced_penetrance) + ch_versions = ch_versions.mix(GENMOD_MODELS.out.versions) + GENMOD_SCORE(GENMOD_MODELS.out.vcf, ped, reduced_penetrance, score_config) + ch_versions = ch_versions.mix(GENMOD_SCORE.out.versions) + GENMOD_COMPOUND(GENMOD_SCORE.out.vcf) + ch_versions = ch_versions.mix(GENMOD_COMPOUND.out.versions) emit: - vcf_ann = ENSEMBLVEP_SV.out.vcf + vcf_ann = GENMOD_COMPOUND.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 735bb207..7b948f30 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -27,8 +27,10 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -ch_ml_model = params.ml_model ? file(params.ml_model) : [] -ch_call_interval = params.call_interval ? file(params.call_interval) : [] +ch_ml_model = params.ml_model ? file(params.ml_model) : [] +ch_call_interval = params.call_interval ? file(params.call_interval) : [] +ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] +ch_score_config = params.score_config ? file(params.score_config) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -45,9 +47,16 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +// +// MODULE: local modules +// + +include { MAKE_PED } from '../modules/local/create_pedfile' + // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // + include { CHECK_INPUT } from '../subworkflows/local/check_input' include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' @@ -78,6 +87,7 @@ include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' +include { RANK_VARIANTS } from '../subworkflows/local/genmod' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -100,6 +110,10 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) + MAKE_PED ( + ch_input + ) + // STEP 0: QUALITY CHECK. FASTQC ( CHECK_INPUT.out.reads @@ -197,7 +211,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) } - + ch_sv_annotate = Channel.empty() if (params.annotate_sv_switch) { ANNOTATE_STRUCTURAL_VARIANTS ( @@ -210,6 +224,13 @@ workflow RAREDISEASE { ch_references.sequence_dict ).set {ch_sv_annotate} + RANK_VARIANTS ( + ch_sv_annotate.vcf_ann, + MAKE_PED.out.ped, + ch_reduced_penetrance, + ch_score_config + ) + ch_versions = ch_versions.mix(ch_sv_annotate.versions) } From c467f0ec9a18c0688da90a440a94a263bac0a8c7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 10 Aug 2022 13:54:38 +0200 Subject: [PATCH 0606/1169] sv update --- conf/modules.config | 33 +++++++++++++++++++++++ subworkflows/{local => nf-core}/genmod.nf | 0 workflows/raredisease.nf | 12 ++++----- 3 files changed, 39 insertions(+), 6 deletions(-) rename subworkflows/{local => nf-core}/genmod.nf (100%) diff --git a/conf/modules.config b/conf/modules.config index 33b9e890..ddb6f5e2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -535,6 +535,39 @@ process { mode: params.publish_dir_mode, ] } + + withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE { + ext.args = " --annotate_regions " + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*RANK_VARIANTS_SV:GENMOD_MODELS' { + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*RANK_VARIANTS_SV:GENMOD_SCORE' { + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*RANK_VARIANTS_SV:GENMOD_COMPOUND' { + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } // diff --git a/subworkflows/local/genmod.nf b/subworkflows/nf-core/genmod.nf similarity index 100% rename from subworkflows/local/genmod.nf rename to subworkflows/nf-core/genmod.nf diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 7b948f30..f1870ba3 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -82,12 +82,12 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' -include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' -include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' -include { RANK_VARIANTS } from '../subworkflows/local/genmod' +include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' +include { QC_BAM } from '../subworkflows/nf-core/qc_bam' +include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' +include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' +include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' +include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/nf-core/genmod' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From ba0c41f3aa023cccaeaa448c211a860b25f97206 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 10 Aug 2022 14:41:08 +0200 Subject: [PATCH 0607/1169] add snv --- conf/modules.config | 52 +++++++++++++++++++++++++++++++++++++++- workflows/raredisease.nf | 19 ++++++++++----- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index d60244c7..6c25c3c3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -545,7 +545,14 @@ process { ] } - withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE { +} + +// +// Score and rank structural variants +// + +process { + withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE' { ext.args = " --annotate_regions " publishDir = [ path: { "${params.outdir}/genmod" }, @@ -563,6 +570,7 @@ process { } withName: '.*RANK_VARIANTS_SV:GENMOD_SCORE' { + ext.args = " --rank_results " publishDir = [ path: { "${params.outdir}/genmod" }, mode: params.publish_dir_mode, @@ -611,6 +619,48 @@ process { } } +// +// Score and rank SNVs +// + +process { + withName: '.*RANK_VARIANTS_SNV:GENMOD_ANNOTATE' { + ext.args = " --annotate_regions " + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*RANK_VARIANTS_SNV:GENMOD_MODELS' { + ext.args = " --whole_gene " + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*RANK_VARIANTS_SNV:GENMOD_SCORE' { + ext.args = " --rank_results " + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*RANK_VARIANTS_SNV:GENMOD_COMPOUND' { + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} + + // // PREPARE_MT_ALIGNMENT // diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f8316937..260b0c07 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -84,11 +84,11 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' -include { ANNOTATE_VCFANNO } from '../subworkflows/nf-core/annotate_vcfanno' -include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/local/prepare_MT_alignment' +include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' +include { QC_BAM } from '../subworkflows/nf-core/qc_bam' +include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' +include { RANK_VARIANTS as RANK_VARIANTS_SNV } from '../subworkflows/nf-core/genmod' +include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/nf-core/genmod' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -227,7 +227,7 @@ workflow RAREDISEASE { ch_references.sequence_dict ).set {ch_sv_annotate} - RANK_VARIANTS ( + RANK_VARIANTS_SV ( ch_sv_annotate.vcf_ann, MAKE_PED.out.ped, ch_reduced_penetrance, @@ -260,6 +260,13 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(ANNOTATE_SNVS.out.versions) + RANK_VARIANTS_SNV ( + ANNOTATE_SNVS.out.vcf_ann, + MAKE_PED.out.ped, + ch_reduced_penetrance, + ch_score_config + ) + // // MODULE: Pipeline reporting // From c59bcb5afb784c1f0796a2cfcdfc58651c33f35c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 10 Aug 2022 14:55:50 +0200 Subject: [PATCH 0608/1169] updates genomes config --- conf/genomes.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 87d5316d..d0166586 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -22,8 +22,8 @@ params { known_dbsnp = "" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" - reduced_penetrance = "" - score_config = "" + reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" + score_config = "${params.local_genomes}/rank_model_-v1.31-.ini" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -43,7 +43,7 @@ params { known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" - reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" + reduced_penetrance = "" score_config = "${params.local_genomes}/rank_model_-v1.31-.ini" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" From 26b83baa1b374652b827692f1f99b558d01be390 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 10 Aug 2022 22:54:31 +0200 Subject: [PATCH 0609/1169] sv vep filter --- conf/genomes.config | 2 + main.nf | 1 + modules/local/filter_vep.nf | 54 +++++++++++++++++++ nextflow_schema.json | 7 +++ .../local/annotate_structural_variants.nf | 6 ++- workflows/raredisease.nf | 1 + 6 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 modules/local/filter_vep.nf diff --git a/conf/genomes.config b/conf/genomes.config index d0166586..68954528 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -24,6 +24,7 @@ params { ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" score_config = "${params.local_genomes}/rank_model_-v1.31-.ini" + vep_filters = "${params.local_genomes}/gene_panels.bed" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -45,6 +46,7 @@ params { ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" reduced_penetrance = "" score_config = "${params.local_genomes}/rank_model_-v1.31-.ini" + vep_filters = "${params.local_genomes}/gene_panels.bed" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/main.nf b/main.nf index f88b21e0..a1d0a2bb 100644 --- a/main.nf +++ b/main.nf @@ -35,6 +35,7 @@ params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_be params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') +params.vep_filters = WorkflowMain.getGenomeAttribute(params, 'vep_filters') params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') params.vep_cache = WorkflowMain.getGenomeAttribute(params, 'vep_cache') diff --git a/modules/local/filter_vep.nf b/modules/local/filter_vep.nf new file mode 100644 index 00000000..78ca488a --- /dev/null +++ b/modules/local/filter_vep.nf @@ -0,0 +1,54 @@ +process FILTER_VEP { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::ensembl-vep=105.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ensembl-vep:105.0--pl5321h4a94de4_1' : + 'quay.io/biocontainers/ensembl-vep:105.0--pl5321h4a94de4_1' }" + + input: + tuple val(meta), path(vcf) + path (select_feature_file_bed) + + output: + tuple val(meta), path("*.ann_filter.vcf.gz"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + export INPUT_FILE=${select_feature_file_bed} + export OUTPUT_FILE="feature.list" + + python3 < versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ +} diff --git a/nextflow_schema.json b/nextflow_schema.json index c524af7e..cd2e2a8a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -164,6 +164,13 @@ "description": "Rank model config file for genmod.", "hidden": true }, + "vep_filters": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "Gene panel file to be used with filter_vep to separate clinical and research variants.", + "hidden": true + }, "target_bed": { "type": "string", "format": "path", diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 07bd8902..e69aaae7 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -7,10 +7,12 @@ include { PICARD_SORTVCF } from '../../modules/nf-core/modules/pi include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' +include { FILTER_VEP } from '../../modules/local/filter_vep' workflow ANNOTATE_STRUCTURAL_VARIANTS { take: + feature_file vcf // channel: [ val(meta), path(vcf) ] sv_dbs // file: dbs.csv vep_genome @@ -74,7 +76,9 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ) ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) + FILTER_VEP(ENSEMBLVEP_SV.out.vcf, feature_file) + emit: - vcf_ann = ENSEMBLVEP_SV.out.vcf + vcf_ann = FILTER_VEP.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 260b0c07..2645fd30 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -218,6 +218,7 @@ workflow RAREDISEASE { ch_sv_annotate = Channel.empty() if (params.annotate_sv_switch) { ANNOTATE_STRUCTURAL_VARIANTS ( + params.vep_filters, CALL_STRUCTURAL_VARIANTS.out.vcf, params.svdb_query_dbs, params.genome, From 9dec33fe88d9cedb226c38b899478402392b61d9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 10 Aug 2022 23:40:46 +0200 Subject: [PATCH 0610/1169] add stub --- modules/local/filter_vep.nf | 11 +++++++++++ workflows/raredisease.nf | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/local/filter_vep.nf b/modules/local/filter_vep.nf index 78ca488a..71d0ccf2 100644 --- a/modules/local/filter_vep.nf +++ b/modules/local/filter_vep.nf @@ -51,4 +51,15 @@ process FILTER_VEP { ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.ann_filter.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 2645fd30..f8595646 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -31,6 +31,7 @@ ch_ml_model = params.ml_model ? file(params.ml_model) ch_call_interval = params.call_interval ? file(params.call_interval) : [] ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] ch_score_config = params.score_config ? file(params.score_config) : [] +ch_vep_filters = params.vep_filters ? file(params.vep_filters) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -218,7 +219,7 @@ workflow RAREDISEASE { ch_sv_annotate = Channel.empty() if (params.annotate_sv_switch) { ANNOTATE_STRUCTURAL_VARIANTS ( - params.vep_filters, + ch_vep_filters, CALL_STRUCTURAL_VARIANTS.out.vcf, params.svdb_query_dbs, params.genome, From 2d6ad58fde7d7f11f0540627aeab9bba971eee06 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 17 Aug 2022 12:03:23 +0200 Subject: [PATCH 0611/1169] add snv vep --- conf/modules.config | 18 ++++++++++++++++++ subworkflows/local/annotate_snvs.nf | 26 ++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 6c25c3c3..571b8bb6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -617,6 +617,24 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + + withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { + ext.args = [ + '--plugin LoFtool,vep_cache/LoFtool_scores.txt', + '--distance 5000', + '--buffer_size 20000', + '--format vcf --max_sv_size 248956422', + '--appris --biotype --cache --canonical --ccds', + '--domains --exclude_predicted --force_overwrite', + '--hgvs --humdiv --no_progress --no_stats --numbers', + '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl', + '--uniprot' + ].join(' ') + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + ] + } } // diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index ed91a430..9db7d089 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -2,9 +2,11 @@ // A subworkflow to annotate snvs // -include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' -include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/bcftools/roh/main' -include { RHOCALL_ANNOTATE } from '../../modules/nf-core/modules/rhocall/annotate/main' +include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' +include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/bcftools/roh/main' +include { RHOCALL_ANNOTATE } from '../../modules/nf-core/modules/rhocall/annotate/main' +include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' +include { TABIX_TABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' workflow ANNOTATE_SNVS { @@ -66,7 +68,23 @@ workflow ANNOTATE_SNVS { RHOCALL_ANNOTATE (vcf, ch_roh_rhocall, []) + TABIX_SNV_ANNO (RHOCALL_ANNOTATE.out.vcf) + ch_versions = ch_versions.mix(TABIX_SNV_ANNO.out.versions) + + RHOCALL_ANNOTATE.out + .vcf + .join(TABIX_SNV_ANNO.out.tbi) + .set { ch_vep_in } + + ENSEMBLVEP_SNV(ch_vep_in, + vep_genome, + "homo_sapiens", + vep_cache_version, + file(vep_cache) + ) + ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) + emit: - vcf_ann = RHOCALL_ANNOTATE.out.vcf + vcf_ann = ENSEMBLVEP_SNV.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From e947a9a3c48a3fd0ba5b10602f13ecfedc26926e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:14:00 +0200 Subject: [PATCH 0612/1169] update config --- conf/modules.config | 45 ++++++++++----------------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 6c25c3c3..8568211f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -553,29 +553,15 @@ process { process { withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE' { - ext.args = " --annotate_regions " - publishDir = [ - path: { "${params.outdir}/genmod" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*RANK_VARIANTS_SV:GENMOD_MODELS' { - publishDir = [ - path: { "${params.outdir}/genmod" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + if (params.genome == 'GRCh37') { + ext.args = '--annotate_regions --genome-build 37' + } else if (params.genome == 'GRCh38') { + ext.args = '--annotate_regions --genome-build 38' + } } withName: '.*RANK_VARIANTS_SV:GENMOD_SCORE' { ext.args = " --rank_results " - publishDir = [ - path: { "${params.outdir}/genmod" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*RANK_VARIANTS_SV:GENMOD_COMPOUND' { @@ -625,30 +611,19 @@ process { process { withName: '.*RANK_VARIANTS_SNV:GENMOD_ANNOTATE' { - ext.args = " --annotate_regions " - publishDir = [ - path: { "${params.outdir}/genmod" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + if (params.genome == 'GRCh37') { + ext.args = '--annotate_regions --genome-build 37' + } else if (params.genome == 'GRCh38') { + ext.args = '--annotate_regions --genome-build 38' + } } withName: '.*RANK_VARIANTS_SNV:GENMOD_MODELS' { ext.args = " --whole_gene " - publishDir = [ - path: { "${params.outdir}/genmod" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*RANK_VARIANTS_SNV:GENMOD_SCORE' { ext.args = " --rank_results " - publishDir = [ - path: { "${params.outdir}/genmod" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*RANK_VARIANTS_SNV:GENMOD_COMPOUND' { From 7307755c2ec85550a2d2fef094f207aa04c6b9c7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:38:08 +0200 Subject: [PATCH 0613/1169] refactor config --- conf/modules.config | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 8568211f..b42d3e16 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -553,10 +553,8 @@ process { process { withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE' { - if (params.genome == 'GRCh37') { - ext.args = '--annotate_regions --genome-build 37' - } else if (params.genome == 'GRCh38') { - ext.args = '--annotate_regions --genome-build 38' + ext.args = { + (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' } } @@ -611,10 +609,8 @@ process { process { withName: '.*RANK_VARIANTS_SNV:GENMOD_ANNOTATE' { - if (params.genome == 'GRCh37') { - ext.args = '--annotate_regions --genome-build 37' - } else if (params.genome == 'GRCh38') { - ext.args = '--annotate_regions --genome-build 38' + ext.args = { + (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' } } From ebcb48296bd903ece9ccc5ea420903b9afc94535 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 18 Aug 2022 16:12:24 +0200 Subject: [PATCH 0614/1169] update nextflow.config --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index fd48352c..37f4974c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,7 +14,7 @@ params { outdir = null // References - genome = null + genome = 'GRCh37' igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false local_genomes = null From 2291b0476ba5b940141d87799f66c80723db1143 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 22 Aug 2022 10:37:23 +0200 Subject: [PATCH 0615/1169] Fix spelling of SAMTOOLS_SORT and INDEX --- subworkflows/local/align_MT.nf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 9650c051..e376bb07 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -6,8 +6,8 @@ include { BWAMEM2_MEM as BWAMEM2_MEM_MT } fr include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/modules/picard/addorreplacereadgroups/main' include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' -include { SAMTOOLS_INDEX as SMATOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_SORT as SMATOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' @@ -43,14 +43,14 @@ workflow ALIGN_MT { ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) // Sort bam file - SMATOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) - ch_versions = ch_versions.mix(SMATOOLS_SORT_MT.out.versions.first()) + SAMTOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) + ch_versions = ch_versions.mix(SAMTOOLS_SORT_MT.out.versions.first()) // Index bam file - SMATOOLS_INDEX_MT(SMATOOLS_SORT_MT.out.bam) - ch2=SMATOOLS_SORT_MT.out.bam.join(SMATOOLS_INDEX_MT.out.bai, by: [0]) + SAMTOOLS_INDEX_MT(SAMTOOLS_SORT_MT.out.bam) + ch2=SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_SORT_MT.out.bai, by: [0]) ch3=ch2.combine(intervals_mt) - ch_versions = ch_versions.mix(SMATOOLS_INDEX_MT.out.versions.first()) + ch_versions = ch_versions.mix(SAMTOOLS_SORT_MT.out.versions.first()) // Calls variants with Mutect2 GATK4_MUTECT2_MT ( ch3, fasta, fai, dict, [], [], [], [] ) From 33248ab5b893a37ce463f87a4154342a8dc82b42 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 22 Aug 2022 10:39:11 +0200 Subject: [PATCH 0616/1169] Fix correct spelling samtools --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index d2881e36..ddfab4a5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -577,7 +577,7 @@ process { ext.prefix = { "${meta.id}_markduplicates" } } - withName: '.*ALIGN_MT:SMATOOLS_SORT_MT' { + withName: '.*ALIGN_MT:SAMTOOLS_SORT_MT' { ext.prefix = { "${meta.id}_sorted" } } From fe8ae1d100d4560a3befbd4f3244094185c4e499 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 22 Aug 2022 10:54:33 +0200 Subject: [PATCH 0617/1169] Fix module name stools --- subworkflows/local/align_MT.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index e376bb07..86c3c6fa 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -48,9 +48,9 @@ workflow ALIGN_MT { // Index bam file SAMTOOLS_INDEX_MT(SAMTOOLS_SORT_MT.out.bam) - ch2=SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_SORT_MT.out.bai, by: [0]) + ch2=SAMTOOLS_INDEX_MT.out.bam.join(SAMTOOLS_SORT_MT.out.bai, by: [0]) ch3=ch2.combine(intervals_mt) - ch_versions = ch_versions.mix(SAMTOOLS_SORT_MT.out.versions.first()) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MT.out.versions.first()) // Calls variants with Mutect2 GATK4_MUTECT2_MT ( ch3, fasta, fai, dict, [], [], [], [] ) From 73dcbacefd4ae32619e04e7a4dae866b9cad0b23 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 22 Aug 2022 11:04:43 +0200 Subject: [PATCH 0618/1169] fix previously committed mistake in names --- subworkflows/local/align_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 86c3c6fa..40d7ec13 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -48,7 +48,7 @@ workflow ALIGN_MT { // Index bam file SAMTOOLS_INDEX_MT(SAMTOOLS_SORT_MT.out.bam) - ch2=SAMTOOLS_INDEX_MT.out.bam.join(SAMTOOLS_SORT_MT.out.bai, by: [0]) + ch2=SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) ch3=ch2.combine(intervals_mt) ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MT.out.versions.first()) From 668b81acb39069ec61a74d9c7239ab76bb76ac68 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 22 Aug 2022 16:40:21 +0200 Subject: [PATCH 0619/1169] update modules --- modules.json | 6 +++--- modules/nf-core/modules/genmod/compound/main.nf | 1 + modules/nf-core/modules/genmod/models/main.nf | 1 + modules/nf-core/modules/genmod/score/main.nf | 3 --- modules/nf-core/modules/genmod/score/meta.yml | 4 ---- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/modules.json b/modules.json index 315530aa..c09113f3 100644 --- a/modules.json +++ b/modules.json @@ -67,13 +67,13 @@ "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" }, "genmod/compound": { - "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" + "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" }, "genmod/models": { - "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" + "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" }, "genmod/score": { - "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" + "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" }, "glnexus": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" diff --git a/modules/nf-core/modules/genmod/compound/main.nf b/modules/nf-core/modules/genmod/compound/main.nf index 848cbea3..4bdff8df 100644 --- a/modules/nf-core/modules/genmod/compound/main.nf +++ b/modules/nf-core/modules/genmod/compound/main.nf @@ -24,6 +24,7 @@ process GENMOD_COMPOUND { genmod \\ compound \\ $args \\ + --processes ${task.cpus} \\ --outfile ${prefix}_compound.vcf \\ $input_vcf diff --git a/modules/nf-core/modules/genmod/models/main.nf b/modules/nf-core/modules/genmod/models/main.nf index f571eb32..d786d269 100644 --- a/modules/nf-core/modules/genmod/models/main.nf +++ b/modules/nf-core/modules/genmod/models/main.nf @@ -30,6 +30,7 @@ process GENMOD_MODELS { $args \\ $pen_file \\ $family_file \\ + --processes ${task.cpus} \\ --outfile ${prefix}_models.vcf \\ $input_vcf diff --git a/modules/nf-core/modules/genmod/score/main.nf b/modules/nf-core/modules/genmod/score/main.nf index 4059a0f4..9b7bd009 100644 --- a/modules/nf-core/modules/genmod/score/main.nf +++ b/modules/nf-core/modules/genmod/score/main.nf @@ -10,7 +10,6 @@ process GENMOD_SCORE { input: tuple val(meta), path(input_vcf) path (fam) - path (reduced_penetrance) path (score_config) output: @@ -24,13 +23,11 @@ process GENMOD_SCORE { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def family_file = fam ? "--family_file ${fam}" : "" - def pen_file = reduced_penetrance ? "--reduced_penetrance ${reduced_penetrance}" : "" def config_file = score_config ? "--score_config ${score_config}" : "" """ genmod \\ score \\ $args \\ - $pen_file \\ $family_file \\ $config_file \\ --outfile ${prefix}_score.vcf \\ diff --git a/modules/nf-core/modules/genmod/score/meta.yml b/modules/nf-core/modules/genmod/score/meta.yml index 324b45e0..3c0ae932 100644 --- a/modules/nf-core/modules/genmod/score/meta.yml +++ b/modules/nf-core/modules/genmod/score/meta.yml @@ -21,10 +21,6 @@ input: type: file description: vcf file pattern: "*.{vcf}" - - reduced_penetrance: - type: file - description: file with gene ids that have reduced penetrance - pattern: "*.{tsv}" - family_file: type: file description: ped file From 81653218c3eeba47cbcad2c1c6d2895f8d141156 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 22 Aug 2022 16:42:22 +0200 Subject: [PATCH 0620/1169] remove penetrance for score --- subworkflows/nf-core/genmod.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/genmod.nf b/subworkflows/nf-core/genmod.nf index d60ff812..206f75a5 100644 --- a/subworkflows/nf-core/genmod.nf +++ b/subworkflows/nf-core/genmod.nf @@ -22,7 +22,7 @@ workflow RANK_VARIANTS { ch_versions = ch_versions.mix(GENMOD_ANNOTATE.out.versions) GENMOD_MODELS(GENMOD_ANNOTATE.out.vcf, ped, reduced_penetrance) ch_versions = ch_versions.mix(GENMOD_MODELS.out.versions) - GENMOD_SCORE(GENMOD_MODELS.out.vcf, ped, reduced_penetrance, score_config) + GENMOD_SCORE(GENMOD_MODELS.out.vcf, ped, score_config) ch_versions = ch_versions.mix(GENMOD_SCORE.out.versions) GENMOD_COMPOUND(GENMOD_SCORE.out.vcf) ch_versions = ch_versions.mix(GENMOD_COMPOUND.out.versions) From 184c517053fe7905c5246711e790094e7f183caf Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 22 Aug 2022 17:14:38 +0200 Subject: [PATCH 0621/1169] check if files exist --- workflows/raredisease.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 260b0c07..ab581b96 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -17,6 +17,8 @@ def checkPathParamList = [ params.gnomad, params.input, params.multiqc_config, + params.reduced_penetrance, + params.score_config, params.sentieonbwa_index, params.svdb_query_dbs, params.vcfanno_resources, From 61dc9266223057344148a4526f64a5d22d95ad28 Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 23 Aug 2022 09:14:18 +0200 Subject: [PATCH 0622/1169] fix removed ADDORREPLACEREADGROUPS module --- subworkflows/local/align_MT.nf | 7 +------ subworkflows/local/prepare_MT_alignment.nf | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 40d7ec13..b995f46c 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -4,7 +4,6 @@ include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' -include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/modules/picard/addorreplacereadgroups/main' include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' @@ -34,12 +33,8 @@ workflow ALIGN_MT { GATK4_MERGEBAMALIGNMENT_MT ( ch_fastq_ubam, fasta, dict ) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) - // Add read group to merged bam file - PICARD_ADDORREPLACEREADGROUPS_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) - ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) - // Marks duplicates - PICARD_MARKDUPLICATES_MT ( PICARD_ADDORREPLACEREADGROUPS_MT.out.bam ) + PICARD_MARKDUPLICATES_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) // Sort bam file diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/prepare_MT_alignment.nf index 83e4cc3f..4625996e 100644 --- a/subworkflows/local/prepare_MT_alignment.nf +++ b/subworkflows/local/prepare_MT_alignment.nf @@ -14,7 +14,7 @@ workflow PREPARE_MT_ALIGNMENT { ch_versions = Channel.empty() // Outputs bam containing only MT - SAMTOOLS_VIEW_MT ( bam_cram, [] ) + SAMTOOLS_VIEW_MT ( bam, [] ) ch_versions = ch_versions.mix(SAMTOOLS_VIEW_MT.out.versions.first()) // Removes alignment information From 1e4362708f52b2d495d787127f92c60929cd4c4b Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 23 Aug 2022 15:43:49 +0200 Subject: [PATCH 0623/1169] Fix unstage previous commit --- subworkflows/local/align_MT.nf | 7 ++++++- subworkflows/local/prepare_MT_alignment.nf | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index b995f46c..40d7ec13 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -4,6 +4,7 @@ include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' +include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/modules/picard/addorreplacereadgroups/main' include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' @@ -33,8 +34,12 @@ workflow ALIGN_MT { GATK4_MERGEBAMALIGNMENT_MT ( ch_fastq_ubam, fasta, dict ) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) + // Add read group to merged bam file + PICARD_ADDORREPLACEREADGROUPS_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) + ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) + // Marks duplicates - PICARD_MARKDUPLICATES_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) + PICARD_MARKDUPLICATES_MT ( PICARD_ADDORREPLACEREADGROUPS_MT.out.bam ) ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) // Sort bam file diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/prepare_MT_alignment.nf index 4625996e..83e4cc3f 100644 --- a/subworkflows/local/prepare_MT_alignment.nf +++ b/subworkflows/local/prepare_MT_alignment.nf @@ -14,7 +14,7 @@ workflow PREPARE_MT_ALIGNMENT { ch_versions = Channel.empty() // Outputs bam containing only MT - SAMTOOLS_VIEW_MT ( bam, [] ) + SAMTOOLS_VIEW_MT ( bam_cram, [] ) ch_versions = ch_versions.mix(SAMTOOLS_VIEW_MT.out.versions.first()) // Removes alignment information From 15a1ea77c66107ebf86792a8337dbdf21828d9bc Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 23 Aug 2022 15:46:04 +0200 Subject: [PATCH 0624/1169] fix change once again cram_bam to bam --- subworkflows/local/prepare_MT_alignment.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/prepare_MT_alignment.nf index 83e4cc3f..4625996e 100644 --- a/subworkflows/local/prepare_MT_alignment.nf +++ b/subworkflows/local/prepare_MT_alignment.nf @@ -14,7 +14,7 @@ workflow PREPARE_MT_ALIGNMENT { ch_versions = Channel.empty() // Outputs bam containing only MT - SAMTOOLS_VIEW_MT ( bam_cram, [] ) + SAMTOOLS_VIEW_MT ( bam, [] ) ch_versions = ch_versions.mix(SAMTOOLS_VIEW_MT.out.versions.first()) // Removes alignment information From c389565a4f0563a9049bf114b59389092ca3935d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 25 Aug 2022 11:53:41 +0200 Subject: [PATCH 0625/1169] review suggestions --- assets/svrank_model.ini | 475 +++++++++++++++++++++++++++++ conf/genomes.config | 6 +- main.nf | 3 +- modules/local/create_pedfile.nf | 25 +- modules/local/samplesheet_check.nf | 1 + nextflow_schema.json | 11 +- subworkflows/local/check_input.nf | 2 +- subworkflows/nf-core/genmod.nf | 2 +- workflows/raredisease.nf | 15 +- 9 files changed, 507 insertions(+), 33 deletions(-) create mode 100644 assets/svrank_model.ini diff --git a/assets/svrank_model.ini b/assets/svrank_model.ini new file mode 100644 index 00000000..a4c0f2d3 --- /dev/null +++ b/assets/svrank_model.ini @@ -0,0 +1,475 @@ +[Version] + version = 1.8 + name = svrank_model + +[Categories] + [[allele_frequency]] + category_aggregation = min + + [[clinical_significance]] + category_aggregation = sum + + [[consequence]] + category_aggregation = max + + [[gene_intolerance_prediction]] + category_aggregation = sum + + [[inheritance_models]] + category_aggregation = min + + [[variant_call_quality_filter]] + category_aggregate = sum + + [[variant_length]] + category_aggregation = min + + [[variant_type]] + category_aggregation = min + +[gnomad_sv] + category = allele_frequency + data_type = float + description = Gnomad sv genomes frequency + field = INFO + info_key = gnomad_svAF + record_rule = max + separators = ',', + + [[not_reported]] + score = 6 + + [[common]] + score = -12 + lower = 0.02 + upper = 1.1 + + [[intermediate]] + score = 1 + lower = 0.005 + upper = 0.02 + + [[rare]] + score = 2 + lower = 0.0005 + upper = 0.005 + + [[very_rare]] + score = 4 + lower = 0 + upper = 0.0005 + +[swegen] + category = allele_frequency + data_type = float + description = Swegen genomes frequency + field = INFO + info_key = swegenAF + record_rule = max + separators = ',', + + [[not_reported]] + score = 6 + + [[common]] + score = -12 + lower = 0.02 + upper = 1.1 + + [[intermediate]] + score = 1 + lower = 0.005 + upper = 0.02 + + [[rare]] + score = 2 + lower = 0.0005 + upper = 0.005 + + [[very_rare]] + score = 4 + lower = 0 + upper = 0.0005 + +[svdb_merge_mip] + category = allele_frequency + data_type = float + description = Clinical genomics genomes frequency + field = INFO + info_key = clinical_genomics_mipAF + record_rule = max + separators = ',', + + [[not_reported]] + score = 6 + + [[common]] + score = -12 + lower = 0.02 + upper = 1.1 + + [[intermediate]] + score = 1 + lower = 0.005 + upper = 0.02 + + [[rare]] + score = 2 + lower = 0.0005 + upper = 0.005 + + [[very_rare]] + score = 4 + lower = 0 + upper = 0.0005 + +[sv_len] + category = variant_length + data_type = integer + description = The length of the structural variant + field = INFO + info_key = SVLEN + record_rule = min + separators = ',', + + [[not_reported]] + score = 0 + + [[long_pos]] + score = 3 + lower = 1000001 + upper = 100000000 + + [[long_neg]] + score = 3 + lower = -100000000 + upper = -1000001 + + [[medium_pos]] + score = 3 + lower = 50001 + upper = 1000000 + + [[medium_neg]] + score = 3 + lower = -1000000 + upper = -50001 + +[gene_intolerance_score] + category = gene_intolerance_prediction + data_type = float + description = Gnomad gene intolerance prediction + field = INFO + info_key = most_severe_pli + record_rule = max + separators = None + + [[not_reported]] + score = 0 + + [[low_intolerance]] + score = 0 + lower = 0 + upper = 0.90 + + [[medium_intolerance]] + score = 2 + lower = 0.90 + upper = 0.99 + + [[high_intolerance]] + score = 4 + lower = 0.99 + upper = 1.1 + +[genetic_models] + data_type = string + description = The inheritance models followed for the variant + category = inheritance_models + field = INFO + info_key = GeneticModels + record_rule = max + separators = ',', ':', '|', + + [[ad]] + priority = 1 + score = 3 + string = 'AD' + + [[ad_dn]] + priority = 1 + score = 3 + string = 'AD_dn' + + [[ar]] + priority = 1 + score = 3 + string = 'AR_hom' + + [[ar_dn]] + priority = 1 + score = 3 + string = 'AR_hom_dn' + + [[ar_comp]] + priority = 1 + score = 3 + string = 'AR_comp' + + [[ar_comp_dn]] + priority = 1 + score = 3 + string = 'AR_comp_dn' + + [[xr]] + priority = 1 + score = 3 + string = 'XR' + + [[xr_dn]] + priority = 1 + score = 3 + string = 'XR_dn' + + [[xd]] + priority = 1 + score = 3 + string = 'XD' + + [[xd_dn]] + priority = 1 + score = 3 + string = 'XD_dn' + + [[not_reported]] + score = 0 + +[model_score] + category = variant_call_quality_filter + data_type = integer + description = The inheritance model score + field = INFO + info_key = ModelScore + record_rule = min + separators = ',',':', + + [[not_reported]] + score = 0 + + [[low_qual]] + score = -5 + lower = 0 + upper = 20 + + [[high_qual]] + score = 0 + lower = 20 + upper = 300 + +[most_severe_consequence] + category = consequence + data_type = string + description = The most severe consequence for this variant + field = INFO + info_key = most_severe_consequence + record_rule = max + separators = ',', ':', '|', + + [[transcript_ablation]] + score = 10 + priority = 6 + string = 'transcript_ablation' + + [[initiator_codon_variant]] + score = 9 + priority = 5 + string = 'initiator_codon_variant' + + [[frameshift_variant]] + score = 8 + priority = 5 + string = 'frameshift_variant' + + [[stop_gained]] + score = 8 + priority = 5 + string = 'stop_gained' + + [[start_lost]] + score = 8 + priority = 5 + string = 'start_lost' + + [[stop_lost]] + score = 8 + priority = 5 + string = 'stop_lost' + + [[splice_acceptor_variant]] + score = 8 + priority = 5 + string = 'splice_acceptor_variant' + + [[splice_donor_variant]] + score = 8 + priority = 5 + string = 'splice_donor_variant' + + [[coding_sequence_variant]] + score = 7 + priority = 4 + string = 'coding_sequence_variant' + + [[inframe_deletion]] + score = 5 + priority = 4 + string = 'inframe_deletion' + + [[transcript_amplification]] + score = 5 + priority = 4 + string = 'transcript_amplification' + + [[splice_region_variant]] + score = 5 + priority = 4 + string = 'splice_region_variant' + + [[missense_variant]] + score = 5 + priority = 4 + string = 'missense_variant' + + [[protein_altering_variant]] + score = 5 + priority = 4 + string = 'protein_altering_variant' + + [[inframe_insertion]] + score = 5 + priority = 4 + string = 'inframe_insertion' + + [[incomplete_terminal_codon_variant]] + score = 5 + priority = 4 + string = 'incomplete_terminal_codon_variant' + + [[non_coding_transcript_exon_variant]] + score = 3 + priority = 2 + string = 'non_coding_transcript_exon_variant' + + [[synonymous_variant]] + score = 2 + priority = 2 + string = 'synonymous_variant' + + [[mature_mirna_variant]] + score = 1 + priority = 2 + string = 'mature_mirna_variant' + + [[non_coding_transcript_variant]] + score = 1 + priority = 2 + string = 'non_coding_transcript_variant' + + [[regulatory_region_variant]] + score = 1 + priority = 2 + string = 'regulatory_region_variant' + + [[upstream_gene_variant]] + score = 1 + priority = 2 + string = 'upstream_gene_variant' + + [[regulatory_region_amplification]] + score = 1 + priority = 2 + string = 'regulatory_region_amplification' + + [[tfbs_amplification]] + score = 1 + priority = 2 + string = 'tfbs_amplification' + + [[5_prime_utr_variant]] + score = 1 + priority = 2 + string = '5_prime_utr_variant' + + [[intron_variant]] + score = 1 + priority = 2 + string = 'intron_variant' + + [[3_prime_utr_variant]] + score = 1 + priority = 2 + string = '3_prime_utr_variant' + + [[feature_truncation]] + score = 1 + priority = 2 + string = 'feature_truncation' + + [[TF_binding_site_variant]] + score = 1 + priority = 2 + string = 'TF_binding_site_variant' + + [[stop_retained_variant]] + score = 1 + priority = 2 + string = 'stop_retained_variant' + + [[feature_elongation]] + score = 1 + priority = 2 + string = 'feature_elongation' + + [[regulatory_region_ablation]] + score = 1 + priority = 2 + string = 'regulatory_region_ablation' + + [[tfbs_ablation]] + score = 1 + priority = 2 + string = 'tfbs_ablation' + + [[downstream_gene_variant]] + score = 1 + priority = 2 + string = 'downstream_gene_variant' + + [[NMD_transcript_variant]] + score = 1 + priority = 2 + string = 'NMD_transcript_variant' + + [[intergenic_variant]] + score = 0 + priority = 0 + string = 'intergenic_variant' + + [[not_reported]] + score = 0 + +[filter] + category = variant_call_quality_filter + data_type = string + description = The filters for the variant + field = FILTER + record_rule = min + separators = ';', + + [[not_reported]] + score = 0 + + [[pass]] + score = 3 + priority = 1 + string = 'PASS' diff --git a/conf/genomes.config b/conf/genomes.config index d0166586..77cd2eca 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -23,7 +23,8 @@ params { known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" - score_config = "${params.local_genomes}/rank_model_-v1.31-.ini" + score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" + score_config_sv = "${params.local_genomes}/svrank_model_-v1.8-.ini" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -44,7 +45,8 @@ params { known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" reduced_penetrance = "" - score_config = "${params.local_genomes}/rank_model_-v1.31-.ini" + score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" + score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/main.nf b/main.nf index f88b21e0..877e54d8 100644 --- a/main.nf +++ b/main.nf @@ -30,7 +30,8 @@ params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_ind params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') params.ml_model = WorkflowMain.getGenomeAttribute(params, 'ml_model') params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_penetrance') -params.score_config = WorkflowMain.getGenomeAttribute(params, 'score_config') +params.score_config_snv = WorkflowMain.getGenomeAttribute(params, 'score_config_snv') +params.score_config_sv = WorkflowMain.getGenomeAttribute(params, 'score_config_sv') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') diff --git a/modules/local/create_pedfile.nf b/modules/local/create_pedfile.nf index 3ff30041..196fe3ec 100644 --- a/modules/local/create_pedfile.nf +++ b/modules/local/create_pedfile.nf @@ -7,7 +7,7 @@ process MAKE_PED { 'quay.io/biocontainers/python:3.9--1' }" input: - path samplesheet + val(samples) output: path '*.ped' , emit: ped @@ -16,23 +16,12 @@ process MAKE_PED { task.ext.when == null || task.ext.when script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ + def pedinfo = "" + for(int i = 0; ifamily.ped + echo "$pedinfo" >>family.ped """ } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index e8d19a6f..b114546c 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -21,6 +21,7 @@ process SAMPLESHEET_CHECK { check_samplesheet.py \\ $samplesheet \\ samplesheet.valid.csv + cat <<-END_VERSIONS > versions.yml "${task.process}": python: \$(python --version | sed 's/Python //g') diff --git a/nextflow_schema.json b/nextflow_schema.json index c524af7e..13184486 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -157,11 +157,18 @@ "description": "File with gene ids that have reduced penetrance. For use with genmod", "hidden": true }, - "score_config": { + "score_config_snv": { "type": "string", "format": "path", "fa_icon": "fas fa-chart-bar", - "description": "Rank model config file for genmod.", + "description": "SNV rank model config file for genmod.", + "hidden": true + }, + "score_config_sv": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "SV rank model config file for genmod.", "hidden": true }, "target_bed": { diff --git a/subworkflows/local/check_input.nf b/subworkflows/local/check_input.nf index 334ab1df..5856870a 100644 --- a/subworkflows/local/check_input.nf +++ b/subworkflows/local/check_input.nf @@ -23,7 +23,7 @@ workflow CHECK_INPUT { case_info // channel: [ case_id ] reads // channel: [ val(meta), [ reads ] ] samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] - versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] diff --git a/subworkflows/nf-core/genmod.nf b/subworkflows/nf-core/genmod.nf index 206f75a5..7bc74780 100644 --- a/subworkflows/nf-core/genmod.nf +++ b/subworkflows/nf-core/genmod.nf @@ -1,5 +1,5 @@ // -// A subworkflow to score, rank and filter variants. +// A subworkflow to score and rank variants. // include { GENMOD_ANNOTATE } from '../../modules/nf-core/modules/genmod/annotate/main' diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index ab581b96..5adee2ff 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -18,7 +18,8 @@ def checkPathParamList = [ params.input, params.multiqc_config, params.reduced_penetrance, - params.score_config, + params.score_config_snv, + params.score_config_sv, params.sentieonbwa_index, params.svdb_query_dbs, params.vcfanno_resources, @@ -32,7 +33,8 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample ch_ml_model = params.ml_model ? file(params.ml_model) : [] ch_call_interval = params.call_interval ? file(params.call_interval) : [] ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] -ch_score_config = params.score_config ? file(params.score_config) : [] +ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] +ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -113,10 +115,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) - MAKE_PED ( - ch_input - ) - + MAKE_PED (CHECK_INPUT.out.samples.toList()) // STEP 0: QUALITY CHECK. FASTQC ( CHECK_INPUT.out.reads @@ -233,7 +232,7 @@ workflow RAREDISEASE { ch_sv_annotate.vcf_ann, MAKE_PED.out.ped, ch_reduced_penetrance, - ch_score_config + ch_score_config_sv ) ch_versions = ch_versions.mix(ch_sv_annotate.versions) @@ -266,7 +265,7 @@ workflow RAREDISEASE { ANNOTATE_SNVS.out.vcf_ann, MAKE_PED.out.ped, ch_reduced_penetrance, - ch_score_config + ch_score_config_snv ) // From f488390b9ab83e92bb79bf4c4bcd57d6b47f8494 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 25 Aug 2022 12:01:48 +0200 Subject: [PATCH 0626/1169] rename config --- assets/{svrank_model.ini => svrank_model.config} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename assets/{svrank_model.ini => svrank_model.config} (100%) diff --git a/assets/svrank_model.ini b/assets/svrank_model.config similarity index 100% rename from assets/svrank_model.ini rename to assets/svrank_model.config From 4d9483c9804f2ee280aa48acb5254f093792d064 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 25 Aug 2022 12:08:25 +0200 Subject: [PATCH 0627/1169] update for lint error --- .nf-core.yml | 1 + assets/{svrank_model.config => svrank_model.ini} | 0 2 files changed, 1 insertion(+) rename assets/{svrank_model.config => svrank_model.ini} (100%) diff --git a/.nf-core.yml b/.nf-core.yml index a6868bcb..78cc7bed 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -4,6 +4,7 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml - .github/PULL_REQUEST_TEMPLATE.md - assets/multiqc_config.yaml + - assets/svrank_model.ini - .github/workflows/linting.yml - .github/workflows/linting_comment.yml - .github/workflows/branch.yml diff --git a/assets/svrank_model.config b/assets/svrank_model.ini similarity index 100% rename from assets/svrank_model.config rename to assets/svrank_model.ini From 491e46020391ae60dfb6de2f66a51e245e8f40f5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 25 Aug 2022 12:14:04 +0200 Subject: [PATCH 0628/1169] update workflow test --- .github/workflows/linting.yml | 2 +- .nf-core.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 77358dee..58b17042 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -20,7 +20,7 @@ jobs: run: npm install -g editorconfig-checker - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') + run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.ini\|.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') Prettier: runs-on: ubuntu-latest diff --git a/.nf-core.yml b/.nf-core.yml index 78cc7bed..a6868bcb 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -4,7 +4,6 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml - .github/PULL_REQUEST_TEMPLATE.md - assets/multiqc_config.yaml - - assets/svrank_model.ini - .github/workflows/linting.yml - .github/workflows/linting_comment.yml - .github/workflows/branch.yml From ddb345b3a328b1af55a4609ea3e4afa9d18ca813 Mon Sep 17 00:00:00 2001 From: lucpen Date: Thu, 25 Aug 2022 13:32:48 +0200 Subject: [PATCH 0629/1169] feat updated picard AddOrReplaceReadGroups --- conf/modules.config | 7 ++++++- modules.json | 2 +- .../modules/picard/addorreplacereadgroups/main.nf | 9 +++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ddfab4a5..719dff27 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -572,11 +572,16 @@ process { ext.prefix = { "${meta.id}_merged" } } + + withName: '.*ALIGN_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT' + } + withName: '.*ALIGN_MT:PICARD_MARKDUPLICATES_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates" } } - + withName: '.*ALIGN_MT:SAMTOOLS_SORT_MT' { ext.prefix = { "${meta.id}_sorted" } } diff --git a/modules.json b/modules.json index 1e4fd609..1ee7db76 100644 --- a/modules.json +++ b/modules.json @@ -82,7 +82,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/addorreplacereadgroups": { - "git_sha": "63db63757cab03cfa7a02c0d0f134b66fbfadea6" + "git_sha": "baa2845d2818066bcbd8b91e6ce77d71e36ecf45" }, "picard/collecthsmetrics": { "git_sha": "35231d394940dca2291ac2321c8f9b2e3b039905" diff --git a/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf b/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf index aff83c9f..116aa4fa 100644 --- a/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf +++ b/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf @@ -2,10 +2,10 @@ process PICARD_ADDORREPLACEREADGROUPS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::picard=2.27.2" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.2--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.2--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -34,8 +34,9 @@ process PICARD_ADDORREPLACEREADGROUPS { } """ picard \\ - AddOrReplaceReadGroups \\ -Xmx${avail_mem}g \\ + AddOrReplaceReadGroups \\ + $args \\ --INPUT ${bam} \\ --OUTPUT ${prefix}.bam \\ --RGID ${ID} \\ From e09b1e4d9ff503a5f54e64d692a8236151f71fa6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 25 Aug 2022 16:23:32 +0200 Subject: [PATCH 0630/1169] revert a git workflow --- .github/workflows/linting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 58b17042..77358dee 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -20,7 +20,7 @@ jobs: run: npm install -g editorconfig-checker - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.ini\|.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') + run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') Prettier: runs-on: ubuntu-latest From 07fdce4349beba006f2c0dfc0a10285566277a87 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 25 Aug 2022 16:56:48 +0200 Subject: [PATCH 0631/1169] add stub --- modules/local/ensemblvep/main.nf | 12 ++++++++++++ subworkflows/local/annotate_snvs.nf | 2 +- subworkflows/local/annotate_structural_variants.nf | 2 +- workflows/raredisease.nf | 8 ++++---- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index 0094ae79..392aa240 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -50,4 +50,16 @@ process ENSEMBLVEP { ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.ann.vcf.gz + touch ${prefix}.summary.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ } diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 9db7d089..1e2e1851 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -80,7 +80,7 @@ workflow ANNOTATE_SNVS { vep_genome, "homo_sapiens", vep_cache_version, - file(vep_cache) + vep_cache ) ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 07bd8902..238e8223 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -70,7 +70,7 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { vep_genome, "homo_sapiens", vep_cache_version, - file(vep_cache) + vep_cache ) ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5adee2ff..ab5f045c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -22,8 +22,7 @@ def checkPathParamList = [ params.score_config_sv, params.sentieonbwa_index, params.svdb_query_dbs, - params.vcfanno_resources, - params.vep_cache + params.vcfanno_resources ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } @@ -35,6 +34,7 @@ ch_call_interval = params.call_interval ? file(params.call_interval) ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] +ch_vep_cache = params.vep_cache ? file(params.vep_cache) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -223,7 +223,7 @@ workflow RAREDISEASE { params.svdb_query_dbs, params.genome, params.vep_cache_version, - params.vep_cache, + ch_vep_cache, ch_references.genome_fasta, ch_references.sequence_dict ).set {ch_sv_annotate} @@ -254,7 +254,7 @@ workflow RAREDISEASE { params.vcfanno_toml, params.genome, params.vep_cache_version, - params.vep_cache, + ch_vep_cache, ch_references.genome_fasta, ch_references.gnomad_af, CHECK_INPUT.out.samples From 561d22f6ec68b2610c6f1577557cdded034903db Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 25 Aug 2022 17:00:48 +0200 Subject: [PATCH 0632/1169] fix lint error --- .github/workflows/linting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 77358dee..58b17042 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -20,7 +20,7 @@ jobs: run: npm install -g editorconfig-checker - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') + run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.ini\|.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') Prettier: runs-on: ubuntu-latest From 59fb73326cb8f0abfb013e6fae03a96fe0ecc396 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 17 Aug 2022 12:03:23 +0200 Subject: [PATCH 0633/1169] add snv vep --- conf/modules.config | 18 ++++++++++++++++++ subworkflows/local/annotate_snvs.nf | 26 ++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e9f952fb..e51aab1b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -576,6 +576,24 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + + withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { + ext.args = [ + '--plugin LoFtool,vep_cache/LoFtool_scores.txt', + '--distance 5000', + '--buffer_size 20000', + '--format vcf --max_sv_size 248956422', + '--appris --biotype --cache --canonical --ccds', + '--domains --exclude_predicted --force_overwrite', + '--hgvs --humdiv --no_progress --no_stats --numbers', + '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl', + '--uniprot' + ].join(' ') + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + ] + } } // diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index ed91a430..9db7d089 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -2,9 +2,11 @@ // A subworkflow to annotate snvs // -include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' -include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/bcftools/roh/main' -include { RHOCALL_ANNOTATE } from '../../modules/nf-core/modules/rhocall/annotate/main' +include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' +include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/bcftools/roh/main' +include { RHOCALL_ANNOTATE } from '../../modules/nf-core/modules/rhocall/annotate/main' +include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' +include { TABIX_TABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' workflow ANNOTATE_SNVS { @@ -66,7 +68,23 @@ workflow ANNOTATE_SNVS { RHOCALL_ANNOTATE (vcf, ch_roh_rhocall, []) + TABIX_SNV_ANNO (RHOCALL_ANNOTATE.out.vcf) + ch_versions = ch_versions.mix(TABIX_SNV_ANNO.out.versions) + + RHOCALL_ANNOTATE.out + .vcf + .join(TABIX_SNV_ANNO.out.tbi) + .set { ch_vep_in } + + ENSEMBLVEP_SNV(ch_vep_in, + vep_genome, + "homo_sapiens", + vep_cache_version, + file(vep_cache) + ) + ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) + emit: - vcf_ann = RHOCALL_ANNOTATE.out.vcf + vcf_ann = ENSEMBLVEP_SNV.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From be0a00e60226c3f092594a4e99ecd15daba2e6f5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 25 Aug 2022 16:56:48 +0200 Subject: [PATCH 0634/1169] add stub --- modules/local/ensemblvep/main.nf | 12 ++++++++++++ subworkflows/local/annotate_snvs.nf | 2 +- .../local/annotate_structural_variants.nf | 2 +- workflows/raredisease.nf | 16 +++++++++------- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index 0094ae79..392aa240 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -50,4 +50,16 @@ process ENSEMBLVEP { ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.ann.vcf.gz + touch ${prefix}.summary.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ } diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 9db7d089..1e2e1851 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -80,7 +80,7 @@ workflow ANNOTATE_SNVS { vep_genome, "homo_sapiens", vep_cache_version, - file(vep_cache) + vep_cache ) ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 07bd8902..238e8223 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -70,7 +70,7 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { vep_genome, "homo_sapiens", vep_cache_version, - file(vep_cache) + vep_cache ) ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4fe0d0c1..e6b32f33 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -19,16 +19,18 @@ def checkPathParamList = [ params.multiqc_config, params.sentieonbwa_index, params.svdb_query_dbs, - params.vcfanno_resources, - params.vep_cache + params.vcfanno_resources ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -ch_ml_model = params.ml_model ? file(params.ml_model) : [] -ch_call_interval = params.call_interval ? file(params.call_interval) : [] +ch_ml_model = params.ml_model ? file(params.ml_model) : [] +ch_call_interval = params.call_interval ? file(params.call_interval) : [] +ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] +ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] +ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -199,7 +201,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) } - + ch_sv_annotate = Channel.empty() if (params.annotate_sv_switch) { ANNOTATE_STRUCTURAL_VARIANTS ( @@ -207,7 +209,7 @@ workflow RAREDISEASE { params.svdb_query_dbs, params.genome, params.vep_cache_version, - params.vep_cache, + ch_vep_cache, ch_references.genome_fasta, ch_references.sequence_dict ).set {ch_sv_annotate} @@ -231,7 +233,7 @@ workflow RAREDISEASE { params.vcfanno_toml, params.genome, params.vep_cache_version, - params.vep_cache, + ch_vep_cache, ch_references.genome_fasta, ch_references.gnomad_af, CHECK_INPUT.out.samples From 9a77085c780cdbf538f4237db9389fae24a56bfc Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 26 Aug 2022 10:16:57 +0200 Subject: [PATCH 0635/1169] fix removed tests folder --- tests/config/nextflow.config | 33 ----------------- tests/config/test_data.config | 22 ----------- tests/subworkflows/local/align_MT/main.nf | 37 ------------------- .../local/align_MT/nextflow.config | 7 ---- 4 files changed, 99 deletions(-) delete mode 100644 tests/config/nextflow.config delete mode 100644 tests/config/test_data.config delete mode 100644 tests/subworkflows/local/align_MT/main.nf delete mode 100644 tests/subworkflows/local/align_MT/nextflow.config diff --git a/tests/config/nextflow.config b/tests/config/nextflow.config deleted file mode 100644 index 2c672d49..00000000 --- a/tests/config/nextflow.config +++ /dev/null @@ -1,33 +0,0 @@ -params { - outdir = "output/" - publish_dir_mode = "copy" - enable_conda = false - singularity_pull_docker_container = false -} - -process { - cpus = 2 - memory = 3.GB - time = 2.h -} - -if ("$PROFILE" == "singularity") { - singularity.enabled = true - singularity.autoMounts = true -} else if ("$PROFILE" == "conda") { - params.enable_conda = true -} else { - docker.enabled = true - docker.userEmulation = true - docker.runOptions = "--platform linux/x86_64" -} - -// Increase time available to build Conda environment -conda { createTimeout = "120 min" } - -// Load test_data.config containing paths to test data -includeConfig 'test_data.config' - -manifest { - nextflowVersion = '!>=21.10.0' -} diff --git a/tests/config/test_data.config b/tests/config/test_data.config deleted file mode 100644 index cabb8f72..00000000 --- a/tests/config/test_data.config +++ /dev/null @@ -1,22 +0,0 @@ -// Base directory for test data -// TODO: Commit these files to nf-core/test-datasets if we want to keep testing with them -def test_data_dir1 = "https://raw.githubusercontent.com/lmtani/wf-human-mito/main" - -def test_data_dir2 = "https://gist.github.com/lmtani/f5f164e34c9e7aba44474d93c7108eb3/raw/e529b386f39a8efc2c6512d0bb8975c2a0c1ce59" - -params { - test_data { - 'mini_human_genome' { - 'alignment' { - bam = "${test_data_dir2}/NA12878_aligned.bam" - bai = "${test_data_dir2}/NA12878_aligned.bam.bai" - } - fasta = "${test_data_dir1}/tests/data/Homo_sapiens_assembly38_chrM_and_alt.fasta" - fai = "${test_data_dir1}/tests/data/Homo_sapiens_assembly38_chrM_and_alt.fasta.fai" - dict = "${test_data_dir1}/tests/data/Homo_sapiens_assembly38_chrM_and_alt.dict" - } - 'mitochondria' { - intervals_mt = "${test_data_dir1}/data/non_control_region.chrM.interval_list" - } - } -} diff --git a/tests/subworkflows/local/align_MT/main.nf b/tests/subworkflows/local/align_MT/main.nf deleted file mode 100644 index 96721c02..00000000 --- a/tests/subworkflows/local/align_MT/main.nf +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env nextflow - -nextflow.enable.dsl = 2 - -include { BWAMEM2_INDEX } from '../../../../modules/nf-core/modules/bwamem2/index/main' - -include { PREPARE_MT_ALIGNMENT } from '../../../../subworkflows/local/prepare_MT_alignment' -include { ALIGN_MT } from '../../../../subworkflows/local/align_MT' - - - - -workflow align_mt { - input = [ [ id:'A', sample:'NA12878', single_end: false], // meta map - file(params.test_data['mini_human_genome']['alignment']['bam'], checkIfExists: true), - file(params.test_data['mini_human_genome']['alignment']['bai'], checkIfExists: true), - ] - - fasta = [ file(params.test_data['mini_human_genome']['fasta'], checkIfExists: true) ] - fai = [ file(params.test_data['mini_human_genome']['fai'], checkIfExists: true) ] - dict = [ file(params.test_data['mini_human_genome']['dict'], checkIfExists: true) ] - intervals_mt = [ file(params.test_data['mitochondria']['intervals_mt'], checkIfExists: true ) ] - - PREPARE_MT_ALIGNMENT ( input ) - - BWAMEM2_INDEX ( fasta ) - - ALIGN_MT ( - PREPARE_MT_ALIGNMENT.out.fastq, - PREPARE_MT_ALIGNMENT.out.bam, - BWAMEM2_INDEX.out.index, - fasta, - dict, - fai, - intervals_mt - ) -} diff --git a/tests/subworkflows/local/align_MT/nextflow.config b/tests/subworkflows/local/align_MT/nextflow.config deleted file mode 100644 index 06309122..00000000 --- a/tests/subworkflows/local/align_MT/nextflow.config +++ /dev/null @@ -1,7 +0,0 @@ -process { - publishDir = [ - path: { "${params.outdir}/workspace/${task.process.tokenize(':')[-1].toLowerCase()}" }, - mode: "copy", - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] -} From a2668caaa2362c3325668b0e47637d7af620ad75 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 26 Aug 2022 10:47:21 +0200 Subject: [PATCH 0636/1169] review suggestions --- modules/local/create_pedfile.nf | 10 +++++----- workflows/raredisease.nf | 6 ++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/local/create_pedfile.nf b/modules/local/create_pedfile.nf index 196fe3ec..b4761f07 100644 --- a/modules/local/create_pedfile.nf +++ b/modules/local/create_pedfile.nf @@ -15,13 +15,13 @@ process MAKE_PED { when: task.ext.when == null || task.ext.when - script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ - def pedinfo = "" + script: + def pedinfo = ['#family_id', 'sample_id', 'father', 'mother', 'sex', 'phenotype'].join('\t') for(int i = 0; ifamily.ped - echo "$pedinfo" >>family.ped + echo "$pedinfo" > family.ped """ } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5adee2ff..c3ffe1a0 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -116,6 +116,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) MAKE_PED (CHECK_INPUT.out.samples.toList()) + // STEP 0: QUALITY CHECK. FASTQC ( CHECK_INPUT.out.reads @@ -227,6 +228,7 @@ workflow RAREDISEASE { ch_references.genome_fasta, ch_references.sequence_dict ).set {ch_sv_annotate} + ch_versions = ch_versions.mix(ch_sv_annotate.versions) RANK_VARIANTS_SV ( ch_sv_annotate.vcf_ann, @@ -234,8 +236,7 @@ workflow RAREDISEASE { ch_reduced_penetrance, ch_score_config_sv ) - - ch_versions = ch_versions.mix(ch_sv_annotate.versions) + ch_versions = ch_versions.mix(RANK_VARIANTS_SV.out.versions) } // STEP 2.1: MT CALLING @@ -267,6 +268,7 @@ workflow RAREDISEASE { ch_reduced_penetrance, ch_score_config_snv ) + ch_versions = ch_versions.mix(RANK_VARIANTS_SNV.out.versions) // // MODULE: Pipeline reporting From 0be3bcc71734ece38998c5039ba381c5efb0ea93 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 26 Aug 2022 10:51:49 +0200 Subject: [PATCH 0637/1169] fix inconsistencies after merging with main --- conf/modules.config | 5 +++-- workflows/raredisease.nf | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9c67a4d5..b8e1c70d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -223,7 +223,7 @@ process { // Sentieon alignment options // -process{ +process { withName: '.*ALIGN_SENTIEON:.*' { ext.when = params.aligner.equals("sentieon") } @@ -626,7 +626,8 @@ process { } withName: '.*ALIGN_MT:GATK4_MUTECT2_MT' { - ext.args = '--mitochondria-mode TRUE' + ext.args = '--mitochondria-mode TRUE' + } } // diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e22649da..134188de 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -57,6 +57,7 @@ include { GENS } from '../subworkflows/local/gens' include { ALIGN } from '../subworkflows/local/align' include { CALL_SNV } from '../subworkflows/local/call_snv' include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' +include { ALIGN_MT } from '../subworkflows/local/align_MT' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -79,8 +80,6 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' -include { ALIGN_MT } from '../subworkflows/local/align_MT' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 9005dc6a9b6de496b7a1d5e3cdb4f2c373b5fdaf Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 26 Aug 2022 11:08:46 +0200 Subject: [PATCH 0638/1169] fix formatting errors --- modules.json | 2 +- nextflow_schema.json | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules.json b/modules.json index d7a251e8..5623307d 100644 --- a/modules.json +++ b/modules.json @@ -155,4 +155,4 @@ } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index 82f40388..cdf86ea0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -115,6 +115,13 @@ "description": "Path to the index file for the gnomad tab file with allele frequencies.", "help_text": "Path to the index of gnomad tab file with CHR/START/REF,ALT/AF" }, + "intervals_mt": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-file", + "description": "Path to the interval list of the non control mitochondral region.", + "help_text": "Path to the interval list of the non control mitochondral regions for Mutect2" + }, "known_dbsnp": { "type": "string", "format": "path", From 3a29f145d10c535b38000a6b90e422a521deb900 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 26 Aug 2022 11:12:42 +0200 Subject: [PATCH 0639/1169] fix deleted trailing spaces --- conf/modules.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b8e1c70d..6fe44eab 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -611,22 +611,22 @@ process { ext.prefix = { "${meta.id}_merged" } } - + withName: '.*ALIGN_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT' } - + withName: '.*ALIGN_MT:PICARD_MARKDUPLICATES_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates" } } - + withName: '.*ALIGN_MT:SAMTOOLS_SORT_MT' { ext.prefix = { "${meta.id}_sorted" } } withName: '.*ALIGN_MT:GATK4_MUTECT2_MT' { - ext.args = '--mitochondria-mode TRUE' + ext.args = '--mitochondria-mode TRUE' } } From f260ffdf003b6ab282e81c3ee0c3adc7fd8ef481 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 26 Aug 2022 13:51:35 +0200 Subject: [PATCH 0640/1169] update ini --- assets/svrank_model.ini | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/assets/svrank_model.ini b/assets/svrank_model.ini index a4c0f2d3..510aadf1 100644 --- a/assets/svrank_model.ini +++ b/assets/svrank_model.ini @@ -91,38 +91,6 @@ lower = 0 upper = 0.0005 -[svdb_merge_mip] - category = allele_frequency - data_type = float - description = Clinical genomics genomes frequency - field = INFO - info_key = clinical_genomics_mipAF - record_rule = max - separators = ',', - - [[not_reported]] - score = 6 - - [[common]] - score = -12 - lower = 0.02 - upper = 1.1 - - [[intermediate]] - score = 1 - lower = 0.005 - upper = 0.02 - - [[rare]] - score = 2 - lower = 0.0005 - upper = 0.005 - - [[very_rare]] - score = 4 - lower = 0 - upper = 0.0005 - [sv_len] category = variant_length data_type = integer From 9d9561bbc8f3f70f6e554ef017d2287eb32b76b7 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Fri, 26 Aug 2022 15:01:39 +0200 Subject: [PATCH 0641/1169] Update conf/test.config Co-authored-by: Anders Jemt --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 74733d94..6e19d738 100644 --- a/conf/test.config +++ b/conf/test.config @@ -35,5 +35,5 @@ params { target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' - intervals_mt='https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' + intervals_mt = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' } From 51e97700fff81833162c19be17576bb96d3f10df Mon Sep 17 00:00:00 2001 From: Lucpen Date: Fri, 26 Aug 2022 15:02:22 +0200 Subject: [PATCH 0642/1169] Update conf/modules.config Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- conf/modules.config | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 6fe44eab..9614c6cb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -611,7 +611,6 @@ process { ext.prefix = { "${meta.id}_merged" } } - withName: '.*ALIGN_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT' } From d04876949eaad92a94d655eaee94b0a12485a3e2 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Fri, 26 Aug 2022 15:09:34 +0200 Subject: [PATCH 0643/1169] Apply suggestions from code review Co-authored-by: Anders Jemt --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 134188de..352de8bb 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -222,7 +222,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) // STEP 2.2: MT ALLIGNMENT - ch_int = Channel.fromPath(params.intervals_mt) + ch_intervals_mt = Channel.fromPath(params.intervals_mt) ALIGN_MT ( PREPARE_MT_ALIGNMENT.out.fastq, PREPARE_MT_ALIGNMENT.out.bam, From ee5b34e1b9913f2c45323f8dd9aaa655c5ddca4b Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 26 Aug 2022 16:18:07 +0200 Subject: [PATCH 0644/1169] feat making ANALYSE_MT subworkflow --- conf/modules.config | 22 +++++++-------- subworkflows/local/align_MT.nf | 2 +- subworkflows/local/analyse_MT.nf | 47 ++++++++++++++++++++++++++++++++ workflows/raredisease.nf | 35 ++++++++++++++++-------- 4 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 subworkflows/local/analyse_MT.nf diff --git a/conf/modules.config b/conf/modules.config index 9614c6cb..a72ea8db 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -579,52 +579,52 @@ process { } // -// PREPARE_MT_ALIGNMENT +// ANALYSE_MT:PREPARE_MT_ALIGNMENT // process { - withName: '.*PREPARE_MT_ALIGNMENT:SAMTOOLS_VIEW_MT' { + withName: '.*ANALYSE_MT:PREPARE_MT_ALIGNMENT:SAMTOOLS_VIEW_MT' { ext.args = { "-h " } ext.args2 = { (params.genome == "GRCh37") ? "MT" : "chrM" } } - withName: '.*PREPARE_MT_ALIGNMENT:GATK4_REVERTSAM_MT' { + withName: '.*ANALYSE_MT:PREPARE_MT_ALIGNMENT:GATK4_REVERTSAM_MT' { ext.args = '--OUTPUT_BY_READGROUP false --VALIDATION_STRINGENCY LENIENT --ATTRIBUTE_TO_CLEAR FT --ATTRIBUTE_TO_CLEAR CO --SORT_ORDER queryname --RESTORE_ORIGINAL_QUALITIES false' } - withName: '.*PREPARE_MT_ALIGNMENT:GATK4_SAMTOFASTQ_MT' { + withName: '.*ANALYSE_MT:PREPARE_MT_ALIGNMENT:GATK4_SAMTOFASTQ_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT' } } // -// ALIGN_MT +// ANALYSE_MT:ALIGN_MT // process { - withName: '.*ALIGN_MT:BWAMEM2_MEM_MT' { + withName: '.*ANALYSE_MT:ALIGN_MT:BWAMEM2_MEM_MT' { ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } } - withName: '.*ALIGN_MT:GATK4_MERGEBAMALIGNMENT_MT' { + withName: '.*ANALYSE_MT:ALIGN_MT:GATK4_MERGEBAMALIGNMENT_MT' { ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}_merged" } } - withName: '.*ALIGN_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { + withName: '.*ANALYSE_MT:ALIGN_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT' } - withName: '.*ALIGN_MT:PICARD_MARKDUPLICATES_MT' { + withName: '.*ANALYSE_MT:ALIGN_MT:PICARD_MARKDUPLICATES_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates" } } - withName: '.*ALIGN_MT:SAMTOOLS_SORT_MT' { + withName: '.*ANALYSE_MT:ALIGN_MT:SAMTOOLS_SORT_MT' { ext.prefix = { "${meta.id}_sorted" } } - withName: '.*ALIGN_MT:GATK4_MUTECT2_MT' { + withName: '.*ANALYSE_MT:ALIGN_MT:GATK4_MUTECT2_MT' { ext.args = '--mitochondria-mode TRUE' } } diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf index 40d7ec13..4b51a2ba 100644 --- a/subworkflows/local/align_MT.nf +++ b/subworkflows/local/align_MT.nf @@ -1,5 +1,5 @@ // -// Prepare bam files for MT allignment +// Allign MT // include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf new file mode 100644 index 00000000..988d854c --- /dev/null +++ b/subworkflows/local/analyse_MT.nf @@ -0,0 +1,47 @@ +// +// Analyse MT +// + +include { PREPARE_MT_ALIGNMENT } from './prepare_MT_alignment' +include { ALIGN_MT } from './align_MT' + + + +workflow ANALYSE_MT { + take: + bam // channel: [ val(meta), file(bam), file(bai) ] + index // channel: [ /path/to/bwamem2/index/ ] + fasta // channel: [ genome.fasta ] + dict // channel: [ genome.dict ] + fai // channel: [ genome.fai ] + intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] + + main: + ch_versions = Channel.empty() + + // STEP 1: PREPARING MT ALIGNMENT + PREPARE_MT_ALIGNMENT ( bam ) + ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions)// Outputs bam files + + // STEP 2.1: MT ALLIGNMENT + + ch_intervals_mt = Channel.fromPath(params.intervals_mt) + ALIGN_MT ( + PREPARE_MT_ALIGNMENT.out.fastq, + PREPARE_MT_ALIGNMENT.out.bam, + index, + fasta, + dict, + fai, + ch_intervals_mt + ) + ch_versions = ch_versions.mix(ALIGN_MT.out.versions) + + + emit: + vcf = ALIGN_MT.out.vcf + tbi = ALIGN_MT.out.tbi + txt = ALIGN_MT.out.txt + html = ALIGN_MT.out.html + versions = ch_versions // channel: [ versions.yml ] +} \ No newline at end of file diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 352de8bb..3c0f1ba7 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -56,8 +56,9 @@ include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_st include { GENS } from '../subworkflows/local/gens' include { ALIGN } from '../subworkflows/local/align' include { CALL_SNV } from '../subworkflows/local/call_snv' -include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' -include { ALIGN_MT } from '../subworkflows/local/align_MT' +include { ANALYSE_MT } from '../subworkflows/local/analyse_MT' +//include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' +//include { ALIGN_MT } from '../subworkflows/local/align_MT' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -217,22 +218,34 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(ch_sv_annotate.versions) } - // STEP 2.1: PREPARING MT ALIGNMENT - PREPARE_MT_ALIGNMENT ( ch_mapped.bam_bai ) - ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) - // STEP 2.2: MT ALLIGNMENT + // STEP 2.1: PREPARING MT ALIGNMENT ch_intervals_mt = Channel.fromPath(params.intervals_mt) - ALIGN_MT ( - PREPARE_MT_ALIGNMENT.out.fastq, - PREPARE_MT_ALIGNMENT.out.bam, + ANALYSE_MT ( + ch_mapped.bam_bai, ch_references.aligner_index, ch_references.genome_fasta, ch_references.sequence_dict, ch_references.genome_fai, - ch_int + ch_intervals_mt ) - ch_versions = ch_versions.mix(ALIGN_MT.out.versions) + ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) + // STEP 2.1: PREPARING MT ALIGNMENT + //PREPARE_MT_ALIGNMENT ( ch_mapped.bam_bai ) + //ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) + + // STEP 2.2: MT ALLIGNMENT + //ch_intervals_mt = Channel.fromPath(params.intervals_mt) + //ALIGN_MT ( + // PREPARE_MT_ALIGNMENT.out.fastq, + // PREPARE_MT_ALIGNMENT.out.bam, + // ch_references.aligner_index, + // ch_references.genome_fasta, + // ch_references.sequence_dict, + // ch_references.genome_fai, + // ch_int + //) + //ch_versions = ch_versions.mix(ALIGN_MT.out.versions) // STEP 3: VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) From d5477203b95a0ebdfec60e61a379abadb64c77fc Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 26 Aug 2022 16:21:09 +0200 Subject: [PATCH 0645/1169] fix deleted commented lines --- workflows/raredisease.nf | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3c0f1ba7..7076bbdd 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -57,8 +57,6 @@ include { GENS } from '../subworkflows/local/gens' include { ALIGN } from '../subworkflows/local/align' include { CALL_SNV } from '../subworkflows/local/call_snv' include { ANALYSE_MT } from '../subworkflows/local/analyse_MT' -//include { PREPARE_MT_ALIGNMENT } from '../subworkflows/local/prepare_MT_alignment' -//include { ALIGN_MT } from '../subworkflows/local/align_MT' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -219,7 +217,7 @@ workflow RAREDISEASE { } - // STEP 2.1: PREPARING MT ALIGNMENT + // STEP 2.1: ANALYSE MT ch_intervals_mt = Channel.fromPath(params.intervals_mt) ANALYSE_MT ( ch_mapped.bam_bai, @@ -230,22 +228,6 @@ workflow RAREDISEASE { ch_intervals_mt ) ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) - // STEP 2.1: PREPARING MT ALIGNMENT - //PREPARE_MT_ALIGNMENT ( ch_mapped.bam_bai ) - //ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions) - - // STEP 2.2: MT ALLIGNMENT - //ch_intervals_mt = Channel.fromPath(params.intervals_mt) - //ALIGN_MT ( - // PREPARE_MT_ALIGNMENT.out.fastq, - // PREPARE_MT_ALIGNMENT.out.bam, - // ch_references.aligner_index, - // ch_references.genome_fasta, - // ch_references.sequence_dict, - // ch_references.genome_fai, - // ch_int - //) - //ch_versions = ch_versions.mix(ALIGN_MT.out.versions) // STEP 3: VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) From 8bc302dde2819deb517347531574c2024ae8a8f6 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 29 Aug 2022 07:17:32 +0200 Subject: [PATCH 0646/1169] feat changing name of variable and subworkflow --- conf/modules.config | 14 +++---- subworkflows/local/align_MT.nf | 72 -------------------------------- subworkflows/local/analyse_MT.nf | 14 +++---- 3 files changed, 14 insertions(+), 86 deletions(-) delete mode 100644 subworkflows/local/align_MT.nf diff --git a/conf/modules.config b/conf/modules.config index a72ea8db..2c10ef72 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -598,33 +598,33 @@ process { } // -// ANALYSE_MT:ALIGN_MT +// ANALYSE_MT:ALIGN_AND_CALL_MT // process { - withName: '.*ANALYSE_MT:ALIGN_MT:BWAMEM2_MEM_MT' { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:BWAMEM2_MEM_MT' { ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } } - withName: '.*ANALYSE_MT:ALIGN_MT:GATK4_MERGEBAMALIGNMENT_MT' { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MERGEBAMALIGNMENT_MT' { ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}_merged" } } - withName: '.*ANALYSE_MT:ALIGN_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT' } - withName: '.*ANALYSE_MT:ALIGN_MT:PICARD_MARKDUPLICATES_MT' { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_MARKDUPLICATES_MT' { ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates" } } - withName: '.*ANALYSE_MT:ALIGN_MT:SAMTOOLS_SORT_MT' { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:SAMTOOLS_SORT_MT' { ext.prefix = { "${meta.id}_sorted" } } - withName: '.*ANALYSE_MT:ALIGN_MT:GATK4_MUTECT2_MT' { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MUTECT2_MT' { ext.args = '--mitochondria-mode TRUE' } } diff --git a/subworkflows/local/align_MT.nf b/subworkflows/local/align_MT.nf deleted file mode 100644 index 4b51a2ba..00000000 --- a/subworkflows/local/align_MT.nf +++ /dev/null @@ -1,72 +0,0 @@ -// -// Allign MT -// - -include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' -include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' -include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/modules/picard/addorreplacereadgroups/main' -include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' -include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' -include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' - -workflow ALIGN_MT { - take: - fastq // channel: [ val(meta), path('*.fastq.gz') ] - ubam // channel: [ val(meta), path('*.bam') ] - index // channel: [ /path/to/bwamem2/index/ ] - fasta // channel: [ genome.fasta ] - dict // channel: [ genome.dict ] - fai // channel: [ genome.fai ] - intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] - - main: - ch_versions = Channel.empty() - - // Outputs bam files - BWAMEM2_MEM_MT ( fastq , index, true) - ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) - ch_mt_bam = BWAMEM2_MEM_MT.out.bam - ch_fastq_ubam = ch_mt_bam.join(ubam, by: [0]) - - // Merges bam files - GATK4_MERGEBAMALIGNMENT_MT ( ch_fastq_ubam, fasta, dict ) - ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) - - // Add read group to merged bam file - PICARD_ADDORREPLACEREADGROUPS_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) - ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) - - // Marks duplicates - PICARD_MARKDUPLICATES_MT ( PICARD_ADDORREPLACEREADGROUPS_MT.out.bam ) - ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) - - // Sort bam file - SAMTOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) - ch_versions = ch_versions.mix(SAMTOOLS_SORT_MT.out.versions.first()) - - // Index bam file - SAMTOOLS_INDEX_MT(SAMTOOLS_SORT_MT.out.bam) - ch2=SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) - ch3=ch2.combine(intervals_mt) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MT.out.versions.first()) - - // Calls variants with Mutect2 - GATK4_MUTECT2_MT ( ch3, fasta, fai, dict, [], [], [], [] ) - ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) - - // Haplocheck - // TODO: probably it will be outside this subworkflow as we want to run - // with the VCF with the variants from the shifted alignment (to solve the mt circularity issue) - HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) - ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) - - - emit: - vcf = GATK4_MUTECT2_MT.out.vcf - tbi = GATK4_MUTECT2_MT.out.tbi - txt = HAPLOCHECK_MT.out.txt - html = HAPLOCHECK_MT.out.html - versions = ch_versions // channel: [ versions.yml ] -} diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 988d854c..254d4a53 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -3,7 +3,7 @@ // include { PREPARE_MT_ALIGNMENT } from './prepare_MT_alignment' -include { ALIGN_MT } from './align_MT' +include { ALIGN_AND_CALL_MT } from './align_and_call_MT' @@ -26,7 +26,7 @@ workflow ANALYSE_MT { // STEP 2.1: MT ALLIGNMENT ch_intervals_mt = Channel.fromPath(params.intervals_mt) - ALIGN_MT ( + ALIGN_AND_CALL_MT ( PREPARE_MT_ALIGNMENT.out.fastq, PREPARE_MT_ALIGNMENT.out.bam, index, @@ -35,13 +35,13 @@ workflow ANALYSE_MT { fai, ch_intervals_mt ) - ch_versions = ch_versions.mix(ALIGN_MT.out.versions) + ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT.out.versions) emit: - vcf = ALIGN_MT.out.vcf - tbi = ALIGN_MT.out.tbi - txt = ALIGN_MT.out.txt - html = ALIGN_MT.out.html + vcf = ALIGN_AND_CALL_MT.out.vcf + tbi = ALIGN_AND_CALL_MT.out.tbi + txt = ALIGN_AND_CALL_MT.out.txt + html = ALIGN_AND_CALL_MT.out.html versions = ch_versions // channel: [ versions.yml ] } \ No newline at end of file From d1065e19c06fa75b88ccc4fe5961dd2ea355a9c2 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 29 Aug 2022 07:33:27 +0200 Subject: [PATCH 0647/1169] feat adding subworkflow after changing name --- subworkflows/local/align_and_call_MT.nf | 72 +++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 subworkflows/local/align_and_call_MT.nf diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf new file mode 100644 index 00000000..98c861c1 --- /dev/null +++ b/subworkflows/local/align_and_call_MT.nf @@ -0,0 +1,72 @@ +// +// Allign and call MT +// + +include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' +include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' +include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/modules/picard/addorreplacereadgroups/main' +include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' +include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' +include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' + +workflow ALIGN_AND_CALL_MT { + take: + fastq // channel: [ val(meta), path('*.fastq.gz') ] + ubam // channel: [ val(meta), path('*.bam') ] + index // channel: [ /path/to/bwamem2/index/ ] + fasta // channel: [ genome.fasta ] + dict // channel: [ genome.dict ] + fai // channel: [ genome.fai ] + intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] + + main: + ch_versions = Channel.empty() + + // Outputs bam files + BWAMEM2_MEM_MT ( fastq , index, true) + ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) + ch_mt_bam = BWAMEM2_MEM_MT.out.bam + ch_fastq_ubam = ch_mt_bam.join(ubam, by: [0]) + + // Merges bam files + GATK4_MERGEBAMALIGNMENT_MT ( ch_fastq_ubam, fasta, dict ) + ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) + + // Add read group to merged bam file + PICARD_ADDORREPLACEREADGROUPS_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) + ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) + + // Marks duplicates + PICARD_MARKDUPLICATES_MT ( PICARD_ADDORREPLACEREADGROUPS_MT.out.bam ) + ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) + + // Sort bam file + SAMTOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) + ch_versions = ch_versions.mix(SAMTOOLS_SORT_MT.out.versions.first()) + + // Index bam file + SAMTOOLS_INDEX_MT(SAMTOOLS_SORT_MT.out.bam) + ch_sort_index_bam=SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) + ch_sort_index_bam_intervals_mt=ch_sort_index_bam.combine(intervals_mt) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MT.out.versions.first()) + + // Calls variants with Mutect2 + GATK4_MUTECT2_MT ( ch_sort_index_bam_intervals_mt, fasta, fai, dict, [], [], [], [] ) + ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) + + // Haplocheck + // TODO: probably it will be outside this subworkflow as we want to run + // with the VCF with the variants from the shifted alignment (to solve the mt circularity issue) + HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) + ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) + + + emit: + vcf = GATK4_MUTECT2_MT.out.vcf + tbi = GATK4_MUTECT2_MT.out.tbi + txt = HAPLOCHECK_MT.out.txt + html = HAPLOCHECK_MT.out.html + versions = ch_versions // channel: [ versions.yml ] +} From 26710ccae9537673d21a5bdce6e2c7fa4de126ac Mon Sep 17 00:00:00 2001 From: Anders Jemt Date: Mon, 29 Aug 2022 08:50:05 +0200 Subject: [PATCH 0648/1169] Updated a comment --- subworkflows/local/analyse_MT.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 254d4a53..ff290ed6 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -23,8 +23,7 @@ workflow ANALYSE_MT { PREPARE_MT_ALIGNMENT ( bam ) ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions)// Outputs bam files - // STEP 2.1: MT ALLIGNMENT - + // STEP 2.1: MT ALLIGNMENT AND VARIANT CALLING ch_intervals_mt = Channel.fromPath(params.intervals_mt) ALIGN_AND_CALL_MT ( PREPARE_MT_ALIGNMENT.out.fastq, @@ -44,4 +43,4 @@ workflow ANALYSE_MT { txt = ALIGN_AND_CALL_MT.out.txt html = ALIGN_AND_CALL_MT.out.html versions = ch_versions // channel: [ versions.yml ] -} \ No newline at end of file +} From d2116224bbcc4210f352d6cdd13653aaf6e829c1 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 29 Aug 2022 15:05:50 +0200 Subject: [PATCH 0649/1169] fix changing " to ' --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 2c10ef72..f4aa3c8c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -584,7 +584,7 @@ process { process { withName: '.*ANALYSE_MT:PREPARE_MT_ALIGNMENT:SAMTOOLS_VIEW_MT' { - ext.args = { "-h " } + ext.args = { '-h ' } ext.args2 = { (params.genome == "GRCh37") ? "MT" : "chrM" } } From c22a9425a640b3d3560351e11cf13bb2bf790063 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 30 Aug 2022 15:16:56 +0200 Subject: [PATCH 0650/1169] update options --- modules/local/filter_vep.nf | 4 ++-- subworkflows/local/annotate_snvs.nf | 5 ++++- subworkflows/local/annotate_structural_variants.nf | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/local/filter_vep.nf b/modules/local/filter_vep.nf index 71d0ccf2..d629f3f1 100644 --- a/modules/local/filter_vep.nf +++ b/modules/local/filter_vep.nf @@ -43,8 +43,8 @@ process FILTER_VEP { --format vcf \\ --input_file $vcf \\ --output_file ${prefix}.ann_filter.vcf.gz \\ - --filter \"SYMBOL in feature.list\" \\ - --soft_filter + --only_matched \\ + --filter \"SYMBOL in feature.list\" cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 1e2e1851..4c3bec80 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -84,7 +84,10 @@ workflow ANNOTATE_SNVS { ) ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) + FILTER_VEP(ENSEMBLVEP_SNV.out.vcf, feature_file) + emit: - vcf_ann = ENSEMBLVEP_SNV.out.vcf + vcf_ann_clinical = FILTER_VEP.out.vcf + vcf_ann_research = ENSEMBLVEP_SNV.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index e6e5cecf..b8655fc4 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -79,6 +79,7 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { FILTER_VEP(ENSEMBLVEP_SV.out.vcf, feature_file) emit: - vcf_ann = FILTER_VEP.out.vcf + vcf_ann_clinical = FILTER_VEP.out.vcf + vcf_ann_research = ENSEMBLVEP_SV.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 0ad2c79e11d7b36956cb5d50ea63a98206411f14 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 30 Aug 2022 13:34:14 +0000 Subject: [PATCH 0651/1169] Template update for nf-core/tools version 2.5 --- .editorconfig | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 3 +- .github/workflows/ci.yml | 23 ++------ .github/workflows/linting.yml | 38 +++++++++++-- CITATION.cff | 56 +++++++++++++++++++ README.md | 21 +++---- assets/email_template.txt | 1 - bin/check_samplesheet.py | 41 +++++++------- conf/base.config | 5 ++ docs/usage.md | 12 ++-- lib/WorkflowMain.groovy | 9 ++- lib/WorkflowRaredisease.groovy | 5 +- main.nf | 2 +- modules.json | 22 +++++--- .../templates/dumpsoftwareversions.py | 14 +++-- nextflow.config | 21 ++++++- 16 files changed, 184 insertions(+), 91 deletions(-) create mode 100644 CITATION.cff diff --git a/.editorconfig b/.editorconfig index b6b31907..b78de6e6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,7 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{md,yml,yaml,html,css,scss,js}] +[*.{md,yml,yaml,html,css,scss,js,cff}] indent_size = 2 # These files are edited and tested upstream in nf-core/modules diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 9015e00c..4548dd24 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,8 +15,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] 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 you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 17805659..7028b89c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,6 @@ on: env: NXF_ANSI_LOG: false - CAPSULE_LOG: none jobs: test: @@ -20,27 +19,17 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - # Nextflow versions - include: - # Test pipeline minimum Nextflow version - - NXF_VER: "21.10.3" - NXF_EDGE: "" - # Test latest edge release of Nextflow - - NXF_VER: "" - NXF_EDGE: "1" + NXF_VER: + - "21.10.3" + - "latest-everything" steps: - name: Check out pipeline code uses: actions/checkout@v2 - name: Install Nextflow - env: - NXF_VER: ${{ matrix.NXF_VER }} - # Uncomment only if the edge release is more recent than the latest stable release - # See https://github.com/nextflow-io/nextflow/issues/2467 - # NXF_EDGE: ${{ matrix.NXF_EDGE }} - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + uses: nf-core/setup-nextflow@v1 + with: + version: "${{ matrix.NXF_VER }}" - name: Run pipeline with test data # TODO nf-core: You can customise CI pipeline run tests as required diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 77358dee..8a5ce69b 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -35,6 +35,36 @@ jobs: - name: Run Prettier --check run: prettier --check ${GITHUB_WORKSPACE} + PythonBlack: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Check code lints with Black + uses: psf/black@stable + + # If the above check failed, post a comment on the PR explaining the failure + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@v1 + with: + message: | + ## Python linting (`black`) is failing + + To keep the code consistent with lots of contributors, we run automated code consistency checks. + To fix this CI test, please run: + + * Install [`black`](https://black.readthedocs.io/en/stable/): `pip install black` + * Fix formatting errors in your pipeline: `black .` + + Once you push these changes the test should pass, and you can hide this comment :+1: + + We highly recommend setting up Black in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false + nf-core: runs-on: ubuntu-latest steps: @@ -42,15 +72,11 @@ jobs: uses: actions/checkout@v2 - name: Install Nextflow - env: - CAPSULE_LOG: none - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + uses: nf-core/setup-nextflow@v1 - uses: actions/setup-python@v3 with: - python-version: "3.6" + python-version: "3.7" architecture: "x64" - name: Install dependencies diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 00000000..4533e2f2 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,56 @@ +cff-version: 1.2.0 +message: "If you use `nf-core tools` in your work, please cite the `nf-core` publication" +authors: + - family-names: Ewels + given-names: Philip + - family-names: Peltzer + given-names: Alexander + - family-names: Fillinger + given-names: Sven + - family-names: Patel + given-names: Harshil + - family-names: Alneberg + given-names: Johannes + - family-names: Wilm + given-names: Andreas + - family-names: Ulysse Garcia + given-names: Maxime + - family-names: Di Tommaso + given-names: Paolo + - family-names: Nahnsen + given-names: Sven +title: "The nf-core framework for community-curated bioinformatics pipelines." +version: 2.4.1 +doi: 10.1038/s41587-020-0439-x +date-released: 2022-05-16 +url: https://github.com/nf-core/tools +prefered-citation: + type: article + authors: + - family-names: Ewels + given-names: Philip + - family-names: Peltzer + given-names: Alexander + - family-names: Fillinger + given-names: Sven + - family-names: Patel + given-names: Harshil + - family-names: Alneberg + given-names: Johannes + - family-names: Wilm + given-names: Andreas + - family-names: Ulysse Garcia + given-names: Maxime + - family-names: Di Tommaso + given-names: Paolo + - family-names: Nahnsen + given-names: Sven + doi: 10.1038/s41587-020-0439-x + journal: nature biotechnology + start: 276 + end: 278 + title: "The nf-core framework for community-curated bioinformatics pipelines." + issue: 3 + volume: 38 + year: 2020 + url: https://dx.doi.org/10.1038/s41587-020-0439-x diff --git a/README.md b/README.md index 662490e9..726f259f 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,14 @@ # ![nf-core/raredisease](docs/images/nf-core-raredisease_logo_light.png#gh-light-mode-only) ![nf-core/raredisease](docs/images/nf-core-raredisease_logo_dark.png#gh-dark-mode-only) -[![GitHub Actions CI Status](https://github.com/nf-core/raredisease/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+CI%22) -[![GitHub Actions Linting Status](https://github.com/nf-core/raredisease/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/raredisease/actions?query=workflow%3A%22nf-core+linting%22) -[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?logo=Amazon%20AWS)](https://nf-co.re/raredisease/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/raredisease/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) -[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?logo=anaconda)](https://docs.conda.io/en/latest/) -[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?logo=docker)](https://www.docker.com/) -[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg)](https://sylabs.io/docs/) +[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) +[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) +[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) [![Launch on Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/raredisease) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?logo=slack)](https://nfcore.slack.com/channels/raredisease) -[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?logo=twitter)](https://twitter.com/nf_core) -[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?logo=youtube)](https://www.youtube.com/c/nf-core) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/raredisease)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction @@ -25,7 +20,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/raredisease/results). +On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources.The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/raredisease/results). ## Pipeline summary @@ -42,7 +37,7 @@ On release, automated continuous integration tests run the pipeline on a full-si 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console + ```bash nextflow run nf-core/raredisease -profile test,YOURPROFILE --outdir ``` @@ -57,7 +52,7 @@ On release, automated continuous integration tests run the pipeline on a full-si - ```console + ```bash nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile ``` diff --git a/assets/email_template.txt b/assets/email_template.txt index 822d3906..a89246e0 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -6,7 +6,6 @@ `._,._,' nf-core/raredisease v${version} ---------------------------------------------------- - Run Name: $runName <% if (success){ diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 3652c63c..9a8b8962 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -11,7 +11,6 @@ from collections import Counter from pathlib import Path - logger = logging.getLogger() @@ -79,13 +78,15 @@ def validate_and_transform(self, row): def _validate_sample(self, row): """Assert that the sample name exists and convert spaces to underscores.""" - assert len(row[self._sample_col]) > 0, "Sample input is required." + if len(row[self._sample_col]) <= 0: + raise AssertionError("Sample input is required.") # Sanitize samples slightly. row[self._sample_col] = row[self._sample_col].replace(" ", "_") def _validate_first(self, row): """Assert that the first FASTQ entry is non-empty and has the right format.""" - assert len(row[self._first_col]) > 0, "At least the first FASTQ file is required." + if len(row[self._first_col]) <= 0: + raise AssertionError("At least the first FASTQ file is required.") self._validate_fastq_format(row[self._first_col]) def _validate_second(self, row): @@ -97,36 +98,34 @@ def _validate_pair(self, row): """Assert that read pairs have the same file extension. Report pair status.""" if row[self._first_col] and row[self._second_col]: row[self._single_col] = False - assert ( - Path(row[self._first_col]).suffixes[-2:] == Path(row[self._second_col]).suffixes[-2:] - ), "FASTQ pairs must have the same file extensions." + if Path(row[self._first_col]).suffixes[-2:] != Path(row[self._second_col]).suffixes[-2:]: + raise AssertionError("FASTQ pairs must have the same file extensions.") else: row[self._single_col] = True def _validate_fastq_format(self, filename): """Assert that a given filename has one of the expected FASTQ extensions.""" - assert any(filename.endswith(extension) for extension in self.VALID_FORMATS), ( - f"The FASTQ file has an unrecognized extension: {filename}\n" - f"It should be one of: {', '.join(self.VALID_FORMATS)}" - ) + if not any(filename.endswith(extension) for extension in self.VALID_FORMATS): + raise AssertionError( + f"The FASTQ file has an unrecognized extension: {filename}\n" + f"It should be one of: {', '.join(self.VALID_FORMATS)}" + ) def validate_unique_samples(self): """ Assert that the combination of sample name and FASTQ filename is unique. - In addition to the validation, also rename the sample if more than one sample, - FASTQ file combination exists. + In addition to the validation, also rename all samples to have a suffix of _T{n}, where n is the + number of times the same sample exist, but with different FASTQ files, e.g., multiple runs per experiment. """ - assert len(self._seen) == len(self.modified), "The pair of sample name and FASTQ must be unique." - if len({pair[0] for pair in self._seen}) < len(self._seen): - counts = Counter(pair[0] for pair in self._seen) - seen = Counter() - for row in self.modified: - sample = row[self._sample_col] - seen[sample] += 1 - if counts[sample] > 1: - row[self._sample_col] = f"{sample}_T{seen[sample]}" + if len(self._seen) != len(self.modified): + raise AssertionError("The pair of sample name and FASTQ must be unique.") + seen = Counter() + for row in self.modified: + sample = row[self._sample_col] + seen[sample] += 1 + row[self._sample_col] = f"{sample}_T{seen[sample]}" def read_head(handle, num_lines=10): diff --git a/conf/base.config b/conf/base.config index 12aea369..d84b67a8 100644 --- a/conf/base.config +++ b/conf/base.config @@ -26,6 +26,11 @@ process { // adding in your local modules too. // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + withLabel:process_single { + cpus = { check_max( 1 , 'cpus' ) } + memory = { check_max( 6.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } + } withLabel:process_low { cpus = { check_max( 2 * task.attempt, 'cpus' ) } memory = { check_max( 12.GB * task.attempt, 'memory' ) } diff --git a/docs/usage.md b/docs/usage.md index f5863e09..ea26d76d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -12,7 +12,7 @@ You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. -```console +```bash --input '[path to samplesheet file]' ``` @@ -56,7 +56,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: -```console +```bash nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` @@ -64,9 +64,9 @@ This will launch the pipeline with the `docker` configuration profile. See below Note that the pipeline will create the following files in your working directory: -```console +```bash work # Directory containing the nextflow working files - # Finished results in specified location (defined with --outdir) + # Finished results in specified location (defined with --outdir) .nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` @@ -75,7 +75,7 @@ work # Directory containing the nextflow working files When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: -```console +```bash nextflow pull nf-core/raredisease ``` @@ -251,6 +251,6 @@ Some HPC setups also allow you to run nextflow within a cluster job submitted yo In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): -```console +```bash NXF_OPTS='-Xms1g -Xmx4g' ``` diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 730a0565..967fdb63 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -59,6 +59,7 @@ class WorkflowMain { } // Print parameter summary log to screen + log.info paramsSummaryLog(workflow, params, log) // Check that a -profile or Nextflow config has been provided to run the pipeline @@ -78,17 +79,15 @@ class WorkflowMain { System.exit(1) } } - // // Get attribute from genome config file e.g. fasta // - public static String getGenomeAttribute(params, attribute) { - def val = '' + public static Object getGenomeAttribute(params, attribute) { if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { if (params.genomes[ params.genome ].containsKey(attribute)) { - val = params.genomes[ params.genome ][ attribute ] + return params.genomes[ params.genome ][ attribute ] } } - return val + return null } } diff --git a/lib/WorkflowRaredisease.groovy b/lib/WorkflowRaredisease.groovy index afd9433e..4cdb011c 100755 --- a/lib/WorkflowRaredisease.groovy +++ b/lib/WorkflowRaredisease.groovy @@ -10,6 +10,7 @@ class WorkflowRaredisease { public static void initialise(params, log) { genomeExistsError(params, log) + if (!params.fasta) { log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." System.exit(1) @@ -41,9 +42,7 @@ class WorkflowRaredisease { yaml_file_text += "data: |\n" yaml_file_text += "${summary_section}" return yaml_file_text - } - - // + }// // Exit pipeline if incorrect --genome key provided // private static void genomeExistsError(params, log) { diff --git a/main.nf b/main.nf index 25e7ee5d..1eba1c1b 100644 --- a/main.nf +++ b/main.nf @@ -4,7 +4,7 @@ nf-core/raredisease ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/raredisease - Website: https://nf-co.re/raredisease +Website: https://nf-co.re/raredisease Slack : https://nfcore.slack.com/channels/raredisease ---------------------------------------------------------------------------------------- */ diff --git a/modules.json b/modules.json index 909b6bf3..2f244966 100644 --- a/modules.json +++ b/modules.json @@ -3,14 +3,20 @@ "homePage": "https://github.com/nf-core/raredisease", "repos": { "nf-core/modules": { - "custom/dumpsoftwareversions": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "fastqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "multiqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_url": "https://github.com/nf-core/modules.git", + "modules": { + "custom/dumpsoftwareversions": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", + "branch": "master" + }, + "fastqc": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", + "branch": "master" + }, + "multiqc": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", + "branch": "master" + } } } } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index d1390392..787bdb7b 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -1,9 +1,10 @@ #!/usr/bin/env python -import yaml import platform from textwrap import dedent +import yaml + def _make_versions_html(versions): html = [ @@ -58,11 +59,12 @@ def _make_versions_html(versions): for process, process_versions in versions_by_process.items(): module = process.split(":")[-1] try: - assert versions_by_module[module] == process_versions, ( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) + if versions_by_module[module] != process_versions: + raise AssertionError( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) except KeyError: versions_by_module[module] = process_versions diff --git a/nextflow.config b/nextflow.config index cfa6b251..820901d5 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,11 +13,11 @@ params { // Input options input = null + // References genome = null igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false - // MultiQC options multiqc_config = null multiqc_title = null @@ -37,6 +37,7 @@ params { schema_ignore_params = 'genomes' enable_conda = false + // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" @@ -45,6 +46,7 @@ params { config_profile_url = null config_profile_name = null + // Max resource options // Defaults only, expecting to be overwritten max_memory = '128.GB' @@ -72,6 +74,7 @@ try { // } + profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -82,6 +85,15 @@ profiles { shifter.enabled = false charliecloud.enabled = false } + mamba { + params.enable_conda = true + conda.useMamba = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } docker { docker.enabled = true docker.userEmulation = true @@ -119,10 +131,16 @@ profiles { podman.enabled = false shifter.enabled = false } + gitpod { + executor.name = 'local' + executor.cpus = 16 + executor.memory = 60.GB + } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } + // Load igenomes.config if required if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' @@ -130,6 +148,7 @@ if (!params.igenomes_ignore) { params.genomes = [:] } + // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. From e655a64ee6feea08a6eb7d36202be774c7118113 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 31 Aug 2022 13:44:19 +0200 Subject: [PATCH 0652/1169] add switch to annotate snv --- nextflow.config | 1 + nextflow_schema.json | 6 ++++++ workflows/raredisease.nf | 43 +++++++++++++++++++++------------------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/nextflow.config b/nextflow.config index 37f4974c..ea94fa41 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,6 +22,7 @@ params { // Main options analysis_type = 'wgs' + annotate_snv_switch = false annotate_sv_switch = false gens_switch = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 9d519115..7216d31a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -285,6 +285,12 @@ "fa_icon": "fas fa-book", "enum": ["wgs", "wes", "mito"] }, + "annotate_snv_switch": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to run annotate SNV subworkflow.", + "fa_icon": "fas fa-book" + }, "annotate_sv_switch": { "type": "boolean", "default": false, diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4b491e47..81ccd136 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -243,7 +243,7 @@ workflow RAREDISEASE { // STEP 2.1: ANALYSE MT ch_intervals_mt = Channel.fromPath(params.intervals_mt) - ANALYSE_MT ( + ANALYSE_MT ( ch_mapped.bam_bai, ch_references.aligner_index, ch_references.genome_fasta, @@ -256,26 +256,29 @@ workflow RAREDISEASE { // STEP 3: VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) - ANNOTATE_SNVS ( - ch_vcf, - ch_references.vcfanno_resources, - params.vcfanno_toml, - params.genome, - params.vep_cache_version, - ch_vep_cache, - ch_references.genome_fasta, - ch_references.gnomad_af, - CHECK_INPUT.out.samples - ) - ch_versions = ch_versions.mix(ANNOTATE_SNVS.out.versions) + ch_snv_annotate = Channel.empty() + if (params.annotate_snv_switch) { + ANNOTATE_SNVS ( + ch_vcf, + ch_references.vcfanno_resources, + params.vcfanno_toml, + params.genome, + params.vep_cache_version, + ch_vep_cache, + ch_references.genome_fasta, + ch_references.gnomad_af, + CHECK_INPUT.out.samples + ).set {ch_snv_annotate} + ch_versions = ch_versions.mix(ch_snv_annotate.versions) - RANK_VARIANTS_SNV ( - ANNOTATE_SNVS.out.vcf_ann, - MAKE_PED.out.ped, - ch_reduced_penetrance, - ch_score_config_snv - ) - ch_versions = ch_versions.mix(RANK_VARIANTS_SNV.out.versions) + RANK_VARIANTS_SNV ( + ANNOTATE_SNVS.out.vcf_ann, + MAKE_PED.out.ped, + ch_reduced_penetrance, + ch_score_config_snv + ) + ch_versions = ch_versions.mix(RANK_VARIANTS_SNV.out.versions) + } // // MODULE: Pipeline reporting From 18820bb472ba4377a2efcd3c038afe2211f24115 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 31 Aug 2022 14:06:44 +0200 Subject: [PATCH 0653/1169] fix fromPath error --- conf/genomes.config | 2 ++ workflows/raredisease.nf | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index 77cd2eca..91791bb2 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -19,6 +19,7 @@ params { gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" gnomad_af = "" gnomad_af_tbi = "" + intervals_mt = "" known_dbsnp = "" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" @@ -41,6 +42,7 @@ params { gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" gnomad_af_tbi = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" + intervals_mt = "${params.local_genomes}/non_control_region.chrM.interval_list" known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 81ccd136..26802ac2 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -272,7 +272,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(ch_snv_annotate.versions) RANK_VARIANTS_SNV ( - ANNOTATE_SNVS.out.vcf_ann, + ch_snv_annotate.vcf_ann, MAKE_PED.out.ped, ch_reduced_penetrance, ch_score_config_snv From 1ef5c8ddcaed2a5a9db91cb7efd00eec73adba99 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 31 Aug 2022 15:18:06 +0200 Subject: [PATCH 0654/1169] fix black error --- bin/check_samplesheet.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index d39456c9..eb13477e 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -98,7 +98,10 @@ def _validate_pair(self, row): """Assert that read pairs have the same file extension. Report pair status.""" if row[self._first_col] and row[self._second_col]: row[self._single_col] = False - if Path(row[self._first_col]).suffixes[-2:] != Path(row[self._second_col]).suffixes[-2:]: + if ( + Path(row[self._first_col]).suffixes[-2:] + != Path(row[self._second_col]).suffixes[-2:] + ): raise AssertionError("FASTQ pairs must have the same file extensions.") else: row[self._single_col] = True @@ -189,13 +192,25 @@ def check_samplesheet(file_in, file_out): https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv """ - required_columns = {"sample", "lane", "fastq_1", "fastq_2", "gender", "phenotype", "paternal_id", "maternal_id", "case_id"} + required_columns = { + "sample", + "lane", + "fastq_1", + "fastq_2", + "gender", + "phenotype", + "paternal_id", + "maternal_id", + "case_id", + } # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. with file_in.open(newline="") as in_handle: reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) # Validate the existence of the expected header columns. if not required_columns.issubset(reader.fieldnames): - logger.critical(f"The sample sheet **must** contain the column headers: {', '.join(required_columns)}.") + logger.critical( + f"The sample sheet **must** contain the column headers: {', '.join(required_columns)}." + ) sys.exit(1) # Validate each row. checker = RowChecker() From 1a9c817e50617a4c6069d8f6e95cddf2e3dc0f0f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 31 Aug 2022 15:25:59 +0200 Subject: [PATCH 0655/1169] update modules.json --- modules.json | 162 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 108 insertions(+), 54 deletions(-) diff --git a/modules.json b/modules.json index 1be0bbb8..8d3ee942 100644 --- a/modules.json +++ b/modules.json @@ -6,166 +6,220 @@ "git_url": "https://github.com/nf-core/modules.git", "modules": { "bcftools/norm": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "bcftools/roh": { - "git_sha": "c079ee20250f5676c53b145fdd00f9defe91f112" + "git_sha": "c079ee20250f5676c53b145fdd00f9defe91f112", + "branch": "master" }, "bcftools/view": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "bwamem2/index": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "bwamem2/mem": { - "git_sha": "4f5274c3de0c9521f5033893ff61057a74c45ba9" + "git_sha": "4f5274c3de0c9521f5033893ff61057a74c45ba9", + "branch": "master" }, "cat/cat": { - "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641" + "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641", + "branch": "master" }, "cnvpytor/callcnvs": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", + "branch": "master" }, "cnvpytor/histogram": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", + "branch": "master" }, "cnvpytor/importreaddepth": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", + "branch": "master" }, "cnvpytor/partition": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", + "branch": "master" }, "cnvpytor/view": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", + "branch": "master" }, "custom/dumpsoftwareversions": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", + "branch": "master" }, "deepvariant": { - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30", + "branch": "master" }, "expansionhunter": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "fastqc": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "gatk4/bedtointervallist": { - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449", + "branch": "master" }, "gatk4/createsequencedictionary": { - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449", + "branch": "master" }, "gatk4/intervallisttools": { - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449", + "branch": "master" }, "gatk4/mergebamalignment": { - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7", + "branch": "master" }, "gatk4/mutect2": { - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7", + "branch": "master" }, "gatk4/revertsam": { - "git_sha": "f231291e7730654158cbd3f10b82c292e27fa273" + "git_sha": "f231291e7730654158cbd3f10b82c292e27fa273", + "branch": "master" }, "gatk4/samtofastq": { - "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce" + "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce", + "branch": "master" }, "genmod/annotate": { - "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" + "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5", + "branch": "master" }, "genmod/compound": { - "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" + "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99", + "branch": "master" }, "genmod/models": { - "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" + "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99", + "branch": "master" }, "genmod/score": { - "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" + "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99", + "branch": "master" }, "glnexus": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "haplocheck": { - "git_sha": "f5615c3db63a2bda7a1dbfaeae447cac3161d7b9" + "git_sha": "f5615c3db63a2bda7a1dbfaeae447cac3161d7b9", + "branch": "master" }, "manta/germline": { - "git_sha": "ffedf09b6e84b479c9c901274f74bb33f3777243" + "git_sha": "ffedf09b6e84b479c9c901274f74bb33f3777243", + "branch": "master" }, "mosdepth": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", + "branch": "master" }, "multiqc": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "picard/addorreplacereadgroups": { - "git_sha": "baa2845d2818066bcbd8b91e6ce77d71e36ecf45" + "git_sha": "baa2845d2818066bcbd8b91e6ce77d71e36ecf45", + "branch": "master" }, "picard/collecthsmetrics": { - "git_sha": "35231d394940dca2291ac2321c8f9b2e3b039905" + "git_sha": "35231d394940dca2291ac2321c8f9b2e3b039905", + "branch": "master" }, "picard/collectmultiplemetrics": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "picard/markduplicates": { - "git_sha": "63db63757cab03cfa7a02c0d0f134b66fbfadea6" + "git_sha": "63db63757cab03cfa7a02c0d0f134b66fbfadea6", + "branch": "master" }, "picard/sortvcf": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "qualimap/bamqc": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "rhocall/annotate": { - "git_sha": "17a4e931427b5b144c0d0227a3ea49347ba7457a" + "git_sha": "17a4e931427b5b144c0d0227a3ea49347ba7457a", + "branch": "master" }, "samtools/faidx": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", + "branch": "master" }, "samtools/index": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", + "branch": "master" }, "samtools/merge": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", + "branch": "master" }, "samtools/sort": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", + "branch": "master" }, "samtools/stats": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", + "branch": "master" }, "samtools/view": { - "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce" + "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce", + "branch": "master" }, "stranger": { - "git_sha": "c7329a3a5730872dea512921217993cfa7acd959" + "git_sha": "c7329a3a5730872dea512921217993cfa7acd959", + "branch": "master" }, "svdb/merge": { - "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" + "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd", + "branch": "master" }, "svdb/query": { - "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" + "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd", + "branch": "master" }, "tabix/bgziptabix": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "tabix/tabix": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "tiddit/cov": { - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30", + "branch": "master" }, "tiddit/sv": { - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30", + "branch": "master" }, "ucsc/wigtobigwig": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" }, "untar": { - "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9" + "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9", + "branch": "master" }, "vcfanno": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", + "branch": "master" } } } From bb5107df4908889680978ea617a46f5a7a89eab1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 31 Aug 2022 15:34:54 +0200 Subject: [PATCH 0656/1169] fix lint error --- modules.json | 216 ++++++++++++++++++++++++------------------------ nextflow.config | 1 + 2 files changed, 109 insertions(+), 108 deletions(-) diff --git a/modules.json b/modules.json index 8d3ee942..63e42025 100644 --- a/modules.json +++ b/modules.json @@ -6,220 +6,220 @@ "git_url": "https://github.com/nf-core/modules.git", "modules": { "bcftools/norm": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "bcftools/roh": { - "git_sha": "c079ee20250f5676c53b145fdd00f9defe91f112", - "branch": "master" + "branch": "master", + "git_sha": "c079ee20250f5676c53b145fdd00f9defe91f112" }, "bcftools/view": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "bwamem2/index": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "bwamem2/mem": { - "git_sha": "4f5274c3de0c9521f5033893ff61057a74c45ba9", - "branch": "master" + "branch": "master", + "git_sha": "4f5274c3de0c9521f5033893ff61057a74c45ba9" }, "cat/cat": { - "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641", - "branch": "master" + "branch": "master", + "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641" }, "cnvpytor/callcnvs": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", - "branch": "master" + "branch": "master", + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "cnvpytor/histogram": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", - "branch": "master" + "branch": "master", + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "cnvpytor/importreaddepth": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", - "branch": "master" + "branch": "master", + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "cnvpytor/partition": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", - "branch": "master" + "branch": "master", + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "cnvpytor/view": { - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518", - "branch": "master" + "branch": "master", + "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" }, "custom/dumpsoftwareversions": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", - "branch": "master" + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "deepvariant": { - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30", - "branch": "master" + "branch": "master", + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, "expansionhunter": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "fastqc": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "gatk4/bedtointervallist": { - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449", - "branch": "master" + "branch": "master", + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, "gatk4/createsequencedictionary": { - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449", - "branch": "master" + "branch": "master", + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, "gatk4/intervallisttools": { - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449", - "branch": "master" + "branch": "master", + "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" }, "gatk4/mergebamalignment": { - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7", - "branch": "master" + "branch": "master", + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" }, "gatk4/mutect2": { - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7", - "branch": "master" + "branch": "master", + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" }, "gatk4/revertsam": { - "git_sha": "f231291e7730654158cbd3f10b82c292e27fa273", - "branch": "master" + "branch": "master", + "git_sha": "f231291e7730654158cbd3f10b82c292e27fa273" }, "gatk4/samtofastq": { - "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce", - "branch": "master" + "branch": "master", + "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce" }, "genmod/annotate": { - "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5", - "branch": "master" + "branch": "master", + "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" }, "genmod/compound": { - "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99", - "branch": "master" + "branch": "master", + "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" }, "genmod/models": { - "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99", - "branch": "master" + "branch": "master", + "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" }, "genmod/score": { - "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99", - "branch": "master" + "branch": "master", + "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" }, "glnexus": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "haplocheck": { - "git_sha": "f5615c3db63a2bda7a1dbfaeae447cac3161d7b9", - "branch": "master" + "branch": "master", + "git_sha": "f5615c3db63a2bda7a1dbfaeae447cac3161d7b9" }, "manta/germline": { - "git_sha": "ffedf09b6e84b479c9c901274f74bb33f3777243", - "branch": "master" + "branch": "master", + "git_sha": "ffedf09b6e84b479c9c901274f74bb33f3777243" }, "mosdepth": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", - "branch": "master" + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "multiqc": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/addorreplacereadgroups": { - "git_sha": "baa2845d2818066bcbd8b91e6ce77d71e36ecf45", - "branch": "master" + "branch": "master", + "git_sha": "baa2845d2818066bcbd8b91e6ce77d71e36ecf45" }, "picard/collecthsmetrics": { - "git_sha": "35231d394940dca2291ac2321c8f9b2e3b039905", - "branch": "master" + "branch": "master", + "git_sha": "35231d394940dca2291ac2321c8f9b2e3b039905" }, "picard/collectmultiplemetrics": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/markduplicates": { - "git_sha": "63db63757cab03cfa7a02c0d0f134b66fbfadea6", - "branch": "master" + "branch": "master", + "git_sha": "63db63757cab03cfa7a02c0d0f134b66fbfadea6" }, "picard/sortvcf": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "qualimap/bamqc": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "rhocall/annotate": { - "git_sha": "17a4e931427b5b144c0d0227a3ea49347ba7457a", - "branch": "master" + "branch": "master", + "git_sha": "17a4e931427b5b144c0d0227a3ea49347ba7457a" }, "samtools/faidx": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", - "branch": "master" + "branch": "master", + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/index": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", - "branch": "master" + "branch": "master", + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/merge": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", - "branch": "master" + "branch": "master", + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/sort": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", - "branch": "master" + "branch": "master", + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/stats": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773", - "branch": "master" + "branch": "master", + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/view": { - "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce", - "branch": "master" + "branch": "master", + "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce" }, "stranger": { - "git_sha": "c7329a3a5730872dea512921217993cfa7acd959", - "branch": "master" + "branch": "master", + "git_sha": "c7329a3a5730872dea512921217993cfa7acd959" }, "svdb/merge": { - "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd", - "branch": "master" + "branch": "master", + "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" }, "svdb/query": { - "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd", - "branch": "master" + "branch": "master", + "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" }, "tabix/bgziptabix": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "tabix/tabix": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "tiddit/cov": { - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30", - "branch": "master" + "branch": "master", + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, "tiddit/sv": { - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30", - "branch": "master" + "branch": "master", + "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, "ucsc/wigtobigwig": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "untar": { - "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9", - "branch": "master" + "branch": "master", + "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9" }, "vcfanno": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe", - "branch": "master" + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" } } } diff --git a/nextflow.config b/nextflow.config index 16bf8b84..3a94fc6b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -48,6 +48,7 @@ params { max_multiqc_email_size = '25.MB' // Boilerplate options + outdir = 'results' tracedir = "${params.outdir}/pipeline_info" publish_dir_mode = 'copy' email = null From 06b758307ec57df18e3d508d0d6a0bbbe563d382 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Sep 2022 10:26:56 +0200 Subject: [PATCH 0657/1169] change default --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 471d28b7..5204d2ee 100644 --- a/nextflow.config +++ b/nextflow.config @@ -21,7 +21,7 @@ params { // Main options analysis_type = 'wgs' - annotate_snv_switch = false + annotate_snv_switch = true annotate_sv_switch = false gens_switch = false From d1084d511e48da07139a9a8d0774909954d3a582 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Sep 2022 10:59:41 +0200 Subject: [PATCH 0658/1169] fix error --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 7216d31a..a9a652df 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -287,7 +287,7 @@ }, "annotate_snv_switch": { "type": "boolean", - "default": false, + "default": true, "description": "Specifies whether or not to run annotate SNV subworkflow.", "fa_icon": "fas fa-book" }, From d3d2777885e93c1591090038519fdb13d7ef6569 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 1 Sep 2022 13:31:24 +0000 Subject: [PATCH 0659/1169] Template update for nf-core/tools version 2.5.1 --- bin/check_samplesheet.py | 9 ++++++--- pyproject.toml | 10 ++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 pyproject.toml diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 9a8b8962..11b15572 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -98,7 +98,9 @@ def _validate_pair(self, row): """Assert that read pairs have the same file extension. Report pair status.""" if row[self._first_col] and row[self._second_col]: row[self._single_col] = False - if Path(row[self._first_col]).suffixes[-2:] != Path(row[self._second_col]).suffixes[-2:]: + first_col_suffix = Path(row[self._first_col]).suffixes[-2:] + second_col_suffix = Path(row[self._second_col]).suffixes[-2:] + if first_col_suffix != second_col_suffix: raise AssertionError("FASTQ pairs must have the same file extensions.") else: row[self._single_col] = True @@ -157,7 +159,7 @@ def sniff_format(handle): handle.seek(0) sniffer = csv.Sniffer() if not sniffer.has_header(peek): - logger.critical(f"The given sample sheet does not appear to contain a header.") + logger.critical("The given sample sheet does not appear to contain a header.") sys.exit(1) dialect = sniffer.sniff(peek) return dialect @@ -195,7 +197,8 @@ def check_samplesheet(file_in, file_out): reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) # Validate the existence of the expected header columns. if not required_columns.issubset(reader.fieldnames): - logger.critical(f"The sample sheet **must** contain the column headers: {', '.join(required_columns)}.") + req_cols = ", ".join(required_columns) + logger.critical(f"The sample sheet **must** contain these column headers: {req_cols}.") sys.exit(1) # Validate each row. checker = RowChecker() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..0d62beb6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,10 @@ +# Config file for Python. Mostly used to configure linting of bin/check_samplesheet.py with Black. +# Should be kept the same as nf-core/tools to avoid fighting with template synchronisation. +[tool.black] +line-length = 120 +target_version = ["py37", "py38", "py39", "py310"] + +[tool.isort] +profile = "black" +known_first_party = ["nf_core"] +multi_line_output = 3 From 28e26043f5886f0c0a8857bdebebed5894c78ce8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 2 Sep 2022 16:39:06 +0200 Subject: [PATCH 0660/1169] review suggestions --- workflows/raredisease.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 26802ac2..312c3d4a 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -218,7 +218,6 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) } - ch_sv_annotate = Channel.empty() if (params.annotate_sv_switch) { ANNOTATE_STRUCTURAL_VARIANTS ( CALL_STRUCTURAL_VARIANTS.out.vcf, @@ -256,7 +255,6 @@ workflow RAREDISEASE { // STEP 3: VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) - ch_snv_annotate = Channel.empty() if (params.annotate_snv_switch) { ANNOTATE_SNVS ( ch_vcf, From a281a25dcf0e4319fc3156da667f04b75c7827a9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 8 Sep 2022 13:08:43 +0200 Subject: [PATCH 0661/1169] add vep filter to snv --- subworkflows/local/annotate_snvs.nf | 2 ++ workflows/raredisease.nf | 1 + 2 files changed, 3 insertions(+) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 4c3bec80..fde6a0bf 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -7,11 +7,13 @@ include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/b include { RHOCALL_ANNOTATE } from '../../modules/nf-core/modules/rhocall/annotate/main' include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' include { TABIX_TABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' +include { FILTER_VEP } from '../../modules/local/filter_vep' workflow ANNOTATE_SNVS { take: + feature_file vcf vcfanno_resource_dir vcfanno_toml diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c8815189..343d8b4f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -259,6 +259,7 @@ workflow RAREDISEASE { if (params.annotate_snv_switch) { ANNOTATE_SNVS ( + ch_vep_filters, ch_vcf, ch_references.vcfanno_resources, params.vcfanno_toml, From b47cea36c281cf13715998a2bb37f1762a2bfff6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 9 Sep 2022 23:58:05 +0200 Subject: [PATCH 0662/1169] Add vcfparser python script --- assets/variant_consequences_v1.txt | 39 +++++++ bin/vcfparser.py | 179 +++++++++++++++++++++++++++++ 2 files changed, 218 insertions(+) create mode 100644 assets/variant_consequences_v1.txt create mode 100644 bin/vcfparser.py diff --git a/assets/variant_consequences_v1.txt b/assets/variant_consequences_v1.txt new file mode 100644 index 00000000..0893a8b9 --- /dev/null +++ b/assets/variant_consequences_v1.txt @@ -0,0 +1,39 @@ +transcript_ablation +splice_acceptor_variant +splice_donor_variant +stop_gained +frameshift_variant +stop_lost +start_lost +transcript_amplification +inframe_insertion +inframe_deletion +missense_variant +protein_altering_variant +splice_region_variant +splice_donor_5th_base_variant +splice_donor_region_variant +splice_polypyrimidine_tract_variant +incomplete_terminal_codon_variant +start_retained_variant +stop_retained_variant +synonymous_variant +coding_sequence_variant +mature_miRNA_variant +5_prime_UTR_variant +3_prime_UTR_variant +non_coding_transcript_exon_variant +intron_variant +NMD_transcript_variant +non_coding_transcript_variant +upstream_gene_variant +downstream_gene_variant +TFBS_ablation +TFBS_amplification +TF_binding_site_variant +regulatory_region_ablation +regulatory_region_amplification +feature_elongation +regulatory_region_variant +feature_truncation +intergenic_variant diff --git a/bin/vcfparser.py b/bin/vcfparser.py new file mode 100644 index 00000000..40445e13 --- /dev/null +++ b/bin/vcfparser.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python +import argparse +import sys +from collections import Counter +from pathlib import Path + +def parse_vep_csq_transcripts(transcripts, allele_ind, csq_ind, hgnc_ind, var_csq): + """ + Parse conseqences for each transcript and return HGNC IDs, alleles, and their severity rank + based on the term's ranking in the ensembl consequences list. + + Args: + transcripts (list): A list of vep transcript annotation + allele_ind (int) : Index of the "allele" in the vep annotation record + csq_ind (int) : Index of the "Consequence" in the vep annotation record + hgnc_ind (int) : Index of the "HGNC_ID" in the vep annotation record + var_csq (list): A list of consequence terms ordered by rank + + Returns: + hgnc_ids (list): list of hgnc ids in the record + alleles (list): list of alleles in the record + consequences (list): list of consequence terms in the record + severity (list): list of consequence term ranks + """ + + consequences = [] + hgnc_ids = [] + severity = [] + alleles = [] + mscsq_anno = [] + for transcript in transcripts: + vep_fields = transcript.strip().split("|") + csq = vep_fields[csq_ind].split("&")[0] + hgnc_id = vep_fields[hgnc_ind] + allele = vep_fields[allele_ind].replace("CSQ=", "") + consequences.append(csq) + hgnc_ids.append(hgnc_id) + severity.append(var_csq.index(csq)) + alleles.append(allele) + return hgnc_ids, alleles, consequences, severity + + +def construct_most_severe_consequence_info(line, allele_ind, csq_ind, hgnc_ind, var_csq): + """ + Parse conseqences for each transcript and return HGNC IDs, alleles, and their severity rank + based on the term's ranking in the ensembl consequences list. + + Args: + line (str) : Vcf record + allele_ind (int) : Index of the "allele" in the vep annotation record + csq_ind (int) : Index of the "Consequence" in the vep annotation record + hgnc_ind (int) : Index of the "HGNC_ID" in the vep annotation record + var_csq (list): A list of consequence terms ordered by rank + + Returns: + columns (list): A list of fields in the vcf record with most severe consequence added + to the INFO column + """ + + columns = line.strip().split() + transcripts = columns[7].split("CSQ=")[1].split(",") + hgnc_ids, alleles, consequences, severity = parse_vep_csq_transcripts( + transcripts, allele_ind, csq_ind, hgnc_ind, var_csq + ) + unique_ids = list(set(hgnc_ids)) + mscsq_anno = [] + for gene_id in unique_ids: + if gene_id != "": + indices = find_indices(hgnc_ids, gene_id) + alleles_sub = [alleles[i] for i in indices] + consequences_sub = [consequences[i] for i in indices] + severity_sub = [severity[i] for i in indices] + most_severe_csq = consequences_sub[severity_sub.index(min(severity_sub))] + most_severe_allele = alleles_sub[severity_sub.index(min(severity_sub))] + mscsq_anno.append(gene_id + ":" + most_severe_allele + "|" + most_severe_csq) + columns[7] += ";most_severe_consequence=" + ",".join(mscsq_anno) + return columns + + +def find_indices(list_to_check, item_to_find): + """ + Get indices of an element in a list + + Args: + list_to_check (list) + item_to_find (value) + + Returns: + indices (list) + """ + indices = [] + for idx, value in enumerate(list_to_check): + if value == item_to_find: + indices.append(idx) + return indices + + +def parse_vep_csq_schema(line): + """ + Get indices of allele, consequence, and hgnc id in the annotation + + Args: + line: INFO line in the vcf header with CSQ information + + Returns: + allele_ind (int) : Index of the "allele" in the vep annotation record + csq_ind (int) : Index of the "Consequence" in the vep annotation record + hgnc_ind (int) : Index of the "HGNC_ID" in the vep annotation record + """ + fields = line.strip().split("Format: ")[1].replace('">', "").split("|") + allele_ind = fields.index("Allele") + csq_ind = fields.index("Consequence") + hgnc_ind = fields.index("HGNC_ID") + + return allele_ind, csq_ind, hgnc_ind + + +def write_csq_annotated_vcf(file_in, file_out, var_csq): + """Add most severe consequence field to record, and write the record to a vcf file""" + counter = 0 + for line in file_in: + if line.startswith("#"): + if line.startswith("##INFO=\n' + ) + counter = 0 + file_out.write(line) + else: + mscsq = construct_most_severe_consequence_info(line, allele_ind, csq_ind, hgnc_ind, var_csq) + file_out.write("\t".join(mscsq) + "\n") + + +def parse_args(argv=None): + """Define and immediately parse command line arguments.""" + parser = argparse.ArgumentParser( + description="Annotate vcf with the most severe consequence field.", + epilog="Example: python vcfparser.py vep.vcf vep.most_severe_csq.vcf", + ) + parser.add_argument( + "file_in", + metavar="FILE_IN", + type=Path, + help="Vcf file annotated with vep.", + ) + parser.add_argument( + "file_out", + metavar="FILE_OUT", + type=Path, + help="Vcf with most_severe_consequence annotations added to it.", + ) + parser.add_argument( + "variant_csq", + metavar="VARIANT_CSQ", + type=Path, + help="Variant consequences ranked by severity", + ) + return parser.parse_args(argv) + + +def main(argv=None): + """Coordinate argument parsing and program execution.""" + args = parse_args(argv) + if not args.file_in.is_file(): + print(f"The given input file {args.file_in} was not found!") + sys.exit(2) + args.file_out.parent.mkdir(parents=True, exist_ok=True) + with open(args.variant_csq) as f: + var_csq = [line.strip() for line in f] + with open(args.file_out, "w") as out_vcf: + with open(args.file_in) as in_vcf: + write_csq_annotated_vcf(in_vcf, out_vcf, var_csq) + + +if __name__ == "__main__": + sys.exit(main()) From a6af0624a2ec7b96c1ef62136614ffa2b2c25ba0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 10 Sep 2022 00:08:54 +0200 Subject: [PATCH 0663/1169] Add vcfparser module --- modules/local/filter_vep.nf | 17 --------------- modules/local/vcfparser.nf | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 modules/local/vcfparser.nf diff --git a/modules/local/filter_vep.nf b/modules/local/filter_vep.nf index d629f3f1..7b96fbde 100644 --- a/modules/local/filter_vep.nf +++ b/modules/local/filter_vep.nf @@ -22,23 +22,6 @@ process FILTER_VEP { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - export INPUT_FILE=${select_feature_file_bed} - export OUTPUT_FILE="feature.list" - - python3 < versions.yml + "${task.process}": + vcfparser: v1.0 + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcfparser.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + vcfparser: v1.0 + END_VERSIONS + """ +} From dd1c4a241e7229dd3ebc4a852958aa5011bb6711 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 11 Sep 2022 00:05:02 +0200 Subject: [PATCH 0664/1169] add vcfparser to workflow --- bin/vcfparser.py | 1 + workflows/raredisease.nf | 27 ++++++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/bin/vcfparser.py b/bin/vcfparser.py index 40445e13..12da31d1 100644 --- a/bin/vcfparser.py +++ b/bin/vcfparser.py @@ -4,6 +4,7 @@ from collections import Counter from pathlib import Path + def parse_vep_csq_transcripts(transcripts, allele_ind, csq_ind, hgnc_ind, var_csq): """ Parse conseqences for each transcript and return HGNC IDs, alleles, and their severity rank diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 343d8b4f..eafff398 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -30,13 +30,14 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -ch_ml_model = params.ml_model ? file(params.ml_model) : [] -ch_call_interval = params.call_interval ? file(params.call_interval) : [] -ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] -ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] -ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] -ch_vep_cache = params.vep_cache ? file(params.vep_cache) : [] -ch_vep_filters = params.vep_filters ? file(params.vep_filters) : [] +ch_ml_model = params.ml_model ? file(params.ml_model) : [] +ch_call_interval = params.call_interval ? file(params.call_interval) : [] +ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] +ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] +ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] +ch_variant_consequences = file("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true) +ch_vep_cache = params.vep_cache ? file(params.vep_cache) : [] +ch_vep_filters = params.vep_filters ? file(params.vep_filters) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -58,6 +59,8 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // include { MAKE_PED } from '../modules/local/create_pedfile' +include { VCFPARSER as VCFPARSER_SNV } from '../modules/local/vcfparser' +include { VCFPARSER as VCFPARSER_SV } from '../modules/local/vcfparser' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules @@ -239,6 +242,11 @@ workflow RAREDISEASE { ch_score_config_sv ) ch_versions = ch_versions.mix(RANK_VARIANTS_SV.out.versions) + + VCFPARSER_SV ( + RANK_VARIANTS_SV.out.vcf, + ch_variant_consequences + ) } @@ -279,6 +287,11 @@ workflow RAREDISEASE { ch_score_config_snv ) ch_versions = ch_versions.mix(RANK_VARIANTS_SNV.out.versions) + + VCFPARSER_SNV ( + RANK_VARIANTS_SNV.out.vcf, + ch_variant_consequences + ) } // From c26e831a8babad769a41570a002eb0ea7f016fe3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 11 Sep 2022 00:56:09 +0200 Subject: [PATCH 0665/1169] add modules to subworkflow --- conf/genomes.config | 2 ++ main.nf | 1 + modules/local/filter_vep.nf | 4 +-- modules/local/vcfparser.nf | 2 +- nextflow_schema.json | 7 ++++ subworkflows/local/annotate_snvs.nf | 8 ++--- .../local/annotate_structural_variants.nf | 7 ++-- subworkflows/nf-core/genmod.nf | 2 +- workflows/raredisease.nf | 33 +++++++++++++------ 9 files changed, 41 insertions(+), 25 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index de523ad9..79592106 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -26,6 +26,7 @@ params { reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" score_config_sv = "${params.local_genomes}/svrank_model_-v1.8-.ini" + select_feature_file = "${params.local_genomes}/hgnc.txt" svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" @@ -50,6 +51,7 @@ params { reduced_penetrance = "" score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" + select_feature_file = "${params.local_genomes}/hgnc.txt" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" diff --git a/main.nf b/main.nf index 9ea1f2a0..a1e5bcdc 100644 --- a/main.nf +++ b/main.nf @@ -33,6 +33,7 @@ params.ml_model = WorkflowMain.getGenomeAttribute(params, 'ml_model' params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_penetrance') params.score_config_snv = WorkflowMain.getGenomeAttribute(params, 'score_config_snv') params.score_config_sv = WorkflowMain.getGenomeAttribute(params, 'score_config_sv') +params.select_feature_file = WorkflowMain.getGenomeAttribute(params, 'select_feature_file') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') diff --git a/modules/local/filter_vep.nf b/modules/local/filter_vep.nf index 7b96fbde..7d1fb448 100644 --- a/modules/local/filter_vep.nf +++ b/modules/local/filter_vep.nf @@ -9,7 +9,7 @@ process FILTER_VEP { input: tuple val(meta), path(vcf) - path (select_feature_file_bed) + path (select_feature_file) output: tuple val(meta), path("*.ann_filter.vcf.gz"), emit: vcf @@ -27,7 +27,7 @@ process FILTER_VEP { --input_file $vcf \\ --output_file ${prefix}.ann_filter.vcf.gz \\ --only_matched \\ - --filter \"SYMBOL in feature.list\" + --filter \"HGNC_ID in ${select_feature_file}\" cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/vcfparser.nf b/modules/local/vcfparser.nf index 641d880b..14063b79 100644 --- a/modules/local/vcfparser.nf +++ b/modules/local/vcfparser.nf @@ -12,7 +12,7 @@ process VCFPARSER { path (variant_consequences) output: - tuple val(meta), path("*.vcfparser.vcf"), emit: vcf + tuple val(meta), path("*.vcfparser.vcf") , emit: vcf path "versions.yml" , emit: versions when: diff --git a/nextflow_schema.json b/nextflow_schema.json index b36cfec5..e7daabba 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -178,6 +178,13 @@ "description": "SV rank model config file for genmod.", "hidden": true }, + "select_feature_file": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "File containing HGNC_IDs of interest on separate lines.", + "hidden": true + }, "vep_filters": { "type": "string", "format": "path", diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index fde6a0bf..fc4064f7 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -7,7 +7,6 @@ include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/b include { RHOCALL_ANNOTATE } from '../../modules/nf-core/modules/rhocall/annotate/main' include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' include { TABIX_TABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' -include { FILTER_VEP } from '../../modules/local/filter_vep' workflow ANNOTATE_SNVS { @@ -86,10 +85,7 @@ workflow ANNOTATE_SNVS { ) ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) - FILTER_VEP(ENSEMBLVEP_SNV.out.vcf, feature_file) - emit: - vcf_ann_clinical = FILTER_VEP.out.vcf - vcf_ann_research = ENSEMBLVEP_SNV.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf_ann = ENSEMBLVEP_SNV.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index b8655fc4..a7a01a54 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -7,7 +7,6 @@ include { PICARD_SORTVCF } from '../../modules/nf-core/modules/pi include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' -include { FILTER_VEP } from '../../modules/local/filter_vep' workflow ANNOTATE_STRUCTURAL_VARIANTS { @@ -76,10 +75,8 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ) ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) - FILTER_VEP(ENSEMBLVEP_SV.out.vcf, feature_file) emit: - vcf_ann_clinical = FILTER_VEP.out.vcf - vcf_ann_research = ENSEMBLVEP_SV.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf_ann = ENSEMBLVEP_SV.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/genmod.nf b/subworkflows/nf-core/genmod.nf index 7bc74780..c3241396 100644 --- a/subworkflows/nf-core/genmod.nf +++ b/subworkflows/nf-core/genmod.nf @@ -28,6 +28,6 @@ workflow RANK_VARIANTS { ch_versions = ch_versions.mix(GENMOD_COMPOUND.out.versions) emit: - vcf_ann = GENMOD_COMPOUND.out.vcf + vcf = GENMOD_COMPOUND.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index eafff398..bf56c8ea 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -30,14 +30,15 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -ch_ml_model = params.ml_model ? file(params.ml_model) : [] -ch_call_interval = params.call_interval ? file(params.call_interval) : [] -ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] -ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] -ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] +ch_ml_model = params.ml_model ? file(params.ml_model) : [] +ch_call_interval = params.call_interval ? file(params.call_interval) : [] +ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] +ch_select_feature_file = params.select_feature_file ? file(params.select_feature_file): [] +ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] +ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] ch_variant_consequences = file("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true) -ch_vep_cache = params.vep_cache ? file(params.vep_cache) : [] -ch_vep_filters = params.vep_filters ? file(params.vep_filters) : [] +ch_vep_cache = params.vep_cache ? file(params.vep_cache) : [] +ch_vep_filters = params.vep_filters ? file(params.vep_filters) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -58,9 +59,11 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // MODULE: local modules // -include { MAKE_PED } from '../modules/local/create_pedfile' -include { VCFPARSER as VCFPARSER_SNV } from '../modules/local/vcfparser' -include { VCFPARSER as VCFPARSER_SV } from '../modules/local/vcfparser' +include { MAKE_PED } from '../modules/local/create_pedfile' +include { VCFPARSER as VCFPARSER_SNV } from '../modules/local/vcfparser' +include { VCFPARSER as VCFPARSER_SV } from '../modules/local/vcfparser' +include { FILTER_VEP as FILTER_VEP_SNV } from '../modules/local/filter_vep' +include { FILTER_VEP as FILTER_VEP_SV } from '../modules/local/filter_vep' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules @@ -247,6 +250,11 @@ workflow RAREDISEASE { RANK_VARIANTS_SV.out.vcf, ch_variant_consequences ) + + FILTER_VEP_SV( + VCFPARSER_SV.out.vcf, + ch_select_feature_file + ) } @@ -292,6 +300,11 @@ workflow RAREDISEASE { RANK_VARIANTS_SNV.out.vcf, ch_variant_consequences ) + + FILTER_VEP_SNV( + VCFPARSER_SNV.out.vcf, + ch_select_feature_file + ) } // From 2f5cd3a0612240a66cdc21ebb71d8a3dcc4755bf Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 12 Sep 2022 13:49:05 +0200 Subject: [PATCH 0666/1169] remove select_feature_file and retain vep_filters --- main.nf | 1 - nextflow_schema.json | 9 +-------- subworkflows/local/annotate_snvs.nf | 1 - subworkflows/local/annotate_structural_variants.nf | 1 - workflows/raredisease.nf | 7 ++----- 5 files changed, 3 insertions(+), 16 deletions(-) diff --git a/main.nf b/main.nf index a1e5bcdc..9ea1f2a0 100644 --- a/main.nf +++ b/main.nf @@ -33,7 +33,6 @@ params.ml_model = WorkflowMain.getGenomeAttribute(params, 'ml_model' params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_penetrance') params.score_config_snv = WorkflowMain.getGenomeAttribute(params, 'score_config_snv') params.score_config_sv = WorkflowMain.getGenomeAttribute(params, 'score_config_sv') -params.select_feature_file = WorkflowMain.getGenomeAttribute(params, 'select_feature_file') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') diff --git a/nextflow_schema.json b/nextflow_schema.json index e7daabba..6e18bebd 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -178,18 +178,11 @@ "description": "SV rank model config file for genmod.", "hidden": true }, - "select_feature_file": { - "type": "string", - "format": "path", - "fa_icon": "fas fa-chart-bar", - "description": "File containing HGNC_IDs of interest on separate lines.", - "hidden": true - }, "vep_filters": { "type": "string", "format": "path", "fa_icon": "fas fa-chart-bar", - "description": "Gene panel file to be used with filter_vep to separate clinical and research variants.", + "description": "File containing HGNC_IDs of interest on separate lines.", "hidden": true }, "target_bed": { diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index fc4064f7..34b46c18 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -12,7 +12,6 @@ include { TABIX_TABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/modules/t workflow ANNOTATE_SNVS { take: - feature_file vcf vcfanno_resource_dir vcfanno_toml diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index a7a01a54..8a23a96e 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -11,7 +11,6 @@ include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/m workflow ANNOTATE_STRUCTURAL_VARIANTS { take: - feature_file vcf // channel: [ val(meta), path(vcf) ] sv_dbs // file: dbs.csv vep_genome diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index bf56c8ea..e66e42ce 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -33,7 +33,6 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample ch_ml_model = params.ml_model ? file(params.ml_model) : [] ch_call_interval = params.call_interval ? file(params.call_interval) : [] ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] -ch_select_feature_file = params.select_feature_file ? file(params.select_feature_file): [] ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] ch_variant_consequences = file("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true) @@ -227,7 +226,6 @@ workflow RAREDISEASE { if (params.annotate_sv_switch) { ANNOTATE_STRUCTURAL_VARIANTS ( - ch_vep_filters, CALL_STRUCTURAL_VARIANTS.out.vcf, params.svdb_query_dbs, params.genome, @@ -253,7 +251,7 @@ workflow RAREDISEASE { FILTER_VEP_SV( VCFPARSER_SV.out.vcf, - ch_select_feature_file + ch_vep_filters ) } @@ -275,7 +273,6 @@ workflow RAREDISEASE { if (params.annotate_snv_switch) { ANNOTATE_SNVS ( - ch_vep_filters, ch_vcf, ch_references.vcfanno_resources, params.vcfanno_toml, @@ -303,7 +300,7 @@ workflow RAREDISEASE { FILTER_VEP_SNV( VCFPARSER_SNV.out.vcf, - ch_select_feature_file + ch_vep_filters ) } From 66678a882ab52827f9778c3c7d9dcfef385d9594 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 13 Sep 2022 13:25:12 +0200 Subject: [PATCH 0667/1169] review suggestions --- bin/vcfparser.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/bin/vcfparser.py b/bin/vcfparser.py index 12da31d1..f72357e8 100644 --- a/bin/vcfparser.py +++ b/bin/vcfparser.py @@ -1,11 +1,13 @@ #!/usr/bin/env python import argparse import sys -from collections import Counter from pathlib import Path +from typing import Tuple, TextIO -def parse_vep_csq_transcripts(transcripts, allele_ind, csq_ind, hgnc_ind, var_csq): +def parse_vep_csq_transcripts( + transcripts: list, allele_ind: int, csq_ind: int, hgnc_ind: int, var_csq: list +) -> Tuple[list, list, list, list]: """ Parse conseqences for each transcript and return HGNC IDs, alleles, and their severity rank based on the term's ranking in the ensembl consequences list. @@ -28,7 +30,6 @@ def parse_vep_csq_transcripts(transcripts, allele_ind, csq_ind, hgnc_ind, var_cs hgnc_ids = [] severity = [] alleles = [] - mscsq_anno = [] for transcript in transcripts: vep_fields = transcript.strip().split("|") csq = vep_fields[csq_ind].split("&")[0] @@ -41,7 +42,9 @@ def parse_vep_csq_transcripts(transcripts, allele_ind, csq_ind, hgnc_ind, var_cs return hgnc_ids, alleles, consequences, severity -def construct_most_severe_consequence_info(line, allele_ind, csq_ind, hgnc_ind, var_csq): +def construct_most_severe_consequence_info( + line: str, allele_ind: int, csq_ind: int, hgnc_ind: int, var_csq: list +) -> list: """ Parse conseqences for each transcript and return HGNC IDs, alleles, and their severity rank based on the term's ranking in the ensembl consequences list. @@ -74,11 +77,12 @@ def construct_most_severe_consequence_info(line, allele_ind, csq_ind, hgnc_ind, most_severe_csq = consequences_sub[severity_sub.index(min(severity_sub))] most_severe_allele = alleles_sub[severity_sub.index(min(severity_sub))] mscsq_anno.append(gene_id + ":" + most_severe_allele + "|" + most_severe_csq) - columns[7] += ";most_severe_consequence=" + ",".join(mscsq_anno) + if mscsq_anno: + columns[7] += ";most_severe_consequence=" + ",".join(mscsq_anno) return columns -def find_indices(list_to_check, item_to_find): +def find_indices(list_to_check: list, item_to_find: str) -> list: """ Get indices of an element in a list @@ -96,7 +100,7 @@ def find_indices(list_to_check, item_to_find): return indices -def parse_vep_csq_schema(line): +def parse_vep_csq_schema(line: str) -> Tuple[int, int, int]: """ Get indices of allele, consequence, and hgnc id in the annotation @@ -116,20 +120,16 @@ def parse_vep_csq_schema(line): return allele_ind, csq_ind, hgnc_ind -def write_csq_annotated_vcf(file_in, file_out, var_csq): +def write_csq_annotated_vcf(file_in: TextIO, file_out: TextIO, var_csq: list): """Add most severe consequence field to record, and write the record to a vcf file""" - counter = 0 for line in file_in: if line.startswith("#"): + file_out.write(line) if line.startswith("##INFO=\n' ) - counter = 0 - file_out.write(line) else: mscsq = construct_most_severe_consequence_info(line, allele_ind, csq_ind, hgnc_ind, var_csq) file_out.write("\t".join(mscsq) + "\n") @@ -139,22 +139,22 @@ def parse_args(argv=None): """Define and immediately parse command line arguments.""" parser = argparse.ArgumentParser( description="Annotate vcf with the most severe consequence field.", - epilog="Example: python vcfparser.py vep.vcf vep.most_severe_csq.vcf", + epilog="Example: python vcfparser.py --file_in vep.vcf --file_out vep.most_severe_csq.vcf --variant_csq variant_consequence.txt", ) parser.add_argument( - "file_in", + "--file_in", metavar="FILE_IN", type=Path, help="Vcf file annotated with vep.", ) parser.add_argument( - "file_out", + "--file_out", metavar="FILE_OUT", type=Path, help="Vcf with most_severe_consequence annotations added to it.", ) parser.add_argument( - "variant_csq", + "--variant_csq", metavar="VARIANT_CSQ", type=Path, help="Variant consequences ranked by severity", From b44926b897395823b7055cc82696367c59e6ef8b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 13 Sep 2022 13:37:50 +0200 Subject: [PATCH 0668/1169] add file exists check for variant_csq --- bin/vcfparser.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/vcfparser.py b/bin/vcfparser.py index f72357e8..b6d14732 100644 --- a/bin/vcfparser.py +++ b/bin/vcfparser.py @@ -168,6 +168,9 @@ def main(argv=None): if not args.file_in.is_file(): print(f"The given input file {args.file_in} was not found!") sys.exit(2) + if not args.variant_csq.is_file(): + print(f"The given variant consequence file {args.variant_csq} was not found!") + sys.exit(2) args.file_out.parent.mkdir(parents=True, exist_ok=True) with open(args.variant_csq) as f: var_csq = [line.strip() for line in f] From 729b9bf43e549fc9045a9851006c6f18bb5989ed Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 14 Sep 2022 14:32:14 +0200 Subject: [PATCH 0669/1169] switch order --- subworkflows/local/vcfparser.nf | 26 ++++++++++++++++++++++++++ workflows/raredisease.nf | 26 ++++++++++++++------------ 2 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 subworkflows/local/vcfparser.nf diff --git a/subworkflows/local/vcfparser.nf b/subworkflows/local/vcfparser.nf new file mode 100644 index 00000000..fcda7129 --- /dev/null +++ b/subworkflows/local/vcfparser.nf @@ -0,0 +1,26 @@ +// +// A subworkflow to call SNVs by sentieon dnascope with a machine learning model. +// + +include { VCFPARSER } from '../../modules/local/vcfparser' + +workflow VCFPARSER_CSQ { + take: + clinical // channel: [ val(meta), vcf ] + research // channel: [ val(meta), vcf ] + variant_consequences // path: consequences.txt + + main: + ch_versions = Channel.empty() + + ch_input = clinical.join(research) + + VCFPARSER ( + ch_input, + variant_consequences + ) + + emit: + vcf = VCFPARSER.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e66e42ce..f38fa906 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -59,8 +59,6 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // include { MAKE_PED } from '../modules/local/create_pedfile' -include { VCFPARSER as VCFPARSER_SNV } from '../modules/local/vcfparser' -include { VCFPARSER as VCFPARSER_SV } from '../modules/local/vcfparser' include { FILTER_VEP as FILTER_VEP_SNV } from '../modules/local/filter_vep' include { FILTER_VEP as FILTER_VEP_SV } from '../modules/local/filter_vep' @@ -76,6 +74,8 @@ include { GENS } from '../subworkflows/local/gens' include { ALIGN } from '../subworkflows/local/align' include { CALL_SNV } from '../subworkflows/local/call_snv' include { ANALYSE_MT } from '../subworkflows/local/analyse_MT' +include { VCFPARSER_CSQ as ANN_CSQ_SNV } from '../subworkflows/local/vcfparser' +include { VCFPARSER_CSQ as ANN_CSQ_SV } from '../subworkflows/local/vcfparser' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -244,14 +244,15 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(RANK_VARIANTS_SV.out.versions) - VCFPARSER_SV ( + FILTER_VEP_SV( RANK_VARIANTS_SV.out.vcf, - ch_variant_consequences + ch_vep_filters ) - FILTER_VEP_SV( - VCFPARSER_SV.out.vcf, - ch_vep_filters + ANN_CSQ_SV ( + FILTER_VEP_SV.out.vcf, + RANK_VARIANTS_SV.out.vcf, + ch_variant_consequences ) } @@ -293,14 +294,15 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(RANK_VARIANTS_SNV.out.versions) - VCFPARSER_SNV ( + FILTER_VEP_SNV( RANK_VARIANTS_SNV.out.vcf, - ch_variant_consequences + ch_vep_filters ) - FILTER_VEP_SNV( - VCFPARSER_SNV.out.vcf, - ch_vep_filters + ANN_CSQ_SNV ( + FILTER_VEP_SNV.out.vcf, + RANK_VARIANTS_SNV.out.vcf, + ch_variant_consequences ) } From e3af85c61084e3f78441372bf764f55c3a3ef2f9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 14 Sep 2022 15:47:30 +0200 Subject: [PATCH 0670/1169] update modules --- modules.json | 62 +++++++++---------- modules/nf-core/modules/bcftools/norm/main.nf | 8 +-- .../nf-core/modules/bcftools/norm/meta.yml | 8 ++- modules/nf-core/modules/bcftools/view/main.nf | 6 +- modules/nf-core/modules/bwamem2/index/main.nf | 6 +- .../nf-core/modules/bwamem2/index/meta.yml | 12 +++- modules/nf-core/modules/bwamem2/mem/main.nf | 2 +- modules/nf-core/modules/bwamem2/mem/meta.yml | 5 ++ .../custom/dumpsoftwareversions/main.nf | 8 +-- .../templates/dumpsoftwareversions.py | 14 ++--- .../nf-core/modules/expansionhunter/meta.yml | 2 +- .../modules/gatk4/bedtointervallist/main.nf | 6 +- .../gatk4/createsequencedictionary/main.nf | 6 +- .../modules/gatk4/intervallisttools/main.nf | 6 +- .../nf-core/modules/gatk4/revertsam/main.nf | 6 +- .../nf-core/modules/gatk4/samtofastq/main.nf | 6 +- .../nf-core/modules/manta/germline/main.nf | 2 +- modules/nf-core/modules/mosdepth/main.nf | 45 +++++++++----- modules/nf-core/modules/mosdepth/meta.yml | 29 +++++++-- modules/nf-core/modules/multiqc/main.nf | 17 +++-- modules/nf-core/modules/multiqc/meta.yml | 11 ++++ .../picard/addorreplacereadgroups/main.nf | 11 ++++ .../modules/picard/collecthsmetrics/main.nf | 16 ++--- .../picard/collectmultiplemetrics/main.nf | 14 +++-- .../picard/collectmultiplemetrics/meta.yml | 4 ++ .../modules/picard/markduplicates/main.nf | 6 +- .../nf-core/modules/picard/sortvcf/main.nf | 10 +-- .../nf-core/modules/samtools/faidx/main.nf | 4 +- .../nf-core/modules/samtools/faidx/meta.yml | 4 ++ .../nf-core/modules/samtools/merge/main.nf | 3 +- .../nf-core/modules/samtools/merge/meta.yml | 4 ++ .../nf-core/modules/samtools/stats/main.nf | 9 +-- modules/nf-core/modules/samtools/view/main.nf | 2 +- modules/nf-core/modules/svdb/merge/main.nf | 12 ++-- modules/nf-core/modules/svdb/merge/meta.yml | 2 +- .../nf-core/modules/tabix/bgziptabix/main.nf | 6 +- modules/nf-core/modules/tabix/tabix/main.nf | 5 +- modules/nf-core/modules/tabix/tabix/meta.yml | 4 ++ modules/nf-core/modules/tiddit/cov/main.nf | 16 ++--- modules/nf-core/modules/tiddit/cov/meta.yml | 2 +- modules/nf-core/modules/tiddit/sv/main.nf | 33 +++++----- modules/nf-core/modules/tiddit/sv/meta.yml | 20 +++--- .../nf-core/modules/ucsc/wigtobigwig/main.nf | 4 +- modules/nf-core/modules/untar/main.nf | 29 +++++++-- modules/nf-core/modules/untar/meta.yml | 8 ++- modules/nf-core/modules/vcfanno/main.nf | 4 +- 46 files changed, 314 insertions(+), 185 deletions(-) diff --git a/modules.json b/modules.json index 63e42025..87f4ae01 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "modules": { "bcftools/norm": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" }, "bcftools/roh": { "branch": "master", @@ -15,15 +15,15 @@ }, "bcftools/view": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" }, "bwamem2/index": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "d0ff29fca32ba795177584ebfd51dcd6b0d5f890" }, "bwamem2/mem": { "branch": "master", - "git_sha": "4f5274c3de0c9521f5033893ff61057a74c45ba9" + "git_sha": "30b04859129f5f4235accdea9fdea8f1feb23809" }, "cat/cat": { "branch": "master", @@ -51,7 +51,7 @@ }, "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" }, "deepvariant": { "branch": "master", @@ -59,7 +59,7 @@ }, "expansionhunter": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "848ee9a215d02d80be033bfa60881700f2bd914c" }, "fastqc": { "branch": "master", @@ -67,15 +67,15 @@ }, "gatk4/bedtointervallist": { "branch": "master", - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" }, "gatk4/createsequencedictionary": { "branch": "master", - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" }, "gatk4/intervallisttools": { "branch": "master", - "git_sha": "409af2f27cbe45109acc7fee70718d2bf20aa449" + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" }, "gatk4/mergebamalignment": { "branch": "master", @@ -87,11 +87,11 @@ }, "gatk4/revertsam": { "branch": "master", - "git_sha": "f231291e7730654158cbd3f10b82c292e27fa273" + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" }, "gatk4/samtofastq": { "branch": "master", - "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce" + "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" }, "genmod/annotate": { "branch": "master", @@ -119,35 +119,35 @@ }, "manta/germline": { "branch": "master", - "git_sha": "ffedf09b6e84b479c9c901274f74bb33f3777243" + "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" }, "mosdepth": { "branch": "master", - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "72a31b76eb1b58879e0d91fb1d992e0118693098" }, "multiqc": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "5587389874dac9c9953a2ab6f01d49af81969492" }, "picard/addorreplacereadgroups": { "branch": "master", - "git_sha": "baa2845d2818066bcbd8b91e6ce77d71e36ecf45" + "git_sha": "67652c7c4dda138c9e71f093b1aea91f29f87c50" }, "picard/collecthsmetrics": { "branch": "master", - "git_sha": "35231d394940dca2291ac2321c8f9b2e3b039905" + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" }, "picard/collectmultiplemetrics": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" }, "picard/markduplicates": { "branch": "master", - "git_sha": "63db63757cab03cfa7a02c0d0f134b66fbfadea6" + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" }, "picard/sortvcf": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" }, "qualimap/bamqc": { "branch": "master", @@ -159,7 +159,7 @@ }, "samtools/faidx": { "branch": "master", - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "3eb99152cedbb7280258858e5df08478a4670696" }, "samtools/index": { "branch": "master", @@ -167,7 +167,7 @@ }, "samtools/merge": { "branch": "master", - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "720027275ccdc1363bb2a19c6412da148e31d94b" }, "samtools/sort": { "branch": "master", @@ -175,11 +175,11 @@ }, "samtools/stats": { "branch": "master", - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "f4eab7945952dc4934224309701a49913ea05ae6" }, "samtools/view": { "branch": "master", - "git_sha": "6b64f9cb6c3dd3577931cc3cd032d6fb730000ce" + "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" }, "stranger": { "branch": "master", @@ -187,7 +187,7 @@ }, "svdb/merge": { "branch": "master", - "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" + "git_sha": "6b011dd14821385c282e030c6d993d2116aed23f" }, "svdb/query": { "branch": "master", @@ -195,31 +195,31 @@ }, "tabix/bgziptabix": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" }, "tabix/tabix": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" }, "tiddit/cov": { "branch": "master", - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" + "git_sha": "40996cdbe1874f9c2ba693fee76d2b4f316f95f2" }, "tiddit/sv": { "branch": "master", - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" + "git_sha": "b689b8ed88a9f89eb2f7c75d3eb0bace77ade109" }, "ucsc/wigtobigwig": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" }, "untar": { "branch": "master", - "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9" + "git_sha": "393dbd6ddafe3f18eac02893dd4a21e4d45de679" }, "vcfanno": { "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "13631304102ca3d99def3578611b79332f6fd175" } } } diff --git a/modules/nf-core/modules/bcftools/norm/main.nf b/modules/nf-core/modules/bcftools/norm/main.nf index b81a4310..96f306bc 100644 --- a/modules/nf-core/modules/bcftools/norm/main.nf +++ b/modules/nf-core/modules/bcftools/norm/main.nf @@ -2,13 +2,13 @@ process BCFTOOLS_NORM { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? 'bioconda::bcftools=1.14' : null) + conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0' : - 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': + 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" input: - tuple val(meta), path(vcf) + tuple val(meta), path(vcf), path(tbi) path(fasta) output: diff --git a/modules/nf-core/modules/bcftools/norm/meta.yml b/modules/nf-core/modules/bcftools/norm/meta.yml index ce4aee85..2b3c8eae 100644 --- a/modules/nf-core/modules/bcftools/norm/meta.yml +++ b/modules/nf-core/modules/bcftools/norm/meta.yml @@ -24,6 +24,12 @@ input: description: | The vcf file to be normalized e.g. 'file1.vcf' + pattern: "*.{vcf,vcf.gz}" + - tbi: + type: file + description: | + An optional index of the VCF file (for when the VCF is compressed) + pattern: "*.vcf.gz.tbi" - fasta: type: file description: FASTA reference file @@ -37,7 +43,7 @@ output: - vcf: type: file description: VCF normalized output file - pattern: "*.{vcf.gz}" + pattern: "*.vcf.gz" - versions: type: file description: File containing software versions diff --git a/modules/nf-core/modules/bcftools/view/main.nf b/modules/nf-core/modules/bcftools/view/main.nf index ca1121a5..3df08a57 100644 --- a/modules/nf-core/modules/bcftools/view/main.nf +++ b/modules/nf-core/modules/bcftools/view/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_VIEW { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? 'bioconda::bcftools=1.14' : null) + conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.14--h88f3f91_0' : - 'quay.io/biocontainers/bcftools:1.14--h88f3f91_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': + 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" input: tuple val(meta), path(vcf), path(index) diff --git a/modules/nf-core/modules/bwamem2/index/main.nf b/modules/nf-core/modules/bwamem2/index/main.nf index 900f27d4..6b63ea59 100644 --- a/modules/nf-core/modules/bwamem2/index/main.nf +++ b/modules/nf-core/modules/bwamem2/index/main.nf @@ -8,11 +8,11 @@ process BWAMEM2_INDEX { 'quay.io/biocontainers/bwa-mem2:2.2.1--he513fc3_0' }" input: - path fasta + tuple val(meta), path(fasta) output: - path "bwamem2" , emit: index - path "versions.yml" , emit: versions + tuple val(meta), path("bwamem2"), emit: index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/modules/bwamem2/index/meta.yml b/modules/nf-core/modules/bwamem2/index/meta.yml index 1b52448d..a6b11ae5 100644 --- a/modules/nf-core/modules/bwamem2/index/meta.yml +++ b/modules/nf-core/modules/bwamem2/index/meta.yml @@ -14,14 +14,24 @@ tools: documentation: https://github.com/bwa-mem2/bwa-mem2#usage licence: ["MIT"] input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - fasta: type: file description: Input genome fasta file output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - index: type: file description: BWA genome index files - pattern: "*.{0132,amb,ann,bwt.2bit.64,pac}" + pattern: "*.{0123,amb,ann,bwt.2bit.64,pac}" - versions: type: file description: File containing software versions diff --git a/modules/nf-core/modules/bwamem2/mem/main.nf b/modules/nf-core/modules/bwamem2/mem/main.nf index 978c4019..08dc5dfb 100644 --- a/modules/nf-core/modules/bwamem2/mem/main.nf +++ b/modules/nf-core/modules/bwamem2/mem/main.nf @@ -9,7 +9,7 @@ process BWAMEM2_MEM { input: tuple val(meta), path(reads) - path index + tuple val(meta2), path(index) val sort_bam output: diff --git a/modules/nf-core/modules/bwamem2/mem/meta.yml b/modules/nf-core/modules/bwamem2/mem/meta.yml index 25c97f91..a4655510 100644 --- a/modules/nf-core/modules/bwamem2/mem/meta.yml +++ b/modules/nf-core/modules/bwamem2/mem/meta.yml @@ -37,6 +37,11 @@ input: description: use samtools sort (true) or samtools view (false) pattern: "true or false" output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - bam: type: file description: Output BAM file containing read alignments diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index 327d5100..34b50b9f 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -1,11 +1,11 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { - label 'process_low' + label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.13a' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.13a--pyhdfd78af_1' : + 'quay.io/biocontainers/multiqc:1.13a--pyhdfd78af_1' }" input: path versions diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index 787bdb7b..d1390392 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -1,10 +1,9 @@ #!/usr/bin/env python +import yaml import platform from textwrap import dedent -import yaml - def _make_versions_html(versions): html = [ @@ -59,12 +58,11 @@ def _make_versions_html(versions): for process, process_versions in versions_by_process.items(): module = process.split(":")[-1] try: - if versions_by_module[module] != process_versions: - raise AssertionError( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) + assert versions_by_module[module] == process_versions, ( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) except KeyError: versions_by_module[module] = process_versions diff --git a/modules/nf-core/modules/expansionhunter/meta.yml b/modules/nf-core/modules/expansionhunter/meta.yml index 3483c0db..c5a89c10 100644 --- a/modules/nf-core/modules/expansionhunter/meta.yml +++ b/modules/nf-core/modules/expansionhunter/meta.yml @@ -1,5 +1,5 @@ name: expansionhunter -description: write your description here +description: Estimate repeat sizes using NGS data keywords: - STR - repeat_expansions diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf index 118f535b..6224d9b3 100644 --- a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf +++ b/modules/nf-core/modules/gatk4/bedtointervallist/main.nf @@ -2,10 +2,10 @@ process GATK4_BEDTOINTERVALLIST { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" input: tuple val(meta), path(bed) diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf index dbf37048..13fa9e81 100644 --- a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf +++ b/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf @@ -2,10 +2,10 @@ process GATK4_CREATESEQUENCEDICTIONARY { tag "$fasta" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" input: path fasta diff --git a/modules/nf-core/modules/gatk4/intervallisttools/main.nf b/modules/nf-core/modules/gatk4/intervallisttools/main.nf index 1b9b37f4..7ab26c15 100644 --- a/modules/nf-core/modules/gatk4/intervallisttools/main.nf +++ b/modules/nf-core/modules/gatk4/intervallisttools/main.nf @@ -2,10 +2,10 @@ process GATK4_INTERVALLISTTOOLS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" input: tuple val(meta), path(intervals) diff --git a/modules/nf-core/modules/gatk4/revertsam/main.nf b/modules/nf-core/modules/gatk4/revertsam/main.nf index 3084658d..959c3e79 100644 --- a/modules/nf-core/modules/gatk4/revertsam/main.nf +++ b/modules/nf-core/modules/gatk4/revertsam/main.nf @@ -2,10 +2,10 @@ process GATK4_REVERTSAM { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" input: tuple val(meta), path(bam) diff --git a/modules/nf-core/modules/gatk4/samtofastq/main.nf b/modules/nf-core/modules/gatk4/samtofastq/main.nf index d8d94d69..de83293a 100644 --- a/modules/nf-core/modules/gatk4/samtofastq/main.nf +++ b/modules/nf-core/modules/gatk4/samtofastq/main.nf @@ -2,10 +2,10 @@ process GATK4_SAMTOFASTQ { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.5.0" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.5.0--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.5.0--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" input: tuple val(meta), path(bam) diff --git a/modules/nf-core/modules/manta/germline/main.nf b/modules/nf-core/modules/manta/germline/main.nf index c680dc9d..5f2964fb 100644 --- a/modules/nf-core/modules/manta/germline/main.nf +++ b/modules/nf-core/modules/manta/germline/main.nf @@ -1,6 +1,6 @@ process MANTA_GERMLINE { tag "$meta.id" - label 'process_high' + label 'process_medium' conda (params.enable_conda ? "bioconda::manta=1.6.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/nf-core/modules/mosdepth/main.nf b/modules/nf-core/modules/mosdepth/main.nf index ff91e06f..d7e3c929 100644 --- a/modules/nf-core/modules/mosdepth/main.nf +++ b/modules/nf-core/modules/mosdepth/main.nf @@ -10,18 +10,22 @@ process MOSDEPTH { input: tuple val(meta), path(bam), path(bai) path bed - val window_size + path fasta output: - tuple val(meta), path('*.global.dist.txt') , emit: global_txt - tuple val(meta), path('*.region.dist.txt') , emit: regions_txt , optional:true - tuple val(meta), path('*.summary.txt') , emit: summary_txt - tuple val(meta), path('*.per-base.d4') , emit: d4 , optional:true - tuple val(meta), path('*.per-base.bed.gz') , emit: per_base_bed, optional:true - tuple val(meta), path('*.per-base.bed.gz.csi'), emit: per_base_csi, optional:true - tuple val(meta), path('*.regions.bed.gz') , emit: regions_bed , optional:true - tuple val(meta), path('*.regions.bed.gz.csi') , emit: regions_csi , optional:true - path "versions.yml" , emit: versions + tuple val(meta), path('*.global.dist.txt') , emit: global_txt + tuple val(meta), path('*.summary.txt') , emit: summary_txt + tuple val(meta), path('*.region.dist.txt') , optional:true, emit: regions_txt + tuple val(meta), path('*.per-base.d4') , optional:true, emit: per_base_d4 + tuple val(meta), path('*.per-base.bed.gz') , optional:true, emit: per_base_bed + tuple val(meta), path('*.per-base.bed.gz.csi') , optional:true, emit: per_base_csi + tuple val(meta), path('*.regions.bed.gz') , optional:true, emit: regions_bed + tuple val(meta), path('*.regions.bed.gz.csi') , optional:true, emit: regions_csi + tuple val(meta), path('*.quantized.bed.gz') , optional:true, emit: quantized_bed + tuple val(meta), path('*.quantized.bed.gz.csi') , optional:true, emit: quantized_csi + tuple val(meta), path('*.thresholds.bed.gz') , optional:true, emit: thresholds_bed + tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -29,19 +33,24 @@ process MOSDEPTH { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - if (window_size) { - interval = "--by ${window_size}" - } else if ( bed ) { - interval = "--by ${bed}" - } else { - interval = "" + def reference = fasta ? "--fasta ${fasta}" : "" + def interval = bed ? "--by ${bed}" : "" + if (bed && args.contains("--by")) { + exit 1, "'--by' can only be specified once when running mosdepth! Either remove input BED file definition or remove '--by' from 'ext.args' definition" } + if (!bed && args.contains("--thresholds")) { + exit 1, "'--thresholds' can only be specified in conjunction with '--by'" + } + """ mosdepth \\ + --threads $task.cpus \\ $interval \\ + $reference \\ $args \\ $prefix \\ $bam + cat <<-END_VERSIONS > versions.yml "${task.process}": mosdepth: \$(mosdepth --version 2>&1 | sed 's/^.*mosdepth //; s/ .*\$//') @@ -59,6 +68,10 @@ process MOSDEPTH { touch ${prefix}.per-base.bed.gz.csi touch ${prefix}.regions.bed.gz touch ${prefix}.regions.bed.gz.csi + touch ${prefix}.quantized.bed.gz + touch ${prefix}.quantized.bed.gz.csi + touch ${prefix}.thresholds.bed.gz + touch ${prefix}.thresholds.bed.gz.csi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/mosdepth/meta.yml b/modules/nf-core/modules/mosdepth/meta.yml index 636e966b..d1e33447 100644 --- a/modules/nf-core/modules/mosdepth/meta.yml +++ b/modules/nf-core/modules/mosdepth/meta.yml @@ -30,10 +30,10 @@ input: type: file description: BED file with intersected intervals pattern: "*.{bed}" - - window_size: - type: integer - description: Window size - pattern: "[0-9]+" + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta}" output: - meta: type: map @@ -60,6 +60,10 @@ output: type: file description: Index file for BED file with per-base coverage pattern: "*.{per-base.bed.gz.csi}" + - per_base_d4: + type: file + description: D4 file with per-base coverage + pattern: "*.{per-base.d4}" - regions_bed: type: file description: BED file with per-region coverage @@ -68,6 +72,22 @@ output: type: file description: Index file for BED file with per-region coverage pattern: "*.{regions.bed.gz.csi}" + - quantized_bed: + type: file + description: BED file with binned coverage + pattern: "*.{quantized.bed.gz}" + - quantized_csi: + type: file + description: Index file for BED file with binned coverage + pattern: "*.{quantized.bed.gz.csi}" + - thresholds_bed: + type: file + description: BED file with the number of bases in each region that are covered at or above each threshold + pattern: "*.{thresholds.bed.gz}" + - thresholds_csi: + type: file + description: Index file for BED file with threshold coverage + pattern: "*.{thresholds.bed.gz.csi}" - versions: type: file description: File containing software versions @@ -76,3 +96,4 @@ authors: - "@joseespinosa" - "@drpatelh" - "@ramprasadn" + - "@matthdsm" diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index ae019dbf..d10dae69 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,13 +1,15 @@ process MULTIQC { label 'process_medium' - conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" input: - path multiqc_files + path multiqc_files, stageAs: "?/*" + path(multiqc_config) + path(multiqc_logo) output: path "*multiqc_report.html", emit: report @@ -20,8 +22,13 @@ process MULTIQC { script: def args = task.ext.args ?: '' + def config = multiqc_config ? "--config $multiqc_config" : '' """ - multiqc -f $args . + multiqc \\ + --force \\ + $config \\ + $args \\ + . cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 6fa891ef..a1029f33 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -12,11 +12,21 @@ tools: homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ licence: ["GPL-3.0-or-later"] + input: - multiqc_files: type: file description: | List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + output: - report: type: file @@ -38,3 +48,4 @@ authors: - "@abhi18av" - "@bunop" - "@drpatelh" + - "@jfy133" diff --git a/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf b/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf index 116aa4fa..f7f929de 100644 --- a/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf +++ b/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf @@ -51,4 +51,15 @@ process PICARD_ADDORREPLACEREADGROUPS { picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/picard/collecthsmetrics/main.nf b/modules/nf-core/modules/picard/collecthsmetrics/main.nf index ef7a9b9f..6cc04dbf 100644 --- a/modules/nf-core/modules/picard/collecthsmetrics/main.nf +++ b/modules/nf-core/modules/picard/collecthsmetrics/main.nf @@ -2,10 +2,10 @@ process PICARD_COLLECTHSMETRICS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -24,7 +24,7 @@ process PICARD_COLLECTHSMETRICS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def reference = fasta ? "-R $fasta" : "" + def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" def avail_mem = 3 if (!task.memory) { @@ -38,10 +38,10 @@ process PICARD_COLLECTHSMETRICS { CollectHsMetrics \\ $args \\ $reference \\ - -BAIT_INTERVALS $bait_intervals \\ - -TARGET_INTERVALS $target_intervals \\ - -INPUT $bam \\ - -OUTPUT ${prefix}.CollectHsMetrics.coverage_metrics + --BAIT_INTERVALS $bait_intervals \\ + --TARGET_INTERVALS $target_intervals \\ + --INPUT $bam \\ + --OUTPUT ${prefix}.CollectHsMetrics.coverage_metrics cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index 340463a8..63f4e872 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -2,14 +2,15 @@ process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: tuple val(meta), path(bam) path fasta + path fai output: tuple val(meta), path("*_metrics"), emit: metrics @@ -22,6 +23,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" def avail_mem = 3 if (!task.memory) { log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -33,9 +35,9 @@ process PICARD_COLLECTMULTIPLEMETRICS { -Xmx${avail_mem}g \\ CollectMultipleMetrics \\ $args \\ - INPUT=$bam \\ - OUTPUT=${prefix}.CollectMultipleMetrics \\ - REFERENCE_SEQUENCE=$fasta + --INPUT $bam \\ + --OUTPUT ${prefix}.CollectMultipleMetrics \\ + $reference cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml index 68b5c65e..c11b02cf 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml @@ -28,6 +28,10 @@ input: - fasta: type: file description: Genome fasta file + - fai: + type: file + description: Index of FASTA file. Only needed when fasta is supplied. + pattern: "*.fai" output: - meta: type: map diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index 87f913d4..4e559fea 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -2,10 +2,10 @@ process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.27.2" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.2--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.2--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: tuple val(meta), path(bam) diff --git a/modules/nf-core/modules/picard/sortvcf/main.nf b/modules/nf-core/modules/picard/sortvcf/main.nf index 4047545e..b57b39c6 100644 --- a/modules/nf-core/modules/picard/sortvcf/main.nf +++ b/modules/nf-core/modules/picard/sortvcf/main.nf @@ -2,10 +2,10 @@ process PICARD_SORTVCF { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: tuple val(meta), path(vcf) @@ -22,8 +22,8 @@ process PICARD_SORTVCF { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def seq_dict = sequence_dict ? "-SEQUENCE_DICTIONARY $sequence_dict" : "" - def reference = reference ? "-REFERENCE_SEQUENCE $reference" : "" + def seq_dict = sequence_dict ? "--SEQUENCE_DICTIONARY $sequence_dict" : "" + def reference = reference ? "--REFERENCE_SEQUENCE $reference" : "" def avail_mem = 3 if (!task.memory) { log.info '[Picard SortVcf] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/modules/samtools/faidx/main.nf index fdce7d9b..ef940db2 100644 --- a/modules/nf-core/modules/samtools/faidx/main.nf +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -1,6 +1,6 @@ process SAMTOOLS_FAIDX { tag "$fasta" - label 'process_low' + label 'process_single' conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -12,6 +12,7 @@ process SAMTOOLS_FAIDX { output: tuple val(meta), path ("*.fai"), emit: fai + tuple val(meta), path ("*.gzi"), emit: gzi, optional: true path "versions.yml" , emit: versions when: @@ -22,6 +23,7 @@ process SAMTOOLS_FAIDX { """ samtools \\ faidx \\ + $args \\ $fasta cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml index e9767764..fe2fe9a1 100644 --- a/modules/nf-core/modules/samtools/faidx/meta.yml +++ b/modules/nf-core/modules/samtools/faidx/meta.yml @@ -33,6 +33,10 @@ output: type: file description: FASTA index file pattern: "*.{fai}" + - gzi: + type: file + description: Optional gzip index file for compressed inputs + pattern: "*.gzi" - versions: type: file description: File containing software versions diff --git a/modules/nf-core/modules/samtools/merge/main.nf b/modules/nf-core/modules/samtools/merge/main.nf index bbf7e8fb..d01bbed8 100644 --- a/modules/nf-core/modules/samtools/merge/main.nf +++ b/modules/nf-core/modules/samtools/merge/main.nf @@ -8,8 +8,9 @@ process SAMTOOLS_MERGE { 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: - tuple val(meta), path(input_files) + tuple val(meta), path(input_files, stageAs: "?/*") path fasta + path fai output: tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam diff --git a/modules/nf-core/modules/samtools/merge/meta.yml b/modules/nf-core/modules/samtools/merge/meta.yml index fb78e55c..f6833d0c 100644 --- a/modules/nf-core/modules/samtools/merge/meta.yml +++ b/modules/nf-core/modules/samtools/merge/meta.yml @@ -29,6 +29,10 @@ input: type: optional file description: Reference file the CRAM was created with pattern: "*.{fasta,fa}" + - fai: + type: optional file + description: Index of the reference file the CRAM was created with + pattern: "*.fai" output: - meta: type: map diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index bbdc3240..9b0c3867 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -1,6 +1,6 @@ process SAMTOOLS_STATS { tag "$meta.id" - label 'process_low' + label 'process_single' conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -20,14 +20,15 @@ process SAMTOOLS_STATS { script: def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference ${fasta}" : "" """ samtools \\ stats \\ - --threads ${task.cpus-1} \\ + --threads ${task.cpus} \\ ${reference} \\ ${input} \\ - > ${input}.stats + > ${prefix}.stats cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -38,7 +39,7 @@ process SAMTOOLS_STATS { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${input}.stats + touch ${prefix}.stats cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/samtools/view/main.nf b/modules/nf-core/modules/samtools/view/main.nf index 55194e88..59ded5c3 100644 --- a/modules/nf-core/modules/samtools/view/main.nf +++ b/modules/nf-core/modules/samtools/view/main.nf @@ -1,6 +1,6 @@ process SAMTOOLS_VIEW { tag "$meta.id" - label 'process_medium' + label 'process_low' conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 0d56fea2..05fb2b17 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -1,18 +1,17 @@ process SVDB_MERGE { tag "$meta.id" label 'process_medium' - - conda (params.enable_conda ? "bioconda::svdb=2.6.1" : null) + conda (params.enable_conda ? "bioconda::svdb=2.6.1 bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.6.1--py39h5371cbf_0': - 'quay.io/biocontainers/svdb:2.6.1--py39h5371cbf_0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:56d0a468970fbb474d92f0591abcf677757fb370-0': + 'quay.io/biocontainers/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:56d0a468970fbb474d92f0591abcf677757fb370-0' }" input: tuple val(meta), path(vcfs) val (priority) output: - tuple val(meta), path("*_sv_merge.vcf"), emit: vcf + tuple val(meta), path("*_sv_merge.vcf.gz"), emit: vcf path "versions.yml" , emit: versions when: @@ -37,10 +36,12 @@ process SVDB_MERGE { $prio \\ --vcf $input \\ > ${prefix}_sv_merge.vcf + bgzip ${prefix}_sv_merge.vcf cat <<-END_VERSIONS > versions.yml "${task.process}": svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ @@ -52,6 +53,7 @@ process SVDB_MERGE { cat <<-END_VERSIONS > versions.yml "${task.process}": svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/svdb/merge/meta.yml b/modules/nf-core/modules/svdb/merge/meta.yml index e166bad0..c71279e8 100644 --- a/modules/nf-core/modules/svdb/merge/meta.yml +++ b/modules/nf-core/modules/svdb/merge/meta.yml @@ -34,6 +34,6 @@ output: - vcf: type: file description: merged VCF file - pattern: "*_sv_merge.vcf" + pattern: "*_sv_merge.vcf.gz" authors: - "@ramprasadn" diff --git a/modules/nf-core/modules/tabix/bgziptabix/main.nf b/modules/nf-core/modules/tabix/bgziptabix/main.nf index 77fd91a5..0d05984a 100644 --- a/modules/nf-core/modules/tabix/bgziptabix/main.nf +++ b/modules/nf-core/modules/tabix/bgziptabix/main.nf @@ -1,6 +1,6 @@ process TABIX_BGZIPTABIX { tag "$meta.id" - label 'process_medium' + label 'process_single' conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -22,8 +22,8 @@ process TABIX_BGZIPTABIX { def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - bgzip --threads ${task.cpus} -c $args $input > ${prefix}.gz - tabix $args2 ${prefix}.gz + bgzip --threads ${task.cpus} -c $args $input > ${prefix}.${input.getExtension()}.gz + tabix $args2 ${prefix}.${input.getExtension()}.gz cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/tabix/tabix/main.nf b/modules/nf-core/modules/tabix/tabix/main.nf index c9dab068..21b2e79f 100644 --- a/modules/nf-core/modules/tabix/tabix/main.nf +++ b/modules/nf-core/modules/tabix/tabix/main.nf @@ -1,6 +1,6 @@ process TABIX_TABIX { tag "$meta.id" - label 'process_medium' + label 'process_single' conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -11,7 +11,8 @@ process TABIX_TABIX { tuple val(meta), path(tab) output: - tuple val(meta), path("*.tbi"), emit: tbi + tuple val(meta), path("*.tbi"), optional:true, emit: tbi + tuple val(meta), path("*.csi"), optional:true, emit: csi path "versions.yml" , emit: versions when: diff --git a/modules/nf-core/modules/tabix/tabix/meta.yml b/modules/nf-core/modules/tabix/tabix/meta.yml index 89478abe..fcc6e524 100644 --- a/modules/nf-core/modules/tabix/tabix/meta.yml +++ b/modules/nf-core/modules/tabix/tabix/meta.yml @@ -31,6 +31,10 @@ output: type: file description: tabix index file pattern: "*.{tbi}" + - csi: + type: file + description: coordinate sorted index file + pattern: "*.{csi}" - versions: type: file description: File containing software versions diff --git a/modules/nf-core/modules/tiddit/cov/main.nf b/modules/nf-core/modules/tiddit/cov/main.nf index 578c4043..4d7e2827 100644 --- a/modules/nf-core/modules/tiddit/cov/main.nf +++ b/modules/nf-core/modules/tiddit/cov/main.nf @@ -2,17 +2,17 @@ process TIDDIT_COV { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::tiddit=2.12.1" : null) + conda (params.enable_conda ? "bioconda::tiddit=3.0.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tiddit:2.12.1--py38h1773678_0' : - 'quay.io/biocontainers/tiddit:2.12.1--py38h1773678_0' }" + 'https://depot.galaxyproject.org/singularity/tiddit:3.0.0--py39h59fae87_1' : + 'quay.io/biocontainers/tiddit:3.0.0--py39h59fae87_1' }" input: - tuple val(meta), path(bam) + tuple val(meta), path(input) path fasta output: - tuple val(meta), path("*.tab"), optional: true, emit: cov + tuple val(meta), path("*.bed"), optional: true, emit: cov tuple val(meta), path("*.wig"), optional: true, emit: wig path "versions.yml" , emit: versions @@ -28,12 +28,12 @@ process TIDDIT_COV { --cov \\ -o $prefix \\ $args \\ - --bam $bam \\ + --bam $input \\ $reference cat <<-END_VERSIONS > versions.yml "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') END_VERSIONS """ @@ -45,7 +45,7 @@ process TIDDIT_COV { cat <<-END_VERSIONS > versions.yml "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/tiddit/cov/meta.yml b/modules/nf-core/modules/tiddit/cov/meta.yml index d925b783..98ea27c2 100644 --- a/modules/nf-core/modules/tiddit/cov/meta.yml +++ b/modules/nf-core/modules/tiddit/cov/meta.yml @@ -19,7 +19,7 @@ input: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - bam: + - input: type: file description: BAM/CRAM file pattern: "*.{bam,cram}" diff --git a/modules/nf-core/modules/tiddit/sv/main.nf b/modules/nf-core/modules/tiddit/sv/main.nf index 1bf7146a..2e876ef1 100644 --- a/modules/nf-core/modules/tiddit/sv/main.nf +++ b/modules/nf-core/modules/tiddit/sv/main.nf @@ -2,21 +2,20 @@ process TIDDIT_SV { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::tiddit=2.12.1" : null) + conda (params.enable_conda ? "bioconda::tiddit=3.1.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tiddit:2.12.1--py38h1773678_0' : - 'quay.io/biocontainers/tiddit:2.12.1--py38h1773678_0' }" + 'https://depot.galaxyproject.org/singularity/tiddit:3.1.0--py39h59fae87_1' : + 'quay.io/biocontainers/tiddit:3.1.0--py39h59fae87_1' }" input: - tuple val(meta), path(bam) + tuple val(meta), path(input), path(input_index) path fasta - path fai + path bwa_index output: - tuple val(meta), path("*.vcf") , emit: vcf - tuple val(meta), path("*.ploidy.tab") , emit: ploidy - tuple val(meta), path("*.signals.tab"), emit: signals - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf") , emit: vcf + tuple val(meta), path("*.ploidies.tab"), emit: ploidy + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -24,18 +23,21 @@ process TIDDIT_SV { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def reference = fasta == "dummy_file.txt" ? "--ref $fasta" : "" + def bwa_command = bwa_index ? "[[ -d $bwa_index ]] && for i in $bwa_index/*; do [[ -f $fasta && ! \"\$i\" =~ .*\"$fasta\".* ]] && ln -s \$i ${fasta}.\${i##*.} || ln -s \$i .; done" : "" + """ + $bwa_command + tiddit \\ --sv \\ $args \\ - --bam $bam \\ - $reference \\ + --bam $input \\ + --ref $fasta \\ -o $prefix cat <<-END_VERSIONS > versions.yml "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') END_VERSIONS """ @@ -43,12 +45,11 @@ process TIDDIT_SV { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.vcf - touch ${prefix}.ploidy.tab - touch ${prefix}.signals.tab + touch ${prefix}.ploidies.tab cat <<-END_VERSIONS > versions.yml "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*TIDDIT-//; s/ .*\$//') + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/tiddit/sv/meta.yml b/modules/nf-core/modules/tiddit/sv/meta.yml index fc307081..8b41c69c 100644 --- a/modules/nf-core/modules/tiddit/sv/meta.yml +++ b/modules/nf-core/modules/tiddit/sv/meta.yml @@ -17,14 +17,22 @@ input: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file + pattern: "*.{bam,cram}" + - index: + type: file + description: BAM/CRAM index file + pattern: "*.{bai,crai}" - fasta: type: file description: Input FASTA file pattern: "*.{fasta,fa}" - - fai: + - bwa_index: type: file - description: FASTA index file - pattern: "*.{fai}" + description: BWA genome index files + pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" output: - meta: type: map @@ -38,11 +46,7 @@ output: - ploidy: type: file description: tab - pattern: "*.{ploidy.tab}" - - signals: - type: file - description: tab - pattern: "*.{signals.tab}" + pattern: "*.{ploidies.tab}" - versions: type: file description: File containing software versions diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf index 2af7190b..2cdc557d 100644 --- a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf +++ b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf @@ -1,9 +1,8 @@ -def VERSION = '377' // Version information not provided by tool on CLI - process UCSC_WIGTOBIGWIG { tag "$meta.id" label 'process_medium' + // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. conda (params.enable_conda ? "bioconda::ucsc-wigtobigwig=377" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ucsc-wigtobigwig:377--h0b8a92a_2' : @@ -23,6 +22,7 @@ process UCSC_WIGTOBIGWIG { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '377' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ wigToBigWig \\ $args \\ diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index 058d1764..007871b3 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -1,6 +1,6 @@ process UNTAR { tag "$archive" - label 'process_low' + label 'process_single' conda (params.enable_conda ? "conda-forge::sed=4.7" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -21,12 +21,29 @@ process UNTAR { def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' untar = archive.toString() - '.tar.gz' + """ - tar \\ - -xzvf \\ - $args \\ - $archive \\ - $args2 \\ + mkdir output + + ## Ensures --strip-components only applied when top level of tar contents is a directory + ## If just files or multiple directories, place all in output + if [[ \$(tar -tzf ${archive} | grep "/\$" | wc -l) -eq 1 ]]; then + tar \\ + -C output --strip-components 1 \\ + -xzvf \\ + $args \\ + $archive \\ + $args2 + else + tar \\ + -C output \\ + -xzvf \\ + $args \\ + $archive \\ + $args2 + fi + + mv output ${untar} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/modules/untar/meta.yml index d426919b..ea7a3f38 100644 --- a/modules/nf-core/modules/untar/meta.yml +++ b/modules/nf-core/modules/untar/meta.yml @@ -26,9 +26,9 @@ output: Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - untar: - type: file - description: - pattern: "*.*" + type: directory + description: Directory containing contents of archive + pattern: "*/" - versions: type: file description: File containing software versions @@ -36,3 +36,5 @@ output: authors: - "@joseespinosa" - "@drpatelh" + - "@matthdsm" + - "@jfy133" diff --git a/modules/nf-core/modules/vcfanno/main.nf b/modules/nf-core/modules/vcfanno/main.nf index bc0514c9..6f264af2 100644 --- a/modules/nf-core/modules/vcfanno/main.nf +++ b/modules/nf-core/modules/vcfanno/main.nf @@ -9,7 +9,6 @@ process VCFANNO { input: tuple val(meta), path(vcf), path(tbi) - tuple val(meta), path(vcf_uncompressed) path toml path resource_dir @@ -23,7 +22,6 @@ process VCFANNO { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input_vcf = vcf_uncompressed ?: vcf """ ln -sf $resource_dir/* \$(pwd) @@ -31,7 +29,7 @@ process VCFANNO { -p $task.cpus \\ $args \\ $toml \\ - $input_vcf \\ + $vcf \\ > ${prefix}_annotated.vcf cat <<-END_VERSIONS > versions.yml From c7d0be3656d77325b550b970b1e876681894eca6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 15 Sep 2022 17:47:48 +0200 Subject: [PATCH 0671/1169] update modules & fix compatibility --- modules.json | 8 ++++---- modules/local/sentieon/bwamem.nf | 2 +- modules/local/sentieon/bwamemindex.nf | 6 +++--- modules/nf-core/modules/multiqc/main.nf | 5 ++++- modules/nf-core/modules/multiqc/meta.yml | 4 ++++ modules/nf-core/modules/svdb/merge/main.nf | 2 +- modules/nf-core/modules/ucsc/wigtobigwig/main.nf | 1 + modules/nf-core/modules/untar/main.nf | 2 +- subworkflows/local/align.nf | 2 +- subworkflows/local/annotate_snvs.nf | 6 +----- subworkflows/local/prepare_genome.nf | 6 +++--- subworkflows/nf-core/align_bwamem2.nf | 4 +++- subworkflows/nf-core/call_snv_deepvariant.nf | 12 ++++++++++-- subworkflows/nf-core/call_structural_variants.nf | 3 ++- subworkflows/nf-core/qc_bam.nf | 4 ++-- workflows/raredisease.nf | 5 ++++- 16 files changed, 45 insertions(+), 27 deletions(-) diff --git a/modules.json b/modules.json index 87f4ae01..bb60823e 100644 --- a/modules.json +++ b/modules.json @@ -127,7 +127,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "5587389874dac9c9953a2ab6f01d49af81969492" + "git_sha": "4b1d4bf401d4cf65ebc4f604bc8c8e7551109db3" }, "picard/addorreplacereadgroups": { "branch": "master", @@ -187,7 +187,7 @@ }, "svdb/merge": { "branch": "master", - "git_sha": "6b011dd14821385c282e030c6d993d2116aed23f" + "git_sha": "513b5fcab92243bb6e227cd36ac779796d304f4a" }, "svdb/query": { "branch": "master", @@ -211,11 +211,11 @@ }, "ucsc/wigtobigwig": { "branch": "master", - "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" + "git_sha": "8572bc8865d166edf2d8efeb97e77bfc53d0866b" }, "untar": { "branch": "master", - "git_sha": "393dbd6ddafe3f18eac02893dd4a21e4d45de679" + "git_sha": "b63b9f752dc8e43fc70b0491aad5e0a270ab0e10" }, "vcfanno": { "branch": "master", diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf index 9ce6d113..9212fa61 100644 --- a/modules/local/sentieon/bwamem.nf +++ b/modules/local/sentieon/bwamem.nf @@ -9,7 +9,7 @@ process SENTIEON_BWAMEM { tuple val(meta), path(reads) path fasta path fai - path index + tuple val(meta2), path(index) output: tuple val(meta), path('*.bam'), emit: bam diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index 59e71fb7..2dae1b09 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -6,11 +6,11 @@ process SENTIEON_BWAINDEX { secret 'SENTIEON_LICENSE_BASE64' input: - path fasta + tuple val(meta), path(fasta) output: - path "bwa" , emit: index - path "versions.yml" , emit: versions + tuple val(meta), path("bwa"), emit: index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index d10dae69..698461d7 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -9,6 +9,7 @@ process MULTIQC { input: path multiqc_files, stageAs: "?/*" path(multiqc_config) + path(extra_multiqc_config) path(multiqc_logo) output: @@ -23,11 +24,13 @@ process MULTIQC { script: def args = task.ext.args ?: '' def config = multiqc_config ? "--config $multiqc_config" : '' + def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' """ multiqc \\ --force \\ - $config \\ $args \\ + $config \\ + $extra_config \\ . cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index a1029f33..ebc29b27 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -22,6 +22,10 @@ input: type: file description: Optional config yml for MultiQC pattern: "*.{yml,yaml}" + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections in multiqc_config. + pattern: "*.{yml,yaml}" - multiqc_logo: type: file description: Optional logo file for MultiQC diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/modules/svdb/merge/main.nf index 05fb2b17..477dbb0d 100644 --- a/modules/nf-core/modules/svdb/merge/main.nf +++ b/modules/nf-core/modules/svdb/merge/main.nf @@ -48,7 +48,7 @@ process SVDB_MERGE { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_sv_merge.vcf + touch ${prefix}_sv_merge.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf index 2cdc557d..4daff1f5 100644 --- a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf +++ b/modules/nf-core/modules/ucsc/wigtobigwig/main.nf @@ -38,6 +38,7 @@ process UCSC_WIGTOBIGWIG { stub: def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '377' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ touch ${prefix}.bw diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index 007871b3..71eea7b2 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -27,7 +27,7 @@ process UNTAR { ## Ensures --strip-components only applied when top level of tar contents is a directory ## If just files or multiple directories, place all in output - if [[ \$(tar -tzf ${archive} | grep "/\$" | wc -l) -eq 1 ]]; then + if [[ \$(tar -tzf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then tar \\ -C output --strip-components 1 \\ -xzvf \\ diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 65c5277a..0b1f40be 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -19,7 +19,7 @@ workflow ALIGN { ch_versions = Channel.empty() if( aligner == "bwamem2" ) { - ALIGN_BWAMEM2 ( reads_input, index ) + ALIGN_BWAMEM2 ( reads_input, index, fasta, fai ) ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 1e2e1851..94f51acb 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -29,12 +29,8 @@ workflow ANNOTATE_SNVS { // // annotate vcfanno // - vcf.map { meta, vcf, idx -> - return [meta, []] - } - .set { ch_placeholder } - VCFANNO (vcf, ch_placeholder, ch_toml, vcfanno_resource_dir) + VCFANNO (vcf, ch_toml, vcfanno_resource_dir) ch_versions = ch_versions.mix(VCFANNO.out.versions) // diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 0d29a58a..ebf4a7ca 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -25,12 +25,12 @@ workflow PREPARE_GENOME { // Fetch aligner index or create from scratch if required if (aligner == "bwamem2") { - BWAMEM2_INDEX ( ch_fasta ) - ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : Channel.fromPath(bwamem2_index).collect() + BWAMEM2_INDEX ( [[], ch_fasta] ) + ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : [[],file(bwamem2_index)] ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) } else if (aligner == "sentieon") { SENTIEON_BWAINDEX ( ch_fasta ) - ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : Channel.fromPath(sentieon_index).collect() + ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : [[],file(sentieon_index)] ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) } else { exit 1, 'Please provide a valid aligner!' diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index e99c3575..3d637122 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -14,6 +14,8 @@ workflow ALIGN_BWAMEM2 { take: reads_input // channel: [ val(meta), reads_input ] index // channel: [ /path/to/bwamem2/index/ ] + fasta // channel: [genome.fasta] + fai // channel: [genome.fai] main: ch_versions = Channel.empty() @@ -44,7 +46,7 @@ workflow ALIGN_BWAMEM2 { .set{ bams } // create a new multi-channel named bams // TODO: If there are no samples to merge, skip the process - SAMTOOLS_MERGE ( bams.multiple, [] ) + SAMTOOLS_MERGE ( bams.multiple, fasta, fai ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) diff --git a/subworkflows/nf-core/call_snv_deepvariant.nf b/subworkflows/nf-core/call_snv_deepvariant.nf index e6ec6c4b..180cb94d 100644 --- a/subworkflows/nf-core/call_snv_deepvariant.nf +++ b/subworkflows/nf-core/call_snv_deepvariant.nf @@ -37,8 +37,16 @@ workflow CALL_SNV_DEEPVARIANT { GLNEXUS ( ch_gvcfs ) ch_versions = ch_versions.mix(GLNEXUS.out.versions) - SPLIT_MULTIALLELICS_GL (GLNEXUS.out.bcf, fasta) - REMOVE_DUPLICATES_GL (SPLIT_MULTIALLELICS_GL.out.vcf, fasta) + ch_split_multi_in = GLNEXUS.out.bcf + .map{meta, bcf -> + return [meta, bcf, []]} + SPLIT_MULTIALLELICS_GL (ch_split_multi_in, fasta) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_GL.out.versions) + + ch_remove_dup_in = SPLIT_MULTIALLELICS_GL.out.vcf + .map{meta, vcf -> + return [meta, vcf, []]} + REMOVE_DUPLICATES_GL (ch_remove_dup_in, fasta) ch_versions = ch_versions.mix(REMOVE_DUPLICATES_GL.out.versions) TABIX_GL (REMOVE_DUPLICATES_GL.out.vcf) diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index 4e85163d..a19a0e80 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -29,7 +29,8 @@ workflow CALL_STRUCTURAL_VARIANTS { ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) //tiddit - CALL_SV_TIDDIT ( bam, fasta, fai, case_info ) + ch_tiddit_bam = bam.join(bai) + CALL_SV_TIDDIT ( ch_tiddit_bam, fasta, fai, case_info ) .vcf .collect{it[1]} .set { tiddit_vcf } diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 26bfcf72..24dffafb 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -24,7 +24,7 @@ workflow QC_BAM { ch_versions = Channel.empty() // COLLECT MULTIPLE METRICS - PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta ) + PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta, fai ) ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions) // COLLECT HS METRICS @@ -52,7 +52,7 @@ workflow QC_BAM { qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] - d4 = MOSDEPTH.out.d4 // channel: [ val(meta), path(*.d4) ] + d4 = MOSDEPTH.out.per_base_d4 // channel: [ val(meta), path(*.d4) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 312c3d4a..765432f1 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -299,7 +299,10 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( - ch_multiqc_files.collect() + ch_multiqc_files.collect(), + [], + [], + [] ) multiqc_report = MULTIQC.out.report.toList() ch_versions = ch_versions.mix(MULTIQC.out.versions) From 28a3673ab3d06ad35a4d87c646d7dd5c6c684c7c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 16 Sep 2022 12:25:23 +0200 Subject: [PATCH 0672/1169] add comment --- modules/local/sentieon/bwamem.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sentieon/bwamem.nf b/modules/local/sentieon/bwamem.nf index 9212fa61..c6d95089 100644 --- a/modules/local/sentieon/bwamem.nf +++ b/modules/local/sentieon/bwamem.nf @@ -9,7 +9,7 @@ process SENTIEON_BWAMEM { tuple val(meta), path(reads) path fasta path fai - tuple val(meta2), path(index) + tuple val(meta2), path(index) // meta2 has same purpose as meta, and holds information about the genome/index output: tuple val(meta), path('*.bam'), emit: bam From 26eb98803151d818c600a552ea32a19c71201d07 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 20 Sep 2022 14:23:02 +0200 Subject: [PATCH 0673/1169] review suggestions --- bin/{vcfparser.py => add_most_severe_consequence.py} | 5 ++++- .../local/{vcfparser.nf => add_most_severe_consequence.nf} | 4 ++-- subworkflows/local/{vcfparser.nf => annotate_consequence.nf} | 4 ++-- workflows/raredisease.nf | 4 ++-- 4 files changed, 10 insertions(+), 7 deletions(-) rename bin/{vcfparser.py => add_most_severe_consequence.py} (97%) rename modules/local/{vcfparser.nf => add_most_severe_consequence.nf} (89%) rename subworkflows/local/{vcfparser.nf => annotate_consequence.nf} (83%) diff --git a/bin/vcfparser.py b/bin/add_most_severe_consequence.py similarity index 97% rename from bin/vcfparser.py rename to bin/add_most_severe_consequence.py index b6d14732..0a28c4d6 100644 --- a/bin/vcfparser.py +++ b/bin/add_most_severe_consequence.py @@ -62,7 +62,10 @@ def construct_most_severe_consequence_info( """ columns = line.strip().split() - transcripts = columns[7].split("CSQ=")[1].split(",") + info_fields = columns[7].split(";") + for field in info_fields: + if field.startswith("CSQ="): + transcripts = field.split("CSQ=")[1].split(",") hgnc_ids, alleles, consequences, severity = parse_vep_csq_transcripts( transcripts, allele_ind, csq_ind, hgnc_ind, var_csq ) diff --git a/modules/local/vcfparser.nf b/modules/local/add_most_severe_consequence.nf similarity index 89% rename from modules/local/vcfparser.nf rename to modules/local/add_most_severe_consequence.nf index 14063b79..3ef2117f 100644 --- a/modules/local/vcfparser.nf +++ b/modules/local/add_most_severe_consequence.nf @@ -1,4 +1,4 @@ -process VCFPARSER { +process ADD_MOST_SEVERE_CSQ { tag "$meta.id" label 'process_low' @@ -22,7 +22,7 @@ process VCFPARSER { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - python3 vcfparser.py ${vcf} ${prefix}.vcfparser.vcf ${variant_consequences} + python3 add_most_severe_consequence.py ${vcf} ${prefix}.vcfparser.vcf ${variant_consequences} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/vcfparser.nf b/subworkflows/local/annotate_consequence.nf similarity index 83% rename from subworkflows/local/vcfparser.nf rename to subworkflows/local/annotate_consequence.nf index fcda7129..808743db 100644 --- a/subworkflows/local/vcfparser.nf +++ b/subworkflows/local/annotate_consequence.nf @@ -2,9 +2,9 @@ // A subworkflow to call SNVs by sentieon dnascope with a machine learning model. // -include { VCFPARSER } from '../../modules/local/vcfparser' +include { ADD_MOST_SEVERE_CSQ } from '../../modules/local/add_most_severe_consequence' -workflow VCFPARSER_CSQ { +workflow ANNOTATE_CSQ { take: clinical // channel: [ val(meta), vcf ] research // channel: [ val(meta), vcf ] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index df2ae4c4..87238dac 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -74,8 +74,8 @@ include { GENS } from '../subworkflows/local/gens' include { ALIGN } from '../subworkflows/local/align' include { CALL_SNV } from '../subworkflows/local/call_snv' include { ANALYSE_MT } from '../subworkflows/local/analyse_MT' -include { VCFPARSER_CSQ as ANN_CSQ_SNV } from '../subworkflows/local/vcfparser' -include { VCFPARSER_CSQ as ANN_CSQ_SV } from '../subworkflows/local/vcfparser' +include { ANNOTATE_CSQ as ANN_CSQ_SNV } from '../subworkflows/local/annotate_consequence' +include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_consequence' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From d44b936c37abac79d57b1d03157fc4e139baa8e6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 20 Sep 2022 14:24:47 +0200 Subject: [PATCH 0674/1169] update version string --- modules/local/add_most_severe_consequence.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/add_most_severe_consequence.nf b/modules/local/add_most_severe_consequence.nf index 3ef2117f..c17dcc2f 100644 --- a/modules/local/add_most_severe_consequence.nf +++ b/modules/local/add_most_severe_consequence.nf @@ -26,7 +26,7 @@ process ADD_MOST_SEVERE_CSQ { cat <<-END_VERSIONS > versions.yml "${task.process}": - vcfparser: v1.0 + add_most_severe_consequence: v1.0 END_VERSIONS """ @@ -37,7 +37,7 @@ process ADD_MOST_SEVERE_CSQ { cat <<-END_VERSIONS > versions.yml "${task.process}": - vcfparser: v1.0 + add_most_severe_consequence: v1.0 END_VERSIONS """ } From 6bf2cb156a5f3086a533dede33ed64afd6cad52f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 20 Sep 2022 14:28:25 +0200 Subject: [PATCH 0675/1169] fix missing module error --- subworkflows/local/annotate_consequence.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/annotate_consequence.nf b/subworkflows/local/annotate_consequence.nf index 808743db..2da8db6a 100644 --- a/subworkflows/local/annotate_consequence.nf +++ b/subworkflows/local/annotate_consequence.nf @@ -15,12 +15,12 @@ workflow ANNOTATE_CSQ { ch_input = clinical.join(research) - VCFPARSER ( + ADD_MOST_SEVERE_CSQ ( ch_input, variant_consequences ) emit: - vcf = VCFPARSER.out.vcf + vcf = ADD_MOST_SEVERE_CSQ.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 1255dc769d662bcf9c653fa4bb6ac4939de4b1e7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:43:41 +0200 Subject: [PATCH 0676/1169] install vep --- modules.json | 4 + modules/nf-core/modules/ensemblvep/Dockerfile | 31 ++++++++ modules/nf-core/modules/ensemblvep/build.sh | 28 +++++++ .../modules/ensemblvep/environment.yml | 10 +++ modules/nf-core/modules/ensemblvep/main.nf | 56 ++++++++++++++ modules/nf-core/modules/ensemblvep/meta.yml | 73 +++++++++++++++++++ 6 files changed, 202 insertions(+) create mode 100644 modules/nf-core/modules/ensemblvep/Dockerfile create mode 100755 modules/nf-core/modules/ensemblvep/build.sh create mode 100644 modules/nf-core/modules/ensemblvep/environment.yml create mode 100644 modules/nf-core/modules/ensemblvep/main.nf create mode 100644 modules/nf-core/modules/ensemblvep/meta.yml diff --git a/modules.json b/modules.json index bb60823e..c71f6d72 100644 --- a/modules.json +++ b/modules.json @@ -57,6 +57,10 @@ "branch": "master", "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" }, + "ensemblvep": { + "branch": "master", + "git_sha": "973151e9eab9bac400aa99f099075a10cdd8e84c" + }, "expansionhunter": { "branch": "master", "git_sha": "848ee9a215d02d80be033bfa60881700f2bd914c" diff --git a/modules/nf-core/modules/ensemblvep/Dockerfile b/modules/nf-core/modules/ensemblvep/Dockerfile new file mode 100644 index 00000000..7d2c99c4 --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/Dockerfile @@ -0,0 +1,31 @@ +FROM nfcore/base:1.14 +LABEL \ + author="Maxime Garcia" \ + description="VEP image for nf-core pipelines" \ + maintainer="maxime.garcia@scilifelab.se" + +# Install the conda environment +COPY environment.yml / +RUN conda env create -f /environment.yml && conda clean -a + +# Setup default ARG variables +ARG GENOME=GRCh38 +ARG SPECIES=homo_sapiens +ARG VEP_CACHE_VERSION=106 +ARG VEP_VERSION=106.1 + +# Add conda installation dir to PATH (instead of doing 'conda activate') +ENV PATH /opt/conda/envs/nf-core-vep-${VEP_VERSION}/bin:$PATH + +# Download Genome +RUN vep_install \ + -a c \ + -c .vep \ + -s ${SPECIES} \ + -y ${GENOME} \ + --CACHE_VERSION ${VEP_CACHE_VERSION} \ + --CONVERT \ + --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE + +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name nf-core-vep-${VEP_VERSION} > nf-core-vep-${VEP_VERSION}.yml diff --git a/modules/nf-core/modules/ensemblvep/build.sh b/modules/nf-core/modules/ensemblvep/build.sh new file mode 100755 index 00000000..eaa3ed5b --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/build.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Build and push all containers + +build_push() { + GENOME=$1 + SPECIES=$2 + VEP_CACHE_VERSION=$3 + VEP_VERSION=$4 + + docker build \ + . \ + -t nfcore/vep:${VEP_VERSION}.${GENOME} \ + --build-arg GENOME=${GENOME} \ + --build-arg SPECIES=${SPECIES} \ + --build-arg VEP_CACHE_VERSION=${VEP_CACHE_VERSION} \ + --build-arg VEP_VERSION=${VEP_VERSION} + + docker push nfcore/vep:${VEP_VERSION}.${GENOME} +} + +build_push "GRCh37" "homo_sapiens" "106" "106.1" +build_push "GRCh38" "homo_sapiens" "106" "106.1" +build_push "GRCm38" "mus_musculus" "102" "106.1" +build_push "GRCm39" "mus_musculus" "106" "106.1" +build_push "CanFam3.1" "canis_lupus_familiaris" "104" "106.1" +build_push "WBcel235" "caenorhabditis_elegans" "106" "106.1" diff --git a/modules/nf-core/modules/ensemblvep/environment.yml b/modules/nf-core/modules/ensemblvep/environment.yml new file mode 100644 index 00000000..d378f810 --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/environment.yml @@ -0,0 +1,10 @@ +# You can use this file to create a conda environment for this module: +# conda env create -f environment.yml +name: nf-core-vep-106.1 +channels: + - conda-forge + - bioconda + - defaults + +dependencies: + - bioconda::ensembl-vep=106.1 diff --git a/modules/nf-core/modules/ensemblvep/main.nf b/modules/nf-core/modules/ensemblvep/main.nf new file mode 100644 index 00000000..8a2c6363 --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/main.nf @@ -0,0 +1,56 @@ +process ENSEMBLVEP { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::ensembl-vep=106.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ensembl-vep:106.1--pl5321h4a94de4_0' : + 'quay.io/biocontainers/ensembl-vep:106.1--pl5321h4a94de4_0' }" + + input: + tuple val(meta), path(vcf) + val genome + val species + val cache_version + path cache + path fasta + path extra_files + + output: + tuple val(meta), path("*.ann.vcf") , optional:true, emit: vcf + tuple val(meta), path("*.ann.tab") , optional:true, emit: tab + tuple val(meta), path("*.ann.json") , optional:true, emit: json + path "*.summary.html" , emit: report + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json")? 'json' : args.contains("--tab")? 'tab' : 'vcf' + def prefix = task.ext.prefix ?: "${meta.id}" + def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" + def reference = fasta ? "--fasta $fasta" : "" + + """ + vep \\ + -i $vcf \\ + -o ${prefix}.ann.${file_extension} \\ + $args \\ + $reference \\ + --assembly $genome \\ + --species $species \\ + --cache \\ + --cache_version $cache_version \\ + --dir_cache $dir_cache \\ + --fork $task.cpus \\ + --stats_file ${prefix}.summary.html \\ + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/ensemblvep/meta.yml b/modules/nf-core/modules/ensemblvep/meta.yml new file mode 100644 index 00000000..a4dde8a6 --- /dev/null +++ b/modules/nf-core/modules/ensemblvep/meta.yml @@ -0,0 +1,73 @@ +name: ENSEMBLVEP +description: Ensembl Variant Effect Predictor (VEP). The output-file-format is controlled through `task.ext.args`. +keywords: + - annotation +tools: + - ensemblvep: + description: | + VEP determines the effect of your variants (SNPs, insertions, deletions, CNVs + or structural variants) on genes, transcripts, and protein sequence, as well as regulatory regions. + homepage: https://www.ensembl.org/info/docs/tools/vep/index.html + documentation: https://www.ensembl.org/info/docs/tools/vep/script/index.html + licence: ["Apache-2.0"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + vcf to annotate + - genome: + type: value + description: | + which genome to annotate with + - species: + type: value + description: | + which species to annotate with + - cache_version: + type: value + description: | + which version of the cache to annotate with + - cache: + type: file + description: | + path to VEP cache (optional) + - fasta: + type: file + description: | + reference FASTA file (optional) + pattern: "*.{fasta,fa}" + - extra_files: + type: tuple + description: | + path to file(s) needed for plugins (optional) +output: + - vcf: + type: file + description: | + annotated vcf (optional) + pattern: "*.ann.vcf" + - tab: + type: file + description: | + tab file with annotated variants (optional) + pattern: "*.ann.tab" + - json: + type: file + description: | + json file with annotated variants (optional) + pattern: "*.ann.json" + - report: + type: file + description: VEP report file + pattern: "*.html" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@maxulysse" From 932edc8d943a648588f9761f8eef3afad0aed57a Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 28 Sep 2022 10:16:17 +0200 Subject: [PATCH 0677/1169] fixed the input channel --- subworkflows/local/prepare_genome.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index ebf4a7ca..e44bcaea 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -29,7 +29,7 @@ workflow PREPARE_GENOME { ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : [[],file(bwamem2_index)] ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) } else if (aligner == "sentieon") { - SENTIEON_BWAINDEX ( ch_fasta ) + SENTIEON_BWAINDEX ( [[], ch_fasta] ) ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : [[],file(sentieon_index)] ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) } else { From f94a14a065bd38e6554ee13a8377858395263e07 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 28 Sep 2022 14:18:49 +0200 Subject: [PATCH 0678/1169] switch vep from local to nf-core --- subworkflows/local/annotate_consequence.nf | 18 +++++++++++------- subworkflows/local/annotate_snvs.nf | 13 +++++-------- .../local/annotate_structural_variants.nf | 13 +++++-------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/subworkflows/local/annotate_consequence.nf b/subworkflows/local/annotate_consequence.nf index 2da8db6a..da220c13 100644 --- a/subworkflows/local/annotate_consequence.nf +++ b/subworkflows/local/annotate_consequence.nf @@ -2,7 +2,8 @@ // A subworkflow to call SNVs by sentieon dnascope with a machine learning model. // -include { ADD_MOST_SEVERE_CSQ } from '../../modules/local/add_most_severe_consequence' +include { ADD_MOST_SEVERE_CSQ as ADD_MOST_SEVERE_CSQ_CLIN } from '../../modules/local/add_most_severe_consequence' +include { ADD_MOST_SEVERE_CSQ as ADD_MOST_SEVERE_CSQ_RES } from '../../modules/local/add_most_severe_consequence' workflow ANNOTATE_CSQ { take: @@ -13,14 +14,17 @@ workflow ANNOTATE_CSQ { main: ch_versions = Channel.empty() - ch_input = clinical.join(research) - - ADD_MOST_SEVERE_CSQ ( - ch_input, + ADD_MOST_SEVERE_CSQ_CLIN ( + clinical, + variant_consequences + ) + ADD_MOST_SEVERE_CSQ_RES ( + research, variant_consequences ) emit: - vcf = ADD_MOST_SEVERE_CSQ.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + clinical_vcf = ADD_MOST_SEVERE_CSQ_CLIN.out.vcf + research_vcf = ADD_MOST_SEVERE_CSQ_RES.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index aab1c097..c718f61f 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -5,7 +5,7 @@ include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/bcftools/roh/main' include { RHOCALL_ANNOTATE } from '../../modules/nf-core/modules/rhocall/annotate/main' -include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' +include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/nf-core/modules/ensemblvep/main' include { TABIX_TABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' @@ -67,16 +67,13 @@ workflow ANNOTATE_SNVS { TABIX_SNV_ANNO (RHOCALL_ANNOTATE.out.vcf) ch_versions = ch_versions.mix(TABIX_SNV_ANNO.out.versions) - RHOCALL_ANNOTATE.out - .vcf - .join(TABIX_SNV_ANNO.out.tbi) - .set { ch_vep_in } - - ENSEMBLVEP_SNV(ch_vep_in, + ENSEMBLVEP_SNV(RHOCALL_ANNOTATE.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, - vep_cache + vep_cache, + fasta, + [] ) ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 8a23a96e..08f33d81 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -6,7 +6,7 @@ include { SVDB_QUERY } from '../../modules/nf-core/modules/sv include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' -include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' +include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/nf-core/modules/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { @@ -61,16 +61,13 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { TABIX_SV_ANNO (BCFTOOLS_VIEW.out.vcf) ch_versions = ch_versions.mix(TABIX_SV_ANNO.out.versions) - BCFTOOLS_VIEW.out - .vcf - .join(TABIX_SV_ANNO.out.tbi) - .set { ch_vep_in } - - ENSEMBLVEP_SV(ch_vep_in, + ENSEMBLVEP_SV(BCFTOOLS_VIEW.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, - vep_cache + vep_cache, + fasta, + [] ) ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) From e527c4b6f820ef72a1cfde84a7ddca13a086433d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 28 Sep 2022 14:38:59 +0200 Subject: [PATCH 0679/1169] update vep --- modules.json | 2 +- modules/nf-core/modules/ensemblvep/main.nf | 33 ++++++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/modules.json b/modules.json index c71f6d72..c4fdfc1d 100644 --- a/modules.json +++ b/modules.json @@ -59,7 +59,7 @@ }, "ensemblvep": { "branch": "master", - "git_sha": "973151e9eab9bac400aa99f099075a10cdd8e84c" + "git_sha": "3d7ce9363079da9a79def248218dcc56efcd5410" }, "expansionhunter": { "branch": "master", diff --git a/modules/nf-core/modules/ensemblvep/main.nf b/modules/nf-core/modules/ensemblvep/main.nf index 8a2c6363..fd2c893a 100644 --- a/modules/nf-core/modules/ensemblvep/main.nf +++ b/modules/nf-core/modules/ensemblvep/main.nf @@ -17,11 +17,14 @@ process ENSEMBLVEP { path extra_files output: - tuple val(meta), path("*.ann.vcf") , optional:true, emit: vcf - tuple val(meta), path("*.ann.tab") , optional:true, emit: tab - tuple val(meta), path("*.ann.json") , optional:true, emit: json - path "*.summary.html" , emit: report - path "versions.yml" , emit: versions + tuple val(meta), path("*.ann.vcf") , optional:true, emit: vcf + tuple val(meta), path("*.ann.tab") , optional:true, emit: tab + tuple val(meta), path("*.ann.json") , optional:true, emit: json + tuple val(meta), path("*.ann.vcf.gz") , optional:true, emit: vcf_gz + tuple val(meta), path("*.ann.tab.gz") , optional:true, emit: tab_gz + tuple val(meta), path("*.ann.json.gz") , optional:true, emit: json_gz + path "*.summary.html" , emit: report + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -29,6 +32,7 @@ process ENSEMBLVEP { script: def args = task.ext.args ?: '' def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json")? 'json' : args.contains("--tab")? 'tab' : 'vcf' + def compress_out = args.contains("--compress_output") ? '.gz' : '' def prefix = task.ext.prefix ?: "${meta.id}" def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" def reference = fasta ? "--fasta $fasta" : "" @@ -36,7 +40,7 @@ process ENSEMBLVEP { """ vep \\ -i $vcf \\ - -o ${prefix}.ann.${file_extension} \\ + -o ${prefix}.ann.${file_extension}${compress_out} \\ $args \\ $reference \\ --assembly $genome \\ @@ -48,6 +52,23 @@ process ENSEMBLVEP { --stats_file ${prefix}.summary.html \\ + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.ann.vcf + touch ${prefix}.ann.tab + touch ${prefix}.ann.json + touch ${prefix}.ann.vcf.gz + touch ${prefix}.ann.tab.gz + touch ${prefix}.ann.json.gz + touch ${prefix}.summary.html + cat <<-END_VERSIONS > versions.yml "${task.process}": ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') From 1bb33879737dd7fd7d0d6e4d7d6771efce6580b4 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 28 Sep 2022 14:48:21 +0200 Subject: [PATCH 0680/1169] remove local module --- modules/local/ensemblvep/main.nf | 65 ------------------------------- modules/local/ensemblvep/meta.yml | 65 ------------------------------- 2 files changed, 130 deletions(-) delete mode 100644 modules/local/ensemblvep/main.nf delete mode 100644 modules/local/ensemblvep/meta.yml diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf deleted file mode 100644 index 392aa240..00000000 --- a/modules/local/ensemblvep/main.nf +++ /dev/null @@ -1,65 +0,0 @@ -process ENSEMBLVEP { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::ensembl-vep=105.0" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ensembl-vep:105.0--pl5321h4a94de4_1' : - 'quay.io/biocontainers/ensembl-vep:105.0--pl5321h4a94de4_1' }" - - input: - tuple val(meta), path(vcf), path(index) - val genome - val species - val cache_version - path cache - - output: - tuple val(meta), path("*.ann.vcf.gz"), emit: vcf - path "*.summary.html" , emit: report, optional: true - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" - """ - mkdir $prefix - - vep \\ - -i $vcf \\ - -o ${prefix}.ann.vcf.gz \\ - $args \\ - --assembly $genome \\ - --species $species \\ - --cache \\ - --cache_version $cache_version \\ - --dir_cache $dir_cache \\ - --fork $task.cpus \\ - --vcf \\ - --compress_output bgzip \\ - --stats_file ${prefix}.summary.html - - rm -rf $prefix - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.ann.vcf.gz - touch ${prefix}.summary.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/ensemblvep/meta.yml b/modules/local/ensemblvep/meta.yml deleted file mode 100644 index cd9c8905..00000000 --- a/modules/local/ensemblvep/meta.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: ENSEMBLVEP -description: Ensembl Variant Effect Predictor (VEP) -keywords: - - annotation -tools: - - ensemblvep: - description: | - VEP determines the effect of your variants (SNPs, insertions, deletions, CNVs - or structural variants) on genes, transcripts, and protein sequence, as well as regulatory regions. - homepage: https://www.ensembl.org/info/docs/tools/vep/index.html - documentation: https://www.ensembl.org/info/docs/tools/vep/script/index.html - licence: ["Apache-2.0"] -params: - - use_cache: - type: boolean - description: | - Enable the usage of containers with cache - Does not work with conda - - vep_tag: - type: value - description: | - Specify the tag for the container - https://hub.docker.com/r/nfcore/vep/tags -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: | - vcf to annotate - - genome: - type: value - description: | - which genome to annotate with - - species: - type: value - description: | - which species to annotate with - - cache_version: - type: value - description: | - which version of the cache to annotate with - - cache: - type: file - description: | - path to VEP cache (optional) -output: - - vcf: - type: file - description: | - annotated vcf - pattern: "*.ann.vcf" - - report: - type: file - description: VEP report file - pattern: "*.html" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@maxulysse" From 6f3c9c80091d77f5f9d0d1940ec4631ea8fd37b1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 28 Sep 2022 15:57:53 +0200 Subject: [PATCH 0681/1169] update ci --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a64a034..b4e4506d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: matrix: NXF_VER: - "21.10.3" - - "latest-everything" + - "latest-stable" steps: - name: Check out pipeline code uses: actions/checkout@v2 From 969a2ad34e916be5e407a6a7b55ed57aedcc68c5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 28 Sep 2022 15:59:52 +0200 Subject: [PATCH 0682/1169] revert last commit --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b4e4506d..7a64a034 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: matrix: NXF_VER: - "21.10.3" - - "latest-stable" + - "latest-everything" steps: - name: Check out pipeline code uses: actions/checkout@v2 From e42d68fcad7f35240b71d3d21711988d98f21d4f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 29 Sep 2022 13:53:53 +0200 Subject: [PATCH 0683/1169] update ci --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a64a034..ec507a1e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: NXF_VER: - - "21.10.3" + - "21.10.4" - "latest-everything" steps: - name: Check out pipeline code From 65281f6e2e363a054356932e769e1aeebfcd9fa8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 29 Sep 2022 14:01:34 +0200 Subject: [PATCH 0684/1169] update to version 21.10 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec507a1e..a76ec02f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: NXF_VER: - - "21.10.4" + - "21.10" - "latest-everything" steps: - name: Check out pipeline code From 279fdaacf88d66ee2b57f136eac1858939e4f961 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 29 Sep 2022 14:35:00 +0200 Subject: [PATCH 0685/1169] change back to 21.10.4 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a76ec02f..ec507a1e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: NXF_VER: - - "21.10" + - "21.10.4" - "latest-everything" steps: - name: Check out pipeline code From 1583be2d33970a5cb5c31638e38fd1aef9f395eb Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 29 Sep 2022 16:00:05 +0200 Subject: [PATCH 0686/1169] update conf --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 85947b7a..b17f0b52 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -533,7 +533,7 @@ process { '--distance 5000', '--buffer_size 20000', '--format vcf --max_sv_size 248956422', - '--appris --biotype --canonical --ccds', + '--appris --biotype --canonical --ccds --compress_output bgzip', '--domains --exclude_predicted --force_overwrite', '--humdiv --no_progress --no_stats --numbers', '--polyphen p --protein --offline --regulatory --sift p --symbol --tsl', @@ -608,7 +608,7 @@ process { '--distance 5000', '--buffer_size 20000', '--format vcf --max_sv_size 248956422', - '--appris --biotype --cache --canonical --ccds', + '--appris --biotype --cache --canonical --ccds --compress_output bgzip', '--domains --exclude_predicted --force_overwrite', '--hgvs --humdiv --no_progress --no_stats --numbers', '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl', From 6ca9606b363cf8fc6dbe9ae40daa95556c9f5d9f Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 4 Oct 2022 22:02:01 +0000 Subject: [PATCH 0687/1169] Template update for nf-core/tools version 2.6 --- .github/workflows/awsfulltest.yml | 4 ++ .github/workflows/awstest.yml | 4 ++ .prettierignore | 1 + CITATION.cff | 8 +-- assets/adaptivecard.json | 67 +++++++++++++++++++ assets/methods_description_template.yml | 25 +++++++ assets/multiqc_config.yml | 6 +- docs/usage.md | 8 +++ lib/NfcoreTemplate.groovy | 55 +++++++++++++++ lib/Utils.groovy | 21 ++++-- lib/WorkflowRaredisease.groovy | 19 ++++++ main.nf | 3 +- modules.json | 27 ++++---- .../custom/dumpsoftwareversions/main.nf | 8 +-- .../custom/dumpsoftwareversions/meta.yml | 0 .../templates/dumpsoftwareversions.py | 0 modules/nf-core/{modules => }/fastqc/main.nf | 12 ++++ modules/nf-core/{modules => }/fastqc/meta.yml | 0 modules/nf-core/modules/multiqc/main.nf | 31 --------- modules/nf-core/multiqc/main.nf | 53 +++++++++++++++ .../nf-core/{modules => }/multiqc/meta.yml | 15 +++++ nextflow.config | 5 +- nextflow_schema.json | 18 +++++ workflows/raredisease.nf | 26 ++++--- 24 files changed, 345 insertions(+), 71 deletions(-) create mode 100644 assets/adaptivecard.json create mode 100644 assets/methods_description_template.yml mode change 100755 => 100644 lib/Utils.groovy rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/main.nf (79%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/meta.yml (100%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py (100%) rename modules/nf-core/{modules => }/fastqc/main.nf (85%) rename modules/nf-core/{modules => }/fastqc/meta.yml (100%) delete mode 100644 modules/nf-core/modules/multiqc/main.nf create mode 100644 modules/nf-core/multiqc/main.nf rename modules/nf-core/{modules => }/multiqc/meta.yml (73%) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index d4af2878..c6fab293 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -28,3 +28,7 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-${{ github.sha }}" } profiles: test_full,aws_tower + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 18e6e776..87d5182f 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -23,3 +23,7 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test-${{ github.sha }}" } profiles: test,aws_tower + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log diff --git a/.prettierignore b/.prettierignore index d0e7ae58..eb74a574 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,5 @@ email_template.html +adaptivecard.json .nextflow* work/ data/ diff --git a/CITATION.cff b/CITATION.cff index 4533e2f2..017666c0 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -13,8 +13,8 @@ authors: given-names: Johannes - family-names: Wilm given-names: Andreas - - family-names: Ulysse Garcia - given-names: Maxime + - family-names: Garcia + given-names: Maxime Ulysse - family-names: Di Tommaso given-names: Paolo - family-names: Nahnsen @@ -39,8 +39,8 @@ prefered-citation: given-names: Johannes - family-names: Wilm given-names: Andreas - - family-names: Ulysse Garcia - given-names: Maxime + - family-names: Garcia + given-names: Maxime Ulysse - family-names: Di Tommaso given-names: Paolo - family-names: Nahnsen diff --git a/assets/adaptivecard.json b/assets/adaptivecard.json new file mode 100644 index 00000000..cf30cdad --- /dev/null +++ b/assets/adaptivecard.json @@ -0,0 +1,67 @@ +{ + "type": "message", + "attachments": [ + { + "contentType": "application/vnd.microsoft.card.adaptive", + "contentUrl": null, + "content": { + "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "msteams": { + "width": "Full" + }, + "type": "AdaptiveCard", + "version": "1.2", + "body": [ + { + "type": "TextBlock", + "size": "Large", + "weight": "Bolder", + "color": "<% if (success) { %>Good<% } else { %>Attention<%} %>", + "text": "nf-core/raredisease v${version} - ${runName}", + "wrap": true + }, + { + "type": "TextBlock", + "spacing": "None", + "text": "Completed at ${dateComplete} (duration: ${duration})", + "isSubtle": true, + "wrap": true + }, + { + "type": "TextBlock", + "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors. The full error message was: ${errorReport}.<% } %>", + "wrap": true + }, + { + "type": "TextBlock", + "text": "The command used to launch the workflow was as follows:", + "wrap": true + }, + { + "type": "TextBlock", + "text": "${commandLine}", + "isSubtle": true, + "wrap": true + } + ], + "actions": [ + { + "type": "Action.ShowCard", + "title": "Pipeline Configuration", + "card": { + "type": "AdaptiveCard", + "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "body": [ + { + "type": "FactSet", + "facts": [<% out << summary.collect{ k,v -> "{\"title\": \"$k\", \"value\" : \"$v\"}"}.join(",\n") %> + ] + } + ] + } + } + ] + } + } + ] +} diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml new file mode 100644 index 00000000..de040a07 --- /dev/null +++ b/assets/methods_description_template.yml @@ -0,0 +1,25 @@ +id: "nf-core-raredisease-methods-description" +description: "Suggested text and references to use when describing pipeline usage within the methods section of a publication." +section_name: "nf-core/raredisease Methods Description" +section_href: "https://github.com/nf-core/raredisease" +plot_type: "html" +## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline +## You inject any metadata in the Nextflow '${workflow}' object +data: | +

Methods

+
+

The pipeline was executed with Nextflow v${workflow.nextflow.version} (Di Tommaso et al., 2017) with the following command:

+
${workflow.commandLine}
+

References

+
    +
  • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. https://doi.org/10.1038/nbt.3820
  • +
  • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. https://doi.org/10.1038/s41587-020-0439-x
  • +
+
+
Notes:
+
    + ${nodoi_text} +
  • The command above does not include parameters contained in any configs or profiles that may have been used. Ensure the config file is also uploaded with your publication!
  • +
  • You should also cite all software used within this run. Check the "Software Versions" of this report to get version information.
  • +
+
diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index e70b56be..3f45252a 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,9 +3,11 @@ report_comment: > analysis pipeline. For information about how to interpret these results, please see the documentation. report_section_order: - software_versions: + "nf-core-raredisease-methods-description": order: -1000 - "nf-core-raredisease-summary": + software_versions: order: -1001 + "nf-core-raredisease-summary": + order: -1002 export_plots: true diff --git a/docs/usage.md b/docs/usage.md index ea26d76d..3b403ead 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -237,6 +237,14 @@ See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). +## Azure Resource Requests + +To be used with the `azurebatch` profile by specifying the `-profile azurebatch`. +We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by default but these options can be changed if required. + +Note that the choice of VM size depends on your quota and the overall workload during the analysis. +For a thorough list, please refer the [Azure Sizes for virtual machines in Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). + ## Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 2fc0a9b9..27feb009 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -145,6 +145,61 @@ class NfcoreTemplate { output_tf.withWriter { w -> w << email_txt } } + // + // Construct and send adaptive card + // https://adaptivecards.io + // + public static void adaptivecard(workflow, params, summary_params, projectDir, log) { + def hook_url = params.hook_url + + def summary = [:] + for (group in summary_params.keySet()) { + summary << summary_params[group] + } + + def misc_fields = [:] + misc_fields['start'] = workflow.start + misc_fields['complete'] = workflow.complete + misc_fields['scriptfile'] = workflow.scriptFile + misc_fields['scriptid'] = workflow.scriptId + if (workflow.repository) misc_fields['repository'] = workflow.repository + if (workflow.commitId) misc_fields['commitid'] = workflow.commitId + if (workflow.revision) misc_fields['revision'] = workflow.revision + misc_fields['nxf_version'] = workflow.nextflow.version + misc_fields['nxf_build'] = workflow.nextflow.build + misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp + + def msg_fields = [:] + msg_fields['version'] = workflow.manifest.version + msg_fields['runName'] = workflow.runName + msg_fields['success'] = workflow.success + msg_fields['dateComplete'] = workflow.complete + msg_fields['duration'] = workflow.duration + msg_fields['exitStatus'] = workflow.exitStatus + msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + msg_fields['errorReport'] = (workflow.errorReport ?: 'None') + msg_fields['commandLine'] = workflow.commandLine + msg_fields['projectDir'] = workflow.projectDir + msg_fields['summary'] = summary << misc_fields + + // Render the JSON template + def engine = new groovy.text.GStringTemplateEngine() + def hf = new File("$projectDir/assets/adaptivecard.json") + def json_template = engine.createTemplate(hf).make(msg_fields) + def json_message = json_template.toString() + + // POST + def post = new URL(hook_url).openConnection(); + post.setRequestMethod("POST") + post.setDoOutput(true) + post.setRequestProperty("Content-Type", "application/json") + post.getOutputStream().write(json_message.getBytes("UTF-8")); + def postRC = post.getResponseCode(); + if (! postRC.equals(200)) { + log.warn(post.getErrorStream().getText()); + } + } + // // Print pipeline summary on completion // diff --git a/lib/Utils.groovy b/lib/Utils.groovy old mode 100755 new mode 100644 index 28567bd7..8d030f4e --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -21,19 +21,26 @@ class Utils { } // Check that all channels are present - def required_channels = ['conda-forge', 'bioconda', 'defaults'] - def conda_check_failed = !required_channels.every { ch -> ch in channels } + // This channel list is ordered by required channel priority. + def required_channels_in_order = ['conda-forge', 'bioconda', 'defaults'] + def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean // Check that they are in the right order - conda_check_failed |= !(channels.indexOf('conda-forge') < channels.indexOf('bioconda')) - conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults')) + def channel_priority_violation = false + def n = required_channels_in_order.size() + for (int i = 0; i < n - 1; i++) { + channel_priority_violation |= !(channels.indexOf(required_channels_in_order[i]) < channels.indexOf(required_channels_in_order[i+1])) + } - if (conda_check_failed) { + if (channels_missing | channel_priority_violation) { log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " There is a problem with your Conda configuration!\n\n" + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + - " Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" + - " NB: The order of the channels matters!\n" + + " Please refer to https://bioconda.github.io/\n" + + " The observed channel order is \n" + + " ${channels}\n" + + " but the following channel order is required:\n" + + " ${required_channels_in_order}\n" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" } } diff --git a/lib/WorkflowRaredisease.groovy b/lib/WorkflowRaredisease.groovy index 4cdb011c..5faae8cf 100755 --- a/lib/WorkflowRaredisease.groovy +++ b/lib/WorkflowRaredisease.groovy @@ -2,6 +2,8 @@ // This file holds several functions specific to the workflow/raredisease.nf in the nf-core/raredisease pipeline // +import groovy.text.SimpleTemplateEngine + class WorkflowRaredisease { // @@ -42,6 +44,23 @@ class WorkflowRaredisease { yaml_file_text += "data: |\n" yaml_file_text += "${summary_section}" return yaml_file_text + } + + public static String methodsDescriptionText(run_workflow, mqc_methods_yaml) { + // Convert to a named map so can be used as with familar NXF ${workflow} variable syntax in the MultiQC YML file + def meta = [:] + meta.workflow = run_workflow.toMap() + meta["manifest_map"] = run_workflow.manifest.toMap() + + meta["doi_text"] = meta.manifest_map.doi ? "(doi: ${meta.manifest_map.doi})" : "" + meta["nodoi_text"] = meta.manifest_map.doi ? "": "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " + + def methods_text = mqc_methods_yaml.text + + def engine = new SimpleTemplateEngine() + def description_html = engine.createTemplate(methods_text).make(meta) + + return description_html }// // Exit pipeline if incorrect --genome key provided // diff --git a/main.nf b/main.nf index 1eba1c1b..a195db40 100644 --- a/main.nf +++ b/main.nf @@ -4,7 +4,8 @@ nf-core/raredisease ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/raredisease -Website: https://nf-co.re/raredisease + + Website: https://nf-co.re/raredisease Slack : https://nfcore.slack.com/channels/raredisease ---------------------------------------------------------------------------------------- */ diff --git a/modules.json b/modules.json index 2f244966..7f84be56 100644 --- a/modules.json +++ b/modules.json @@ -2,20 +2,21 @@ "name": "nf-core/raredisease", "homePage": "https://github.com/nf-core/raredisease", "repos": { - "nf-core/modules": { - "git_url": "https://github.com/nf-core/modules.git", + "https://github.com/nf-core/modules.git": { "modules": { - "custom/dumpsoftwareversions": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", - "branch": "master" - }, - "fastqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", - "branch": "master" - }, - "multiqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", - "branch": "master" + "nf-core": { + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "fastqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "multiqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + } } } } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf similarity index 79% rename from modules/nf-core/modules/custom/dumpsoftwareversions/main.nf rename to modules/nf-core/custom/dumpsoftwareversions/main.nf index 327d5100..cebb6e05 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -1,11 +1,11 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { - label 'process_low' + label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml rename to modules/nf-core/custom/dumpsoftwareversions/meta.yml diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py rename to modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/fastqc/main.nf similarity index 85% rename from modules/nf-core/modules/fastqc/main.nf rename to modules/nf-core/fastqc/main.nf index ed6b8c50..05730368 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -44,4 +44,16 @@ process FASTQC { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.html + touch ${prefix}.zip + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml similarity index 100% rename from modules/nf-core/modules/fastqc/meta.yml rename to modules/nf-core/fastqc/meta.yml diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf deleted file mode 100644 index 1264aac1..00000000 --- a/modules/nf-core/modules/multiqc/main.nf +++ /dev/null @@ -1,31 +0,0 @@ -process MULTIQC { - label 'process_medium' - - conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" - - input: - path multiqc_files - - output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - """ - multiqc -f $args . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf new file mode 100644 index 00000000..a8159a57 --- /dev/null +++ b/modules/nf-core/multiqc/main.nf @@ -0,0 +1,53 @@ +process MULTIQC { + label 'process_single' + + conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + + input: + path multiqc_files, stageAs: "?/*" + path(multiqc_config) + path(extra_multiqc_config) + path(multiqc_logo) + + output: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def config = multiqc_config ? "--config $multiqc_config" : '' + def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + """ + multiqc \\ + --force \\ + $args \\ + $config \\ + $extra_config \\ + . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ + + stub: + """ + touch multiqc_data + touch multiqc_plots + touch multiqc_report.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml similarity index 73% rename from modules/nf-core/modules/multiqc/meta.yml rename to modules/nf-core/multiqc/meta.yml index 6fa891ef..ebc29b27 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -12,11 +12,25 @@ tools: homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ licence: ["GPL-3.0-or-later"] + input: - multiqc_files: type: file description: | List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections in multiqc_config. + pattern: "*.{yml,yaml}" + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + output: - report: type: file @@ -38,3 +52,4 @@ authors: - "@abhi18av" - "@bunop" - "@drpatelh" + - "@jfy133" diff --git a/nextflow.config b/nextflow.config index 820901d5..241cc210 100644 --- a/nextflow.config +++ b/nextflow.config @@ -21,7 +21,9 @@ params { // MultiQC options multiqc_config = null multiqc_title = null + multiqc_logo = null max_multiqc_email_size = '25.MB' + multiqc_methods_description = null // Boilerplate options outdir = null @@ -31,6 +33,7 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false + hook_url = null help = false validate_params = true show_hidden_params = false @@ -74,7 +77,6 @@ try { // } - profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -189,6 +191,7 @@ manifest { mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' version = '1.0dev' + doi = '' } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index 1743c89c..37a6908b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -213,12 +213,30 @@ "fa_icon": "fas fa-palette", "hidden": true }, + "hook_url": { + "type": "string", + "description": "Incoming hook URL for messaging service", + "fa_icon": "fas fa-people-group", + "help_text": "Incoming hook URL for messaging service. Currently, only MS Teams is supported.", + "hidden": true + }, "multiqc_config": { "type": "string", "description": "Custom config file to supply to MultiQC.", "fa_icon": "fas fa-cog", "hidden": true }, + "multiqc_logo": { + "type": "string", + "description": "Custom logo file to supply to MultiQC. File name must also be set in the MultiQC config file", + "fa_icon": "fas fa-image", + "hidden": true + }, + "multiqc_methods_description": { + "type": "string", + "description": "Custom MultiQC yaml file containing HTML including a methods description.", + "fa_icon": "fas fa-cog" + }, "tracedir": { "type": "string", "description": "Directory to keep pipeline Nextflow logs and reports.", diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f7d800f0..32fd703b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -23,8 +23,10 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() +ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() +ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() +ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -46,9 +48,9 @@ include { INPUT_CHECK } from '../subworkflows/local/input_check' // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' +include { FASTQC } from '../modules/nf-core/fastqc/main' +include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -89,15 +91,20 @@ workflow RAREDISEASE { workflow_summary = WorkflowRaredisease.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) + methods_description = WorkflowRaredisease.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) + ch_methods_description = Channel.value(methods_description) + ch_multiqc_files = Channel.empty() - ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) - ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( - ch_multiqc_files.collect() + ch_multiqc_files.collect(), + ch_multiqc_config.collect().ifEmpty([]), + ch_multiqc_custom_config.collect().ifEmpty([]), + ch_multiqc_logo.collect().ifEmpty([]) ) multiqc_report = MULTIQC.out.report.toList() ch_versions = ch_versions.mix(MULTIQC.out.versions) @@ -114,6 +121,9 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) } NfcoreTemplate.summary(workflow, params, log) + if (params.hook_url) { + NfcoreTemplate.adaptivecard(workflow, params, summary_params, projectDir, log) + } } /* From 1b827288a36d4ee65438377d77a0f9f472a8126a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Wed, 5 Oct 2022 10:36:06 +0200 Subject: [PATCH 0688/1169] liftover --- bin/check_samplesheet.py | 0 conf/genomes.config | 8 +++ conf/modules.config | 64 ++++++++++++++++++ conf/test.config | 6 ++ docs/images/mqc_fastqc_adapter.png | Bin docs/images/mqc_fastqc_counts.png | Bin docs/images/mqc_fastqc_quality.png | Bin lib/NfcoreSchema.groovy | 0 lib/NfcoreTemplate.groovy | 0 lib/Utils.groovy | 0 lib/WorkflowMain.groovy | 0 lib/WorkflowRaredisease.groovy | 0 modules.json | 4 ++ modules/nf-core/modules/ensemblvep/build.sh | 0 .../modules/picard/liftovervcf/main.nf | 61 +++++++++++++++++ .../modules/picard/liftovervcf/meta.yml | 55 +++++++++++++++ subworkflows/local/align_and_call_MT.nf | 9 ++- subworkflows/local/analyse_MT.nf | 57 ++++++++++++++-- subworkflows/local/prepare_genome.nf | 2 +- workflows/raredisease.nf | 36 ++++++---- 20 files changed, 279 insertions(+), 23 deletions(-) mode change 100755 => 100644 bin/check_samplesheet.py mode change 100755 => 100644 docs/images/mqc_fastqc_adapter.png mode change 100755 => 100644 docs/images/mqc_fastqc_counts.png mode change 100755 => 100644 docs/images/mqc_fastqc_quality.png mode change 100755 => 100644 lib/NfcoreSchema.groovy mode change 100755 => 100644 lib/NfcoreTemplate.groovy mode change 100755 => 100644 lib/Utils.groovy mode change 100755 => 100644 lib/WorkflowMain.groovy mode change 100755 => 100644 lib/WorkflowRaredisease.groovy mode change 100755 => 100644 modules/nf-core/modules/ensemblvep/build.sh create mode 100644 modules/nf-core/modules/picard/liftovervcf/main.nf create mode 100644 modules/nf-core/modules/picard/liftovervcf/meta.yml diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py old mode 100755 new mode 100644 diff --git a/conf/genomes.config b/conf/genomes.config index 79592106..82acb9e6 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -13,6 +13,9 @@ params { 'GRCh37' { fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" + fasta_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa" + index_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" + shift_chain = "${params.local_genomes}/ShiftBack.chain bwa = "" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" call_interval = "" @@ -20,6 +23,7 @@ params { gnomad_af = "" gnomad_af_tbi = "" intervals_mt = "" + intervals_mt_shift = "" known_dbsnp = "" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" @@ -38,13 +42,17 @@ params { 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" + fasta_shift = "${params.local_genomes}/hg38.chrM.shifted8000.fa" + index_shift = "${params.local_genomes}/bwa/hg38.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" bwa = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.fasta.{amb,ann,bwt,pac,sa}" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + shift_chain = "${params.local_genomes}/grch38_ShiftBack.chain call_interval = "" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" gnomad_af_tbi = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" intervals_mt = "${params.local_genomes}/non_control_region.chrM.interval_list" + intervals_mt_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" diff --git a/conf/modules.config b/conf/modules.config index b17f0b52..dc33ab13 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -700,6 +700,70 @@ process { ext.args = '--mitochondria-mode TRUE' } } +// +// ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT +// +process { + withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:BWAMEM2_INDEX' { + ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" + ] + } + + + + withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:SAMTOOLS_FAIDX' { + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*fai" + ] + } + + withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:GET_CHROM_SIZES' { + publishDir = [ + enabled: false, + ] + } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { + ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MERGEBAMALIGNMENT_MT' { + ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' + ext.prefix = { "${meta.id}_merged" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_ADDORREPLACEREADGROUPS_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT' + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_MARKDUPLICATES_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' + ext.prefix = { "${meta.id}_markduplicates" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SAMTOOLS_SORT_MT' { + ext.prefix = { "${meta.id}_sorted" } + } + + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { + ext.args = '--mitochondria-mode TRUE' + } + withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { + ext.args = '' + } + +} + // // SENTIEON_TNSCOPE_MT_CALL diff --git a/conf/test.config b/conf/test.config index 6e19d738..9f0cce39 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,6 +25,7 @@ params { // Genome references fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' + fasta_shift='https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' @@ -36,4 +37,9 @@ params { target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' intervals_mt = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' + intervals_mt_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/control_region_shifted.chrM.interval_list' + + shift_chain = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference//ShiftBack.chain' + + genome = 'GRCh38' } diff --git a/docs/images/mqc_fastqc_adapter.png b/docs/images/mqc_fastqc_adapter.png old mode 100755 new mode 100644 diff --git a/docs/images/mqc_fastqc_counts.png b/docs/images/mqc_fastqc_counts.png old mode 100755 new mode 100644 diff --git a/docs/images/mqc_fastqc_quality.png b/docs/images/mqc_fastqc_quality.png old mode 100755 new mode 100644 diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy old mode 100755 new mode 100644 diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy old mode 100755 new mode 100644 diff --git a/lib/Utils.groovy b/lib/Utils.groovy old mode 100755 new mode 100644 diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy old mode 100755 new mode 100644 diff --git a/lib/WorkflowRaredisease.groovy b/lib/WorkflowRaredisease.groovy old mode 100755 new mode 100644 diff --git a/modules.json b/modules.json index c4fdfc1d..9d2ca938 100644 --- a/modules.json +++ b/modules.json @@ -133,6 +133,10 @@ "branch": "master", "git_sha": "4b1d4bf401d4cf65ebc4f604bc8c8e7551109db3" }, + "nf-core/picard/liftovervcf": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, "picard/addorreplacereadgroups": { "branch": "master", "git_sha": "67652c7c4dda138c9e71f093b1aea91f29f87c50" diff --git a/modules/nf-core/modules/ensemblvep/build.sh b/modules/nf-core/modules/ensemblvep/build.sh old mode 100755 new mode 100644 diff --git a/modules/nf-core/modules/picard/liftovervcf/main.nf b/modules/nf-core/modules/picard/liftovervcf/main.nf new file mode 100644 index 00000000..334f68b0 --- /dev/null +++ b/modules/nf-core/modules/picard/liftovervcf/main.nf @@ -0,0 +1,61 @@ +process PICARD_LIFTOVERVCF { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + + input: + tuple val(meta), path(input_vcf) + path dict + path chain + path fasta + + output: + tuple val(meta), path("*lifted.vcf.gz") , emit: vcf_lifted + tuple val(meta), path("*unlifted.vcf.gz"), emit: vcf_unlifted + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 1 + if (!task.memory) { + log.info '[Picard LiftoverVcf] Available memory not known - defaulting to 1GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + LiftoverVcf \\ + $args \\ + --INPUT $input_vcf \\ + --OUTPUT ${prefix}.lifted.vcf.gz \\ + --CHAIN $chain \\ + --REJECT ${prefix}.unlifted.vcf.gz \\ + --REFERENCE_SEQUENCE $fasta + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard LiftoverVcf --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.lifted.vcf.gz + touch ${prefix}.unlifted.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard LiftoverVcf --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/picard/liftovervcf/meta.yml b/modules/nf-core/modules/picard/liftovervcf/meta.yml new file mode 100644 index 00000000..55f04963 --- /dev/null +++ b/modules/nf-core/modules/picard/liftovervcf/meta.yml @@ -0,0 +1,55 @@ +name: picard_liftovervcf +description: convert between genome builds +keywords: + - liftOver + - picard +tools: + - picard: + description: Move annotations from one assembly to another + homepage: https://gatk.broadinstitute.org/hc/en-us/articles/360037060932-LiftoverVcf-Picard + documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360037060932-LiftoverVcf-Picard + tool_dev_url: https://github.com/broadinstitute/picard + doi: "" + licence: ["MIT"] + +input: + - meta: + type: map + description: Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_vcf: + type: file + description: VCF file + pattern: "*.{vcf,vcf.gz}" + - chain: + type: file + description: The liftover chain file + - fasta: + type: file + description: fasta file + pattern: "*.fasta" + - dict: + type: file + description: dictionary for fasta file + pattern: "*.{dict}" + +output: + - meta: + type: map + description: Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf_lifted: + type: file + description: VCF file containing successfully lifted variants + pattern: "*.{lifted.vcf.gz}" + - vcf_unlifted: + type: file + description: VCF file containing unsuccessfully lifted variants + pattern: "*.{unlifted.vcf.gz}" + +authors: + - "@lucpen" diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index 98c861c1..ba071d6a 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -11,6 +11,8 @@ include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } fr include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' + + workflow ALIGN_AND_CALL_MT { take: fastq // channel: [ val(meta), path('*.fastq.gz') ] @@ -31,15 +33,16 @@ workflow ALIGN_AND_CALL_MT { ch_fastq_ubam = ch_mt_bam.join(ubam, by: [0]) // Merges bam files - GATK4_MERGEBAMALIGNMENT_MT ( ch_fastq_ubam, fasta, dict ) + GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, fasta, dict ) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) + // Add read group to merged bam file PICARD_ADDORREPLACEREADGROUPS_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) // Marks duplicates - PICARD_MARKDUPLICATES_MT ( PICARD_ADDORREPLACEREADGROUPS_MT.out.bam ) + PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam ) ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) // Sort bam file @@ -53,7 +56,7 @@ workflow ALIGN_AND_CALL_MT { ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MT.out.versions.first()) // Calls variants with Mutect2 - GATK4_MUTECT2_MT ( ch_sort_index_bam_intervals_mt, fasta, fai, dict, [], [], [], [] ) + GATK4_MUTECT2_MT (ch_sort_index_bam_intervals_mt, fasta, fai, dict, [], [], [],[]) ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) // Haplocheck diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index ff290ed6..11d0423e 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -1,11 +1,11 @@ // // Analyse MT // - include { PREPARE_MT_ALIGNMENT } from './prepare_MT_alignment' include { ALIGN_AND_CALL_MT } from './align_and_call_MT' - - +include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './align_and_call_MT' +include { PREPARE_GENOME as PREPARE_GENOME_MT } from './prepare_genome' +include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/modules/picard/liftovervcf/main' workflow ANALYSE_MT { take: @@ -15,15 +15,21 @@ workflow ANALYSE_MT { dict // channel: [ genome.dict ] fai // channel: [ genome.fai ] intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] + fasta_shift // channel: [ genome.fasta ] + intervals_mt_shift // channel: [ file(control_region_shifted.chrM.interval_list) ] + shift_chain + main: ch_versions = Channel.empty() // STEP 1: PREPARING MT ALIGNMENT PREPARE_MT_ALIGNMENT ( bam ) - ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions)// Outputs bam files - // STEP 2.1: MT ALLIGNMENT AND VARIANT CALLING + ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions)// Outputs bam files + + + //STEP 2.1: MT ALLIGNMENT AND VARIANT CALLING ch_intervals_mt = Channel.fromPath(params.intervals_mt) ALIGN_AND_CALL_MT ( PREPARE_MT_ALIGNMENT.out.fastq, @@ -33,14 +39,51 @@ workflow ANALYSE_MT { dict, fai, ch_intervals_mt + ) ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT.out.versions) - + aligner="bwamem2" + // STEP 2.2: MT ALLIGNMENT SHIFT AND VARIANT CALLING + ch_intervals_mt_shift = Channel.fromPath(params.intervals_mt_shift) + PREPARE_GENOME_MT(aligner,[],[],fasta_shift ,[],[],[]).set { ch_genome } + ch_versions = ch_versions.mix(ch_genome.versions) + ch_dict_shift = ch_genome.sequence_dict + ch_fai_shift = ch_genome.fai + ch_index_shift =ch_genome.aligner_index + + + ALIGN_AND_CALL_MT_SHIFT ( + PREPARE_MT_ALIGNMENT.out.fastq, + PREPARE_MT_ALIGNMENT.out.bam, + ch_index_shift, + fasta_shift, + ch_dict_shift, + ch_fai_shift, + ch_intervals_mt_shift + ) + ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT_SHIFT.out.versions) + + PICARD_LIFTOVERVCF (ALIGN_AND_CALL_MT_SHIFT.out.vcf,dict,shift_chain,fasta) + ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT_SHIFT.out.versions) + + + + + emit: vcf = ALIGN_AND_CALL_MT.out.vcf tbi = ALIGN_AND_CALL_MT.out.tbi txt = ALIGN_AND_CALL_MT.out.txt html = ALIGN_AND_CALL_MT.out.html - versions = ch_versions // channel: [ versions.yml ] + vcf_shift = ALIGN_AND_CALL_MT_SHIFT.out.vcf + tbi_shift = ALIGN_AND_CALL_MT_SHIFT.out.tbi + txt_shift = ALIGN_AND_CALL_MT_SHIFT.out.txt + html_shift = ALIGN_AND_CALL_MT_SHIFT.out.html + + vcf_lift = PICARD_LIFTOVERVCF.out.vcf_lifted + vcf_unlift = PICARD_LIFTOVERVCF.out.vcf_unlifted + + versions = ch_versions // channel: [ versions.yml ] + } diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index e44bcaea..6ff0513a 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -29,7 +29,7 @@ workflow PREPARE_GENOME { ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : [[],file(bwamem2_index)] ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) } else if (aligner == "sentieon") { - SENTIEON_BWAINDEX ( [[], ch_fasta] ) + SENTIEON_BWAINDEX ([[],ch_fasta] ) ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : [[],file(sentieon_index)] ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) } else { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 87238dac..566d81e1 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -13,10 +13,12 @@ WorkflowRaredisease.initialise(params, log) def checkPathParamList = [ params.bwamem2_index, params.fasta, + params.fasta_shift, params.fasta_fai, params.gnomad, params.input, params.intervals_mt, + params.intervals_mt_shift, params.multiqc_config, params.reduced_penetrance, params.score_config_snv, @@ -68,6 +70,7 @@ include { FILTER_VEP as FILTER_VEP_SV } from '../modules/local/filter_vep' include { CHECK_INPUT } from '../subworkflows/local/check_input' include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' + include { ANNOTATE_SNVS } from '../subworkflows/local/annotate_snvs' include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' include { GENS } from '../subworkflows/local/gens' @@ -89,6 +92,7 @@ include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_co include { FASTQC } from '../modules/nf-core/modules/fastqc/main' include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' + include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' // @@ -161,7 +165,7 @@ workflow RAREDISEASE { ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) - + // STEP 1.5: BAM QUALITY CHECK QC_BAM ( ch_mapped.marked_bam, @@ -173,7 +177,7 @@ workflow RAREDISEASE { ch_references.chrom_sizes ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) - + // STEP 1.6: EXPANSIONHUNTER AND STRANGER CALL_REPEAT_EXPANSIONS ( ch_mapped.bam_bai, @@ -181,7 +185,7 @@ workflow RAREDISEASE { ch_references.variant_catalog ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) - + // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV ( @@ -196,7 +200,7 @@ workflow RAREDISEASE { CHECK_INPUT.out.case_info ) ch_versions = ch_versions.mix(CALL_SNV.out.versions) - + CALL_STRUCTURAL_VARIANTS ( ch_mapped.marked_bam, ch_mapped.marked_bai, @@ -223,7 +227,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) } - + if (params.annotate_sv_switch) { ANNOTATE_STRUCTURAL_VARIANTS ( CALL_STRUCTURAL_VARIANTS.out.vcf, @@ -255,20 +259,28 @@ workflow RAREDISEASE { ch_variant_consequences ) } - - - // STEP 2.1: ANALYSE MT + + + // STEP 2.1: ANALYSE MT ch_intervals_mt = Channel.fromPath(params.intervals_mt) + ch_fasta_shift=Channel.fromPath(params.fasta_shift) + ch_intervals_mt_shift = Channel.fromPath(params.intervals_mt_shift) + ANALYSE_MT ( ch_mapped.bam_bai, ch_references.aligner_index, ch_references.genome_fasta, ch_references.sequence_dict, ch_references.genome_fai, - ch_intervals_mt + ch_intervals_mt, + params.fasta_shift, + params.intervals_mt_shift, + params.shift_chain + + ) ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) - + // STEP 3: VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) @@ -305,14 +317,14 @@ workflow RAREDISEASE { ch_variant_consequences ) } - + // // MODULE: Pipeline reporting // CUSTOM_DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') ) - + // // MODULE: MultiQC // From 5db9aeb184a23c6ba05cc2b77d2ddadfe00b9ccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Wed, 5 Oct 2022 13:10:44 +0200 Subject: [PATCH 0689/1169] filepermissions --- bin/check_samplesheet.py | 0 lib/NfcoreSchema.groovy | 0 lib/NfcoreTemplate.groovy | 0 lib/Utils.groovy | 0 lib/WorkflowMain.groovy | 0 lib/WorkflowRaredisease.groovy | 0 modules/nf-core/modules/ensemblvep/build.sh | 0 7 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/check_samplesheet.py mode change 100644 => 100755 lib/NfcoreSchema.groovy mode change 100644 => 100755 lib/NfcoreTemplate.groovy mode change 100644 => 100755 lib/Utils.groovy mode change 100644 => 100755 lib/WorkflowMain.groovy mode change 100644 => 100755 lib/WorkflowRaredisease.groovy mode change 100644 => 100755 modules/nf-core/modules/ensemblvep/build.sh diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py old mode 100644 new mode 100755 diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy old mode 100644 new mode 100755 diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy old mode 100644 new mode 100755 diff --git a/lib/Utils.groovy b/lib/Utils.groovy old mode 100644 new mode 100755 diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy old mode 100644 new mode 100755 diff --git a/lib/WorkflowRaredisease.groovy b/lib/WorkflowRaredisease.groovy old mode 100644 new mode 100755 diff --git a/modules/nf-core/modules/ensemblvep/build.sh b/modules/nf-core/modules/ensemblvep/build.sh old mode 100644 new mode 100755 From ac2c2aa105a3770c2bb8e226d6dc7357a898d92c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Wed, 5 Oct 2022 13:22:52 +0200 Subject: [PATCH 0690/1169] filepermissions --- docs/images/mqc_fastqc_adapter.png | Bin docs/images/mqc_fastqc_counts.png | Bin docs/images/mqc_fastqc_quality.png | Bin docs/images/nf-core-raredisease_logo_dark.png | Bin docs/images/nf-core-raredisease_logo_light.png | Bin docs/images/raredisease_workflow.png | Bin docs/images/raredisease_workflow.svg | 0 7 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 docs/images/mqc_fastqc_adapter.png mode change 100644 => 100755 docs/images/mqc_fastqc_counts.png mode change 100644 => 100755 docs/images/mqc_fastqc_quality.png mode change 100644 => 100755 docs/images/nf-core-raredisease_logo_dark.png mode change 100644 => 100755 docs/images/nf-core-raredisease_logo_light.png mode change 100644 => 100755 docs/images/raredisease_workflow.png mode change 100644 => 100755 docs/images/raredisease_workflow.svg diff --git a/docs/images/mqc_fastqc_adapter.png b/docs/images/mqc_fastqc_adapter.png old mode 100644 new mode 100755 diff --git a/docs/images/mqc_fastqc_counts.png b/docs/images/mqc_fastqc_counts.png old mode 100644 new mode 100755 diff --git a/docs/images/mqc_fastqc_quality.png b/docs/images/mqc_fastqc_quality.png old mode 100644 new mode 100755 diff --git a/docs/images/nf-core-raredisease_logo_dark.png b/docs/images/nf-core-raredisease_logo_dark.png old mode 100644 new mode 100755 diff --git a/docs/images/nf-core-raredisease_logo_light.png b/docs/images/nf-core-raredisease_logo_light.png old mode 100644 new mode 100755 diff --git a/docs/images/raredisease_workflow.png b/docs/images/raredisease_workflow.png old mode 100644 new mode 100755 diff --git a/docs/images/raredisease_workflow.svg b/docs/images/raredisease_workflow.svg old mode 100644 new mode 100755 From ca7de7b2d963280ee5519d2448a3dda2e8ee7922 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Wed, 5 Oct 2022 13:27:07 +0200 Subject: [PATCH 0691/1169] Delete mqc_fastqc_adapter.png --- docs/images/mqc_fastqc_adapter.png | Bin 23458 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 docs/images/mqc_fastqc_adapter.png diff --git a/docs/images/mqc_fastqc_adapter.png b/docs/images/mqc_fastqc_adapter.png deleted file mode 100755 index 361d0e47acfb424dea1f326590d1eb2f6dfa26b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23458 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 Date: Wed, 5 Oct 2022 13:27:25 +0200 Subject: [PATCH 0692/1169] Delete raredisease_workflow.svg --- docs/images/raredisease_workflow.svg | 922 --------------------------- 1 file changed, 922 deletions(-) delete mode 100755 docs/images/raredisease_workflow.svg diff --git a/docs/images/raredisease_workflow.svg b/docs/images/raredisease_workflow.svg deleted file mode 100755 index 012f2c59..00000000 --- a/docs/images/raredisease_workflow.svg +++ /dev/null @@ -1,922 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bam - - - - - Preprocessing, mapping etc -bwamem2, MarkDuplicates -Sentieon: bwamem, Locuscollector, Dedup - - - - Reports -MultiQC, Peddy, plink, rhocall - - - - - Variant calling - - SV -ExpansionHunter, CNVpytor, Manta, tiddit/sv - Mitochondria -According to GATK Best Practices -Mutect2, eKLIPse - SNV + short indels -Deepvariant -Sentieon: DNAscope, DNAModelApply - - - - Variant annotation and prioritization - - SV -VCFanno, VEP, Gens - Mitochondria -Haplogrep, HmtNote, gnomAD_mt - SNV + short indels -VCFanno, CADD, VEP - - - - - Outputs -VCFs, inputs for scout, Gens - - - - - vcf - - - - - - vcf - - - - - - vcf - - - - - - - fastq - - - - dev - - - - - - From 52f1e11506dee9de82a4131cac4acf0d44eb4b06 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Wed, 5 Oct 2022 13:27:45 +0200 Subject: [PATCH 0693/1169] Delete nf-core-raredisease_logo_dark.png --- docs/images/nf-core-raredisease_logo_dark.png | Bin 75872 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 docs/images/nf-core-raredisease_logo_dark.png diff --git a/docs/images/nf-core-raredisease_logo_dark.png b/docs/images/nf-core-raredisease_logo_dark.png deleted file mode 100755 index 9e7a1960ad55bf1761376247a48c8229ebdc227c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75872 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 L(>>Y0+MoMhsb=rF From 5e1db03fbf99dd1a32e35e4f4b78fee9e4b578fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Wed, 5 Oct 2022 13:40:37 +0200 Subject: [PATCH 0694/1169] images --- docs/images/mqc_fastqc_adapter.png | Bin 0 -> 23458 bytes docs/images/nf-core-raredisease_logo_dark.png | Bin 0 -> 75872 bytes docs/images/raredisease_workflow.svg | 922 ++++++++++++++++++ 3 files changed, 922 insertions(+) create mode 100755 docs/images/mqc_fastqc_adapter.png create mode 100755 docs/images/nf-core-raredisease_logo_dark.png create mode 100755 docs/images/raredisease_workflow.svg diff --git a/docs/images/mqc_fastqc_adapter.png b/docs/images/mqc_fastqc_adapter.png new file mode 100755 index 0000000000000000000000000000000000000000..361d0e47acfb424dea1f326590d1eb2f6dfa26b5 GIT binary patch literal 23458 zcmeFZ2UJtryD!S#x<#o93es(Ww4k)maRbte0-+a?-g^xY-3myTE`8G_KvA54)F1tn})nJ5u%TA4Y;^!^{48eL_}p#q-Umo0M|F1 z74+PQh^X8N|9_jcWbq~ zzn+tZC9B75nKdz=gQ8wo9GJ$P{D~3knlI_`-PRhCw34f1oYDLr^;oEbgxa#A^J%*2 z>FfDE*(~JzKFs$t_oeLz))qDU?s}%Q?7b~3Y;lUi^Oy-2@3g?joA4Wkgb6-2=ih*jub)~7yZ`T=L=Z`B`{1jhkB-iSjea94&Eo9A zxN59pv1p_}RO1>EC^q}Z2)ZI;b7JV_x4lMr=Bker2+EK;8~!;JO7re*@ZkDmoV878S*N^yX(F@U1yqt?Is3nnV>7}#(5pk`V3C) zWhB8;CwWIwsVIjH+`<9=YA(j&3DgQdFOOGU~*`36wNC&QDv8> zr?h2PQgnHkp&t^S)q^K!68h~`$PjZW&-Wns;Zlw$M2sc z1xR!u{m|Kih*|Hht#M@eOMM#8O*={^6b9k5B5^eBsrnhVHD7XZ5BWO&F?q(>Y=QFl z`f>yQ9NCoxZCH-1F{#mz_j{QeyY~4h*VeyYZ#S@Z(Pnb7G=ud!RW)5svqM*&GI_za zzn;8LkOTT?``1Ygt6w!2;5arK*o5k15cdIJnMg)IQhF_zVK%!ma$z&jL zZt>Q{!PqKl^`Qw?nJUOEm@@qX(y(TwSJ~dqW&M@7-N4Wk_wC4izx(xJMrmNjsl$XR zCyK&INt}7@FzNAbbg-nW)sJ>3->I1+2~YdlPsaS}^X-H0GR_CEsw`PGjpq`uX}8VP zJ)HC34>D(z{KR9;E&z=@?@q_|I{NPOj~g>w!$gR?Tlu~F+L$Mk%}xQEm+{&T(5zkH zacVy0k3w!T9r*p2sgX@V;^+PfUYUrEde07XSV=KSDbkIZU!j!Rk3MQV=h-!y@kWVB zdYkmu^fiU~pp#ixe4hBEMx7^LdHa z_L*14aVIHtrsR)SO?=&kQS&JR#^AVvln=P=bUXEIy$QB&!s34znCV@y(C%j9V=}SU zoYLHn+-Lalm0$-=QQ}a(+2dR*{DPF+)J4y!ukiA_T%dF zVKEk;c?LWheG#A5{A20}CKjMw5G%2}cT5@Oce=wqdobHC70=kY7}dxt3diH9(Zcwr zCabx8yObHQ@#e_wjl%wp8s_!Wvxe5f-Duin@obgt>qOcqN$$@{X^C_rEDh3fmM;|X z$zu4;D`{YRbaJ?o!KkazII&|th9v5MG2Mao$ytOHtW+wo;XJJdtLuGjg;d020qT++ zpD}e&o?SeKSqR`}4`OdkWNC7K)Wltn zbwBrWGM;bBGm8uP_RiqfwvDD1f+uRX>b=nTH9Y%vpg{ka0e*E>%<+3!G3#s*-1D>q zHg~1@BT52a*L>mVcP>6y*0iX8@!3tDFJLE+sRlnU(cl``hF`0Q>e4i6P8|wKmqIqI zoY+a0V*Bib0`F9nG#sR(8$^!IWLR)cE8@7XZTN%L-ucJ{9yijy)w5Pom%XG7V<^PX z$Z$U82w0qgcGmld-O6*e)?pm$g@!6`Pps5SPKccjDf(|vX9zcLs7t!7cyyckZI#R* z#lj(HqfVeqyZ+Va{)>65sAb3IQ%a{9W^_F!5!;w=XD}ZUHFH$8=Xjw+VE)s$q(nt> zE2^aDYki5`e73RQ=DxaBNZ6CK?XKCv@V}=y(g?YHnFaHfXnl}Lo;36@?471W;&#Se z>pE*@M{Y?CevLG8il9#HXG#W3>;o$1``EYBY5i<;JlBqj2M8Y2!+6bPj1(S_bOksY z<34UQE;=Z>KiL``pYd}5fpOOT)GJQnXfNiAc5wgJ>F|$Eqw&D*Vmz+#mM0oFD^`-^ zB~SXe{T+5hd$gnKd7Afo9cy&Lii@syPDFDK)^V{iWEAEO@?xzx1bd`ta z;$(vG+=i3~9|D=GX%f~<>eOVjy~-yRAhLf2dR8V<@M_`C^ev(yOTg{uf=L3uyDb-w z&)l7KXS_HTo87BxI}fXF{ge&5p&IHk9M1}eNAwqw)`eZSOPFhqjS70{hyE@C{oSN$ zam*`-UH3RF-RWEP`^Su1q#n_J{AncekkV4m7YITf%QHBo60h@pk4N4O}hhf%rxuIZGiQpprVMal%h7?8+cY#L>pYnx6v!EnuIgInW` z)w!NuTp;fz9md^}*x@K9+`^2LO*bZp1^?BG#iS@(4i%AB6YP023T8Eb?M5K7ElSpe z9-wA22Mm}VwDkmECLd*}a=7bCf(}@SHs6UBe)Xvk(+hQ^^unj5JBeo$=><{4PBI%P z4_9XQ=XnE``;1Daa6f`~rGwNj9{YXY)eIw3G90Ip+QEWg0%?g=i$UHuQ?Qc0OR0!w zv?BvlQa!QMyI*IP!0>goBt$xo2^hlD&wRp?$=}}#?q~Yw z{**_|5&yL*Epz|4V#SJjg-lNaIx_{sCL3R=_VH&_;oOn5J2P=h!0enu-i%FAZ- zw`Hm*u6N*}&A7pAqr>-?%0(lveb{r8>hpDmex?Yo*8!-%1?YV0R~VEPBFp>)ba=mv+2(#>WEy0yxHZX=Cr2 zKmew%=^>HsD3BtRR*#H!@!TTGcI&fHrVh)P&|X;>)OHML+uWDn(dlsDjXa;5uBM$r zdt!r~ig?5iGbx!GpH+kdG8k0%;~)Q#0L6wFROJ}^Z%DvO3x#yNk13^&ccd&l)BP9h zD5cU-qZg-rV3Sg&?)`x}cI3`zw#zq{-eN4pNf(+?QuOG4oZ7zMGSVqOUe>`u=GfKM z{xPCciJFw9%Pk+uDSoormR&c=fS#hGOk=RGUtizBOoY^8P(>!Si|I9i=1ZCQbcc)5 zgE6UED;+b$4u&#dhZjdXwO3tpG0QaQwXrLOx5YP#TOaS@FP!h|G!z!Pbv?hTp0eQL zoUsiv4d@*Ck#ID9-ua|zPbQepcC4a>>9-bJApd()Wg%}hj#%A4pO-q{jIJ$f-SL7- zo&=keG_jhq$Ty4e|J^l6j6TQ=W)|~&Ei6gRn<{*^cFG*tS19#kHpMD7Y;wb~!3_%X zS_-3NQoGiWCX!M-Id;Nsg7oSi4VJ=Hi{bYNfjnmTq?IyK@@&_uacfb&8h@DIe70-Q zZ^KaT(4UX*vf7@A7CY;P!IVGIuXPRIe^&71Z1EyHO5&^=jUUKHF+h&m!4!dOA+!Ed zfA#uQ&p6vD7|O8(?5`bf8^gK)6p`>+$c*yG?Sw29;OD+tp}kDD9augDAEXWbSVoie zpHF1Wj8lWfIZ}mx%(2XREqF9!{fNd&iurAaoQDMCSNo!vRHE8wH%QLLZf9u;ADqnxOaAD#VE%Yg z?Gb?EmGbY}a0|vSZPlF3z6;Kf669Bf%h zlSGiY-}E4LFurm_CJN)(*l?=uX);o&R&qLuzENz?9I%S&YQ2>rVhx#c!hbvWLL!CI zA8mXM$zjnnJ#Me@-99}hjxCE!w8|9w{SBlj%Miq#dvS5GHP!DxO$sDx^4PF^#`;A! zb=bZ1pyj{R#9h$r7svB$QlJqeF1cp*ubT12UZ!deKFG%1N<@S2x&2UtqsVz zn=gF&$D4i3x7&vdoa#^cS?bQuP69OpspVPxm*%@DSWf!NG`o`y^R~o1Hvta;#!r%i zvEB~Jsi~sJ7Y35P!bf?OQin->fAk+TpU$Ow1st|l9|i2rrOneBP3&aDyoUj3K{a7! zOYpnJyYD#nr4GNJ;@$ce2dSN=eS7f-VptzM(|Ek^ze)mPVrpAEgrFs3mL>f(ZwriH zCZ65HdO0|W@2<+v9t?J=-4U9>bvM@@Ew4uVZy@c^Ovw9`k|$!+CTAn(u#4kC7TVTB zXuy#d+GC@RIMaPyp|Y2jS%RJkktCracCaLqfs^i^XFqK#3z+d}n02*VDF&My)vp)lNzWx<< zGB7hEAH?7_joYR?>+&+JIas*%Oiux%kr*X*B=8N8Ulowx0MkRK?pR)K1F_m8>dSe54 z)48k>#|F!OV#yOs7xQNQ@1iun5pl;py{tx+o044?r{W2O{f}3r{#QS#4bf(|f9R3y#6*0YY) z5Ey{M`dj)yHl)B{sdmvti^b0IE5xFx%jJM&5w69;`PGy0vGk2ztSW|5H3~zhXO?mn z+4mo>;Y7=4&gC}HifyMO`#70u3H6;0|| z!l=0lP|zVF`bfxm{%i98943^7y4Iz};Z9F$oY3iUI*FIsYa=o=nS^d`;3?*wDxi&| z=?oqs6uDcd1e_e5z7M5q(+I^PilSRE(T6%z<=U8%sq63V!wELY9Rj%#Y@2Y+TEJ8(f_Kh0ih?l6E6~wDl3~?-5%7>d{ zKs0XHUeORoi5+U#M{kE!Ae%|)^dabh1DsJI9N~LVXp*8$XlOfc6J+Cc?}SM zsc3N~L7hzcpXn2>b(_YN=J*C0N}$f_NINTiV!~L}nA{wn^XfBogd5hu!G?*THg^mF zFJm@9m{X~X3t5{7 z#lWIO++R8;BTByGl7U;fz|JBB^*4R|bLvm18x;DF*U`=kyxbH2nD*RIH5AWfJ4^5o z&Nr;*|NreNKo$fUI5}~n#Xcbjr0T-7MV;wZXA(QPt^`x;=ZK)5^`AFgQM?7ry_(Tm z0|EhWs&cYJW?|uvc3af(tfuyDf$28~R=HOa#}3Edru##Wwm0a$Vnk=_8+eQ; zfyq+GVt0Twr^QS*HtI+&&>_<%-Gq-!{iQr-3LYn-6bqW0VW)>%iat!2IP)Jd+LgnS zgI+jJ-I9HMJ8Z*$2FjwK1T0RpF%U`&x)S{3HqRJ z5^;r?VoA(k7*aP@tzB`O5Y26jv#x54xNH;E`KzzLxC)FEnQ<}IR#w*>9sq|zFzZq< zdM1%ynXvcLfZ{Xm=l(Op?=XGV8`BwRiQ%@@A-GnjD+y3K zN2Pm011b!s`3368%P&MapW-PDulXKfpeyRXNjN`lKKgC%CplwE#GrRw#0FE#Q4>R+ z23B4CmO%uy8Y@;F$hCHU6+oJ}_cKgm|4Amr{$`38ue-?+GX1T!hd$w@x=z{w30Z*W za@$MLl^=f#*oR+8(&a&`E@Bj{{1O;DPjj$g9U7~{m*?^Tj}Rrc^wc=(SycXVT?bW{ zUus*6{74fo{nOh@zQyv0g{)t}Qekl*>KXQYCI9m2jqge|&Ntj{V?gLs*_GkeODYhf zW39Q1L1~vk+#E^S!nCyO&z9Wh}2=K}`9#{=`j&)^}8=U|lz}DqgAteVsos){s zDhK`>&pK%cVuhO7tPu7@Y4|yXAdHs!(uKDuLL@i$Okc6Gs;2456Br??ZNZiONAe!~ zvY5w1(C)E9fRmpWgWU2Su0u6~9{@wIm<-lha;uuEN>&C^FJ#^|oopkg``l#i0&{OX z%rI6Q>l^9J++K19D;HrFU#V9o0M`MBTT#-(q&A{|n-`T~CgAFET=$E_&pIQTPE;J#&nrwf2N^I*d zH)ev~7d=Sy8<@syK<`PFvNtyfa#8^JceG^ua^o%!fl6R&j--jGkz8wS`EgfEZouOD zr97H059Dj(#$*$-!UQLvb92wS40!wJc!4K~lq-K2h2rXunCs?SjQERnvv9Fs?tF;y zWUTcQ&PtDMbsUY6_&np`UGMS0ZZIhnDh~p{`Bryj7XS~*R}%z6 zUO^hJn$_-CW(;$)hHu0ej1BNqv^o%*D2gR6zUvCZyw)ddNB6JE$;okhf7PEEz|dRN z$sP&o`MU(L_I8mDW33;)3!U*;HRm$zVV%%zaDn^*Qj~RdWdFNb;^fRhnF&{oeY-tv zq$p~pZw)Ls$EWKsEZubtx_9bpdCfsjdy*<8_Io8VtCIC+8kk@Qxdti>xnu}nRYJ-y zp8$3YP7u;u+YlPQ2`o_>S?mpXvd0-x!Z3=}>ceWDg*e)+#wQLE)Uwhneo z;*y`VfoY<#lwT^k4BP(ytfI;M`FoYsedi}L{1V|Ho}ciBs=`@vtgnieHdpWz%Vyy$ zlnn?k0KJWOnlJD9>6y64*X=G{lyl&%pV8Uo&>tXw%1za!6*YYVB$jR$Y0XhB#1mVx zvjd8N4X~{Dd&28RVEkCw9TLN9*Ng!?9F88l2Bl)w%7!97mtx5(Qx%1u6h+$OGa4#qGGGI{Pj4d)5yg8F4O2sfu61u0uM}?$_nH8=0St?`ogZ@1LAr@*uC4Z9(|dIQ z?OH<_%?PD56K*Kty@PQT;W#)tazY~|I7-aq)tQ($$#Q?{gEbJwJK3mnk)|l>XgmJQ z_POHzee+4NEWu0i0zUFmLTF(zvD3B%sp1_F7 z<|O7{-oZ2>t9k~zX0MDQ(4&(YZ#~baV{$ah?o_K1p$Ad`PAvgtuhW(xO{@bMjNb>Y z-k>lsDx?xX;x5*9RSpJe~BwLtb79%{p~+JTs5HZ&#({u>j3kAOLx*Y zW{7^+`OD%vhcxVW39F$jZ;I@H`3X?>Wwt@269f1o{V4-t-|dX4x7L3j zUHltoa@jqToWvn&=0CF%6%D0h50m^)qaXkRMC&Owv8iG~$}1PBgld3nBE#Rg(5)8n zga7!2@yjoBBoF_e3M$ongy7N1L_hT@!LUaCXX6QLZFKcq1r;;Z$sca}zfwaCji7PcbfW7H9p`7Eh$-j*7-=%{5f&}TidFWiMr=NYvc}Q@gh_z)<;^d&F zd@za3ugvK(BbprUX|)`Rk0&+6)#sm5S8a7;dzrqn*f)iXpvW$BVu6u)bR+ywtGne@B61Om=Q)yvb`45S}|LKt&5@)wSOfk;LhZ^UofjlQz0h zm)>a9f&40n$;-ndr=xntY3nOFGmA5POfiIsfgTzT*Cl zU{P;It;qo}n}IeEA1&?GRONCJp3=_!ce2$kKRZonNV+tS_uFPWzeS zhqSPws(Jp?TsgNT7yGtphSz=h2-}y#HTWNE#@LHFs^pseT#RfN*P8yLUm`jG1N5s* zfU25qv2akmjD=Q`s4SJxi@i`xIOCdT5B%W6wj1Fz8)Kuv*iB`}b^(em~z zz4~VcUB9M5@W}s3-SOWXu+*?)Al7p)Bw?jh8_#s)>lYp{{b%_vCY00=iC@I3$FcpY zYuOjg948l-C~}cDxL!%j&X1(H6ZC7U5?oVLQ<)zh*qg)k6HdNPB;PQcbVRXucl7>@ zE`Ga=^8RPrIRE!3E#e-v8MTy%%a1yk_k{s|V-=5ML7(Mg#S@LA3;rEyjF&X1w*^R&VJ>2%B@{=W9BD)oa@0!_Gl{G8Oe+Vki1QQWd~<<~Et zEV_YlJ=t8VXv>#L|FKXIJ)GZ1(d6xUoSPZVFOzMhM$6tgyhWq=@}=HzWm&b4o8R}L zQd7<0PV(LqaHYNNcXtTN4rc2ov$)VeRm&}XS-vamGB^G4tspa#HrPa5#22^pb?s&W zS%!p!fba6R+WLMjkeUo!qpKob}#cMpU4(`C+U6R8i>qlJ&Hbh52enW<`FmyjlhwlfIlxyu$Pg z3uS-Qau7K~%A$hBFocIe2<$LBIbEI!uddh9(JX=++R9aM|DO2#5*qKh#Zq^~O40f6 z0#s@~v{DPy=4^A}ieKe(Idu22Ex4~>p=#u?w_Lx>bHE@Z4Dh%iKrDJj2IJ+qNDIxj&WPRXRSaNz$JyFkpFK#gLAB6G;4KKql{+5w z{2yWKln-fjDCc()q_W&mmIx?JvpXPb{)hR&ok40*!M7lC!&?b|=efwVb@r0;FeD2( z*x!h~5OA8DEVr>6PS6o_oYt+7HY+d${lh@ruB?hP=`vq;@uLNGIb%@~*X54+`NY0- z35nZLFQArwtL~;t?sb(T6k;wi@v0FFLV}%b1@;p|R%u%8ROV= zRWO3*fG33>>}We#nQ5Vk3gY2ODY5fL+-E@ zvWG%=(;1n3UEEjqSDn9V_C*FMSXjR{uYKa`>$>D#@FacqRX4qmy{)y4&Gf)@V_BVr zvNEa@r<%e5HW?jhEb!SY6v|~N%22Y0992I>~ud8In`Lf`QStH3E)x@G=`2&AraN&V){PF%a=v)Pu{I zuQ7a;TZAlAgDiVUO+`B+z-8%M0kCiylcazP7I(w|^h*D4Sn6R#-jd7ZMN@iJo=6v2GyL zo;~Df{e7CCta*U4B1pD0lfi=EwI3CTf2}#(`mwSD-u-%XLU(&V?BTG?P-Fx}R5*E5 zcvSdpxqh`s3e`yRJ6%Efp|NYd2}SjJ)h@$9391YRLSU!qq4E=W9yx#}_KqRcG)(~r z!+&i&OckDJQ2El}fI8mdeCHPcJ2=byp-dT&ZFDzLuqc{lvh)^vKB2 zL}g}~j~QUN0Fo{!0BTTKwrDjx#j6KVb>MsCz=!G& z0?uz!q)+3>Q|KAM0zy>+^zjMt4}XE)t2HIfc*Tmi?$;KdI7B#Aw9_O-Zg>98L}4}% zna0Es9syWr5+f5RGVqawtNUt}*r|Zy#6ay+mEGaSGMmMOW%88u6mXzDD_wlGT6!zy zpLOrO442P{0J&IYJjqwrVrEF87ZDTT<9iz5xv)C#pUTTj+d73+z7GI`Ehx*q&zxS(F>^b?4*udLeSbU~XBKKi_PI+| z`R!s3tpv7gX^R3~Cce0vX(P9@UCS)XwG6mNX_eM`6X(`UW>OMp*nTlrcUU?`gCzDr zKR0P?yj9z#ME0=e!>GupM|%&t{Qcx)sN)wVzW*5E>yxt5g6NEc!GR+F(!Nysd6n&^ zN?K|Q@t>y$%H^ z1}}eMB%-GY`CK5%Pj}AkUNRem1zBUE6y}0KA;6;dZu&VyB`KCwPfdQ5Xri>Osl*$@qxi zNUlL!r3OOxC4C`xXPqL4Ec)b`ajpfaw12E4xMZ6=Yyb-WN0LL2RUzLj zAKS$6X%>ekm|3yQ$#-`3N8ah|B+0f4bxDc4nfJcHZ{dlBeXYRL5bY2afSAF|vcc%G!HPxGS8==1)_U|T zNvWWGt}f~OGmCtqW8>q3f@5Go0Rce)p>g@dgop$3UUF3))$Wn6gRX7M3GQ}?tC)i6 z5#2fg?U#)GsvTF-;w zY-Nw9hPGMC9F9(W5F-PUEmiuS(F06nlcE{I)}b=%A7_~A6cEH$BClS~DB|X6Z*IT2 zIpOX|#S?qiLR2Osk#^=DtNG&ym+&FR*Kv8P<@ep!ZLZtJSjcEO2t@V!3dE-*!yhNO z<`xWq;JT2z{)iLD9MQ;&^p<*B%Gv z9;zH_>TGtlGO@9MT_xDkFS4=QaZA)){{?|_B)8Hw-q)H3IPzKPiHM2|2?0GNX^+EI zRf5>q`4yE?GgaPuK8|(quyuVfv-aF(wlXs_w}4}Na=7tnIA2P*pcwxEhcBp%Q-6rI3Rc0j@jnbz>h=|(@M6C7U>fx%lJG+#q2Q4af?@H7>c`6Fw&JpwfW1WFvJ!J#H z%4DH$Nww@r6h6K-1K$M;1QOi8g)GMGRywKGssy2=E7s%k;ESt|W)#O-pRtb)vf8-D zxR2gI3De!E>)xMZTl>m(C!Tx|_c}u7mC!FmY~hT4&*t)mO76L0VQ$Zm)=+l7>+9FH zfQZjFC%h{enbPhuNz~lx(beZsjm#JG@8B$iw_cTSX-?0fRc}lkFJafCcF=wqJsUd8 zMn~$&N!wK2xp3mXuom2=TlzBdg~W^u`*x0IxUuITUpwpCCpIqO47DsRfB}i?8mn+k zO?VOK*oa)bFN6F7oN04eyGiZR6q#;01`nk`g-ro<5USFo8#dEMz{N z)FLtwpl>inBl;{0syyqD<@D`l$#Jfl)EJHXIv_2TJFdCbB1tJq2^~2}iq9XvxA^o{ zn0YLREmF;vJ(gM2^u>gGlpZOM>hd=@e@%v3L4CC$gdajz11>;t>9B37u4gN+c2EaN z7N{PzCO`Ov_B8QVS#5&Tgk_TYRF@xdXvUjab#=&lP?prpL~g4|3*W;OC@JF8+0RZoP6YS5=9t%X5j<@=9s zJZx5j1kEdx-027b#7vEm4TRT9soiaOv=y$Y#MT=^nhP%|fDdU^7Ez#Ft2I{)2fQ7` zW7SkW?%wkBWnL)w_~|{}hkUWMk@uEt@uS1%?(3-dK@CnX)?b$25^pIgnsh^HS!eiB z?gK|C)llrf;ga;b^r9EOF`p3yYRe*y*MIBz1Bd-qR8TlBdJn2ur@`?phF`DfaY8;D zCwmvCvRQoWVlI$tetKk}o?MNTX9H3!Y@C`PXWV>S%$VZ{%|p4jHr#UH_Ryyow;{{;KtygLxrG7(#ca)wTYK z-Y0sN6h;=V$f!GPone8y(zPnL+1N>PyLSs(y=`1y*FQ1lR8e`3s=cW#m$+c=3)Tb3 zN7!8_R~a%Ek8tTvTN6~|O}BoxmiKrt8Mkh0)vSD{hV=%yVvnL*%!|m2!23pSnTfsT zwQ-^GnI8{pLlWXKtGU!5h-Pk2LFIGB{oj=);~!Nlji{=PmP~Mqtb8I%bKzXfV~y`v zhZpp~H7qb%5D%?Sa5$&Vmvl)54qk6v;W{B~UlL4_ z81zf;L5bb3SJPuc^~%Ua_>tB)$VLK>FZvy&b%*eB+g)qdbU(k_R*eJS(gX< zJxL0apH$ji6sKDr)n`3{aNlN^Qwkhtd8DRdnV96&?L&8b5Co{7; zvmmb;3CdwVs8W1GMY~|zn1^&RO1t0hBt(ULtGJTf^IAMxRpD7HU;6{ij?XXdjHv`a zw9!c(a5cYpR_vk~eKYL+k6gM+5023LHvMEY_p}y=4k&Q!!C<*zC^2Ia3C3Ji zL1sbM+*p_j602gKXP|mF$s?~%_vnUv zj52~Vd_MWnLq+!(*+*-Lw~%K)_w>^_onjFhcBsl-1z4eAVzf$ZoD9yB+;Sysedi;%NXg8B1{e-#F_eG|zvUc4YC2OlIpARjmdsP@u05 zr*U3jsq00uHQh{r5KWSeeT?KjD!)FjzCJInzFM??L^jL9NcW`?Lr-^4X;Bzlu&Q?y z02M)ULBT=3$s#1Y9wAzg8-+0n||g$cI`eH$?LAzF9rpS6h3c^3UB*o~o`&^2bx~YDhrzULrno%G+^r zq3*RFmK+#R^m@8?svWLq){v0z;Az zxet5`c$dkiO>9f|6fbU>MAIx-Kjc(r4SckyK$1&9Ug3)mVCA8Y1>GV0bcjayWKU?1 z;d6`Ui1G&YLMmdtb&4SB(ffffFqD_1Okq%F3-y=7Xr$+V_G^RS{QgC zXKOBBq9L5K2Qnz3y##l~^f-q^dVo0JTO6ysmtjFF?tQ4=Mh9FhB)1vUcK2(Quo8ja4+LSJ)Y<8ba zuA}O{%Nltg%FD9=r+$Zri;I)XEgq8j;?A9Ap0;b5j5DIM+@eRt2of>UaXBan>ZY7* zVXIJgT25e+vU`n3vm9;wD-XX>S5Izts;k7?q0ifUbXFZ ztu890yFSO?daUUr!gp4FD4cm`X`a_ImZ)oY+O^`2sgS=Z-sfHvxbI807yFk_pf??D z)@elHpxFmUW>0G7ey-bx)DpdGO}*NS(z-#}PYqNxLg1@YN}fvhUtBLqKc+GUT;OW% zO_B<`R#rcqET`udx*1pLFro0I)_p#G&G^C(J)_;ph87-;WP@^*-yrWnJiD`bUJP4q znYR1%sd_A6GDQ|qpc%2A)KEGs;Y;857S{2jmRaCehP?GUgH%@%HTz-B?uYLBrVgP} zH@h;%V${F6+&AJkBG1T_xqmSr-oU0c++uF-EFD zir8XIv!Ke#t=O)W|8PyRa?ZUc=)2$4uI5;dauysN?Iuy7nk&-rwtj_ zbqWwtQli>QcMkpbLD<<#ef^2AtKAu7XV^+t%ng>C+4%Wb9$F58#E^h`#n9f!Ps zj#E`k*Ev&FK`3R|?l*-YBQmL)w`1e~thLbiWK69X#vg3g_b_#aGcF(hyvqEk72SD; zu~^e}9oE2m94b1C2NhicobMMlg}U1!FA|mJle8de9Xe&=-H(MvA(68kA0+z|@_;-# z&(b*W+h^U$FizY_L_j1L?db`Rywq|kJ8nKA;QjfTaq4P?Nw-t8PTt*s02E}f>sbOX zogFNsq@})oI`S|>iHp=g?5*Ri>{ zfB@dk5v}dqihux<=+%{)tOw&-*p;K#;k0?3?5LDv#-^~Bshk-i29xz)oSMVH0{UfE_@k=$Td6mLADmA5HCS>H;8Elg7$zuRGQ_PzI@ zO7f{m&I)ngat~(Q!A^05yQ_P6@m+rB1*YFo4Y=~o+^59v4+%;&=jKhGbUydp4sH`1 zy;I`gK$wj(W`yp3Yj2)F9^2eqVW8uZJUv^BWHR7|G0X^Vuta6p*nh6WK_UPW?g|4H zCB73}#_XrDiYLG?L;{a;A`xflU$&e61X|e>FFS;FXT~~Nej^;8D;T+(JOGZ)-YCl! zDic2c`~DhIAgQ(OXEkNRICxKJ<<&$(86$}P>l1x?yCEt=imFk`Pe$TW&4$L37fnx4(%*=smL>0uH114m_}1+sdfuU!A0Zqzr@~p)h_Rae)3fnObHlP6C?me#TrO zCzi%;E6iC);zLiV*o22GEXIF{NL2tM-wS{K&aCtKGNF+iOQ+JaXYw|H4%FRB?7R&T z1KbAY2p!11zb8icU0Q6TPkZCL#ztpG;uZYw`xg!FyJfa%ZgI;OhQyI`fsLCle_S+t z4uqjjj%#Gy0#Ipt92R{W{euP*jXIOxh~qaUFM9L1FgE=XM~3_=Bba|6C*-;_c4HdFiehcxh0 z3i5W02=DV{(OsRR{NTp{O}%1D0O?=QOrHWG;?)^(Uyagt?*2oVuw0Pnoh8{=0EzL^H|PjFP(dF&|L7WETT0GcVgY_ zx1oq}^k1#{aimB=*)HzvnsDIHm*|-4-oMfmwO_ThrZR-9o)Q(i2K8OOn)fj<5|I>i zrMN-NYx$b70)BeTtJLb1l@(5>DzdL{44E$Db`c|6v{j8rk`njaT(d`!Q+zvdV+~uc zwOi(`abOznKOr4><!y3?&Pn`#_&3l#Gef?)=p3_f^Ui;vfzaAOR#H0C- zC_m1^677NRcZrEQlhb%^AG}2eIicl$V9+BoV;Y&B{w1=n5~3`>l3tCJ_iei91O5sJ zlfRNrKdWsWxAWWhrxQmbuci*ftO7n7Oc}WO%lj>uVaUiDKPF^(#js~|dl-WEB(b%;R&%wBZo4s*Feg>11~T!zk!KqRO#H>GQupBCvQnt=r+5tC~|_jcwZextGmQ=bxnE*pJAI!;`6FR9y=}o5@Ho683hnm=2#mq1!K9 z;~t#M?%xqQa&ju$A*O`A5Y;)3bM=^-yRtSfb`+m*&?NHD1^&k_^1V`zUUp zBQjO}+aSl}wx4UqTg2FEd)wQlHv^*CRVd!3FhGRo(ku4))jpO12ugP&rZjKiwWfRW zYw>!=HK|cBWxk2w*r^o8&xo`u5~q#7C$1%JvzI7GnjkBxN}y~)MsK5FzthqT)I+i9 zLQUJe#tLyOp$}IIr$A@HkBqga9H3%Ak12)kQ{#!2%+*+9#70XhbyV%2UkvY~D0|mM zOicCza3cpNf8-DDqMQ{MkW2mhk21pBOx#yO@k>+nz1ZeIc+LzQXaBES&Mc^@EREx+ zqiBmVE)B9tyJ8C(1%!qWVxu&JY>L`J5QAF>)IcL^2uZMMRMdci4TdEsixgYJCJ-=e z(Lp2&ix5o$VGm(RSON)Tn;Yzh>4%xBd6>6bx9&ano^!tXf8ROv|DAg`e-7-iRZ8cm z=ml-2W49d)ss}v#)i{V&<{UK+J~DWlkr^ixT(|EP4_lGEv+7l6mX7 z`rnoA>yKLGlLdp#ymRS3uTeX~bc`pDe>eR8u{uRKGM^xch?2hX5Bxxz6(kXw^chB# z#7h9KbJ}H`x6PI{mOk`b>sfNpaaH^>y|DfmqK}?)K;U6OD{UDN0WtzaUnVZ#(spqZ zVUr8UHtKKJjt*vN1d8xgpq!jad2C3(uDSb@6AQqAzw;SdN2f_9m=Y%6(PT^t2e zg=!ibR|V#v11NDo)>*m?5o>hTQnM~G5obZpgu!tGj(YQzF70x0uAV}pwc8nXX9bNO zbd)kXD!8@U4%A|o<87&s*`|`dnky@hr;;ZAo2~Bu2g7qn%3zfDbCVL7wu5 zo6Tn~<`BAK((ct9AG1D;F6BcA^^r>vEU%LrOxsOA%-~5M z#X&|sFPm7+R$g01eYw6pxAtP}a&bw{TPi%16;?Qf0?g2_F$#<3}XnXEmOcm0X z!{Mfdfq*I2fU-a1TZs929@5Rg{4M{z@?9Cko|M^ReIRLnw|jnGRaL}G1ibFOa|A7s z+co|6Dsuoxs)B@lW!!Fy@jnb5RF(!^gPXPin?1IG|04fYi3yRqp(DWls)4f1ZERc>4-}4==@QsXQg#VCX`Pjnxeb({{Mj4zJ&j-1gzqTJ&ZexJiN=qXShYkaMiouM$* zihdgSA>BBh>UG8sz{fP)%#B>6)ZZ=Zve3ylD#}%J_s_FUjp|p?zS5nme$D^s9D%?1 zd2a%1f&hF>jr5)w_Qg&=>>L|+n_ZGJ{}HuB-aWy6I|{a6W`Hnb;cfm6{HJ~AA5ZV+ zO^P4X_D8eT5KMzCi0L0n3XE^`Xqp2~J~>=whP^9u!!3KaNy^5JOLz)Qwu7R8tf2ks zjisRN+T82EvVNsTX1X}xJ+r&E1Ana8Qpn2QD&fVB#c4QXwtxn8H8-fA^k_PfU1K3X z>IqazcZf<=_}R)j8P@aQ7;I*x%o;+#m133p4|1XdRsx)DWgq8qRCq~o16CxrvV~U` z$2#Ub_snsmq87&UH8fBu1S$k8W-@S#nO1mvLoQ#oa#qzo1j5WsbiT7n#x9E6xctup zJJ%*Op$=MhR$JZqbv_dwGf|=jmqw4H=Qe2mw@dI%LXLx+E_G`7=_yvYv(qNF3xrZR3f^9WzweTrZ7WqEQ>&+*-xiy?FBw3-ZWJN4Th}bQmbtp<+ZqlYjQPJ zzNJfa4MuhJC8X&CS?MdFHTA9?=isQw$nkr*(2+Po!G*E?U$K}~)F4_CUzSe8@O3kZ^Er5IyP;Rw( z35J!UL`-m9!A;qPy7nr*dZ@-uSCrN8P)B_V9{n(?zi#F`+gKxs#*j zIH*Icy{ipTSyFy2@?sB~?5qc-cE2IAHt=n!gOV&jwpC}hxH_Kx% ztE2W0xmBmGr@cJg0cyO-?r1X(kr9xzu3+5V>1YzBtuK6Ra+RToix@7>2?<#qlBORE zbPI%~d_ybB0wTJa@)1vVt^ENOxF^N8TUJ5l82Ua|j9w5GM!ns$6;8y2MsryfV`-qN zEznw|%v2>{C)I{qY-dkz`?}Fkw&fQ zBN#PretyOeaJs1{;WawCpt=$SI;XBPp7InnGa1cDG>a+B>Gj%*6DIE9rWl)H8{q`X zVd*sdD=SM1z|Vy6zDVL-OqDUa_)7$Y%8SwTNc$fK$`(EpOnd?|qD%^KF$$pzZLs>; zv5g|58uwUn(Y{xXl&jn#G4$KyOX%KD$tr1&*MWVUnx;mKg3#9O_l|8-Q|n3o{>>eu z!`5^oYumbF>)9rC1!*L0!jnc)RWy#I)ou2c_^7-jK29i+|GW6{gJ3&?o*?PGQU4@` z$7-B=gU6FGBh1l6I?5Y{G*rvYh!1zuM?w70^DH5@`^PXicUM2_WGwV*Cy$rqr&KUs z;}joZDc2XLy+|3^isfRqI4kTS5mliCSf3Z_X+6tS(ggtRztKx~?*aru3zmUEkLYLny4;8GY~MslmYH0k0dw z)G|*Su9O!{ADIl88Z8f6?rr30%#0dUX!v!~CP(SiH;^=tG*9+f* zH%TQ``8r7)cps_|-xy8UlqQPc2juI@-%8z!W+a52Sf%}QgT?XI){9PBt`2zqixfO& zJYfn;xmG!vzt!#M7tQ$&CC8O6@#jiZL&LzQg<5w;Gu0=gN=$#tKIPXT@+WB5R@Q%X zp1bdd>c#xa)I7FsC%bz7zwfDVlz?fP!dV(_d_kVy^b``B>#P;dM7+H4lfdnTdURBAu@`b`q4%FkzqUgW3 zhYFFDJz1knY!{|dBW8Lh%a?_G)X7Y!X6H`szb}cCkv*v#Lu!nzK1Hm3FVAc18sK7^ z>AnNS+m1E=`x^ajSc@6Ieh1&8Rkl|$1}csP%YGcqpRX^;*Lv{tSgQje|Jc#u3W#8Cg{Hs_9~*{DS0xsT7sC`DMpWzAzskBfVvdb z@y`yEh6X;l;b>hiazNKRWJ{>hjjkf+%^@6k=Aie@bG3?N#%FF^mY=8xLE4A}5 z>aq0#{hvJ$UY?RYX{uH9i1gt7(ae(APoE^j2h9|A1X2DCPw(TgTQAFmsnJ-o69lh* z9oIm-U+h3Esl8`?QxI&beN#~!IRfH$CVmDg>mCcV-_o29~{`Jf)Nc`P796ky56b1X^g+HZaPvYG0Tav$)YZ}m4Gu66s_ceA^1{9agzjwX_Y;6=_wk8$$ z129D0Rta&OMG!WN5{z-uDzYKWF2`V;G%36~%d{h}|35w=JV}CtP9xQc^c6;h28t6^ z6TwQG0)s3Bi%BFe#)X-0*v)o~(^GR3U;ERuoIxD_E_?biq)}BT+TXN1Dzr|OsM{_f zj^1zI6${VY{Ft+)Uo@%`PZ~$uD;tDCHH5V&{+-sBJ^>EZ@LNw7ch@>-w*0SgRv`P!6HjAGi4 z8OB%$uqk{K%~G{HsN>c@-Z{+y+w{Y)pU0cxR2FKm0WUu9G}lG4QI;qnRG~oJOfH}3 z#$i>GNcGqNKS1oYr)N>>k^iFp{HNB7brQtrWokjR$WvgpJ8Xx^IS4UnyPm<*!HS`p z%P7gj{{ZX^D@tfmhFAT2ZDOmP;gNIfc+@kg|E{=H^QB<(IPpAAY3dSwHW{3ITh0J= z3C;O0*YYTC32f}H#ap$FFrzB}yHgUL4PJ6fV_UPrd+n}eK)oUU3)@KP1S>oKWz|Gd z7P$SvV>(oqf6e6m`4ZE=TD~=oUvGY7gnCv~ znv<6o@Ax;cEk1z3vzkT8RyO=>YcbT1nQSaaccPB{7a;q4fr*<8=F39V>BA+c)0zLW zlB7Otx&KSeTT9gdpif(C9%a-e5A}a2jirA#)^piqi!ru3Q0^$|67K(eqr2dC;CsJYxts_Nw>Q2ocQf4U8Z1AmOD{_&&^_l3nlsEpKUf=%o?mzB6eje zuDZLCQ6mvbUg&5SsI?3KWQ)c6z%_+ux?VyRx$Zlh)t8oiw(5~w-iF#gmB1px{adaw z*36(XT~}7O`=zEVO7{l%aeL?D(@dyIi@%W~X=VnwM-Ed_!jq6qoh*_iMyc?Rc1EEJ zSpPB3^2HZN2W`q~CmQEFZsjm>o6Iy4vEbKi_#;CCb&dP)kOa-oH)H%XFDyJyAx$HX zDh>Rz_neTweNEu`_0|~csz;7e!C4f^cocvI4XIU8js7OJ(&UPhna$@0hf7RfC3b#k0G?>@PzAU(GW#Y6Yc1%i2B98(fVKf#5h#}cm| zLBuffb;OjvMI zbkd*-_ID*khGWJteF-zNA4-)!PT$7YlLO98%q8|e$FK?e*!y_iungoxo)uA}Qx%7i zji34T#ZSaeFFHO7wK@jw?L7^KMP&LG7oH++ViGX&62#(8w0CaJZptL-xo`2j1)kBj ztZt%a!vyb_V8eZtVWkjx-bnc*-o!-Vg>KnnR#f*#C`bjt;9nlw#an`8)^hRb!PH^D zDplS!4`-W7x?(MzdAkdftqrEwnTwPxq^ivP?7J_>+sg>gBHXTg?S48<3~|1A3=kyHVDh%%IUGPnC^4G?vX}V&+A4IP2{i-nC zt@g&tw$VH(M;k4Urb&)-nDieg+x?an)o>3oA?a#OUvC^~H`YoP^_Pq_j$?d$XQ!jw*)*PN zEX)56k9D*QoVkr}>>k*xTweN&Ro%Lc4+R*vEtS!rY@kmF5&&yTF-|%Zi64_3$nIF) z+r`?80@a4b`ag5uAt`AC93ZQEVs&D7<&toPMeB6GpOe@4hk|U98|wwQTNyiprHt2< zEn_OY07ci{iKEmXiS*I*I)mZ#*Z|SNy0C4Awt4-lbMB3N!I{NsU#5C zrj^^Riu&j68WRk_s0UyK%V%?zmzLcD3aY5AOe9Ju`7Rc-t}li(rq+xT5+?of4_+F+ zWuQfQF*H3aTv0bDM(vvBK&iJ}p7TO5W?GU690idb>6K`GizB4z5m z)8p;-!QwZNx*>*o5n=Tns19J8WS+0#Sa1ByPp0;TrPg-uIW6F@<(4Y*+M!g-;kOjRbo+WURb*>Do*3>|8_-c4rBb<^+|s>PD>`)>ubZKW zTKffy(pkHqdhHP+d*fT|VpDqfMXI8|nQ}s7m zII}i>=9Vbd`Of?Fvjt9;nY^8ezKmPOP%ZFf67Av#kE7{M`v5z$XxH?Ws}MuK;7Zs+ z{zx!_EEHfIHvUVE+BJjqbl6MaQ8bOg6(<=WNIBwt`4gmX35{$Oo+9$o&UcPnH8gCa zcA5{DOf#FyFVuL=_SRJvRoW=ezC2m6+RGoXc; zsY(p-H{Rsi+WdW?swnwF^If1JO+y3(f)1c!_IT#h7^wXAZS5O`!DbD9 zizodir_ShcsmfkYTJ_2lv?zWh%j<_Xi6z~~=IJa;=f{-$Hn?rx`Z?mJ>P4!Z4qPmm zruvR|CXcDT*Kt_vXjhsPZM<5VGc!Fp$nTI=wg&Cn#&tusm!*^$T~{sq@U>J^Iei6& zph$=T;WUtxUF>=fkN@t6f6#%&>r^eqVgqX2FYrfUe7XUug`I~lX+j1i%rs5%FAU8{ z7{5KSbkJDYzt5bn#&5jFT#J=oF<-f`sPn0b^7_Y=P=1y2T#w6XA^Du1_G@2*>y}OG z^Ep|CsP{3mCaI>k6QXD=$`Norfx>(j6Zpi+j~vhOr>8ruFntxje!VgQm;G0u>h&aF z9GR(CWAT=yz@SSHNN#biii@L?4%bcPOV@sz*SbwS&%a1=GEVp@EfSPcnB`D6P59Yf zaZA!eaI_7hTC7wxCz5#%#lr`6i{S;-2c&F^9~qSTTT5zykdz_vKL$>A13dw?E9l1L z?wUNLjQoZ1Yu@Kz78}^_>%L6KIGcwf7uIB_#69d@3%I(ZG+i1p>{I)_hqFeJm=tfr z%?E%Xj6h@L+&$5%j$glpH{{aU&-h1hWqffI6ZW|d$?xx8By-ACf%ZYB>_X)+kq2gz zRVLqg`l)gG0gjD0bN}NPHkba&8C}RtTl?ot#X<_l9tfi|v_c~A_EP+N*2A(upa z{K%{beeei69Y=r8^27UAyYFDR0=O`Bk_k9Lbj9DttTBs3MzodYR@JRkGv`s?GpBj! ztn~$s>y~~MZg+1wRX7^xA7Fgdu>aidoIFvy|H~o!>PmMeRLFN2vg8=Uv*Jl7x5-o8 zWC$r^77-vv(Ae5XRyO2#mGuQcqbcMBJD7MM8z4R?YGE&Gd{U+MXUDl^{}yncw7KHy zU5s(sRIO-xuTTFwtyEkqL#9DjofhTg&pvuO`Ji2HP@HW>6K>9JmjYh$1AV)>MbIq? zQ9;E9PBLw|vb=S1B#GE+aRzhV38%KciY)?Hd(Fgm(PhCZ8Y zGDmXX1jrB(HyFU6Yw;wMG*j4J1$OiL-~QrG@w5{lMuO5_$ODRt>EtLd13=r=^sOWy zdO}odIihN5YeCzO)ntAko7L3wU5)We;aP>&!BUltygFa|bMJny-JkXwqaZ7Xg$eq90W=b7%NK>Hpc&`8CPG0i3<@wU@b)zgY zO;v>)$Z0elwPQjyZ2v^3%EJXe2~8c=c|){M!Q;YgmaymW8g=b2b%XYNkPQhS zTSq>@0KmBcN#9QiGstFxTsm#b+OU)fXzD6`iewBbY1%ZPj!6=2@YO}`%r;rY4wEx< zfm=Vgb5e^(OEGv^M@i`#vw3Z{yY5GOts;F;7UIA#v4F5= z{E^T%!ADXD=u(Wxs|CKC22E+1DL6v>3f&YqG#$(~s0{n^sN(U6Zy_VOUhbejAt4E@- z)fF%>*F`!iy*IMF2_h9a?%R?v;^~_d$|4bx3&>$a-!~+mt#O38dz2emHLgrSl(!PH zidy=gbKZzp5aP1i`iDH$N#lHs!Q8o97+;<5<)e?1K{}jN{aJ~6Rin!71Zeowj(LqV zuXI?ID+;taSDj?=B;^w;cZ)qPET$$m}RO{W>8jdUzo6uLhnL5ok-$6zeafs;!n4T1?)Ai0IGL$Cw&Pks=9 zJUDLvXwH4jllXJyFbcB>-sH;P zrZjb7#i1w2GS*@w7y$>_;6Gv%waN%#zKA%3K?9*YJB}4)q370YxCPbUz12ZzFnwhi z(}xbRLu^Ym>C&ODHUSyb0&+pqn83V8{hAn2LWKGqpfC!vl^~Jd8<})66>G5r@uX?h1q?IOFC*T@3)p3wYOyVsfP3&|$1 z29<#Ei`al7cgBcd!|tTWGO>1X|5A4*Lb=o`?Z{(aIw299a>qGxfZ!w@EW)_zGXnBg z6CdhVRuwA^;nx-Mxs2!6q)>Q*kc^2amVId?@^LtY#0hRLAF@UV*1)r4%7mz35Nfm; z@mYluQ9e^pCZ-DiDNAwb4%|T2Y&nXk3R$<5REDl!4$sA$qvuzok)bM|XQX2T}5kOQYTJojY zBa#p#NCPsG%yP3O2fg3agKnWcZe;`>H4P614Y4dFum1w^UeIng9DXBHaP_keWeFhH zV26j&L)*~X4$~8!3qbQqXJ!p9Cp?}x@@o{kIS-+T={yV%O1nr=#_}Cc-kvbbZ8zoo z$Khz`$Q7y>qK`!56 zLZxGUPwima1 z`iM}Ss#7tfZ7H!t{H9;!zGGp4JyEjI_q-&aWfLQg&7;+r4!&9Krkq$IYw1}GCg zmOrhrZ7?hhO~(!y{IT^SrlQcD(OFXhI7Lz%@mF63EVzPX&^Z7Fe0W3+cyp=)VT`Cj zX8Pshf@jvefXb5AQ$SgmAf>X%?&DfF<-?!!HEwhDj}fSexrkV5q|Rcs_UErtZ;E4+KKL>frzg z21ZDL?X{3vPSC5&gP$ePG?EkBhL@)-EI$2HQxPYZoFYyluCHnRWMWYpg`L>glHj6s2g;;SJdIrHZ->4Hu!g#fjyr$Anb@RoJ-1pjj_ zuNLD1c@Szf3?2?q8#2-6!18jIhCsVK$hnFCIi%+_%9lQP51z9f1RPLeGsX~UQgT7x zM^460LE$NgUfL6p)g_lb7YE`6R5?P1rs2+AyYkD2R_BgVi za}A|bkphu+R#HYTKGy{jN1M|8w^t7WZ9(+{_4>>yu+AMtID%-}+-acn-seCFaj+tM zBC30`jM|9jilyMB=Aa?vj#OQ1FstU^#}Zw2D^RhrC2o9 zXt!0Nd_Cz~?=W1bo;8@*6rL}bRoT_Kk?6AS>D}6&4ls$M?Ym^K-Erx{W@aGpcF?oK z>B_M|n3?_t2$Vul(m_ihr<(R>VU8$2pP?;AEL=!UzMg727kTOdGX1sJ6j7GJOet7pov2@H+nwXB|!&01QrxSEm$1mWO zs+Fof^Nlz??Vz+m2zX3uLFvnwR%~DzQ=25uFWnbU}rR3%jQ)qf512! zj*GrO$85p-BFXQU0b&d{0|BNCz(lK;pnSgciGGY>?<) zUwNjd|LcO&4p*!WOEsKADVL>qRWTRrOomheTJ`QBKmRmMKlwx$C>w3hc=ZDce{ur5eg9z5~?d9=Njb3?bmWV zj}kJB0#%d}Nj;hu2t?>bJ8>s=U&6IRh9F15JjNgglilm6K9qvV_Yq^VU)w&YRn~1W zf7xhILn<7+OrwimcbT0YPlnfWM>D-_8%9M=`FqVyAE`U*WTS(VIuA>}gZOy~QA6Ar z#iH%)`FL~T>=JnuYgX55>QwXAW?HT(dDF?m0Uww;6H86gpqR%ZldHwkg;GtjI=Yq8 z(W=ViyDu*DLK+(`IZi`QZw$=@KZRN`?<@ENCf(27w@eRS=>LMd@nfD_gbxl1`L!vj z?sbklta|5V<5~Yb!3)xpQx(yXwI&FcVb<(oqm^tXzt)?ZUmx@>80@23WED^58(wW( zl$Uy7=S4;#$K)TcAv4iV+~Nka>yN#EoiR7N{TQuEGx}gil^+J#WtnSlMxxH> ze%;BxIu*~)T4LinH~d`^na_2t`PWJhwvY2`xEeGpe>4-x7V^0~>!~$6*%#W04jw## z^m+Sb-+*iB&0y2+99){?xZW(VPQwo%Ur$Moqvx&hY8lDCKKXo~ zx_r9LUFCY&SZkgPtiQDGV8JDi1S3ZFKDu1bspql#)OZ6XKcD0CY5Q@XIYI4R5q)i) zKughyRHKHz&6cP3^>lT;wez!O_Qsy0oVt9!t!~9!Q~xA2i4qV3 zZ~tF+do;gXN}qKc$i5rAW)%6-CHcFoiZa!c5^EW<#PDDi`2jo^^cWR`jDzY9rAcMjig$A6m9M*w zl#r|?YUZ;2c!OJl+8J-WZB_VGpcT8Kp>SRzg)pSb7NfgWsjf%PXzs*p?wNC(JZQQS zz^ShSJA=I>em zl1p`<(9I)SP!p&0^^SDOkIQNqjryzj=Q1kF6_2aGdK^r-+jFPo;(K2TrN_MVK&xLw zF-z_|nV3e~lIx}+l+trY8d*~yyp>M;p)gT)SV<6}j62@Bb~bx0l6) zUOGh5_p{tXmZ#UhRGVq3v}%3)In=w$pS4^+yRI@;xKMYKXYw3rOILGtfWd^uUyqZV zq1lNsV_0{3V0U)PE=01jL*ZW2OoXm(K+?L`De~Eoce5(fBUQtdH|;xugT34(oYuD1 zrD}icMQ<(?1nN_@D$6pvZmSF`+zV@Zb(yU7pkZYJLpVSwIaWuLJhgee%R`pR>D*It zpmn4rvNLG3T$8F+*nn9)h-__RGRYWvx|SaRbx4x61b4IHU5h+R=-Y5 zOZM*7^w(+f0s_hzoeBE!qCV*JW)$C}RNuqO!HUVHw1#wsx5WkrUM&duJ?~5i`=pil z!7g~2W)>CC(-<>AN6Mbg+xh->y2q2t3BvONl=q_;=esTk`^v;fby`S72nrFs$FzSd zpuKk|j#>ZI88Oi&`Mr@2Z){>-tYeJW-}pMoFF2ZZ*np~)lYu=*yR|dtZCmI4WqLSL znPeBJIteIY@_w(-Sm3>JhPlVIV4`4}F?7=}6{U@=Pk;KWdSBPE@=Kd2sjF`y8(jW534 z>s206Z~Pw2POl71aCzk`{|buDm0Dk!N0+4xud0e{+6x<7#GQH2P;4Ce(o9J}p!1yX zsf;HsLiyt{x^uoqeTa5Xt%di8=?(TfKqm4#o=Wuk*1*BRvELLnPB%nf&3(-wNqy|u zk?|B(du;5A5rwu_S;4kqYv99ux1eac?1<5(^<>uMRN;9K!Ufn`lft6~-NX-}F~eT% zf`P$L^jpr3aFJqH?zC(Kt{$aq8D<{PL2c5MD{KE?hD>Qyc=WZI+D%irV9iyV@#Cs7 zJme~k~^cJn{`_?o89O-6Ni+nX4b`;lt#V+i~7sVY`sc_ zx4%dIWIih}{F{3(#&<_!ifA!|UUG z^V9DpW0_pPAp2f+CM*oDERc*SA`b0`BvyZIDIT>$*+l8;n$i2`blr9=h!hkMkg7Hz z{&XOSbgX7yc4e8f9r+<0?u1F(Je5l}uNuGlt|oCkz&Y9B06CrAn{94MI$V|6+nUq zA?b*I_E(fSyJPi&VN`GB=VhJ3HmM}GP~2EkobeXvdm~@@X1K_yT<&YXd`{+@xf3cA z_=~K5yRoS_&;O9T_PzcF;lOe!_abI9hq9WbYY*~-I+ug{7!nv=06gh zR&rC`Dh{`vY~9z%+@s|7J$N$Ecep2DUTr!xeV3A)?Yp~+`SMo8^hQ;Oj`xLhFVc&S zPx{b^w-lXcrrUaQ>LIH|>kB&XR!UZkRiEIpgP&{tqUu^c*YNOsONs3%kziZkRgLJ^ z3qr~#kdnAg`eH{kH^}c;DpK7?qdl@4?4PwimB^b*7akU-Z<_d_5uX<1U*WNjL)7ug z=c-_>CVoB5jpOv<3`38F=Vy1^$XJ}`B6Z8AV$BwOg}APt7c7!>j2rc96498T=6zoZ zC1ek_hx_H!H);4t)O+OpG&>zTYsHgO%6dtNo6oliZG-k~ntvqboR&z#N3)Nv<#o5^ z(v5WHi z_Tp5dvIEB!T4udbBGsSdBs>^#c-+?Ml-+e|G4dRSX6iZKAJ4GogmaYNb? zt#L^EM;w7MxGa4!Qc4XXzI*)?wN6axKorB~DeWK8bb)WkkEG1=KCknEj;U13{$Z_w z7);Ns>@-FZj34%&`oe0o!(``rSamg((EH&lYfvkjIVqOA?rM2i7a<8%%=PGcycqSj z`SprLv8|48tC#Rmq*;`fzl6_tr;t|~H6oKa{@yzmQs8pjNPY7-pZ^H*+aW#gB)))~ zjg_;GLzN`EI`1FXMroh?fxM=9XB?ENAWk4FoAkk!PSutmC(s|YG~VXf9RoMf8ft18 z$2u_qC+CFRf0*3SS*Gs`xlgbrOn$+rNHC@E?hc+frv0OY5K3$@^JUe1pb4qLP#YD{ z5b=V2Wyf5ibhtVHy^dRxr=`BO2}>BUJk%z5bRSk*viA3NJzVcGJduEI!Oe;_s!TuQ zZ4iFBv~qW!SD*Uw)r-aJ>tmr3M(0$lm!}EM0ih|ap$6v4l(03kvb+-S{);kFb!_Xa zG|YUs<&$Z(o4-Q1(R6*`-9AeejB`f{-U;>>EIp%>S$}t?eT8^NmD<-J;kfZ}KY_RK z>CNol%|Lf!yIpfKSn?tA1_XJMb-rNasK$oUj_Ma(xAV$arH%mRRnOObZJzm8{>ea4 zcbTwOcPTu4@_S-^VqH2sA!eAnt+Y)bt}N33XJ?5=Z97tO8&TY}PA`q@Ze^5#H2LL~ zb8Z3tRb}qPNZoatm|$;qZv%Gq$=r~pITz7}z#Rwe4rcOhDKn)5O9*tykk~@l~=yi&Sg~|9^t?!TKt95=C zu0Ok+JWW^*o<+&hL`Q00oStuXO#0Fv94*y*b|g1f{kJTGw-QH8jI31d9dZq<^pT|d zIrZUprfVD)VsjE;b3SPKWus82gwG7pV zwSNrney_oKZ|#Wo56-3*GaDltjz0c8{dJF#IJn9pYR9IK_76k)8}4ZyJo^>0Bu(z; z?f_?7w2WhhJBv z@WTE4Re6>bk!1nq7{_EM^fRpnG+stbF?G6!OD3N zQzd$-0dq%ZRjr7oAqr*^N~*hLah9!r_17&-8CYg>qn)L?iNyB4^cxO{oiDsDR`DvCLwU;f&ukAhD#C{+}GciB1I|c*r6 zDDbd^AzmRW|)r@mU zXE}V+&^a*CJ!=A6Cx)*y_HEpc zX0xqW|H!8B1{bv@m`twUaaV$O5xPH)=jSBZPxL0d$<=xGr zX}f(YF`8{62+Z=LZD-8m`+S%iXMgj4-G^m74LaY>$*lU0fU1H?m!d3`Nf+*N$ zZi7Ax*7Se{Uof?M%UM$VA17+XdLN$aA}7tY{Y0Jo4_5+ z8+2jK{Zqw?-iQ}$Fd+9=QgmVX>uG`yDNqE*?KAZ4q2a-AJwG}(pD?XE1fFzRndT4Z zzR`FuwX8uQ`ZxRBBv@HT?sjFp2u#KA%{8}=vK9#%LEoU^@?VjGMXZOUbj|tGQrAna zru(FMuyb(4m^q8E)v_krrkwu(tk@D%N3R16DoA9^gC>S)%lC?{K2CB)r~G8QK|oT!n0% zRHi}+K`XYl7z8s0mfMrjHu>JGmme9BsiEyCeveEg&Y4(V)uK@Ab`1I--9 zQv8wNg~Sb-JK5_9b3Toh4rdcgOLnaWg=7bbf(k$#v`#s%KEzKa`UMkU!>%4@dgA6$ zAkLtC8oS)$u!Xy#{iPL@(`i#aSk+}Tq@ z;+)Bwyybfps`IV^h5;C1Ph|I-JHjD)wt&R&RlgjX6GTWv!{vw zLQ=vaVDa4Kx|&sQF72kLzwecN8E%f4=W)XGmkD(*-X}0YzsJmV8eaMM^Zx=cY_f9I zS~(9ftd}T;i|QnP$iS{M5>(UQCqyuLsc!8$=1&}0A;@-ORN556^qWP41#{22-%y;h zMg;$jKrM4wlmxxmXBfGpwpV_*n*Q|dfmSD&U?k8=?C`B{u@aptdb7877ns){)Pss% zSi8o^Fx0^x*wE{+q0*LGy-uLxTU~Oy>SP3VbsVdAT;D%;_ZU}gGvK=w5>WRrCr8X* zpE(l+q;~1-*u3fQ+o=!=`VR6YIB2cW6n+aop;b&X<$M!wVr7=kqF7$}fJd$fz zvqL*Pf#drw^T6=#P7SYpG=VU2(1bYcA2(+F)oB1dT?ve)_$!a%92iv?FT&1y$_}*l zFO|M`3537+1##1C(LH%O-s*q~$nCm4q%v!Plax785>vfWGJLo z6}AbSBTJ6Ve!-aCM620X>}<{drwy6Ps!-8&J>}CkxqdahuZOG;;IM&AXZPMYHxe-P zX@l?(3NKxaR<|DngiY#+tTiAdmcFTwfC^s!kQeSr`8AEuI8K9 zz(`~bmm{7-XJ*pn5w+HNN4kfuj=}$(++SfDxzH>Lq+7{57kV%Or{S=%FGT<e=bBF(y1x!{*IQePaN4kc_KUv-(`-4zmkM(=j3s9dYP=d+J?3m)$A-7= z!?)+iSC9Y93Q=+zo9JqaRo)Fw8Jx4h#DPrOk!lh1y8oLj#H&8<2MGcFK9H_!A?3wtMVw)lH9} z7pI?dSSZ)>ouvR17qcD?f$3}eT&`!eG?U;Yi@=(lCwbD5LNuFoIF)F8oOW6pz_`zu zp}JFuYZw%MgPyiplaCW4q5TyyBZ?~K(o_SemKoHa~${-WK!KX9aik^frBVVY=^ z(}AQX2P!Cf*&QZ~)lB8LbbF}gE=6T`Gs42A7!j}UMep?g02A6UjqAwda+c;H5Waq} zapVFQ#WhlcE0=z=A>|iW%wdQK?T8bK%PoUHp2qNYt7UHTPUsLj?&lJ^pl2F;egx-0 zKg3*J-gSE^hvh39$a&!r1H$Nx-cG7}etU1`L?qO1<0cWk#X-fZe3iY+V}XiJ%HAC~ zL-eT`iCycKV}W+cC1~#rNWq`Y4-s#d(bb)+ec(a*%RxZEAVWm_yp=xgHdIb8%V%(y z!O*6ixWcIK$Z^zdey|s-85552T_b9vN2I6+DZku7w`2a8oIpUu%gUSbWzN zir#&lD=lPg8cbNrJ-1+--H`!-*jc^fn$y7xYF4D}gu8QMj&B>jP;`XS=1RWF{iR`D zETR8QB=>hQ1%%4HD$`pLXA4xR?FRRMsoa8NtcD+Njeip^jWLaJP?=Tpb)gX z&s4(JW+CH{o~O*nhFoY%A==@VySXe|xP6BLxHiO<79J_KDf>@(ADVK>Fcn7;K0 zJLAf^YK9sB)TvoL-rm>LUC?s(!7*wXwVfDN=)VkjMI>%EXj|CQYDJ`ned-bzk$5|H zIb#*7%>MGP3ZY*gbSrh&BLhr#9J_k7Q7HRUwlY4QV^;Pz?=U*I9*W}f&Y{*9W}51* zt$s!NpqzSE`S3fbYqdL9I49Zn0ZCjPVHs%$EQLk9Ikq{%$w7|$Ns!;(L$?ZRvOW52 z#?3Ywoif(Lotb(;%f{dsWss2^a|!xxMIjO5xjqMPfEyWy?xdt^CB76D*pPa}1$dU5 zdSn1Ig{LhZbZoWmA5JVktcd^})3Lcmh{~G}xu+{XDTFo!RLa4i0KrbQ3hQmI>}#JB8#@*qErLD5 z#0TgGZUC>Ve*ypENLy_SDQu!!Y3CBA-M%HvzB`p|IN-V78S=(xg|_^T{mluQNp=H7 zATXHSNjV3!_KFG4W*o(++2ROhg|&ZJ6U?uVv%lU`w)$(A#cP+nF&ic9xjuVeXGn)f z(?jPI`n6k1+SHZ==O8HWG(;TlxfkQXz_H(fE@^3T;-^-$KTO75j(t7bp7hkLiV`Kr zEs^8;-HvhY1S}0{<7H&S&awZL?~5yH6CHd)wprAhWqJ*OQHZ147~k0c@PAelA>b^rFUYEkv??KQ2cnqnXB z_oh0aC<>b*aGEHgtYQ`wN>!p9nrbmGw9i`g+lF$0(1Nl zfiq8o>o)q^`2t7C%y`fTt`3dZYxEyFoCTb#A+l3D^4`KjO6KFvppUc^Wpd~7RAsIF zRvU3zo3x3}SCw0cM(aQDS;-J3!f0_JPSafA3bzxq4X`fE#_0(?!RNcL1B$e%t50B6 zK0m|657|%$zFxP@EamgV#`$+D1TB0h(56<(Fr{mQPcmd2>G}45eWxQw8W}ZXzt0D$h=75RSrM9zrwN?xF z2p8bGuLJS~QTX!{Wda7);E}cVT<3sv1T=Thr`0Ab?QiZH`E~{^(Ngp=O_dUs+iDXn z5uxNX{VYmRmmi(<3A%$-(^+Yq3R*Gr?y&ddZ&|xHR$d1PC%`MKA4JlYJW@T_V-Bn;pZ-!k?x^U@JeN=U znfGGEpn4dZDwem*{aQiRgeQLH{_FlD(iV#rqiiX9Fz6FwN;ig%%gf~X!XVP|hl3HX zGpmAf2?cu#8OZ6NO^$UugslJd;c?hkqAir_7T~9SlMqEIg@M)h;vBay{YXXIbr&$r zo|ziHO2Mwd`P_JPOv2&jS?<0M2YsACFU7(EiWOQdL)_%(=(%qB2ZS2JGEu~3fa6|A zTZMm&XrP0KQ}on~0<=`LI`jb{)jLYxF#23*6@jJ-%dXxnpP}d^Bq7iG5N1ON5(1!v z<6(%pfE#J;zJ6@%vc)%~5PyA$z)VENdCwelS+K_gofwAPeS7*iwW*0|Vgxinm5!~* z?wy?-yE;}@c1&~6&po}nMn00FqZfy5x43>b441MBToIgA*Q;G3(TwO3B0>63^qjdX z>HFB*_q9ZjpkHzIp0tsbo_TEjcm}sh|u-3uM~Jh?K0A>bzCxfNUH%g2F0%#yK-|R zgs>L;F{JJCnc4H1`8Qk-Ko*CIE3x|bfor}d1~g3HVO;gPuBOJa(oLhLJ|JU3M->&D zJ*4X6#!roPF{U}S$vC?Mp*+NGW+)T;lyjbiaqBMKHST;~4u=ANXfwb_&@yN=*Nr9k zUiGgi>GPY#B;BSo?(E_oFb>9upZbuTKgN_^IozoB;WJbY zb;`Io#%mgW+J~g`71hKAp`yTBL7_owL}t@1oq)S8Nq+si?43>}`r(Qk{C)RO3{}MG z9y?W=TR}P*20PBe6$d5x2e8sGKV>1`Z=*qIN{xr_4 z&WBf*9nFW5h36RoC~y?JFv#N5af@z_hw6q>)O1n|7O~mzS^8PLrF3rd{U`QoBSY;! z9cZX-JGFwc;#7vd^j}hCdv(;jN~1}{57(ycn)4VCf#TPWUAZ!nAFSuV`E)+GjBcx5 zE_CV~A~k!ikN@h-gea;tW#Q0v=obRw#R#)5N`KW|3S((XCz!f7o3d>WOj3T=+%Qz~ z9jJ*LL``4m)uhBmO9-T0@lf)Szqr(XWkh4-%;cdpXKtCT6x|nQdWZNAt6n~NQRX@$ zI|q>0&N(ErZ!1#U35vmiG&3ykUx{qZ(BF6)vc6;EL5-<|_RS`K(c~S~_xyhjp7=UB zK3biDor>kYPkLP%tNVG?on4(bw|+_sPQrroUt;}FQNJ}t(_ZL%`6lN)Ni;BDs_pRa z*hgCd1r+3bui(7}H%!Q!OZAx0>4Tzz*=)40Z`7k1c~~7`F~Jdm8?$r0IcJ!N z^-9gE0A5KZ8c|qXIY^Brx#+?EXr)~LS;>hkXpPp48i1Wu>Z zGqLbGALP4wR&Bg@C{|gzzvW1KFQ&%-7qfVnzv1pu)iYih_6et{J)8-i3X;!6l%ot{ z*;a(T#RvmyP!F>m}18 zaO(;`=@Y@_dEgRLBTRrIR1ykQ6HEmj#zv7O139M0k*a#V^1khnl9ip!7GV!#T7VI;O`TMRlA_nQ-fIJ!Tyf@@k~a;5EVDRWFoImsHUUg z6BgnNxAfRfjP=gX%xCDM(6c$tl=3j1kuT%j=#7Cw;EU^zQ=egqhQtjDpVbGeD^rNJzC3ayn091Y_}-Rqdp6q=2jdFhEvw{BHIuN>79HSg7(OB zDsrt?Zl#v`ZkG-54c&yuQ0VU#pyU1S1i795T3-*ichT0z^g9OQyHs0)#+Cp4I^B^a=|7Ih=NAj7Z=kIuM5My+Q9 z{HM9k;C`7R=?kyhf)Zr7V<>juvAw?h5>#QkeiODK-|j%q(yn3VFBV6CS^QgD+o4Yal+n+qF-dv83=n# z!e^bMM+cWbU@7+*m!r@Tep;lToqDTJl$H&vaOvXgvaY;WEn_XkkR98jnHA!spsoE{FYaDqVrG8A7QC)hE4*$ru z!gosZu`5~006wv(TFLo{_g!h#4zvWE2|0b zrmE;g%Df$<5M`%G62BO}AyIk$P1`0I3UKmbJ>0h@A27X?(KGZM@tFuqU13AQo;MGQ z+C?wTU<@L?JRctM1nekTaY@Sv@uMD)3QEf9NXX8_Ho47whIrCmetQ_KiJf4wdGD+C z7@;ZJOdyO$h~uTzz|wTRgoBspBB=mjB$IWQ2p-Ixp)Cm6C+UXaHyxW#rq@Y~3V>~9 zK>YA6KNxAmUC%Ugd5b16rY5jS?|6gh1%g9f5wV+jYw+V++zfC$X-R$dDR(}KBn#-W z>YkAY5;+=sPk@=8Fi6*jAvg&vXN-72;7so# z=c+Y8I$#DEWWozv-tb-q0=hwGLAXtO54!#7<;QcEXcOg7Fm4sl(bf{!D@M65jZclQ zKM)BY%&p<T|QFFb3)&{>*`s6(8YDzD>M=9S9NhXiYH$ zLs65x=FrJmf)9QkOvk!7%>{FG%w|d#^ovz4;5`HSSqfg%+Ed@WYVichG8_w|2jGY*6tMmJ5eOI& zP{eIWl!}|5JpTfHRwTnwzf*jDu-F$wL6N9&T}u%{Xt;mnF7FX;tzML38TXpoQ)ZH9 z>n>*P88yEs5yt)w(?Sb7x5#_L^XHdG^%($(_ZuovFOBvJ~TI z@jlch9!$w4)~#Y>P0oi3CAX27ja|%#F|Od29I8izoNnrpz)pzhb*7>wOhC4wAQtgb z1_vifAQ>X-=grqQmet3Lpv*$@OB5Xk)VREqzx&lc)C9f z1JT|G`jn(epoa;<@E#KpQx0BfP{BJQR_tM=JPIv3!}?@YZG>g+%wU5@S-?@*no-{E zxSj=PkD<&}QN5YQ>NQb*@gu#-lZMy?)FizWm*!VaF_fF)l#o7O<5piS@9-LKYpp$! z%W7v4i7i(YU0$gt3c{^Lah!a{qZ}f;VoJJzphNT7BCw|cI#rR z>d&rTReZvn<@kxP`O&ESW@2^*0t5c_5$&5!`Qtfc>jYx4Cvmm7vm+#*n?JfrmPN4H zQG5d6!F@gM9ZQnB`MnIoDk*=Af_A2TCyd2#c?s(R9lwV6rm~zNB+g3#n)=$$03FRb zVi-eWph>(%(9wP8)LY<@oLIkl)h5eb(yEe;?>qF^3hlSN6`KV&oKAmMohPbyJK}hY zY2sqDEafnW`)+hk>`s#tO7lE+KXH0u>Rg#0*HnT%{O5$>eY12;4%B4!oJ;VILHV*^ z#}1kPl^Y3k5euu80b%F7O}npraKDYO?+E%qBA+EiW8bUBW+-fxMxCv zP&SCk{1~K7{>@j!3wb_WlUPRA=i8Spem&k-RY0#nt_9E-<(nfQUcHM?i!7%22+|!) zQ0w%Qq3Nw{`iffKruI~zYq6pHI5qV)VZty z1W&7XnlYy|V%8_Diz|k5uX_}xdW82#(V<@J4r_%q4TNF#*(&s3gqZH=$PPdIxfNyi z7SqYQ6n^Or8ntly^nNLtA}t$6b3zk7VPY*_-Rv_&JkbJFAl=S{+=|wF%+8MjXt-&( z1@W7J_T{Ab@%-Ix=H1M-^#kwYKKt>2RwwW#*+`-LQyYm_=dJ(mwzQzn5%f}duN}5# zHm5ymv01}Cuv@+9Cnan|x%wlrCz>GQvBJQs3&qyC6`OoX1w^40l0_D68JA4D$*mQ% zTpJ>}UekX3{`{Hug<%Wvhuq!rV=hf39$53dZ6>!WedNVaITR)z=0<2nM6=>T+;4wJ zdWB$g$r&D?5}DWuo{I1(j@1H^zH8#jBtG>=7%I*tC_7Kd>h~Dy-nqz-5A;{YYY7x( zni*)eb)HHRUzqz2v=LfnFecG}Zxfb@Mi+@ddCcO)nebdMX;Y;1(MeN>f*ns_W9@y@-EVr6Dg>`dG=(?l(nW$10&1XL}AFIr{ zDNnrU`QRVt;zHmlNr}P_hXm#}8%-C#y4ikCJC7G#5hO}AV2*h52U^<8w zEC?nq{Lusw_&qf3H_>7pH%BU7aosNzd1QU}iN>M53%^Dh{bZyDHyu*7X!X63_wXI1 zNmrNejp2=MNUlqb*SMK6mDt>a()RSaW}W)PGn<`x+8UW2+}$c=g@FrI5>@$RFKRkn zCK|%;GnnaBHr3ig$}8cZNQ&#e@~%@8xCEYWEh?oLv}g`NLbwXB&q|SGg|mXa7@pEH zMI^E*8I^d@iBsv}o0cZx0WW9fQ24y&+oX}o{#epP7(}v{t0ALk7<`xgog!|}g>Zee z9aGsIvic@7abEo}%FX?1{8YE-WTYw6neBzbz*?(4v8Iy71pbMP+m?Lj40jhZB8G`j zdJ}Aw#jnh;G%c=PgSlyJ!V?|s$(>}6XAiU=g|$kzT<9kJU`fmaN~}au;72Uh3SsE$ zPXEUe@dLL83py22mgTr_F-JhF9+|dY2cy*QVG4IcUDM+{%?0TsgWdLI5T?>D0c#_f z6j$Eo|pFa4#LD6beRTKjwcW94e&TL1bWvTn@Xbv4o= zys$?&qWj*i$>NKxd#w}PVv!-r=j9Jneva*Nx-JTz&bZfum+vq(?`v>@l&_%%72-tsAJa)ulmE%I+ANKs96MeHX|chD}MjOfFeBy*rx z_~)fd*Z&bOx!n{MNtm^Y^&$ts*mqqQbrO|w!XSP)I#kL`M`Ma|Ai=*qoJ#@Spx?{G zb6+_FGJ1u==GAC)3;}ecrW-_T9SXFw6yB-nf*MjgQd@K@^RmTRCk@ z;}-O7``Xdc)szs+aAOB1t=>IEz{rUfIfJ8h?cd*!eLGhUS=zJ8!m-wcRFCYAI*>R5 zZbDE28H{YM9*Ho~ZK($3CHa0Rdd%Z~5R0eJA%g$}k|#m80l-alUi&NBwsrzlTbIIN zz+_^brW@oUtBPTLGUv~ctc5r*eWPnb^~Gm!fXc-9e(QS2t% zoxXpZ*~*h({^Gn4zKooSge_QBnIhoYTcjqZQ@EeHflGSCp5BbV6UP&m36_ZA=w-pb zShmZ&9y=+ov~q`NK0kM-y>@fC?=A1cj*1FgR-l7wm0x4uoq@32XqBO+t-iMyw^!P! z(}K4|wkXihAT_vmz?RoUpsD2({6)2R@BLS|jb>QQsm`<}mb|K2wZMuNMX|8EdywmEb!H8xaM)@b|13N>!1~h z`vxrHZc^o@vD2(Z==qt4r#-U=tPr1Pfqy)_>!ESU24N_vZwRxYsLoDPnhP{ZyEeT_ z(yo4>G@gRXD3Zy`p7_+Tu9LT87r#9k0{+}9^NcJ2h@}+6H{>Mn1*ZD)e%yUaucDy6OpM{ zuJj#jd3N~?%-Uq+Lu+j0uwyq*YCvao12W!urwmPS0cqg{;6!E_hxVdb^Fn(OiZm#O zo(~xm34M8>w87kjNDC{Yt94B`qu#BKPL5UJZ$CQ@|sD3%WTVOvz$d}t@Q zuWQ`dEmt^g5m_}*_H&FTZfS4f2mM0-?7&lv0cj3-gP~cH`u)W1a15GTL%OJny`}LM z?Hs%NWrj2k6ag=u(TR93>4Hn;H-O(*r80F$lciawV9sa(*eCx8EQFtkSr-)E0xsnx zb*hK)hmkE7?ZxAMi{k3t=JO$s`Te+MihOxa~*e#7#xx=+4KX=aGKr@#=ui{~wA|+)-dnYEb zRh`qGHiZx4Fu)>Xptk0ueGuhxQ&ne9OJRdkdVls~%Do2{MQ;PTyX|4L9xx#1Sa5%u@Nw{sD^5pUO>RQXQ^Ans8&lNwX z|K`V`vjd+!nAc$2l^Sib|5$Zh%rUZjjIKPa0y)7wOk47hxCS|g7_95%=|N|(4K9!| zB`@ACVbLmIp5SS*5jFmUpPg&T2SLcw0&(x1%HTtk&cYv8G`DEyg2&bN0OZ}nG7wGh zBuWy&=I;FvRk_ZyI%8Hn)(rhke8aijIO+Dx9Bd4T(mdQ*JT40*-x-umoQU5xN;rv< zGHW;}jau!BU!I^(NpF5w+Z-^yw69{%&8t&7qc>hWTHI*t;rdYXnT}@aa+kr(v`hKL zU3E(nR{NBk-g7?zSZAHShMQU=Ovx7B8}E?tMR8=MkpOy$Zt*eoPB#VJWz>S20f)tJ zp#2tD_|NNZLg`14DDWMnXJ}4$v%qwDMTHEWRvYcbOo~Zg$|-Jj3-+ zlgZfxvW8fj)477rw{kKn;&ZPXE#!%`n_*r!bX4;X*EQyCYSeAM$yJfy-WYr+)`-;zIOD?aZ`u4r$@ zZP~|{h>K_WsC%NXPo6|Y>(ZRq3FBqf?0ZohS^7)g%yq-q z(rdw7rYYRQ!k0d9DD2a7q#r?O&`v`8DM2x0&JN%tvqXtX$y0SzHO}pB8%D3v*M{-% z@=6wJ3YMv8PEMV}`aPj5c@dc~tTAGpTG8Id+szSC_7uBkKUq#2x+v85HZL)Fg1_aw z1;RZjT1Ad~4Y%fwGydtW7uI82Ok1)MtUa?wsmH;6y&L)RYGHS-?HhpCJ%CjHf>{j% zXj+KR7LDa9ef%I<_GRx~=U|M$Om)pHBV4)A8Zm*pLVpPL@DwjuSvq$;MG-E_!t$MB zj+dW=dW$K#n~ApcZ04o^u`1|W`v$W)exs_RZ*{-<<8?!CJ6`=wyw z@U&WT(?meI3uZg&>*WtKJkMc8F{;y?Z2Gisd7ZM{enfCRC>_MvSlnPi zJ=EYgC*tACubE5M?yi`2nRdGtz1DB3ylswovECQ?m+keAL$}yd0M0)fYbhs;Cbr^E zn7Zsx`aRHPV&nQ6TAHXixtC&GQWdN+Y9-0;Mmwvvt3&@LM-383ssih3yTBX{P4+f zbne#>J=U+#M@o*XdhUEtUj~!@{RY|s(cwmU6$9*UPE?|LrUZA9$kP-K{b=1^T49xL zRch<2qWhm25E=z#4^4Tuo>g7MpwM8$ancH+zogW(1J z&7wh{ug4dPGxY-NT~9=YYpa=r9H^)6oxlZU5r4?3^RfbBk!iif98!uW1>x9D|2@QF zCB7!ZPm+X)sRDnNH1Rq%dB_)KvXe zBX-^5Yt*88Sb1MHy{ zUJZCsX25-k=UrI^d2IlTCx1}PZrMB@^yv0&db>!^ za?=Q5C|eml`qFau3`iDu^t)Kt-qW1>o&$zRVTSfRp7Y~}mA9*k*2W3&sfm*-ONSeS zYVudp-s>RnmJu6l9MqUBy7DvyGcyn-Jm)BKW8ab7zuDo2C^a?4U3Wq$YKfMM&A&+7 z&JA<7Ff(d9{4tN)&W_s6t>3$1P1|DeOA{7c?&4KO!hGD<***n0j#ADR_R);6<5zyV z<9(rl^8hg9jQ(Mp!9{Tvd;A@FHh1(5#V20JR|ncJe|U0jY4#x^ifVnvp z@xvxGX%)_Mj`0`ay0c#hlCuz%Fcjy)XSK`c2@fLoj);d~~Y~e0Eu9JHUO;V#=T;YxUyu5Cv2C2*H z@yp>p8*}{3MZm_&6njF3v_ba86#);kL+|Y!-%NoIAy9cwzyurTy%fx19Lc3;h(x%w zjvw{%UGKe)tv5|QF19N1#TG38#!y)tyJt?|{IA1(4}F71tq(g5jp|J?`{Bwh4L*jY z{1H7Inl331{wUa$JFwXlruwvLPiUPCdA95>ypwUuC9~2m_jbfyXr|tIu5O8^E__W+ zJzQ*V6UA|n<$emcYPZH#cdbcHJO(PpX`QpzHJCxtZ2JAJ(%cC(EA-yHb#`;BycO73 zEq5v;i!;6Drrm_^T45w*_XR#M2d=Vg;A<-1daoHdTD+k%<8%{DT*WC-9%fld!yL~h z=pETS3wy3busfAf=R4ldR1IDo*lSuaUY}N2TqUm3?_PDssIITdQ#a~GJc)^1VtZv8 z@3Z9e^#iSY=H^OY-9je1rm+Y4)F2J0SFGKzZs{AkZI{9(-mm_nT}D~PqZFWlY<>f7 zuY=~w>a;rB^|@fK_4wmF6E zhI)3hom%v>EZg<|fGm~KjLJkBA{)mO0s2)~Eh%kIH`+QSd5g=egGG2w`pV;4kRUkSJAWGO7R>(u&LO9-i%ug>ja5_2dlM_7{ag z(*+^Lx1Qj`Sf4epTbhuE7r&xDfOjObg(hrOEvqXuHl(`joG0bIUZ&!*!+E48rk}Cx z_DEqfQFYZE^W349SKRh3=Kx9e6Mjvz2lQC3H>TPKP3729 zLdt67a5P)DN5NDi+iTj6pMD&u^XIUuOM>EGmD!(Lap&Tzk4)nF)^uI76zi1a`^WM4 z@FUBfN^u>E#WjgG$R1=5mXZH6Ko>&j@)e{gXnEkh89%xQi9KR}UoO7H<>p(=K6QDv zNz-tozh2yXJ*i$!F4~$^Ijxw-Iz6MZQ4mAH6j7 zv2Ug`I>m0qWrlAzfjF*;aB5Uqn1KS3q!pVP{A$>k4@3Kb6Vdz znos9S?({)r!r&8poZ+EOgU;qUc1(X!uF>2{YZ4U;4Et zYxTu?l=2&Qe|~lsDOcKlr4)E-`PGZ}+($Rj!n%-od~8j#SNrN$lk;)pul8L}xXtQq zzj_(x&}l9c9fTaz488neJ$(plng-u_$7eqG2gxwRj>4e#c8IWb0GQs`gM!yF-RsBKpJiv1aT>dv%$|$RTVy~%0{bTJqPnFu?YQv6v2bLd0 zp{WZs48JfMc^_5$AoOk70iwt1ZhAeobLN>}J@!;b!vn5k(o7G+J*Bl|vJ#Na!aw*K zlKLV1yetdL*RcfgUz^OCuf>$NIlns6GP`Dv7dD>!*}hwyh*PiNh4@e{=#%2^VO`VH zZse7=2?w0RJklEy(>NSTQk~>f9_94Yky_zO68KITW!KY4iCX;VVOOG*n-v$`Y?9No zwOSY$_RzANBs&EO27OO{Y*4k}`6^K5W*v?o-x5PgOMXYvwr=lav-r)*iHol3- ze?68NOJP`w4isakU6PZOl$Nc0b_XbtZ<E`z!Im}~hdEmpKek;>jGPi3VkRdsT;KQ2RQCS4D<9JZ7H)y>qp zjG=@miaI)y9+%hNC&#-S&C#terXjZ*_qSNyMkV#!%F7j>CYd-k+O+j9Pkcix7VoV( zOC?Unx5dz)BH>4)`R~ay{H}8}hGomPB*CzTDgH(Q3kzGQm5B4$sv` z6CTl^Og*<(`i&^;5}RA;Tw&=C`uuL;B6+RD%wI+mERj`>4`qQ?IPI%&WQyL%tQT<2 z`uibPK&bq7H^-~roME({IJ!_H=Ht&W3H$4cA&MbS z?j@_;ssGZ=!jdS3;1#beFSM@Z{Qaf7C~R|Ei#ec3C%NSGxF@?JFk3&?FBUswc zbFie4+~Sk0F*|kTXH;SL_*PvX-vl3X^lfY)H?BdeT*rqwpg>|hpROVgRxKHkq<(9QGU4=QwTHQy7$xbz1-7~oqj zTwB&GJe^s^VQFa~*wiKbvk39pP<-c?i}=op){(K*#SF5%B5M194e~O_Q#K0>vrkeJ zVufw?in7hUEcQY^5_A|Fi}xan7TB4e&9h5b^%qgcZHRmDQx{zmyF_x`|56{iZ6#-# zKu{-kk;{5F#+AxlZeh~>LErZ;5bmTo*O5;Mgs+(u@gpCEzOxMT!HSMO4pr05P6}g{ zv!CG{nH==wFWuU!W0&{XrHI&H|KvWBduZ4#ls@`(;kD{Id4Wfs_Z)kF{-2e#wOtwh zMFC6ogA(!Uf;M%Y#iw`si?)B^{)kQx4`gEnuwLC=GQK3KX;E%T^Kp1K9-`a;ZN(sEu!g!#oCWr z=P9?W%126axK{<_@>!6Q0i9o$u2u#$RTjAi_B$MfJWaF;`ks7XH*LY&z`{(-^I?%8 zSQpD$7$SiRWhGtyB`p^!@Qf{C=er;-=I&wbtx}_DzV^eyl~;eC7`i*WVKkF>z?~_a z`O|Y_MWDY zJNd%R0e6XU!dpmArTWhLHMvmM@7>d01lGIl-_1K(H7^zuQ0ex+!ya$oht=(NDk}Gd znM7EEI~Z=GjVAQ`c+Ireo$;@{aw=B;J>VxifXaQwu+Z#ziWRXOOt{&uX z5H~+J?)E2LOUq)SMck~L?7%MRUz0mMdTb9hv;Nk|I+0n!LaXD$?J8=q>3_$TLTuL& zSx~K|J>GVDw1GwZ^zFN4#sn9=f}~|+RdOB=uah#ZT$fAdz*{yn`5~MoRS?x9W2*ov zhPX)RJztM0~c3EM48-d=>^fX5xI>{ys}Pkn|njKMo=_q!wnVc-X< zU{*65eALK=a$1$2Nl>X|RAuZuXd{&9#y_Qq6=_)Cjd!(yPDLvBg zsJ~x%%`_GJUI_LZ$mYNMu1SOn2n-e|nliP$f3-n|zuBxGxxt`L!WjO*e}mz0tWGbZ;~+tEi&LVMk*mh z)XoL@Q!(%dIft=!1>#XvP9;S#*5A?bDJ0FAL%_W?-#Tp#x;q6n(~XL#_Mt%p;>?I# z8=*>o9yr}+WmdE9?j^)EGbgM5bv$CEIsWGoPSWHgD~U-|()~hoVEuXBlb7fad?r@q z!?L%!e%2X23zLGo^AG$q=yq5}!rKtUWdg{1p|ghOU4G}C6&&h<Q6L?D_yuo z@7gvR;u1c&{QktNtZ8gYWPL(4ismN+qXHvRCdutkS_}{L(zhLqKYYeA|>ZD{&849-g;#U>dk@o^RiblhwwrdtGEx;8l@JOX|+VXuMg{`^vxFWJ!DaJ~%e--Tl zM~pwst5yT+q}D{Rpby7~*-mAJ*hN-yzX)>fyu27lMPd8I0r%~?znj>?o?EtjyCq~v zHJO7eenQrJjKuM05Lcw&FE7|CIn)sd5i|S2`pTko3ZI-<*o(J5cDKT@|Ey+isOlgY zObR1w;&8A`;ZRQwvQdW1WYg_bkZ`XMq*fh_c<4ovM#h}w-I{dovzF8p9!<^XF7cv z&NS@Emx`kGr%_6;BUR3AB#T!pHu=C}ZY7WaGi@UlDs7-W&S7ihQ0FzUdQDCw8tlfg zz~qK}0WK}%q0IGv;9tMc%C)UIUXyNTrH#h?gV2y>JR};TcxJ>I!&|mCa3uB_-Z$E4 z?$Z&_OUlSf@Kar)Meuo*ds!rb3qJ(|e)AThu9OQk|M|~dG_Ax8C`QJB9{wD>M*~sz zEL_S%%Ry2#Tng*uXf0oULoR=2nj)=vcPm85X0I&Ab3aR9HbRE{)O0)R@5GC&Y1Z-Q z5s!!=1BIGb|9d98T#OY#x3m+^=`yl^BvxrKnTSR*rvqbTy^Uena>rC4H2E&8nb2vyi-V7eZT=;IF3r%V)UC}oq+8JE8k@ii z$ZQ=QWZ=PpVPqSn(_W0ujLZFPH0|8T1oO|i9M+`P_!wtIGHEd)9$!7?D5U?gO68sp z{J0i{Ta7UjnxIFDoJ5PDLJXOBe+Zy)+8;7N^}vUI4ZEYHUCswt=*DB_7W%a9 zbf}ulGimb94?$gE*O7mS;bia)^XY^hBjStB-V29&!NWZM`^(e5WnBLID+OB=!5oI* zFrBOiRvA5#PMtWSk-rDVE6HrGqFuQwigx15(RjnA;SJk#0_X#)_rLHoxMn6qI&gOI z@i`1UDZGuQ?@N{77anU8ziD3r|K~%KeqUyf?pUowU@Z2CxkJhR(gcO8dKE)l`Ft}A z3LlC~?(N1uITrlu=kq0hm(5y5;PN`Q$Jo?YTopw1Eo5t5c=P%rh=XvcL+g==wj2FW zYn>?J0MJ^3JjRMl{Ar+29z?JMj^6pGr@h%|ta7I^uf8QPFqldjevh~%@c-sq)l>qH zrSc3@a1Tjg+0cK4u7Ft+wkCVhEt`9l4bj5SzgumvM5sYnrHGzajVsvjt*iEOl9uUw z?8&g0Hyvo$1AIs^EV)-Y{YGdy{+H|%uO`1<)`>wMj5Zt=J(FvXZw{dP_NChEDkMHR z^LAl<$nNcru9-RVE_Y1_GTyng{ZM;c*_X=9Kd(M$k=oV$VhKSM^QQt{{9(T|(;jEC z&rNMiJ8XWQ5iS>V7m|ZuRKJFk7RA1V_IQgwRa-V7Ya;jRFt7i1^E=)D)3r=stcwEMwqR~R-0vB<{fb1>ZGM#AjLX1 zuYRt`{f2_}_!Qw3!1dk}u&8YU976Q@Z4>QrdP$!GeeH2$(~tys-!Rb@p$&N;b#rg;FuYwsYuJJLhyWt+3nt>h|8dN%~G zW{#9%8f-&?dT_&kKPasT<8i`S=(NixA3YjnTYFp#BT@$#)yN`_;a;sG$4YFJiX(4loMn)dVG`Y6yvVNaC zh>D@rR4!)6DS&mM7I+bXGVGBr$SI8V?OLolSbqkWo%E8lWOI>WB%zVT)1RK1I+J^K z$23H|yh?Da%1g6#-iVhVR6th-jWWw$kV#;=fZ$g+F#a?ohkmTL{C%3h?EHF=^S-5n zOh6^Wwgx!ia!H*;&+zQVd|rK(q~QEU9j<*O^Cv)|bBy4noDZ^|>l{q8%XhBJm-GmO9-I7ZgJKXF4o7{XgZ^E5oS{;+(vzOa+Ri-EJd4 zlLZnT=5nuUi1G~$FK;l797z{<)+oxw3|>H72?!Pk2Q4-BY9T~j_unrWiGVe@!RFW@ z-Q2Nd?)sZ=|0+Lb@dv(Qzb=;_fahw)Q-F{I46S8#hH(a4pOi4J3JyN3Y5eB&40tM8 zx_ZS>!apmyN z6wwt?oUvXl0K-@7tx&gaC79367Vp-bm)`1>_H3PN%BvriD74$)QhU9fg$#6|Fd!6| z;XCRAd!GZf1`RcFEz8JC8{%}U-;^t|a?ve)VX>b%R-EUiOlZNme<>`w{L&vrMBB|& z0%j7dF5Ql#_IPU0m{k4YN&r+JVuWtg+qb(inEJQx_Q)g>n~%$mSeS+cbsDO{&k-C^ zeUK^cY*IfUG?L4oV;so_&T}VbHtL5bxBvbH(~y=RD!)f`E;@8O+NL2@LFTP<3EzZN z%i1ic){FOepu+lBj@sc7fEIHJ ze_7HOIzkM|VfgI!7jaJi{m!pUM}L@Cb)Z55*F2)Qd19Zk>*(*;pE6q%>0&_Ow-6~D zAiz=VVXjO-*OC2^r#I%Y)mlfkXy4-)V!0Sa;-wFZ&p+pTwLCsOR8`Ks+97SX?D6d2 zJ|^FZaeY^2ME&-(;Hjy{R(GuYM7-wkY-m!n&+e)8%MQ)dp1UWug*OLw9iOE3SgqS% z3KigFbn%vg!#}w`g>!I_td66oAl*hTALP}G_lgs(ejCYl2f@L^Q@(cz{Nc_>mAB2~ z(=HWZ<{9sxdi$)igVC=%vmFFU(P~U;3nGjNt58T=t?9Zn<2V8-*zAq|3DGl%wnsjy z2-9uB5%Im(TUS>~Qp7*FxdHBnNgbM{TV$Ne@s$I`|N`%nd`WBiOZE zvw#!cwON|6*XY`jY@qf_}2{g%1B6HARM0u%%`7^P~rkiLr|ZRdllR6leaVf zbi37Mo5XvmzxV_%le|5JEL`T*#C0Z z>%DX7S$8RuB&1vU4*G97?v~=;aUzqjn{bP8Ys<4D`{-`~uKPegXP)_5>6_VKC2_-t z1J*}wtX)!%$@QpIfU-8SRK?Fe$=qBg89_C$RK?7~KO;6LbQ4yTi?i_R8O8newj>Z^ zL|iGvxq8bluk={DJUAlDN#kDa_X@{VZ4D1aCu`HtYSOtpMC-M4;CPAIw>;+`2W;ev zA`R~?ff^!@N8Ew@Bx1&=7q0TJcg>*b37L(adXgQsT$%zU0{5@FxCeoZqTA{B7M3b5 zs397G9eIRH84&0?mMf~BwnvEh1oU;BytIo9UfV4$2PeO2Ya04=F7XLymINP&_4g|; z*7O6kFaY?LvHtGfD$c_4l$ny;NbIxR-H!9Hw$L7T$}v7O&y#*-FF>t2`=a*^a*=`o z=2`ex;LTI}tM_b_=ZD=E%O;OS(Ayx^kuEO+4>b3hk|7spTEPKE`=ocwF_G^hY}-$H z{xXX*i2Swk{!V5nE5dj9HeTo@pF*hV+JX|+#-ox>8R?%WQG>?)R;x2HKZ*caqOmTV z>>fQ^k`-=WX=++*oEQJDI^^|Bg6&2q#iV#hJuVj8QB}K9i8`QwL%I`KZh7DQMz%%2 zX+!DwviyL7)ss1PNnOoTBWCQDTuc^T=|aviFF51q2hHf&CCM+PL(bq?wj0SI^ym%2 zwW-DKT$8*1Uvhg8`ZN|!n`GP2!Cy^AF6J@a&P8utsbYb823yA?vMxJaVfgC6a0=s1 z_?KWd2@R_igfjsX6K1D7|9b!Rk|BOZ1XotvMJlh!<^OJ@QPG7&Vxv8-Nr3USrg?O? zxFXq8wQ;?;uu=$Li31l^Ar|FDe)f)#BEOWWgrQvaQS0xc{`m{)ceyYBt!aoB_adGB zHtWKSPP%tWN1_CyIgPE-QIW82Bg?QDL6Q6AQ|XGF{*Gk`rHxr#;q<0#a6=$HbT5g! z+Dc?3ePnNJ=^2_qp=B-CJ|A&>TJ)0S0<9};gycybb38<13LAn4hBt__T^ZoHk2pb=!go$lGOT*)Dqp9Nd&XEiIra<5LP)wRg_ z**|u`;p_OqdjN&ZT6gb=+1WeDpHs}zvE#Q@fqaS(hPWM-XR=$_oeqwkT`#L6O8DFA zS#{B~Aca*h4zn5#&`t$)VlgqjjFYV3rc}BWs{MMYk9mJmGD8AE_WQu#J`guM%(~fn z(70zn(off72#z{u(7>(Dz6ry|{`9sH-hvQnAv_G|y|8RC-xdKl{GT-k%kh|UXum8D5baY5m45%P!n*RX-ICGyLe7;ksq{1pFI{-4 z_6zc^h%0j5K-P%$&JJEFgpP*1_mni${glgxa4-_~4o3?N%St2FaRyEvhRPo+2r(C# z{qj@s82u+z2~*CnEwJqPbZg5+F11IW-+xItRN!)zGd`^HfrJ-&@m>kvOsoo-P)-y{ z*3PRCpXcHjLXADj6|lsRwom&K>P08_syVz#{&MGKv8TtKF1sKZk^+IBKs@EWG^L#c z2HH9u=G5Wvh_|UHt)G`i91Vwd()}v~^5G@$xz&Kh;8|c}yhI7_7lWzVQ0!)tc32g~ zb@H3#UazCt&p=cXlwAH#X<`gi!o(8EZ>?gQ2@bP5=HmIsli9SD(A;0CewVfpip;H- znWgp|c;dwKr|ykg>InHP>4rK$2L@kv9w) z4VbTn(z`n8Dw(Z2q$r?7j4>(mdu3Db?Ni5>gKP+8k@HY0UZUJLaH#Wj{ta6!EZH2I zK?ji?o^U>AFHUXy<5HEUT)Ri-7-bN6od73DH53&j!b-BPvhDL8BZ<>gGnXs5wW7`rAG?g{#8&(|1a4&=a|ZBSdaA4679pDwlzh5kwG;CWEne@h zJM}wOIGvYFm#jhnnbs7DDa zGmf0flNrH-ZY|GFQ<>Goo%nPfv@BOI3%tX3DFk6$5zD^;$R;lp3Dn+RF1T~Zpxa~h z%jV@?ag}S`jMG5*`h0o!r`;wS57$He*rI{kbCX$a%A`i)1_ybOoMrG5X{c;$;$yM*nH2)~JZS ziEo65{l;FN5Xnmr3jUMdQoG?LT9Snm7D@`$F&7W_zFbT=%KG(N`3ST0X(dfj9GNzt zaZtV#)aO7eB_mpXR8uMgvyQ5c_&9)$ksBo=kx`KkF5Wh z>OJf4A|l=&-|5V#0o%!V0vCgy8ph0O$sF-S#*97~c?X236RHR9({18-1Z>;t@EHwE)XSD}^E%!<# z)=kn)X58f(0r_o)U??Ox+EXdz-8A)}xWBmssB-p3fRJLKKzzl=yHk#YkPI;jtj9dR zUMBza*0*f19s~K|l4WI;nU+%rwb0;pdpVo%C)X_}rK3MTndA8@t)5nGVqd%*wbvNj z+TP0AIn27b$3Im@INNulZ?GN6GL{~eKR1(mEDVl}9v zlZJU6bJ^4DWj-x1b&tpOOUohJ&YHSki|C3gp8Y1~O0cb~l;_pk!=1xMN0Q&&UOOab zMsDm3>)btZ6>pZAkP_x4_i*AFvICG|+GZbdzqFgM*UO)`bwMuuSSt@rz7vt$+odLR z_hBENe5#!GkVEH_Ill~js+%amdYVTr-_`rsm|?EKMFS;wp6e|&Q+uA|vgQfB+vVn0 zAcIz;Y%UazVnCUqBl2wg?wMWWc2u|XTXSe@SUACHYIY`de=4R!YzGD3?Mp%J__=Tv+CK;j|ys}_&b-9!ExAeqwnzV4JQ%*R`Irwy%K%GSRPwsQ@ zO1_zY=W`jw_SN)JjIh(o!Rn_g?mpAZg4;|ZD;t9FvM4z_+P?@bop*;-us z*N*LJTCqTtTwr1 z-TQJc@+;G&z43QGO8*~w?-|x)+O>@aQBY~N5$QSx7!?(y69gSpj5HM@(oqnkcR~-y zOi)2eqDV&tDM6YTdWoW7R6v1%(vc{gVCVtDx1uxe^SuA|pZ#MW`}6QP6p~!`b*;Y6 zbKSYw1M}q_qm^z#gCE{Y8?Ce{>m5^@x>iwpbDZ!-TUo{9ONp2R_4gqLq_^b-4$arH zzo7)G_%z)G&FlRe8#onct9#!4s(o)0l!A55=o`d|-?9kM8sz{OvUB!0KbvIdq*A8= zHVv&<3#npL!x_Ib>DezW_iz|#f>N}5{2s?o;`NL-CSr+fSUzkg;4>3Yl(zURD>!oU zLL1^(?;x)1UZ7A2_I(^-Ib>Z@kUrqIJ&0iDS8oSR% zo%c%s-+%r#Q!qqA?e}Wk!uc*RA5NI^mv#covpA>vv%iDuy-sn!>b9my^ecoP8X|#f zKK_2aqkHDNv0GjkPe~OVLvmSd_6;1PP-l6WJJp>0)r8b!rQZn868TciniLCryC9}2 z5jxkkmgjA8vO)NG#miNxkg-l7_mJBUk6FK9K4>VhXWz1)ijURj_uM@D0E{Qhg?jK< zy|>54XGLuG(s(!4| z9v$~D1#o?M9*g8vH364y_RYx@3zfC_NfmdE?~@jDPXVEN9dW;Rs8Ps0=!34R``5pP zR>ym-{W>>9Es|oCoh+6^hU_5SYi_T!hcjgGfF2IbYLc!M8*f?_d~+3SpZwrwin|=n z_VRBy>$gTJ%L>k}hD;CIsG;aSvFH?4-P8c}k+1LV>?+_S@SvsbAtGwWs&z?a&)*8= znjJSh6utzN#&+SrmO1&M-`0B*p(fi^DY9(7F`WXsc>I@dQ2z?$4&_io@N%1GXo{Ol zJ@e!DQe0bfR(KYEmqPP9x7pHr+M3_&usje^O?2U{ibe{Vq{?i1dBkz94anU^AuY5Xr*$U~j_=)|dNiWMniCM(O z)>e%?KOLX_W#ai;Dc%slfDqp}6FXq)&Hz(q4EYj>(>?CH7u2r1b9tWIDDUS66{y%M z&rY*@rz?16nq?iB7nYE(bb zO4IcC^a^FooQv{U`+MVuv8+dLx!Wb*?l4z2J8rJGL6iLBwvp!Y$BI0arhA)g&iqe{ zwP_(vEQpI%pgnkJ@}o51mcgcGbg^)uuj_yMj9efI*wp`S=9~b%DYPE;Lyc;_$EP35 zG51t*25#yvp4!#vIOgIJi)j7Q+>kmmUu}_(ceqUBXA%`5m|)s4#KE};s!wWhdo@s$NlZRa41 zg4o^Ij)%xCzcM6=qfY>1CryNpAG1q5*yc2dUeF2_{nL zlu)1#lqrLkC6bY3K&#`pQeND#KRWvbVjzcXT%2ruqPf;8rRgiG9k4Zg%iMPZ?Gpx) zY7Sx5?BTgl4@;KuT!rL{@%TJp#fhce)YR_Xt8yXfScO~au?ht%*WPmqb#6iZaX$46 zjZ#Oer*$o2Et7@yax1*9&u*AY0P{(>#c98R%GQTK7SRn5nlhcKGPHtDS%9L1W`wI;HjThNGHdREwip=LV@B;CT7D;#_liqAa`^Jxt@pDk z^XqL7`kS3=o_fB99fff~P?meURe`OUfOA@Ltx4G$xZW{=!nU7h?XV}-H(KmY5XUb=W{_EBPgvJ4<(qSx@32O_3j2xtl~^X-WB(!Ju`l1 zfek%M5QRc@y4h8G*YX+HdrEsoxpg^#tOwaL6B8S6f`X9f)ddr$mo0uZ2g-nxxj;P8 zqJ7di0-^mT2$FB@@ND_mUfQcnu7;HCFDE}8Af$jJ^TOM>X2mEyW0FqC?w=KenTDU^ z2TmT6cLn3kC)m^<+l*x5|IK;=aAwnp4FkXVkLxehMT<~*DkAyC4ci#kho}L#n+2;8 zva(K#yg>cmi%n26hkB1kjSKLqy-tFfl4{a0WQygs;p|z@okh6*EEY7c@@t60IS&e% zRb8R=U9`l5yb|Yn{V2xay3kR7?6w9|lbF3ZR2=@hnr>t17I-MA-ufVDZZ}*9Iz#nY zH4>MrlZlf1dtk3Qb1cqIcEI{w2HGB(-|`FY5G}&(WL_Uipg3j)D-~>qFF!Sfqk9t^ zx@Da9_M5nXa)H@AF#E^Q+^3T%#!^p37psA&u%R7y`U8%!W%;+EUE-CdPfMFcfE8Dg zhk@VldnPs;(oP;T_drt4ew@Ub{Hu4o4K@IN+{Tr$wNJ7?OXvBvWxgR{qEawa@fBxz zl?}icK~DNZ-4PGqY8X{SoI(2(kY51OC3I@7+x|@)A#+E*`Dx%fwJp{3x)PlJterqq}gplW)>{{BmmNF zGEQA@4Q!zK*=#KW$8{QFLgZOcR@YM4@+@v9-rQkz%}FX5z4h6{)q&n2*Y`*Yqc7Y2 zvi^IO?9w(xJS+7U@kJwNm!{>~nxqvXL#vcq9caH$U5E*#6-e zH+xfn-0WLq3mZmvgKwpNfA@v*9Pli7&JKXt`8(N)8mF9-k8=>!e+FjA7vV%uAc+o* zMsyD~WmPE&SPEHg)zn0nHOn|H!ahT`c$csfEMWkAaT96U<{`o*vaDyqowWM44b%yv zO*1iqglrv})QK?R*{#5$RBVxTGMbDKLKtNSr7g0MEmz8I_iy}6sy(*`ccaT1VfJm< zOsEg20JIwiA_5D&3zZ~1?gNShVYT02j>Ke0DJ0?Ti4R$I}>3{Ey_JC;oKFR-7p5IlCulsZ_*|z$)@6NalbBi{I>TzN> z2Q%-i!mPpA@rW&-cIwazo=N8yYrA^6Y%JyiDSFQD67!IW@ZYg_3tVCrD5Lp2bwvh1 zRKQ;U+<3J%8qxOfZ2eX>-T)2So0WsV_nv!gPHJO}hQla9uV`OZT}`roC~kQW=D(uY zBZZUUlbk_7L*9&SX}oFsl2qQ!WNYl5&5RI(yptvSlLZeBt=;d0Si0!eyLi^My>FE> z{j}{n%=90HIb$;$RyHQb%7VJbc-cCYV=eTff7=a zF3-E<{#2A%En3-f&zkTe7n<2E8K;#uFK({A8Y;h?RIJ{s8rV-Sr&%r7eD;zmk*~gi z-%heq4IR$O76CkRBX+PD-8jof9N7(E95R3US147A2d?&_RZPfs+TQHlPR)N)@0kei z^5ClP+W2A4d$kAHo~*ob+{tuj<7i#qX-{q1I$bKffT%QwwndAc!pV|*&UeKTyLmM@y0?rc#I)EWvkRaHA$sN@@eMa zEJTx(<%D3A`ExP%5eX*vqVe9q?V6GSztijriQywo&6JZSy1s=xGt-0Yf{jJVA;XGi zt(G_!xCBO<6?7R)2@z7B0*1@Arso@_^fluI!253h*_cnZ_Ew)gC?1L=xg#zv z<_I^b&`Ri{)tOq}-q4asYukH~R%KaoOfS+wYU)>ro9pHv zt?wW$J9xBWBS3FE{e(SV(U;G_P{7amG`Qmd_{yEM-6hfCZ`LbN8vzQlC829ITPS;N zC*3RhaqcH)Puc>v#Z3W+E*Bie8TaVm-Zv$fa3}P72n|kW#%*dpkZW+std-urcTM1Lx2K}tduls+@0oBfp@jVU`SjIKX)XZ| zx1F|g+TceTboyctt&#ygX^xo7LS^q<-~bUzFlJ6T+!(gY4D6i1sibIIPUT}*x_=c- z4!VEo#dS#WTm0##N#A5U?CybO|1e@Kwsn{YcU2&?ryBaz0=726&CK{ zU{}NR(x8x?a&Z-_ZEno-Q$aBFu_r}&mdvvp z0)jlZ$_vK+{Z-J=JIHyQ`z1IqJPgRL^L-PV_aGo!?y^-1rz6dmn!9ek{W%Hgtr~Md z_s%X%N=(iRFYc$9K4efjmC)z8o5#vk=_ zuW<%$oJ{|@6zBaZ#}MCjq0+kxnF5+^(QO+r2Xrqf8XDAcxG{j>|Eti2w<6I8VH9cQ z*Ub-RfT<;T8NhVvpGCYyFhYi${>NiDXE@j96LAp8g4s6^*WpE_6IV8Iu=br75$|E! zPf$p7@UKzEU+ZSed51?o`E^f4_9q3%{sJNU!5z79@?iD4oINvs1qROhonFB6vPC8S zoi@Ffw!{S$+2zR4odKqtw+{aITb112cSF^4R`tB70w>6Xx1GbD7x2@bea`OEgy!y7 zLg$>W{Wkc@A463zV)7XgqNMR>``aKa)OZ(dZ_e#5+1xJes$m>y{M@q?hZU|p3<;xy@(o@-*G*sEOvyY0n_-?E zy2trI@~;Mt^Zx8lv)6}U@{lV8LV+^p?bbq-(i(p{hfhX08UTg^we|mcKmJIxxNRV3 z785E(B^Il`&B=?5rLcDa15llb|{MYKD zFjiz2F$W6u)Sk@;H zB@f-#Pw!6KrY7AxP3!Y`4Asx7WYL*=mt?-}lkbeLG zKFL`sG|!e$IeLJ_wd(@`y+R2NH$79K^!hhSDs1P95Q`60cMK*^1~<3z?rnAWe7kyg z0LqgFsc)ymLG<1Kije{^#n6CoJcH#Qq5{ysxoE}&azw}J1g0gROJ$Lq}qlzyi0|Gc9Q3qCC;Eg}F1xT%3Q&)zlJ|}0%WdPv* zV?T`rH!)`mVjkA&hk;+o{Og;2vpZ_EtPO)7d^WAl2QzdMUqY$SeFpoX(6j_I%*`c&5&)u_~8bXKQ zchaDaZm#HCKIImCmb%JxzjgZZUpBj?(LVnrJ|tS>JUE*C&@QNf-@H^W`z8ZWZ|V~r zhbJ4svna}0$~7JKEIh2oM8~?DYY8GazxwI_fxUmJwEX~_2dIOH?oDyqTGjVt@>)YG zE>+jCzsNB&PnB8yA~@>u8K?!=_a0D}Cw@8qA& zr0Aqu3lGV`R=oBL2=vfQBW55kSb-fNoxcA^v5I5G zc%&>%dxr5mwS^tvpEB!8PAXKF z5GS+p4ax9(E{xF6e0u!XyTcRA(|P<2@!yK0kSnX`R<*G*6m?o8vBq6{Xl@)Sh4xNA zdmND@{6EVh5WBtqWc+h2_{TN<-=z?U@NK2@TmF4X{y<{=zyC+bylxl%_Xo;fS6Q3> z{UK?`f3JLfobTTkZ2y!C<@)yr{oDWdB0pvE{|#}~1o3iqn@3VzY%Mum>|EI2iQ3Hh zjl7l3+=Jqfr&u2N!FHJBjOM-@Rnb*6E%DPJl8zN)f4-0N-v9TGIyE7|xj?v60ZCOR z@ESurwaa`pWk7`U%d0Z7|JUp|g808)%8>&6`F|SJLRw7gnGb$iQTX2lBx!*^BnQlE z%CTEHi`Z7D{r@a7{&KRUdXk1Zbp|QxFs3NDmV#U=(pr+3ovbl;S#s4nia?YYvbYh5 z#Y=&#;?-H6&SI`zA{37^DW(}dQis9liUDUFED2YhY zP-t8lnc*Ldt`S;JyT3k2log+!Ts;wTTyi-yaHygFAhocN9IU$B9P!0_{ZR#N;cFk# zQC8h$VWo%Gt*98{kx|VGx)3|JXP8v23K_5HAof{Us4=0zEVS+r^&Z;Y^WHV|mF|d8 z+*0cYc7w-8FIR(>`f4#Rui*PdhmD1yp|*4pcE)-et-DunImpgs8lD%x#TAbJBt@xA z`myOFv1doq2#hH_D4uUc5KS<$$S*{CEx+&!TqP^WA0Pc?yrAt))QYZacYSo98`|B# zdv0P*743eW`Hf$=vZi}}RdE-_@A4vU5bln4Tf|9aBt9`>Ve5%bOQT#Ta1HQ|MojLTF|jF|C1>M)ax^4D-M<+S(i|GeVA0{m@!2 z=)Vt{(>zBDwMHG6SFzUkhG54Vm6yt#f)y=y*VnSvXcLou=pu`yK{Cm_J^br%A=xE3 z3K1STF7!x9(HhZo-fioM<2YaJ6OzAdl|1zzuTB=i8BGwqs*EdRB3naJ@ zLh8xo6)uNk(U|n~^}%4FcO~-A89wl!o?cJAD~%CIo2%=rp01ukE8~}f-s`q8R|X$G zln%5fL^50RP-bMnav{{RBQS(`e6n9V2jqfMchYws4x+xx@v;Kl#uToZW_RE8H+36XS8+Nd}MzK?dH>~amRYHHkqkT{V`we1`|R~P@9Qs*9dWe zvP?A-T9wG%yl8@^TH}tPwPzdD!qUnEI>QUi=psX=h}g1z#3ZjB1|usQ=u5z*&`U+? zb#qJ9MZ_Qw>_?!_oHp^TwCa{!@gxlDF)tM>-{`oa>LZy-S12eJUNm^2f_1EvSqme? zxnl27+l5QqG2|nS_ZIm~Z8lEhWjoubp4IQ1%xna3Hh5#>#X5(j#J&yseTx(GuT@`k zxmy_X>@~za(zaFn5YQ5k%tJn)m#bnTc0wqz{^|>o#_`5CQ>j;Mau;8$8&=6Swxldc z2UZA-w&anbpW`gp2MXE_S?Szss~1=+Acp+Wc2Oy#-pOb3&mL}wxgQ|RbqwsCy(sg_izN!1rZ@xRxp6{!ahLTe@Fw>hPY26*4R2uAcPtxeu=<9%#iGGV}Ni-W(*R z^(l8M^(S9jWpj(TBL~{mh4_Y9rP4)G5*XSFI^zM|DVcHSPt-M=-5ZnWuq?8_?x?2z zXJ^~BPUK()-Rn}X#8fMiVZdxfn!0_Y4mpo)3-Z~^QrB{ zkWtj#gb+P^&w6eBo$4=3q<-zUv!s3_|5hDYR-{{p)GWfGR?M#HeR;k>!v(kVyU4?W z7sXD9B-STAAZZ+EymWt%Ff6nF=F?x(f7OX(wBydYOwZLd#(bLK8LDU0$s()rJf56o zxe_X5SAH{!@_J^e-PN>UCqSBDB9C8S-q#=5$~v?hLO4QPyX-QZF>q~PCT(}Z#$l=t zA+1Nf^?v_D`bl(H5qa@P7%s*X}u6>D#;le&7W(&tJX zSdrw9QgZi27=I-Fcz(mV@#rP7V=+CRM?3K`DNm2f6q5`MnXma7l3|w#9W0p?aveJC z5LHjyX@%BZcTyT0m3i}zrt2Q~k(Z$6{sE`9;mR=A`;*Noh4nU>#B1ZPclJ&CxDdcE zw-owPoP6N+C&-K)=gx6l>Y1E~tw&#gCZU44T&zVfV3o*2mmSyW>VMm|U5aQlz$c zE}vU_Iyy{?>Y_CJ-WXFu&^%6kPn;T0b=awuM!x}p`e>+u4d$c*!MP96IAeK<^qD!ksov#^<`*@FS>+m5!wmC+aJltw5)*9YZA_jZD zJ|0cYBl(=D4PHhOHJ|y2^K3jOFYd0>dDc7Or`2|W`9W^!Tbk*$8Y4(-;Ls*gs3PT7)E#~tzP4kCe3O=8cj-E zkNjRezp#!DE5*hNqOn>-9{T!d$%?Si+Nc!!2c_lqvcPpH=#&&o$K ziNm*t^fa2UIa*~7FVi+AmcOoeukWk-Vy#_X0C_CXi|`PsUgaacxOy2+ygks5+B$g& z(`LXVAszi%QnJ8ke~K?uzQXb;9sw-ePOUWEt9;Nbfdx2@Z}rjg#NWicB~$Vzozc zKmLMrC6bxDu=m*kAN&+ix+_VlGFuvA7 zXTdktREAC6Csiv^AN*i_%C9^^J!0;%k&oRG3kf-Wn9*+>``Y4L~&#?c`_ zpvh+hKk&IPiB1-=W@PEk09UIH8<8Ke(o`JSW-Jz)(o>>H9;W9Bd{NW0@%5wpcz67~ z_q9b@W;$_g3o$VE!sxg|J{Vf`~*^aPx1cr zCq^ebx=n zwq?%qrYHUI-T|ArBxVRwX#}a{s@U7Dg+GcWRX-zzsZ$4~SE?$nweetRMYNXsjf`PG zEj$;pF`?2!pZO58Fg0*ZO{rVx`x8<|5}gknrsmAd53(m1nbH)4d9S&UCT@{fXYjcP zkA`r$Ugdb<=!vvFLpcM>=?T{yn5LM8M$EU)d&=!nA8xU28$Sf7^D7SAxhQ5B+v6G8 zi7$ivXSWt_Ye$;MCIy9I*3S}*?A0EB%Wf^bnnVh6CNzBTEMt6V_1c%~L#(YMX<;xA z=LI7tdFP(9!orLRLelEFSjqC~`$$F}sp45iy;aIFSw}%IyWj`7Hf^|iN7bGc72*O z@qrYCAvBpdv?|QPV`RgF$HS3XfmaFIg`^_|?}+ClD#PSeF$?j?Ohe|{ zfZ1oSHa(^zhMbGtF#|C>pJdbKDWPD=^|^%G(9=`rCTr2Y^4gDlQgy9QqS;5O4=HS0 z0}zX#L+!yQDrpZ+UJ{%6gFO5!U%(8!>KW9!HW&{yvl|_Dm^z+*u+%kEkNJAwKvLRn z!kR6i&B;=wc_C8Wyw3Zp5z+D^iqFO88vc7f`trd`7$H68C^};R#Ybs>mT?hhhu{lnU^iBd51Ikt?rRzV8#!%R;|I22iGCuNZ|y!`CfA9x)#zty40U!Bp9 zdfSenbr9Ds;bo1uK0l&$yvL={|4z>;u{P3U{!LsH@1nd^S??ZktVnHRjh7;>(!XOP;xsMjWALVNXa zh>`0}HK&~$-&_)t*O0}cjc2$WRghT zOM<1Fp*JE3Ap?ULatJ*WjK_IqN|N#`?lB>?a5kdpO$^qc6Ym+|tRo0cq+9vf`@g$pT({junh-&U$yy(24%0Trm@Wz`z?m)(HWKOE z>dFvuEu zxtS8MMce&iDGQO(c_d+(KwZM_V8?5|VIRHvA+zM(2+&}1{P3*#yk#ND-!b4uT-a8@ z(>Th`f0hsbwfs(4KJlzj?&oTnKih@4=0%7O8s*xTV1*tSb}G^FS+_kznrJ50DonTt zGIB{1QNdB1_E??Dkglr4?hSuxR(EA76fHT3;)_XOhadg;vp;o@{I&YtJOOq0uo6!b zjGsF}TaWp5IfF~>{%!(kIe0CWA(8cUjwD+NLC~3tr*=CWNfY<}960 zvO;17o;HqgJJ2x3(U_0W{AWblHqw~5z=Vtm&{>#%5u^Vu*d`A z$vyFQ*(&tPtE{g#>lLZ_bvg+B*W>5`Q%p@TuLxJSkb{RGeZ%5O&iBu0N%RWR#Iu3Z zGE>4t&3x?Ea5=c;Nsn+OC@P$@<22Z@mP4%t6zz={#k|ux@#2cw_6S=?tN39DC3(Ao zT(^M?dsBv-etWV=hPYNKm`grMST@j_Arb*`8=5yquFf#KOs zyeknl$$_)|2g(ZG2{(VGvI=DO~Lz|b<{M;2T*6+-X@x{Hia()K%3Qp+FVjbn&?DIz4h$WcJ1~dO?;`- z(Lar`N}{KKYTV>%iLpwfOZ-sWCwU4-5$yOSv@>p7qad+Gfh+G4wntoz>-XBM_Td61 zJ)T~1Li~pi>e~fw`oRJckx+YtN(F-#w_o%jlX}vJ9cO0-%xqofd7s_+=~YXJU%PU7 zqC(Ge&`#SF9-DEMV-}k}D->T~RzmDeHzw5DDewFGaUhBQYTy83@5DRg=z<{E!Kd1` z62HW~n*UQq&mw!`vzRShh{**OZTCgWUlP5|HNlHR$9Ff zyVrs78tE}1aov6(g-(a##M-v{kh^8o$=I#?#9*at?eHIF%%3Ykq=Bq0-jx<*jF8_8 z{r_3U4vJTx6G1OH%2q+r0@F4vah)GLl%QGuOY6-tf#wWx`O7SB6*Or5`CE}68SRn$T|4>9~H@Bc}DDHdAiZWn&Th4y|+9 zmAr<-xNiG-n3SG)g^OZL498f?z-S%k1-Zn{G0;5|gGa+3bT0~)9K!fH5FReIa+R21 z7Vaa3=Uch#vb1gO_ktg7{t(0wtB$eQi4)E`1fa0O4SFBYlOgyBy$B-ri3N>@b6Z}) zJcQhIKs((Y%h-WvzG>(~mYS46G@ZjywjRxgyqCJlF%{lRVkiEDRrt?tLzI{eCeXD( zJDL=srh;#=w0^X^zIWqn$8ZoS9{kya*Z!$6~5$~Bp7JC_Lg$>f6{$huFI zJbWupphDlRGSFEE)P9N=`rSj+;zhwtA+$JI^*ZeB1eQJlE4^}WT4{pULZCsbj8&_S zCQZ~LjnK^F1j}mUhHm~ffZ+z92?X2@oza2frMwEoG7ty-JP2{fl{%!9TVbd}F8d{* z#l*g9mSylPuD&|o7fsNW2{gfriRaFAGTIWyganOn9|v7mxs#HrS_5eKs2mkb74qv%FbSW2-b>{_3f5Uu>lCYaAC?q>VU39ESO8iY;krby# zZn)rmfgyMBxhi!P@&MT%Mp-a^UIZyLGe+&Z7Fx2;yrv#|JNCOtrfcE9@+#JBy zRKJfnthUaLt2@$|z>+Pj&q$^-9M!IDq#=c6)a|lxw*rF#T&B4i*YXQU3?pWAosa8B zRUp|Qh@q}@_Zls=DxAnfGx11<wn_KLXFgk?uEg{bHMrCX7 z%QRc$)dh%XYYQi)Xd=nO3YW!>-RkiS*=r_t!n0kNQajb+`D`{_WIzb#vDk2&{hC{g zv!z|#x2z?*QHWX0@#viOQvj$Dx_X3z@mEhOtkhu^?jnl~nNxDBf2;~iub9^9Ol8wP zemG=<8l6FAw#dh`I{|H6=fOsM^gT6{g>sIX59~YW|7RIn_Qm9f&abP^D7rd@AvnM{Z6Tg(JA}$M- zr9K{gkV#)x_>xL5LSpSVI+)mEttH9%Dvt$R19oAs?s((hW1g8-Rk+>QA;+Z&ALc|E z^}D-?ELohYpRuXt2vyiLGnKH`GBIg@c7H#cv1}LCo=q}r@syhuDJULAu2l24yj&^3 zx!o+06ao(PBiLYNnE3AQxY#SrSsQLjGgQyem4vPy#-gD2ADD#_{@iBEc9fnh7&L(5 zR&|lkaI=z;#Z&2auV&uM|HVE<5OTOW+Y?ORc*lB%{}89gEJRCY4vRJptB<=#e)nwe zmTGoU0Knx*R}a#r#RT(Eb|nI7WRN=$YM84&CN!gqlXnN1l)s8un*9(^lhOiWNjl?J z>E_({<+508@9!=;Jli$Zo&(pCM8_j5>^BN7y0?(HEJEviBFOZb0aJT3GICbfN4JD=PnEm=2cJY>LFtm@{j?9~(ackm^lB+!fjv5o-_T8vg>S83gfBDrWE*D>4~?kyx`2;L&JEb@4r( zk5t69|1l5qA@tD=6{_$FB|95X;DCBtlL<{kBxCVQ8H@FZ--yeqgw-9TvCBsZjH2aj z=BAp19G>9Q#3Xq#K%mW#MDihMN>eMO16^|(=0Cm1IThAD!ru1tT=!gmySYfJAY#6*tasE2yq&l_OF;I4!)u4H>Cu0ZdF{eO&7(AL3f7~&^{KrFcmx={JA32gU zmT-g+VuU|iA}vM6?UxO0X{?A@I5b*#)yinF8>OquXz?`m=v-eaHSaH3Xa9sz4AwGy z)LTyD;?LmZmCMG3%HPFc9g}~|B>g4kMZzP>K_?#rP$pp8qIhc_w{k4-z(Gy@6=k=Y+ZlOw4T9)*KBtXNX&bq0IIX60)o4CEDvn`(P561q<5{>mqb#&P8jpOlp z_TZp7_45mkX5S6^#fTvzN!AH9?wEynWbt`syx-c~XuHt3&^+&MKpLSJe9sf&W&b(3Uxnm*5R=(K!{f;^p!|eO)Azhr-7T}C3l5ABm2`VqqxxR<~2Fw zMdq41e^Xjjoem}E-Y^^??t^#gVydF%55@7Eljti(DWQ&pFIsm3w;C0b z@`d_0Za`l2cfqF~vC;1SyBO(I*xzry+J>$_M#VbjrAD;WlwiXRtxK{~gWyW5_quvi zWmXoE#E{FlevSgRr2;tX?@;SdtE>1BN?FeXop@ai|74id;~4=NeCinl%vI#zM=)=f z>EC=pZf)E&cd>CV3^gT0$y8NiGZJd@u!yU9Pqn7uehUvbPSkvB=u~L+fG*9+WBKTe zcGT-1<^mFs$(zqxJ$Q^?Ybzw5?K5#IoQ4|Yg3I(vbbSFjmrk1U+-`ej z#*kT#+;~A=6f$=??ow#gt={nm7%i}MXzN7#a-#;fjxBZEly(yiWc>-H%NtA#=@#du z6_PiShJO>&`*E_4+qH2wF|7;r`fcCCVNC2GWOXt&$=ckdp$o+=_rcuy+X=4XX$f0? za~FnN;YrQLaly>#^jy{T2(~RxPM=iF9TCPgFbHa=W36-J7Gtr2%$|#GYTV9^f5Wtu z=b9FAcmZY8YrZ-FECp&*Y&rk%1^V)z*3<(|WDKC(Ozc@4~zs zJA%88N$)|u_F}aTaGm>}gB*N8dVo+F7YpVc8(QSgJ^cK+M*pywqGjg8HImi(OHJr+ z4+AwPKXQ_k-v+TVPhbhC0_btSJcm8F&KNKY(2}3bgU2QoP}oI5F5tdCD2)lBPm*3pbY%hYabk$Rr zM*^RuKBTh4b>v6-xg2Vvlor7B<5z*80!%rh6VG?z+wdNWOdo+ROIVBS>Uj@b#*&~C zr@$eEz*OFR>xo^)Qd=pVnpxOzL2H`1MSFp;^(Pbsuj%FI-F1I08g%rvnqM{~|42ke z>x9IkNNJi*b0OK^#$|d`u{LMoTk^({i}Sp5x!U^`M*6)RYK7!~?m_2QvBud0KoLV9 z-3^%sMKV|{p+YhsB`HMOZtlU1;hfR-^vf6^9>TY*6b*2xOf?}lpnFN}G_N^KZ3Y@C zyq|*}y}p8>Z9`{#Mm2BkOQQoJQvr3j+(2?2x3Bz?mrij6 z230}75#UhkV&4?3ZJY@KS^anNuxq}+sGeKperUvI7_Iyk0~>kd#mp;4a-}?lWE2r7 zOFP=bnHK|G98~TWQV0TdqcsG!3hZscuySm;Kytf6f1IJWGh;`3Kap;cei$)-1(PeQ z4g`|m{8IB{Aaz})Z=l(i2&%HlEiN|mywOjzuSzNo0G?f!iRM)A;(X-csXT#E1GmZ@ zun(Rk=@lc6WGZ;LQa_p39BN!0dgx97Q+aeGi1%}e3z*<1)ESVQkfTWRywN!Q8MG9X zt!rmorh5Q%kWi*o_3W}4B=Q?+_@tS;K)KDnK>$p0U?9-{Hrw_9Y~gxSZ-fZL)WEN4 zjcu#>?<_!p3Oy-b!11)38V(#fX##?dY^Wwx$HGOs-F)s$J060&GPNdnbj)>JHj|PQ z;=(|PElz+X);tGMsJSfc`ML*yt?<@?LG#tW0id{II4<#s_>^6RHF23{b@fz8ujC+2 zms-mVSdlltQZq$7bRBBZIj9jU=X)_b6i-@?b$VAM$!#hJ%q_e6+rqYxBX!1GFu?DzWfH}w|KX! zrv>_Oaohaj=PURDuJ1QrsYU}Co28v}RB>RZ!btiQCrrcw&4Y*7`8GywJWBY~iL@89 zCt+t6%8z53T?l@ z)ID%I;89l(@O*tJUD@r&t~N+Z*sY}&lBLBB>VA{@uogG2rB0QGaQMa!!tmHP=xjKL zvd>ptJVqj&tkaPf1q}jM6e+^Eo&3X)(6gfxulH2NelJ8ly&rmLNvLzZ8T-XQ9bXds zNHxja6p79w@e$JoP|ZAbWNdip%|h^(b;zTXtYBWXG?KJ})?y!-#MaY20OC9K9d zE(xB(u_C{57%35kQqm8@_a;6JfL?xPo)f}AfuFru7&3VfO&%PvcNU7V6mDy0?4D^|&PEe$h8X!uJP30Ci=NC&l zJkq`@4~xe9T$F}~xf)A(@&O;)alY`<6@3E4&(HFze_u1;pbw6Vt)&OBNH5K$$Dx(r zrj;+S;f(=T83>6f17^-o6p@;%j%+M=2%vTDlHjZF<3d+qaEt|NjRFg;yy~oTr4z3Y zqYa32H~bDa(dv8bS*U5qKPVgB$^3Ytje7&Uc6}Rw1dGLFsK@$Ar$q(9|J^+79TG@&q2D-OfKzvHzN* zk+#Wp;5(Z=6=~qNA7NaQ{gfEDBq)CcN@dxqI&7?R@OcIz%Jb4M5zKHz@Rd`0&})&I zMI>R<2kPS|#)JU-`3^P*JQuWJ%sc^r$pVjEMZ|mpZWrNTcgU!u4@PybGj<%rx-o!+ za^@i7uTM+%p-%DQ+Ral}-ho? z&$_+Ua@LV~4>Rd@FJ44YIIeQ3fHX%;YezNXE&EZF&1yNpbBW6r{#sf9(^Z00ePSaw zDX#e}hh@M`@eD#mq;{K)=xU3>ZtBEGJyl6lCm-OzdS;ML_NBv28+v9soja*kTEc8i zw~kw%k{b+>q%^ecxYzh3X@D#IUJ8^HO(24)c7D}mHgF-P7}*8E*RdiNg)ajly*loxGL2&) zScbTmzayayP|lLG)+0W?!qS0ygoZ*=cah;H+n#w|@$)!D>NRjb=f*6k<>Gqcxxq{1 z0CbL__1AGDh)WA_h4`lRvHBz@A=`@U`i&goW^Bl=kX(g}I3gJ!ari!Bio-80PQu0?tI$t@uw6{yrU7v?%yg^g_NA}la?6B)Luc;xq8+!XQJBUSjP*>Z*l{wUx2}i@W{;j*^r7bWrv~mAXlF^N4q&g8icLlO4aA6@4i3^7B7k=8+Bhb5+^^BNH z37?Yu@h0Q~v}HomC9E0ZjV0Y@QeujM{Mx6N zXV%;s56NQNcE5RpsEAF|1*qo zxncZ_n+D4aTR=!JSlJ{{K$*>)niWcOotLg=i0m|mLy!VCsW_srx(M4kt*H0T7Fgt0o7(X4n z?6al*F`w)7Ajkob=DA}Yh!l%3MD;^C7`Pnynhi{+I>S+>G+_r87cn)8wUO(q-W1{` zKJ3ehxh(XI^~nd!$4CZD$hIqsoMJxW9AriZx+?X?-QQrOfa5ZaFadD2@+3N=fi+b~ zGLoq}tYfo|E?)iO#o|sR1>@vppmnitdavc&SicC6AR4X;b00d!xZii$7Lq2`NI`al zjRbn30>4^XKRN?O4Usqt%tj$8!v>S<->UqZsLJQS6yZc?{=rp9X&)oHR*Y0cN+l*_ zPp2W9batxgoKCx=q)}retf)vON$ie;t@D8>n@*@*cD0kXj%w?yQoWzm^E}t@{queQ zc>j5?Xa1SFE@SPr?seba`+I**>$X_?^yW^z#SXQh2j!f8!)(l_p_|la^@U_OoMd)emp}Z&)`InJpJ$C;>WHwtLK4MG zE~BwOA-gXz+yFg}Moh6rg-NM?CQC7g<*n0wbIXi~(YA=$+p-#bHwY2Hg4}-~$%Gam z&Cj)~i)bEVA!;M1a$yA!z-^np8zQ-fdE1>ifvic+$zPr1PPi!4aFSn1X{VY$} z(WjSh$)nqWK4{iiSpPz9>IHU<@&n+tnrS&k!|fS;YOFrTjJ`Xy1@}M%5o3eWnzd2P zsvAS@HFDs#Du&Eu2PGiYeUi`f99&t54|O=3F=h@&q(m)15(40CDXcSPtnB;0 zG_A3(Vl>i+Mpa*Pi%#3|-Znw#K8*#YWh$)Gb^l!zdhA(WqU=7a%qK?JGb&bJqTjqq zgMUfAGjTh+1KsK6tGs2gAT7@SDnW{Z|6!fctXSS|HjwDJTOnDH7xRt5C}}=$XSGxF zF(WIju<*pT$qD_e5n-8A9txdjF&guAlP868a(N?<=9Jp)4mBEOyrRsZol~(9&e{(E zS;j%Dj6(ti5LAK3S!1+)n&;_+5_}OFC8fy`iM?OwiJdBq+H~6lLCz7$mv6;H%WJh# znUtQ)iT1EGy-fk$*e_Z}xqOl4<=DDRB4mZo<ap_P%#Gxb8@vv^@(kaUMM$N_9L4o@zzdm-K5es_hxcp zE+{c{&IE7_<#s|rb>o?JoJ7!xCrtNy1(2#%MU+)m;QsdgZCIIw{F$egXz&TD5I@(w z*X=8IwOIF9b_Y>&N^4Q>x{OrUx%C{QPR9?cAldb$&;G(GNPI+j_vtV9*zAcf&Q8i9 zZG0U{x!+?hi7N56EiRf9#p-02q73y3gZ=#IU$bY^`r8ygYiaP`pj%O&S2~H2KjX*l zc)MvxOgs1Yc`b!9^4){)@@?!&5{UiRR>9?_^v+Y>%e&yFoM05S( z)&)2cWtpt*BaIhIMBT3Z`zIi@rsG_s3IgzfQi@#WbwnY2uhc}JyoiIfa z3nz=%(?I=y@*kIln@%lI%3+VcpaF;tzoezcN!Zf*A;?mwF8lB?Z=n>oNWXcrLvd8A zD>vxC)WH_Hkn(cf zv6=BQ)jG5b#k!>8_6$5Ns)ut{3Rm8VFki7VK2Ma0c3-pAR)+jus zXk*>Gb{q*ZA#6$v>anZu32ivA6jK z?Uf-;?Jk)1U45SbZpfb-RJh)2*NVP;kLqU()oE|x`NjyEvqAhta7S|F{ad3KB_#ps z->qi$wB)O~Eq&!ErP7qy?MwFfGiRT9u2q(MN5gW;O1-Xuu;%n111wTn&;4Qo7 z{tJ6e36w=r)ibK<&6<~VXjRN_?6@bRjU#2-%J(rK2T8j5DddT_ zku-f+EQ`H?%QLT*=+~UO*%%c^jh`X$j@=44?is)DaWRmB-`D=Fr3+N#*Di~1TEM4;!S|}2{FYFnNs^Y z^a16z={#SK)8StphtL@A`*9o83tr3cbaj8Y7(}<;i7+n@e$0)g592IPQU7fN6kC7Mu#Ly`#KG;^8w>vjfduUvmdD3<|z!+T?MeiVq}vymx_-`SMeutGbz7^3IA?Nd3zEovByi&IH?6 z#NRoB{k;6XQ)^02+NKZ?0+d~94Bw-KhuLs{$)oy4D@&IXvpX9U%e8I{J*x(kazJ*0 z>s3spgO)Crjl3L$a=8u{OT{HL%a^y+=QT~Y%ZCmqRO-H5*qqPeSuynE1xHE##Xu&V z7GNV>mbW{UvbN|)G?~UXhW3$;lQqUq?>ig#ReC6?Z&T})r<{EQ!z9H*3m#mR-^t13 zVd7K_%o9 zy~WU6D&W-|YFx+gEt8NLi5m~e^{H|wR^9=T<(_t!zpCS@!kYV%GA8h}X+k5EIFhi` zn4{6@Eq=CzX#(=Z)2Qgg@MF9~EbAybDN${U2`*&*_@wUwV1Ws#(@QYOG8(oPXd@w( z6?wAjn4~d>Bt0Zg%dE<50;F!=5v!@Iqsd8xv}{!Z#LX;)8-fRP)q%vwtbo(NMQ%fm z2Ca2=wZ8|jkALuJvR&>c?Z3BlVVZay7Rs&gvmt<^{LHydpWVP=WQ3lvA^MN#Pte}S zo%A3=7;Fz;uNVK&qpfCiha7TrvTg0krUJSf`|oa=DXIwzqhvOHFFO&Z^uA4JVXD{Z zD!ZTy!l#ck8Z0TT#*C0$_IL+P|CXR}$fC6%$kJsXjj`=sjDDO&LXUKQLDJ0ABP2^q z73SXNefGugbm7fReK9ir{({6n>MJse@YjB_6+Meh}+?X6rE}TKOt!f(t|@nJQckW+j4` ztB;*6Ug!I;H&$&XK0?0szMf&4ev+U+qc4mxcJChvQFkMT&0$6vgQ1qmDst4?^6e=7 z%*M!oNNTy;16CVV!6}zE0ezUegOli1OnSL6R$&SY!bw>|SDAAjigsI2)%(1M?4S;` zuMEmiy-ZaTPuIMq$37PN?}uNhyMAYml-~hDd0l}KW9Cb2~MGqV3)V65+|`q^xaYzmzX$u|gPQgRDYBRFHrmqJKx#alOj% zCEI62Mjb1I%pHnHz^NO6hBlWSPt*L9YHlxT{-qw^)$t<)gx!}}Q=W{P>S7Fb9*b|sxLo6T@TCS(tY#Vze=~^9HSL%Gh$+-l7u6KS9Q>B#ewOE{ z*$@Fd@Yp>}p-^Yz4Q2u9DGvFUV&WbCV@Q}S7=hlAb6c6k0>T|(&6IN=(%Xr2dif@##IUmwp> zrnYo0(gXmo6nFr3e{<}x&54cRbdpUV&N0Z{Hn<>stY{18d!c2ZGs@({h8O81djjbs z8`{tumfd}pkj2WOdtIifnZPUBG+~mzf5JMkaPwlkh1XGW>(o2tm$N(8&nxJjNdT>? z9GoYhBWUe;J3#n+36gYqG9^)x3tlhjt)+L<&uxsxZB*x*X#oduIBdPoQq5%9WwXH5 zY@-jxKo#Y={ESDPtN3YGqG(*|YL7HHP1pq`&g2-Hx-}>MYrS5<{`DE>_S@l2j7A2E zdUZJ{d>_wX!Vx0Ojd7z=^-o37Dgihx-z4wDtEgi%8faMe1i2Cr8+|J6b#OCIpYD;q zt*BvZf2bj%?f(2r{@4AFk`w+Wt*l;Wp;b4w>8P?nuoQ|w2@c2RkNUb2!a+!-S9`OU zqVO=rIIKV?M#u@Ghz9$anZu3Cf$y(*U=5J-v}%5Y$U`6(zhEx=ta_EHNNS^{juI5_ z-mdRMAN*3aL^QMNdm;BX!W)KqR8rzwh>((~ivuks8cOiP43BIUPCh(|Rg_FTsMyMXUm0Cb<>v;8^mQtnmO!!F;@C(Xtgn6IUzm8s7x{?;PQYjQ zK9@(uXnBsZ`XX3U_KXm_h>OAPHw10;Y+-^cQR#EcER+(0;a=%b4CABqMs|l5y1ji^ zTPOT}6XIiP2N*VQAkVcv)L1G}GyT0DY_LN98jIp}JNcWbQ=erp{N;i8L)Mf(Lr=M4 zZ>h5K5MB|v&qNw+DV2|&U$+}_?`c`L`;bkyJWy~e9E*(r`U|?jgpQ}xx z4SWj*lMcWqxj)hAZnRrgVk?LVP$eM_#pRzLNJ=NnV_WJg&_Hk2!FILDs&DNTPnlJ& zZyg_go@hp^<$Na4a#%h_ZDLl`0wa8qp{E5E2W(4qOVFB;rKNAh6P$q3EQTk<(XsMz zc=yK$FD||iwpk||m*mBDEZFbIkd@ME)P|WqFHHu$?85?{v&A8rd}pO-L;#a2!Dl$=VEg6r}+Z<*37a!`$Unfm`QDQ9m??}FOOwt89Df3yIe z#>B)EE=tp%FDBn%Z~bsAi;edulG%2x+qwHO_e>ev@1XD}BlxhA1jYEd)h$j^7iPin zKYU;N$>&yD zP+;V$uqHNlkc(Bh8xBU0`eLI}50~YDcun0rUOW|!*XL&OHmD|w`M&aN2$R+j(UPVq z2gq#~egkm{s~)Y>Yx*YO@|Kc?ltJ1H-lGlrSWBOM%=W9|@6JEqGSG~}2oAKu#8YjD zs|2Ab%;@D>svO}HuJw`~3+HTZC%n^WSd`VUM)?uc7L{YV=F* zo1o_Ib|^N6Og*R}0!F~%rRFEYk``d6_7W+|9 zE?1O1F-YL``1)};CiODaR-?TjLYRX->!HvkgLCzLPCG218 z4vN`7l6x0oj%#;kvEczd3MFnQP$-k(%XC;L9we@H<0*s3zA8qWJX>_nqhl7$%Ypco z>8~xsHxsBtO1u9STK}ec8h}N-61$^oe)ag9J6A+I*vdY1@Rl_d z8F>i)a&3?p08A9W)WeJ>rAcF<+*)rxqRcr5;h^4f^}%+obci~g~D=IMHUQO%c8 z%z`d09KYRTd7gVfecshX$!eeH+Zf-{+CuLk(J45VhUR|Jany7@NsFyUrseLfQt{D3`v zlgm3@Qc?YqjU8x9*9(uCr<;1EHUCJN38ShRC-Xct8X~~)6|ZA=EZ+1O^I>ID`5%l% zzKY9wPcOm{%!7<~vA9HKp8<8kJ|*r%OmP}}d^&5J;oh9xE(5k%Y&(--eUiMX+A~Lz z>QVI=5O(VD$P@q2@>TM20tQv}i{4%D*aC~=!n_<-rEbd`MLC#KYhqg!vDN+LJ(qMu zHoLubu38RaubUvOo(OnX#zw@%Ru#=Ryl5wO$r!l~!cokN6O@hCZa!{iJUo%b7WT@Y z{2OgX9x2`&&!f*;5i+M%ebxBtL$pD7QvaU%W0}G`o&C@p!Fur*R(mrJ`Y!)mE8ra^ z7uPuCe!V3X#;xC*F<~M*+j2)g-)1UYzFx8QPpXXHL9?MSE&v%;& zUwd0WpJD!0#X?!bHWv0-Z`A99vV6EFmgBA@u_OLdg#L6BIveO}pK>>SQdM7do>hp@ z6-b}YLh{YbVl$tR9lV3FrHk@oZqj?p={*r^^V?$uyWiN!N23_4d(~B|Z=J(T(|o}8 zb9F)TesLNzHu_dz)uFaE9G5M@hxHyY6l?HetiQ}E9|j|tH2BJ`@Cqj4PW|ygALy*H za92ycr4H~p@c3mfJ&$k^@1PpNHOyj-uL}sp|9rX*?!qsnK}P|I^27Y@u>G(;nZ!4S z+=*ls>8kH?=Cl#Pn1U#mkz-OC4jBq_w$K56`NS8Iik$uM7b#>mguJ|<+84-BD0x|j_F)KPL~(uV5-1jb`vjr8lcNktFqHCe#MJRq zxM}lsV>ycy8|AY7j9mtXGK%Ep zR5=sRgEr8!K`>~3D5cMy^bM=)m5LnyrZS@8`I|TD+Ev81*R4ouA#(6+bFaIS<^hmlX6O8-l9X4q~q#@MW}OTD_Lqf!7|@OY`6eM^Lp zoJRM{fA++`>`u*=S-FH>6U>=_^E{)%v6;S?kb|!dEzWsw zX|TY`0A6e-YoJ&ECgV|cjA^L_!@P)+t#5Hzca^-QWcL#W^*e zfj{VYyGDpiY12zX$LcT;s%Bn$BPMu1&}W^-nu>_ewVsg!VaY)(=eoWSpU-{1!4d7r zqVp(QvY?ha*sQBjv0$}f7qEg{%{fC%N>9s(y6GcNxcoRlB2d|GV=Ext`y+Io#`S#T zi$q_WwO{x)I=8&yOI%zpc4qK(y^mtTF?G+8Q`gLiTXL5s zPabNNMD1J$KI^DMU%rGv#v`eT(0a=jYkbVRbB)EF&KTY89B(TZ9BpOk{F1=dCRaAM z)^s>bC2!v(gvZeYJb9yHuTSD;#l_|YUoW%JY)g?q`G*l|X>Q!?jj`J__+#{PSUVea zs+Ewraz&61PiX8Z-zx6LEplzu{J3>9gxA7Dc2@84D?f2BGzdv-YLc{$dWrp6Gl&!KJ+w&VC(9Ho5-T!aa3Mxr!2^DrO9v=;be0VL}LU^ZBU+clOt^9Dqq|FwJLr@ygBSd zjP5TL9I3es_Bgh)5i6H;-&!^*V)`j9jy*^Dmh~Y<6U=*}Q=%3c8vF$C%-~9kUx^7+iP$CeaBCz{K>|I$?Yt(~i*~BniEO{k=8N2r1hXzAh4o~%`7W2|M6b0i z8B7wC(g%NR*V~@g*tH_xrtFG93~7VRWfp(43L#EUp_%n2F4Fv5L25*o#D|^OV!cX# zBWFVHD^3t?^wQ!$o2!Ck!uonjH$+ivdbU0>>+gGDx$IJ^=YDy# zE!|vqOf2_|LvbDsRX3~s;S-2X#+(XYd8+(c@K1{uME3JDnlgx1>P>Km+Y z2>K)p-wZxrmC)Y;05XX2F^&-a)w!ir+xtVeJaH?&V{$~<;g6H1^kLtOHPtg!4&@4fV^2@PJp2jpJBm!VrAyq4 z#WPoTtl`WY$uV%wa#NGsK5-qtp1@+&p%UH_pv?(OyU%)!bz1Fds8ju>k&be)@CpXA zmCRM37Uh#{!0|+YCbn=8VR%~cTl9JNF9cL!-x=5FVAgJf35oLI3g`g>Q~H>#?B(b7 zrDxKrI{hg-{84>LZ~qt|2ls0Kj(Ud#y#rZ~DpS zz&Q=5aG(h>0+{lAfNey~RePyyGfltB*xf`Su!vYEBeG!Pv02dmN^fO#-CiC|*NXr?NKW>GWbC^7e z|9e<2lEZR{f!LiP6j!mGwus=su$VCt69j4a`_B-=LuPHHKGx@m1A{?K*tLSy68!wa zX7(!7R>Vm<0O@z9yDiDx3yAqz$t2!Lr;;rL6WV^v04$M131ZYo7ZUADt#V~A9_|p8j0pFa&PbldNxSl=z1&NKCycb zSmR2QwKSRW+6A~7oJhL(+8@+yk_8VkgyLrlrU8ed8B4*+ZMe3n?0Eh>gA~F`F-t_~Ah4m!y0n3HZ)#WfSHs5CsCY^C6>c(mplJrH*38iVqvnk4gLMJF>rH|aZvRFAViC1}FH1A7>xgoZqdLLthDx%N)^2Dpn88%l0Vf1XI!OUMtGzNiH;usNNMa6B+g_<><-yza)>b-=Ft-UcG@*IY( z<^juybYB^vDy_3fqC z!t!=Rc+lo?<$wT2$sOjhvzy?Z>tKBP*l+-~3Tm-aC#(IB-PUXsVXw(uiX-(=OTFRl ztJG-g2wPhlhOiH`LpC`PD`JWtFn`3xHuV6`@P|c6I2kCExSZn;HFH!%!D?@&iFHE@ zjudiw8n*j@3NJ?T*YC0m`W>_uRUc;9Tt9Y#ukosHe=Ai%jV*@PI`OmY@-57)gsV~%%zL}noE-CcXUoc1o9_i_f$Pi z*e7>>5Oem)3!uV=B(V)tj$MGn7Y5L ze^;8z8ppAjIVGyK!=cy}P!?|8>aONOzh|D`SwxZ2i8`a*Bs$|Q`n9J;O zDuboqszCf-Q!I@!CQrAOOFwhk-%ojRh}Pcm=7;igx8ej=8Lv98<{5`l3~Qs}B)4>) z598&oV6XAqib{RaoPoV}<<}od9;u59jfOWd#$LeO=yacDL=xm1PwbMkI>7KS9j>A8 ze6J&(I)0VbZow$~odM!Nr1_j)!Ra?+uS+UauFq1UqY-uLP$}+QaR8IU5Xg4!ejIfo z+$N>*?oZkz3OJ0hD3+Jk63;!T`-~am2*bLNY^DNUXyF|e@@|(>2R}rJVmbcF3jCGa zq9n>=gLNxTxNa(pMugY=57<|VBZBNNEV;GEFz}hI!fbLW^rAE;Msk{yVR8;OXHeIR z=p1CoFdD;Sbk|Pn6}7#f zE7&mFdlyE611Z0%(fMipjUoOuo@W6NpnIANrK(7)g$oLPohKp=F=~OywVrver5V>R zJ}>8C%O`?Q5Xm*3*LJ-2IY5}`IjCdGu<3U#Au3#fyB0Vf$Y4LTC)W*H(aX6q)qXu{W?O&dm-XlRrR%ouHL zP6jOuMiHwojZA4yIPR&*Y*G#|Ac_t(ZqzGXw3sp0%L)u6LgPACJ~!H7c)VoX!NRlD zh*8qm8FqG zizo;Kh+{Nr+zCs5G(+DRlfwTx#R}ZbNNm@BcZbmk{+pmNIqKhvOTB5_eirF~hprkq zDgWquF3H&2y!~+F_H_aF1bQ~=Wv9ZO99fN9&R^fMhTAj`Ooi{QSIoRYRojk;ER@ej zaCm?X_!&`SKhJg9&5hXwIodx*k7+bq0hSbkhy*@$)nzVkGaYdO*Xe`ESZ%>4E+8o$+uOO_BA>HA-x@-#jc1uy+xg>vD*16WJpaO3o=Lt)8NqZu1wRP0^K9lU3)Zr zuVdM`vbGvWc8YmX&ql-V$vov*7O!o4t=G{hO9=3elBoJ7 z&QU19-w)y&Bf|*_N7&X=;cwn4MqQx_KgSRG-P4qlBwdG)#y|9nEzLJkJy^f`ew9)XhRfi`0+z5aPoixPKwJkXT#ANdn+98b$LJvtcI^)BlOC{pMNNaBDp5FC(xiU}iRa`;U*?-I#>8#@4>%Y?kZ)V+0ZeoDNf_oA79;>;od=`Vpi$;@esh1GVz~) z93d_YaCH_2i_Ev;0y7hmY2Ep>ZlCB!hl*luC3h^>4<&%@@tU?RFaI%X@X*fs=lVZ! zHixXJc{WIsIhpT`!1!S3P{uDkUj@qSI`9cp>C(-6tRjtK5P+_zG#NFaU|iMrPyS{4 za3WnHR`6%(1tmvjMCten`p&_RnubQ9xrmy*q0uS7NP~X^S)K8`E9~E8-I1q|jq>HX z-(?`0dNbb8QA^|*N4h^xzv6tkIPvXNM9rkyY6?Z-u*tWzgs#`v$S5v+%r2s8Pw*O! zUDg>}3&wQOz2jb3j1KA{oRJ6CJ6+>gWogOHV~K1$=;{;IkRoM2Q+(w@6oe4p+SY zXLl$q+sq3wi$w4Sj!ca82kIClG6yKQyQ@I)ia>xg?Uux2XZ=nSWt{rE$##q)+*>T} z?c{wC#draqs^Ip|sQA7n$NXGx```VN)~Q)UknpIfzrSaMcn@=M_5I5Up^ML;UH&Y4 zA?=M~>$%ypEvG7r&=|I!H5&ZI>{<(Mvs8Pj->tgb*xeC!6ZgMU)~tWEb4m8=`cB&` zvT7e~TDO1SO3Wfq5L=`kO~cj?7;WcmGFKkt4P_sIddrBXRopbB@Hu!#SjpI`2;kZL-hiHM8c6-l$L`SS;~I$Mhdjm+!U2bm)9~ z)!6?xZO*5@-OiTLG=5Rc(A_s~1YB78Adw=a8!|Q$O?A}ESIfAmTJa(=wEB`v03ulR zX6}fXKMph=Y}?YXu01|QN&Cc@ca+TAoY$Var{78>huCRdeE>4}oKsGP2(eQIoq7d|_SwZFYeesm;1 ze0C?b)J$qNNxQ*LSo=lKt8I7AT=(s=onJzWc(_54N=iym-sv_r((Z77uheLza@W0(A$hM($M&$gXM)PQ;_zvH!rYke(Xl-0PEqEm zuivKo%r2)LcN!J*9K}HbFk?MXsVR&Q`S}v^AN4inx;uaT*MH-KCdhjJ@8_8?8vp%H z&cCO`|LJ#fP;mbYx;_1IXGC#)ueJB5!YAawB_|Jd;_tSF!9*O_U+Vy2F&qa(z z{@ru4W$uQz=fCN;@2=W^#`Wy-|80!-{LeC9b@hKf1o;2U|9+L?kfQ$1zTeJ=e0us` L(>>Y0+MoMhsb=rF literal 0 HcmV?d00001 diff --git a/docs/images/raredisease_workflow.svg b/docs/images/raredisease_workflow.svg new file mode 100755 index 00000000..012f2c59 --- /dev/null +++ b/docs/images/raredisease_workflow.svg @@ -0,0 +1,922 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bam + + + + + Preprocessing, mapping etc +bwamem2, MarkDuplicates +Sentieon: bwamem, Locuscollector, Dedup + + + + Reports +MultiQC, Peddy, plink, rhocall + + + + + Variant calling + + SV +ExpansionHunter, CNVpytor, Manta, tiddit/sv + Mitochondria +According to GATK Best Practices +Mutect2, eKLIPse + SNV + short indels +Deepvariant +Sentieon: DNAscope, DNAModelApply + + + + Variant annotation and prioritization + + SV +VCFanno, VEP, Gens + Mitochondria +Haplogrep, HmtNote, gnomAD_mt + SNV + short indels +VCFanno, CADD, VEP + + + + + Outputs +VCFs, inputs for scout, Gens + + + + + vcf + + + + + + vcf + + + + + + vcf + + + + + + + fastq + + + + dev + + + + + + From 613792b50258463e2dac204240074cab1e7cbd7b Mon Sep 17 00:00:00 2001 From: Subazini TK Date: Wed, 5 Oct 2022 14:07:10 +0200 Subject: [PATCH 0695/1169] Update subworkflows/local/analyse_MT.nf Co-authored-by: Lucpen --- subworkflows/local/analyse_MT.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 11d0423e..1d131481 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -39,7 +39,6 @@ workflow ANALYSE_MT { dict, fai, ch_intervals_mt - ) ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT.out.versions) From 184a6e479b9886a0c513d734e51cd4294589b504 Mon Sep 17 00:00:00 2001 From: Subazini TK Date: Wed, 5 Oct 2022 14:07:18 +0200 Subject: [PATCH 0696/1169] Update subworkflows/local/analyse_MT.nf Co-authored-by: Lucpen --- subworkflows/local/analyse_MT.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 1d131481..1e0f1cce 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -25,7 +25,6 @@ workflow ANALYSE_MT { // STEP 1: PREPARING MT ALIGNMENT PREPARE_MT_ALIGNMENT ( bam ) - ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions)// Outputs bam files From 3718315dff5978eb9ee0856a07d0e98dd662dcc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Wed, 5 Oct 2022 14:34:32 +0200 Subject: [PATCH 0697/1169] modified: conf/modules.config modified: subworkflows/local/analyse_MT.nf modified: subworkflows/local/prepare_genome.nf modified: workflows/raredisease.nf --- conf/modules.config | 10 +++--- subworkflows/local/analyse_MT.nf | 53 +++++++++++++--------------- subworkflows/local/prepare_genome.nf | 2 +- workflows/raredisease.nf | 4 --- 4 files changed, 30 insertions(+), 39 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index dc33ab13..2741abb1 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -704,7 +704,7 @@ process { // ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT // process { - withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:BWAMEM2_INDEX' { + withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:BWAMEM2_INDEX' { ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} publishDir = [ path: { "${params.outdir}/references" }, @@ -716,7 +716,7 @@ process { } - + withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:SAMTOOLS_FAIDX' { publishDir = [ path: { "${params.outdir}/references" }, @@ -753,15 +753,15 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SAMTOOLS_SORT_MT' { ext.prefix = { "${meta.id}_sorted" } } - + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { ext.args = '--mitochondria-mode TRUE' } - withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { + withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { ext.args = '' } - + } diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 11d0423e..1693e7ec 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -1,11 +1,11 @@ // // Analyse MT // -include { PREPARE_MT_ALIGNMENT } from './prepare_MT_alignment' -include { ALIGN_AND_CALL_MT } from './align_and_call_MT' -include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './align_and_call_MT' -include { PREPARE_GENOME as PREPARE_GENOME_MT } from './prepare_genome' -include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/modules/picard/liftovervcf/main' +include { PREPARE_MT_ALIGNMENT } from './prepare_MT_alignment' +include { ALIGN_AND_CALL_MT } from './align_and_call_MT' +include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './align_and_call_MT' +include { PREPARE_GENOME as PREPARE_GENOME_MT } from './prepare_genome' +include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/modules/picard/liftovervcf/main' workflow ANALYSE_MT { take: @@ -18,17 +18,14 @@ workflow ANALYSE_MT { fasta_shift // channel: [ genome.fasta ] intervals_mt_shift // channel: [ file(control_region_shifted.chrM.interval_list) ] shift_chain - main: ch_versions = Channel.empty() // STEP 1: PREPARING MT ALIGNMENT PREPARE_MT_ALIGNMENT ( bam ) - ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions)// Outputs bam files - //STEP 2.1: MT ALLIGNMENT AND VARIANT CALLING ch_intervals_mt = Channel.fromPath(params.intervals_mt) ALIGN_AND_CALL_MT ( @@ -39,11 +36,9 @@ workflow ANALYSE_MT { dict, fai, ch_intervals_mt - ) ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT.out.versions) - aligner="bwamem2" // STEP 2.2: MT ALLIGNMENT SHIFT AND VARIANT CALLING ch_intervals_mt_shift = Channel.fromPath(params.intervals_mt_shift) PREPARE_GENOME_MT(aligner,[],[],fasta_shift ,[],[],[]).set { ch_genome } @@ -51,7 +46,7 @@ workflow ANALYSE_MT { ch_dict_shift = ch_genome.sequence_dict ch_fai_shift = ch_genome.fai ch_index_shift =ch_genome.aligner_index - + ALIGN_AND_CALL_MT_SHIFT ( PREPARE_MT_ALIGNMENT.out.fastq, @@ -64,26 +59,26 @@ workflow ANALYSE_MT { ) ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT_SHIFT.out.versions) - PICARD_LIFTOVERVCF (ALIGN_AND_CALL_MT_SHIFT.out.vcf,dict,shift_chain,fasta) - ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT_SHIFT.out.versions) - - + // STEP 2.3: PICARD_LIFTOVERVCF + PICARD_LIFTOVERVCF ( + ALIGN_AND_CALL_MT_SHIFT.out.vcf, + dict, + shift_chain, + fasta) + ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions) - emit: - vcf = ALIGN_AND_CALL_MT.out.vcf - tbi = ALIGN_AND_CALL_MT.out.tbi - txt = ALIGN_AND_CALL_MT.out.txt - html = ALIGN_AND_CALL_MT.out.html - vcf_shift = ALIGN_AND_CALL_MT_SHIFT.out.vcf - tbi_shift = ALIGN_AND_CALL_MT_SHIFT.out.tbi - txt_shift = ALIGN_AND_CALL_MT_SHIFT.out.txt - html_shift = ALIGN_AND_CALL_MT_SHIFT.out.html - - vcf_lift = PICARD_LIFTOVERVCF.out.vcf_lifted - vcf_unlift = PICARD_LIFTOVERVCF.out.vcf_unlifted - - versions = ch_versions // channel: [ versions.yml ] + vcf = ALIGN_AND_CALL_MT.out.vcf + tbi = ALIGN_AND_CALL_MT.out.tbi + txt = ALIGN_AND_CALL_MT.out.txt + html = ALIGN_AND_CALL_MT.out.html + vcf_shift = ALIGN_AND_CALL_MT_SHIFT.out.vcf + tbi_shift = ALIGN_AND_CALL_MT_SHIFT.out.tbi + txt_shift = ALIGN_AND_CALL_MT_SHIFT.out.txt + html_shift = ALIGN_AND_CALL_MT_SHIFT.out.html + vcf_lift = PICARD_LIFTOVERVCF.out.vcf_lifted + vcf_unlift = PICARD_LIFTOVERVCF.out.vcf_unlifted + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 6ff0513a..9d1b11e7 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -29,7 +29,7 @@ workflow PREPARE_GENOME { ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : [[],file(bwamem2_index)] ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) } else if (aligner == "sentieon") { - SENTIEON_BWAINDEX ([[],ch_fasta] ) + SENTIEON_BWAINDEX ([ [], ch_fasta] ) ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : [[],file(sentieon_index)] ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) } else { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 566d81e1..6225dea6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -70,7 +70,6 @@ include { FILTER_VEP as FILTER_VEP_SV } from '../modules/local/filter_vep' include { CHECK_INPUT } from '../subworkflows/local/check_input' include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' - include { ANNOTATE_SNVS } from '../subworkflows/local/annotate_snvs' include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' include { GENS } from '../subworkflows/local/gens' @@ -92,7 +91,6 @@ include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_co include { FASTQC } from '../modules/nf-core/modules/fastqc/main' include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' - include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' // @@ -276,8 +274,6 @@ workflow RAREDISEASE { params.fasta_shift, params.intervals_mt_shift, params.shift_chain - - ) ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) From 99bc475fcc158491cadfcd394e9dd804ef4ac8da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Wed, 5 Oct 2022 14:45:23 +0200 Subject: [PATCH 0698/1169] modified: subworkflows/local/analyse_MT.nf --- subworkflows/local/analyse_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 1693e7ec..9cfeaeb0 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -41,7 +41,7 @@ workflow ANALYSE_MT { // STEP 2.2: MT ALLIGNMENT SHIFT AND VARIANT CALLING ch_intervals_mt_shift = Channel.fromPath(params.intervals_mt_shift) - PREPARE_GENOME_MT(aligner,[],[],fasta_shift ,[],[],[]).set { ch_genome } + PREPARE_GENOME_MT("bwamem2",[],[],fasta_shift ,[],[],[]).set { ch_genome } ch_versions = ch_versions.mix(ch_genome.versions) ch_dict_shift = ch_genome.sequence_dict ch_fai_shift = ch_genome.fai From b89d7a0c3f799476f697fbbaf0e69ae0dbc89ef5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 5 Oct 2022 16:49:22 +0200 Subject: [PATCH 0699/1169] update to new structure --- modules.json | 443 +++++++++--------- .../{modules => }/bcftools/norm/main.nf | 0 .../{modules => }/bcftools/norm/meta.yml | 0 .../{modules => }/bcftools/roh/main.nf | 0 .../{modules => }/bcftools/roh/meta.yml | 0 .../{modules => }/bcftools/view/main.nf | 0 .../{modules => }/bcftools/view/meta.yml | 0 .../{modules => }/bwamem2/index/main.nf | 0 .../{modules => }/bwamem2/index/meta.yml | 0 .../nf-core/{modules => }/bwamem2/mem/main.nf | 0 .../{modules => }/bwamem2/mem/meta.yml | 0 modules/nf-core/{modules => }/cat/cat/main.nf | 0 .../nf-core/{modules => }/cat/cat/meta.yml | 0 .../{modules => }/cnvpytor/callcnvs/main.nf | 0 .../{modules => }/cnvpytor/callcnvs/meta.yml | 0 .../{modules => }/cnvpytor/histogram/main.nf | 0 .../{modules => }/cnvpytor/histogram/meta.yml | 0 .../cnvpytor/importreaddepth/main.nf | 0 .../cnvpytor/importreaddepth/meta.yml | 0 .../{modules => }/cnvpytor/partition/main.nf | 0 .../{modules => }/cnvpytor/partition/meta.yml | 0 .../{modules => }/cnvpytor/view/main.nf | 0 .../{modules => }/cnvpytor/view/meta.yml | 0 .../custom/dumpsoftwareversions/main.nf | 0 .../custom/dumpsoftwareversions/meta.yml | 0 .../templates/dumpsoftwareversions.py | 0 .../nf-core/{modules => }/deepvariant/main.nf | 0 .../{modules => }/deepvariant/meta.yml | 0 .../{modules => }/ensemblvep/Dockerfile | 0 .../nf-core/{modules => }/ensemblvep/build.sh | 0 .../{modules => }/ensemblvep/environment.yml | 0 .../nf-core/{modules => }/ensemblvep/main.nf | 0 .../nf-core/{modules => }/ensemblvep/meta.yml | 0 .../{modules => }/expansionhunter/main.nf | 0 .../{modules => }/expansionhunter/meta.yml | 0 modules/nf-core/{modules => }/fastqc/main.nf | 0 modules/nf-core/{modules => }/fastqc/meta.yml | 0 .../gatk4/bedtointervallist/main.nf | 0 .../gatk4/bedtointervallist/meta.yml | 0 .../gatk4/createsequencedictionary/main.nf | 0 .../gatk4/createsequencedictionary/meta.yml | 0 .../gatk4/intervallisttools/main.nf | 0 .../gatk4/intervallisttools/meta.yml | 0 .../gatk4/mergebamalignment/main.nf | 0 .../gatk4/mergebamalignment/meta.yml | 0 .../{modules => }/gatk4/mutect2/main.nf | 0 .../{modules => }/gatk4/mutect2/meta.yml | 0 .../{modules => }/gatk4/revertsam/main.nf | 0 .../{modules => }/gatk4/revertsam/meta.yml | 0 .../{modules => }/gatk4/samtofastq/main.nf | 0 .../{modules => }/gatk4/samtofastq/meta.yml | 0 .../{modules => }/genmod/annotate/main.nf | 0 .../{modules => }/genmod/annotate/meta.yml | 0 .../{modules => }/genmod/compound/main.nf | 0 .../{modules => }/genmod/compound/meta.yml | 0 .../{modules => }/genmod/models/main.nf | 0 .../{modules => }/genmod/models/meta.yml | 0 .../{modules => }/genmod/score/main.nf | 0 .../{modules => }/genmod/score/meta.yml | 0 modules/nf-core/{modules => }/glnexus/main.nf | 0 .../nf-core/{modules => }/glnexus/meta.yml | 0 .../nf-core/{modules => }/haplocheck/main.nf | 0 .../nf-core/{modules => }/haplocheck/meta.yml | 0 .../{modules => }/manta/germline/main.nf | 0 .../{modules => }/manta/germline/meta.yml | 0 .../nf-core/{modules => }/mosdepth/main.nf | 0 .../nf-core/{modules => }/mosdepth/meta.yml | 0 modules/nf-core/{modules => }/multiqc/main.nf | 0 .../nf-core/{modules => }/multiqc/meta.yml | 0 .../picard/addorreplacereadgroups/main.nf | 0 .../picard/addorreplacereadgroups/meta.yml | 0 .../picard/collecthsmetrics/main.nf | 0 .../picard/collecthsmetrics/meta.yml | 0 .../picard/collectmultiplemetrics/main.nf | 0 .../picard/collectmultiplemetrics/meta.yml | 0 .../picard/markduplicates/main.nf | 0 .../picard/markduplicates/meta.yml | 0 .../{modules => }/picard/sortvcf/main.nf | 0 .../{modules => }/picard/sortvcf/meta.yml | 0 .../{modules => }/qualimap/bamqc/main.nf | 0 .../{modules => }/qualimap/bamqc/meta.yml | 0 .../{modules => }/rhocall/annotate/main.nf | 0 .../{modules => }/rhocall/annotate/meta.yml | 0 .../{modules => }/samtools/faidx/main.nf | 0 .../{modules => }/samtools/faidx/meta.yml | 0 .../{modules => }/samtools/index/main.nf | 0 .../{modules => }/samtools/index/meta.yml | 0 .../{modules => }/samtools/merge/main.nf | 0 .../{modules => }/samtools/merge/meta.yml | 0 .../{modules => }/samtools/sort/main.nf | 0 .../{modules => }/samtools/sort/meta.yml | 0 .../{modules => }/samtools/stats/main.nf | 0 .../{modules => }/samtools/stats/meta.yml | 0 .../{modules => }/samtools/view/main.nf | 0 .../{modules => }/samtools/view/meta.yml | 0 .../nf-core/{modules => }/stranger/main.nf | 0 .../nf-core/{modules => }/stranger/meta.yml | 0 .../nf-core/{modules => }/svdb/merge/main.nf | 0 .../nf-core/{modules => }/svdb/merge/meta.yml | 0 .../nf-core/{modules => }/svdb/query/main.nf | 0 .../nf-core/{modules => }/svdb/query/meta.yml | 0 .../{modules => }/tabix/bgziptabix/main.nf | 0 .../{modules => }/tabix/bgziptabix/meta.yml | 0 .../nf-core/{modules => }/tabix/tabix/main.nf | 0 .../{modules => }/tabix/tabix/meta.yml | 0 .../nf-core/{modules => }/tiddit/cov/main.nf | 0 .../nf-core/{modules => }/tiddit/cov/meta.yml | 0 .../nf-core/{modules => }/tiddit/sv/main.nf | 0 .../nf-core/{modules => }/tiddit/sv/meta.yml | 0 .../{modules => }/ucsc/wigtobigwig/main.nf | 0 .../{modules => }/ucsc/wigtobigwig/meta.yml | 0 modules/nf-core/{modules => }/untar/main.nf | 0 modules/nf-core/{modules => }/untar/meta.yml | 0 modules/nf-core/{modules => }/vcfanno/main.nf | 0 .../nf-core/{modules => }/vcfanno/meta.yml | 0 115 files changed, 222 insertions(+), 221 deletions(-) rename modules/nf-core/{modules => }/bcftools/norm/main.nf (100%) rename modules/nf-core/{modules => }/bcftools/norm/meta.yml (100%) rename modules/nf-core/{modules => }/bcftools/roh/main.nf (100%) rename modules/nf-core/{modules => }/bcftools/roh/meta.yml (100%) rename modules/nf-core/{modules => }/bcftools/view/main.nf (100%) rename modules/nf-core/{modules => }/bcftools/view/meta.yml (100%) rename modules/nf-core/{modules => }/bwamem2/index/main.nf (100%) rename modules/nf-core/{modules => }/bwamem2/index/meta.yml (100%) rename modules/nf-core/{modules => }/bwamem2/mem/main.nf (100%) rename modules/nf-core/{modules => }/bwamem2/mem/meta.yml (100%) rename modules/nf-core/{modules => }/cat/cat/main.nf (100%) rename modules/nf-core/{modules => }/cat/cat/meta.yml (100%) rename modules/nf-core/{modules => }/cnvpytor/callcnvs/main.nf (100%) rename modules/nf-core/{modules => }/cnvpytor/callcnvs/meta.yml (100%) rename modules/nf-core/{modules => }/cnvpytor/histogram/main.nf (100%) rename modules/nf-core/{modules => }/cnvpytor/histogram/meta.yml (100%) rename modules/nf-core/{modules => }/cnvpytor/importreaddepth/main.nf (100%) rename modules/nf-core/{modules => }/cnvpytor/importreaddepth/meta.yml (100%) rename modules/nf-core/{modules => }/cnvpytor/partition/main.nf (100%) rename modules/nf-core/{modules => }/cnvpytor/partition/meta.yml (100%) rename modules/nf-core/{modules => }/cnvpytor/view/main.nf (100%) rename modules/nf-core/{modules => }/cnvpytor/view/meta.yml (100%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/main.nf (100%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/meta.yml (100%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py (100%) rename modules/nf-core/{modules => }/deepvariant/main.nf (100%) rename modules/nf-core/{modules => }/deepvariant/meta.yml (100%) rename modules/nf-core/{modules => }/ensemblvep/Dockerfile (100%) rename modules/nf-core/{modules => }/ensemblvep/build.sh (100%) rename modules/nf-core/{modules => }/ensemblvep/environment.yml (100%) rename modules/nf-core/{modules => }/ensemblvep/main.nf (100%) rename modules/nf-core/{modules => }/ensemblvep/meta.yml (100%) rename modules/nf-core/{modules => }/expansionhunter/main.nf (100%) rename modules/nf-core/{modules => }/expansionhunter/meta.yml (100%) rename modules/nf-core/{modules => }/fastqc/main.nf (100%) rename modules/nf-core/{modules => }/fastqc/meta.yml (100%) rename modules/nf-core/{modules => }/gatk4/bedtointervallist/main.nf (100%) rename modules/nf-core/{modules => }/gatk4/bedtointervallist/meta.yml (100%) rename modules/nf-core/{modules => }/gatk4/createsequencedictionary/main.nf (100%) rename modules/nf-core/{modules => }/gatk4/createsequencedictionary/meta.yml (100%) rename modules/nf-core/{modules => }/gatk4/intervallisttools/main.nf (100%) rename modules/nf-core/{modules => }/gatk4/intervallisttools/meta.yml (100%) rename modules/nf-core/{modules => }/gatk4/mergebamalignment/main.nf (100%) rename modules/nf-core/{modules => }/gatk4/mergebamalignment/meta.yml (100%) rename modules/nf-core/{modules => }/gatk4/mutect2/main.nf (100%) rename modules/nf-core/{modules => }/gatk4/mutect2/meta.yml (100%) rename modules/nf-core/{modules => }/gatk4/revertsam/main.nf (100%) rename modules/nf-core/{modules => }/gatk4/revertsam/meta.yml (100%) rename modules/nf-core/{modules => }/gatk4/samtofastq/main.nf (100%) rename modules/nf-core/{modules => }/gatk4/samtofastq/meta.yml (100%) rename modules/nf-core/{modules => }/genmod/annotate/main.nf (100%) rename modules/nf-core/{modules => }/genmod/annotate/meta.yml (100%) rename modules/nf-core/{modules => }/genmod/compound/main.nf (100%) rename modules/nf-core/{modules => }/genmod/compound/meta.yml (100%) rename modules/nf-core/{modules => }/genmod/models/main.nf (100%) rename modules/nf-core/{modules => }/genmod/models/meta.yml (100%) rename modules/nf-core/{modules => }/genmod/score/main.nf (100%) rename modules/nf-core/{modules => }/genmod/score/meta.yml (100%) rename modules/nf-core/{modules => }/glnexus/main.nf (100%) rename modules/nf-core/{modules => }/glnexus/meta.yml (100%) rename modules/nf-core/{modules => }/haplocheck/main.nf (100%) rename modules/nf-core/{modules => }/haplocheck/meta.yml (100%) rename modules/nf-core/{modules => }/manta/germline/main.nf (100%) rename modules/nf-core/{modules => }/manta/germline/meta.yml (100%) rename modules/nf-core/{modules => }/mosdepth/main.nf (100%) rename modules/nf-core/{modules => }/mosdepth/meta.yml (100%) rename modules/nf-core/{modules => }/multiqc/main.nf (100%) rename modules/nf-core/{modules => }/multiqc/meta.yml (100%) rename modules/nf-core/{modules => }/picard/addorreplacereadgroups/main.nf (100%) rename modules/nf-core/{modules => }/picard/addorreplacereadgroups/meta.yml (100%) rename modules/nf-core/{modules => }/picard/collecthsmetrics/main.nf (100%) rename modules/nf-core/{modules => }/picard/collecthsmetrics/meta.yml (100%) rename modules/nf-core/{modules => }/picard/collectmultiplemetrics/main.nf (100%) rename modules/nf-core/{modules => }/picard/collectmultiplemetrics/meta.yml (100%) rename modules/nf-core/{modules => }/picard/markduplicates/main.nf (100%) rename modules/nf-core/{modules => }/picard/markduplicates/meta.yml (100%) rename modules/nf-core/{modules => }/picard/sortvcf/main.nf (100%) rename modules/nf-core/{modules => }/picard/sortvcf/meta.yml (100%) rename modules/nf-core/{modules => }/qualimap/bamqc/main.nf (100%) rename modules/nf-core/{modules => }/qualimap/bamqc/meta.yml (100%) rename modules/nf-core/{modules => }/rhocall/annotate/main.nf (100%) rename modules/nf-core/{modules => }/rhocall/annotate/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/faidx/main.nf (100%) rename modules/nf-core/{modules => }/samtools/faidx/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/index/main.nf (100%) rename modules/nf-core/{modules => }/samtools/index/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/merge/main.nf (100%) rename modules/nf-core/{modules => }/samtools/merge/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/sort/main.nf (100%) rename modules/nf-core/{modules => }/samtools/sort/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/stats/main.nf (100%) rename modules/nf-core/{modules => }/samtools/stats/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/view/main.nf (100%) rename modules/nf-core/{modules => }/samtools/view/meta.yml (100%) rename modules/nf-core/{modules => }/stranger/main.nf (100%) rename modules/nf-core/{modules => }/stranger/meta.yml (100%) rename modules/nf-core/{modules => }/svdb/merge/main.nf (100%) rename modules/nf-core/{modules => }/svdb/merge/meta.yml (100%) rename modules/nf-core/{modules => }/svdb/query/main.nf (100%) rename modules/nf-core/{modules => }/svdb/query/meta.yml (100%) rename modules/nf-core/{modules => }/tabix/bgziptabix/main.nf (100%) rename modules/nf-core/{modules => }/tabix/bgziptabix/meta.yml (100%) rename modules/nf-core/{modules => }/tabix/tabix/main.nf (100%) rename modules/nf-core/{modules => }/tabix/tabix/meta.yml (100%) rename modules/nf-core/{modules => }/tiddit/cov/main.nf (100%) rename modules/nf-core/{modules => }/tiddit/cov/meta.yml (100%) rename modules/nf-core/{modules => }/tiddit/sv/main.nf (100%) rename modules/nf-core/{modules => }/tiddit/sv/meta.yml (100%) rename modules/nf-core/{modules => }/ucsc/wigtobigwig/main.nf (100%) rename modules/nf-core/{modules => }/ucsc/wigtobigwig/meta.yml (100%) rename modules/nf-core/{modules => }/untar/main.nf (100%) rename modules/nf-core/{modules => }/untar/meta.yml (100%) rename modules/nf-core/{modules => }/vcfanno/main.nf (100%) rename modules/nf-core/{modules => }/vcfanno/meta.yml (100%) diff --git a/modules.json b/modules.json index c4fdfc1d..976979f4 100644 --- a/modules.json +++ b/modules.json @@ -2,228 +2,229 @@ "name": "nf-core/raredisease", "homePage": "https://github.com/nf-core/raredisease", "repos": { - "nf-core/modules": { - "git_url": "https://github.com/nf-core/modules.git", + "https://github.com/nf-core/modules.git": { "modules": { - "bcftools/norm": { - "branch": "master", - "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" - }, - "bcftools/roh": { - "branch": "master", - "git_sha": "c079ee20250f5676c53b145fdd00f9defe91f112" - }, - "bcftools/view": { - "branch": "master", - "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" - }, - "bwamem2/index": { - "branch": "master", - "git_sha": "d0ff29fca32ba795177584ebfd51dcd6b0d5f890" - }, - "bwamem2/mem": { - "branch": "master", - "git_sha": "30b04859129f5f4235accdea9fdea8f1feb23809" - }, - "cat/cat": { - "branch": "master", - "git_sha": "eeda4136c096688d04cc40bb3c70d948213ed641" - }, - "cnvpytor/callcnvs": { - "branch": "master", - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" - }, - "cnvpytor/histogram": { - "branch": "master", - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" - }, - "cnvpytor/importreaddepth": { - "branch": "master", - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" - }, - "cnvpytor/partition": { - "branch": "master", - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" - }, - "cnvpytor/view": { - "branch": "master", - "git_sha": "16536b69368595f7e5934fcbaef5033522d49518" - }, - "custom/dumpsoftwareversions": { - "branch": "master", - "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" - }, - "deepvariant": { - "branch": "master", - "git_sha": "fd5f6f5f4ffef4ab5a4e809bd3211bbc71c38d30" - }, - "ensemblvep": { - "branch": "master", - "git_sha": "3d7ce9363079da9a79def248218dcc56efcd5410" - }, - "expansionhunter": { - "branch": "master", - "git_sha": "848ee9a215d02d80be033bfa60881700f2bd914c" - }, - "fastqc": { - "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" - }, - "gatk4/bedtointervallist": { - "branch": "master", - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" - }, - "gatk4/createsequencedictionary": { - "branch": "master", - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" - }, - "gatk4/intervallisttools": { - "branch": "master", - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" - }, - "gatk4/mergebamalignment": { - "branch": "master", - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" - }, - "gatk4/mutect2": { - "branch": "master", - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" - }, - "gatk4/revertsam": { - "branch": "master", - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" - }, - "gatk4/samtofastq": { - "branch": "master", - "git_sha": "169b2b96c1167f89ab07127b7057c1d90a6996c7" - }, - "genmod/annotate": { - "branch": "master", - "git_sha": "94619a3faf6918030ff948f0bce36812a339f4b5" - }, - "genmod/compound": { - "branch": "master", - "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" - }, - "genmod/models": { - "branch": "master", - "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" - }, - "genmod/score": { - "branch": "master", - "git_sha": "a8e6a88163eb1fe650cf57b5f7c067a4a10bbc99" - }, - "glnexus": { - "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" - }, - "haplocheck": { - "branch": "master", - "git_sha": "f5615c3db63a2bda7a1dbfaeae447cac3161d7b9" - }, - "manta/germline": { - "branch": "master", - "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" - }, - "mosdepth": { - "branch": "master", - "git_sha": "72a31b76eb1b58879e0d91fb1d992e0118693098" - }, - "multiqc": { - "branch": "master", - "git_sha": "4b1d4bf401d4cf65ebc4f604bc8c8e7551109db3" - }, - "picard/addorreplacereadgroups": { - "branch": "master", - "git_sha": "67652c7c4dda138c9e71f093b1aea91f29f87c50" - }, - "picard/collecthsmetrics": { - "branch": "master", - "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" - }, - "picard/collectmultiplemetrics": { - "branch": "master", - "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" - }, - "picard/markduplicates": { - "branch": "master", - "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" - }, - "picard/sortvcf": { - "branch": "master", - "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" - }, - "qualimap/bamqc": { - "branch": "master", - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" - }, - "rhocall/annotate": { - "branch": "master", - "git_sha": "17a4e931427b5b144c0d0227a3ea49347ba7457a" - }, - "samtools/faidx": { - "branch": "master", - "git_sha": "3eb99152cedbb7280258858e5df08478a4670696" - }, - "samtools/index": { - "branch": "master", - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" - }, - "samtools/merge": { - "branch": "master", - "git_sha": "720027275ccdc1363bb2a19c6412da148e31d94b" - }, - "samtools/sort": { - "branch": "master", - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" - }, - "samtools/stats": { - "branch": "master", - "git_sha": "f4eab7945952dc4934224309701a49913ea05ae6" - }, - "samtools/view": { - "branch": "master", - "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" - }, - "stranger": { - "branch": "master", - "git_sha": "c7329a3a5730872dea512921217993cfa7acd959" - }, - "svdb/merge": { - "branch": "master", - "git_sha": "513b5fcab92243bb6e227cd36ac779796d304f4a" - }, - "svdb/query": { - "branch": "master", - "git_sha": "313d76e00525c8e975dabce0c34973fd53c3f4dd" - }, - "tabix/bgziptabix": { - "branch": "master", - "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" - }, - "tabix/tabix": { - "branch": "master", - "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" - }, - "tiddit/cov": { - "branch": "master", - "git_sha": "40996cdbe1874f9c2ba693fee76d2b4f316f95f2" - }, - "tiddit/sv": { - "branch": "master", - "git_sha": "b689b8ed88a9f89eb2f7c75d3eb0bace77ade109" - }, - "ucsc/wigtobigwig": { - "branch": "master", - "git_sha": "8572bc8865d166edf2d8efeb97e77bfc53d0866b" - }, - "untar": { - "branch": "master", - "git_sha": "b63b9f752dc8e43fc70b0491aad5e0a270ab0e10" - }, - "vcfanno": { - "branch": "master", - "git_sha": "13631304102ca3d99def3578611b79332f6fd175" + "nf-core": { + "bcftools/norm": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "bcftools/roh": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "bcftools/view": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "bwamem2/index": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "bwamem2/mem": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cat/cat": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/callcnvs": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/histogram": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/importreaddepth": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/partition": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/view": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "8022c68e7403eecbd8ba9c49496f69f8c49d50f0" + }, + "deepvariant": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "ensemblvep": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "expansionhunter": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "fastqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/bedtointervallist": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/createsequencedictionary": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/intervallisttools": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/mergebamalignment": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/mutect2": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/revertsam": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/samtofastq": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "genmod/annotate": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "genmod/compound": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "genmod/models": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "genmod/score": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "glnexus": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "haplocheck": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "manta/germline": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "mosdepth": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "multiqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/addorreplacereadgroups": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/collecthsmetrics": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/collectmultiplemetrics": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/markduplicates": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/sortvcf": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "qualimap/bamqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "rhocall/annotate": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/faidx": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/index": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/merge": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/sort": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/stats": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/view": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "stranger": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "svdb/merge": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "svdb/query": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "tabix/bgziptabix": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "tabix/tabix": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "tiddit/cov": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "tiddit/sv": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "ucsc/wigtobigwig": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "untar": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "vcfanno": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + } } } } diff --git a/modules/nf-core/modules/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf similarity index 100% rename from modules/nf-core/modules/bcftools/norm/main.nf rename to modules/nf-core/bcftools/norm/main.nf diff --git a/modules/nf-core/modules/bcftools/norm/meta.yml b/modules/nf-core/bcftools/norm/meta.yml similarity index 100% rename from modules/nf-core/modules/bcftools/norm/meta.yml rename to modules/nf-core/bcftools/norm/meta.yml diff --git a/modules/nf-core/modules/bcftools/roh/main.nf b/modules/nf-core/bcftools/roh/main.nf similarity index 100% rename from modules/nf-core/modules/bcftools/roh/main.nf rename to modules/nf-core/bcftools/roh/main.nf diff --git a/modules/nf-core/modules/bcftools/roh/meta.yml b/modules/nf-core/bcftools/roh/meta.yml similarity index 100% rename from modules/nf-core/modules/bcftools/roh/meta.yml rename to modules/nf-core/bcftools/roh/meta.yml diff --git a/modules/nf-core/modules/bcftools/view/main.nf b/modules/nf-core/bcftools/view/main.nf similarity index 100% rename from modules/nf-core/modules/bcftools/view/main.nf rename to modules/nf-core/bcftools/view/main.nf diff --git a/modules/nf-core/modules/bcftools/view/meta.yml b/modules/nf-core/bcftools/view/meta.yml similarity index 100% rename from modules/nf-core/modules/bcftools/view/meta.yml rename to modules/nf-core/bcftools/view/meta.yml diff --git a/modules/nf-core/modules/bwamem2/index/main.nf b/modules/nf-core/bwamem2/index/main.nf similarity index 100% rename from modules/nf-core/modules/bwamem2/index/main.nf rename to modules/nf-core/bwamem2/index/main.nf diff --git a/modules/nf-core/modules/bwamem2/index/meta.yml b/modules/nf-core/bwamem2/index/meta.yml similarity index 100% rename from modules/nf-core/modules/bwamem2/index/meta.yml rename to modules/nf-core/bwamem2/index/meta.yml diff --git a/modules/nf-core/modules/bwamem2/mem/main.nf b/modules/nf-core/bwamem2/mem/main.nf similarity index 100% rename from modules/nf-core/modules/bwamem2/mem/main.nf rename to modules/nf-core/bwamem2/mem/main.nf diff --git a/modules/nf-core/modules/bwamem2/mem/meta.yml b/modules/nf-core/bwamem2/mem/meta.yml similarity index 100% rename from modules/nf-core/modules/bwamem2/mem/meta.yml rename to modules/nf-core/bwamem2/mem/meta.yml diff --git a/modules/nf-core/modules/cat/cat/main.nf b/modules/nf-core/cat/cat/main.nf similarity index 100% rename from modules/nf-core/modules/cat/cat/main.nf rename to modules/nf-core/cat/cat/main.nf diff --git a/modules/nf-core/modules/cat/cat/meta.yml b/modules/nf-core/cat/cat/meta.yml similarity index 100% rename from modules/nf-core/modules/cat/cat/meta.yml rename to modules/nf-core/cat/cat/meta.yml diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/main.nf b/modules/nf-core/cnvpytor/callcnvs/main.nf similarity index 100% rename from modules/nf-core/modules/cnvpytor/callcnvs/main.nf rename to modules/nf-core/cnvpytor/callcnvs/main.nf diff --git a/modules/nf-core/modules/cnvpytor/callcnvs/meta.yml b/modules/nf-core/cnvpytor/callcnvs/meta.yml similarity index 100% rename from modules/nf-core/modules/cnvpytor/callcnvs/meta.yml rename to modules/nf-core/cnvpytor/callcnvs/meta.yml diff --git a/modules/nf-core/modules/cnvpytor/histogram/main.nf b/modules/nf-core/cnvpytor/histogram/main.nf similarity index 100% rename from modules/nf-core/modules/cnvpytor/histogram/main.nf rename to modules/nf-core/cnvpytor/histogram/main.nf diff --git a/modules/nf-core/modules/cnvpytor/histogram/meta.yml b/modules/nf-core/cnvpytor/histogram/meta.yml similarity index 100% rename from modules/nf-core/modules/cnvpytor/histogram/meta.yml rename to modules/nf-core/cnvpytor/histogram/meta.yml diff --git a/modules/nf-core/modules/cnvpytor/importreaddepth/main.nf b/modules/nf-core/cnvpytor/importreaddepth/main.nf similarity index 100% rename from modules/nf-core/modules/cnvpytor/importreaddepth/main.nf rename to modules/nf-core/cnvpytor/importreaddepth/main.nf diff --git a/modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml b/modules/nf-core/cnvpytor/importreaddepth/meta.yml similarity index 100% rename from modules/nf-core/modules/cnvpytor/importreaddepth/meta.yml rename to modules/nf-core/cnvpytor/importreaddepth/meta.yml diff --git a/modules/nf-core/modules/cnvpytor/partition/main.nf b/modules/nf-core/cnvpytor/partition/main.nf similarity index 100% rename from modules/nf-core/modules/cnvpytor/partition/main.nf rename to modules/nf-core/cnvpytor/partition/main.nf diff --git a/modules/nf-core/modules/cnvpytor/partition/meta.yml b/modules/nf-core/cnvpytor/partition/meta.yml similarity index 100% rename from modules/nf-core/modules/cnvpytor/partition/meta.yml rename to modules/nf-core/cnvpytor/partition/meta.yml diff --git a/modules/nf-core/modules/cnvpytor/view/main.nf b/modules/nf-core/cnvpytor/view/main.nf similarity index 100% rename from modules/nf-core/modules/cnvpytor/view/main.nf rename to modules/nf-core/cnvpytor/view/main.nf diff --git a/modules/nf-core/modules/cnvpytor/view/meta.yml b/modules/nf-core/cnvpytor/view/meta.yml similarity index 100% rename from modules/nf-core/modules/cnvpytor/view/meta.yml rename to modules/nf-core/cnvpytor/view/meta.yml diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/main.nf rename to modules/nf-core/custom/dumpsoftwareversions/main.nf diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml rename to modules/nf-core/custom/dumpsoftwareversions/meta.yml diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py rename to modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/modules/nf-core/modules/deepvariant/main.nf b/modules/nf-core/deepvariant/main.nf similarity index 100% rename from modules/nf-core/modules/deepvariant/main.nf rename to modules/nf-core/deepvariant/main.nf diff --git a/modules/nf-core/modules/deepvariant/meta.yml b/modules/nf-core/deepvariant/meta.yml similarity index 100% rename from modules/nf-core/modules/deepvariant/meta.yml rename to modules/nf-core/deepvariant/meta.yml diff --git a/modules/nf-core/modules/ensemblvep/Dockerfile b/modules/nf-core/ensemblvep/Dockerfile similarity index 100% rename from modules/nf-core/modules/ensemblvep/Dockerfile rename to modules/nf-core/ensemblvep/Dockerfile diff --git a/modules/nf-core/modules/ensemblvep/build.sh b/modules/nf-core/ensemblvep/build.sh similarity index 100% rename from modules/nf-core/modules/ensemblvep/build.sh rename to modules/nf-core/ensemblvep/build.sh diff --git a/modules/nf-core/modules/ensemblvep/environment.yml b/modules/nf-core/ensemblvep/environment.yml similarity index 100% rename from modules/nf-core/modules/ensemblvep/environment.yml rename to modules/nf-core/ensemblvep/environment.yml diff --git a/modules/nf-core/modules/ensemblvep/main.nf b/modules/nf-core/ensemblvep/main.nf similarity index 100% rename from modules/nf-core/modules/ensemblvep/main.nf rename to modules/nf-core/ensemblvep/main.nf diff --git a/modules/nf-core/modules/ensemblvep/meta.yml b/modules/nf-core/ensemblvep/meta.yml similarity index 100% rename from modules/nf-core/modules/ensemblvep/meta.yml rename to modules/nf-core/ensemblvep/meta.yml diff --git a/modules/nf-core/modules/expansionhunter/main.nf b/modules/nf-core/expansionhunter/main.nf similarity index 100% rename from modules/nf-core/modules/expansionhunter/main.nf rename to modules/nf-core/expansionhunter/main.nf diff --git a/modules/nf-core/modules/expansionhunter/meta.yml b/modules/nf-core/expansionhunter/meta.yml similarity index 100% rename from modules/nf-core/modules/expansionhunter/meta.yml rename to modules/nf-core/expansionhunter/meta.yml diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/fastqc/main.nf similarity index 100% rename from modules/nf-core/modules/fastqc/main.nf rename to modules/nf-core/fastqc/main.nf diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml similarity index 100% rename from modules/nf-core/modules/fastqc/meta.yml rename to modules/nf-core/fastqc/meta.yml diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/main.nf b/modules/nf-core/gatk4/bedtointervallist/main.nf similarity index 100% rename from modules/nf-core/modules/gatk4/bedtointervallist/main.nf rename to modules/nf-core/gatk4/bedtointervallist/main.nf diff --git a/modules/nf-core/modules/gatk4/bedtointervallist/meta.yml b/modules/nf-core/gatk4/bedtointervallist/meta.yml similarity index 100% rename from modules/nf-core/modules/gatk4/bedtointervallist/meta.yml rename to modules/nf-core/gatk4/bedtointervallist/meta.yml diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/main.nf b/modules/nf-core/gatk4/createsequencedictionary/main.nf similarity index 100% rename from modules/nf-core/modules/gatk4/createsequencedictionary/main.nf rename to modules/nf-core/gatk4/createsequencedictionary/main.nf diff --git a/modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml b/modules/nf-core/gatk4/createsequencedictionary/meta.yml similarity index 100% rename from modules/nf-core/modules/gatk4/createsequencedictionary/meta.yml rename to modules/nf-core/gatk4/createsequencedictionary/meta.yml diff --git a/modules/nf-core/modules/gatk4/intervallisttools/main.nf b/modules/nf-core/gatk4/intervallisttools/main.nf similarity index 100% rename from modules/nf-core/modules/gatk4/intervallisttools/main.nf rename to modules/nf-core/gatk4/intervallisttools/main.nf diff --git a/modules/nf-core/modules/gatk4/intervallisttools/meta.yml b/modules/nf-core/gatk4/intervallisttools/meta.yml similarity index 100% rename from modules/nf-core/modules/gatk4/intervallisttools/meta.yml rename to modules/nf-core/gatk4/intervallisttools/meta.yml diff --git a/modules/nf-core/modules/gatk4/mergebamalignment/main.nf b/modules/nf-core/gatk4/mergebamalignment/main.nf similarity index 100% rename from modules/nf-core/modules/gatk4/mergebamalignment/main.nf rename to modules/nf-core/gatk4/mergebamalignment/main.nf diff --git a/modules/nf-core/modules/gatk4/mergebamalignment/meta.yml b/modules/nf-core/gatk4/mergebamalignment/meta.yml similarity index 100% rename from modules/nf-core/modules/gatk4/mergebamalignment/meta.yml rename to modules/nf-core/gatk4/mergebamalignment/meta.yml diff --git a/modules/nf-core/modules/gatk4/mutect2/main.nf b/modules/nf-core/gatk4/mutect2/main.nf similarity index 100% rename from modules/nf-core/modules/gatk4/mutect2/main.nf rename to modules/nf-core/gatk4/mutect2/main.nf diff --git a/modules/nf-core/modules/gatk4/mutect2/meta.yml b/modules/nf-core/gatk4/mutect2/meta.yml similarity index 100% rename from modules/nf-core/modules/gatk4/mutect2/meta.yml rename to modules/nf-core/gatk4/mutect2/meta.yml diff --git a/modules/nf-core/modules/gatk4/revertsam/main.nf b/modules/nf-core/gatk4/revertsam/main.nf similarity index 100% rename from modules/nf-core/modules/gatk4/revertsam/main.nf rename to modules/nf-core/gatk4/revertsam/main.nf diff --git a/modules/nf-core/modules/gatk4/revertsam/meta.yml b/modules/nf-core/gatk4/revertsam/meta.yml similarity index 100% rename from modules/nf-core/modules/gatk4/revertsam/meta.yml rename to modules/nf-core/gatk4/revertsam/meta.yml diff --git a/modules/nf-core/modules/gatk4/samtofastq/main.nf b/modules/nf-core/gatk4/samtofastq/main.nf similarity index 100% rename from modules/nf-core/modules/gatk4/samtofastq/main.nf rename to modules/nf-core/gatk4/samtofastq/main.nf diff --git a/modules/nf-core/modules/gatk4/samtofastq/meta.yml b/modules/nf-core/gatk4/samtofastq/meta.yml similarity index 100% rename from modules/nf-core/modules/gatk4/samtofastq/meta.yml rename to modules/nf-core/gatk4/samtofastq/meta.yml diff --git a/modules/nf-core/modules/genmod/annotate/main.nf b/modules/nf-core/genmod/annotate/main.nf similarity index 100% rename from modules/nf-core/modules/genmod/annotate/main.nf rename to modules/nf-core/genmod/annotate/main.nf diff --git a/modules/nf-core/modules/genmod/annotate/meta.yml b/modules/nf-core/genmod/annotate/meta.yml similarity index 100% rename from modules/nf-core/modules/genmod/annotate/meta.yml rename to modules/nf-core/genmod/annotate/meta.yml diff --git a/modules/nf-core/modules/genmod/compound/main.nf b/modules/nf-core/genmod/compound/main.nf similarity index 100% rename from modules/nf-core/modules/genmod/compound/main.nf rename to modules/nf-core/genmod/compound/main.nf diff --git a/modules/nf-core/modules/genmod/compound/meta.yml b/modules/nf-core/genmod/compound/meta.yml similarity index 100% rename from modules/nf-core/modules/genmod/compound/meta.yml rename to modules/nf-core/genmod/compound/meta.yml diff --git a/modules/nf-core/modules/genmod/models/main.nf b/modules/nf-core/genmod/models/main.nf similarity index 100% rename from modules/nf-core/modules/genmod/models/main.nf rename to modules/nf-core/genmod/models/main.nf diff --git a/modules/nf-core/modules/genmod/models/meta.yml b/modules/nf-core/genmod/models/meta.yml similarity index 100% rename from modules/nf-core/modules/genmod/models/meta.yml rename to modules/nf-core/genmod/models/meta.yml diff --git a/modules/nf-core/modules/genmod/score/main.nf b/modules/nf-core/genmod/score/main.nf similarity index 100% rename from modules/nf-core/modules/genmod/score/main.nf rename to modules/nf-core/genmod/score/main.nf diff --git a/modules/nf-core/modules/genmod/score/meta.yml b/modules/nf-core/genmod/score/meta.yml similarity index 100% rename from modules/nf-core/modules/genmod/score/meta.yml rename to modules/nf-core/genmod/score/meta.yml diff --git a/modules/nf-core/modules/glnexus/main.nf b/modules/nf-core/glnexus/main.nf similarity index 100% rename from modules/nf-core/modules/glnexus/main.nf rename to modules/nf-core/glnexus/main.nf diff --git a/modules/nf-core/modules/glnexus/meta.yml b/modules/nf-core/glnexus/meta.yml similarity index 100% rename from modules/nf-core/modules/glnexus/meta.yml rename to modules/nf-core/glnexus/meta.yml diff --git a/modules/nf-core/modules/haplocheck/main.nf b/modules/nf-core/haplocheck/main.nf similarity index 100% rename from modules/nf-core/modules/haplocheck/main.nf rename to modules/nf-core/haplocheck/main.nf diff --git a/modules/nf-core/modules/haplocheck/meta.yml b/modules/nf-core/haplocheck/meta.yml similarity index 100% rename from modules/nf-core/modules/haplocheck/meta.yml rename to modules/nf-core/haplocheck/meta.yml diff --git a/modules/nf-core/modules/manta/germline/main.nf b/modules/nf-core/manta/germline/main.nf similarity index 100% rename from modules/nf-core/modules/manta/germline/main.nf rename to modules/nf-core/manta/germline/main.nf diff --git a/modules/nf-core/modules/manta/germline/meta.yml b/modules/nf-core/manta/germline/meta.yml similarity index 100% rename from modules/nf-core/modules/manta/germline/meta.yml rename to modules/nf-core/manta/germline/meta.yml diff --git a/modules/nf-core/modules/mosdepth/main.nf b/modules/nf-core/mosdepth/main.nf similarity index 100% rename from modules/nf-core/modules/mosdepth/main.nf rename to modules/nf-core/mosdepth/main.nf diff --git a/modules/nf-core/modules/mosdepth/meta.yml b/modules/nf-core/mosdepth/meta.yml similarity index 100% rename from modules/nf-core/modules/mosdepth/meta.yml rename to modules/nf-core/mosdepth/meta.yml diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/multiqc/main.nf similarity index 100% rename from modules/nf-core/modules/multiqc/main.nf rename to modules/nf-core/multiqc/main.nf diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml similarity index 100% rename from modules/nf-core/modules/multiqc/meta.yml rename to modules/nf-core/multiqc/meta.yml diff --git a/modules/nf-core/modules/picard/addorreplacereadgroups/main.nf b/modules/nf-core/picard/addorreplacereadgroups/main.nf similarity index 100% rename from modules/nf-core/modules/picard/addorreplacereadgroups/main.nf rename to modules/nf-core/picard/addorreplacereadgroups/main.nf diff --git a/modules/nf-core/modules/picard/addorreplacereadgroups/meta.yml b/modules/nf-core/picard/addorreplacereadgroups/meta.yml similarity index 100% rename from modules/nf-core/modules/picard/addorreplacereadgroups/meta.yml rename to modules/nf-core/picard/addorreplacereadgroups/meta.yml diff --git a/modules/nf-core/modules/picard/collecthsmetrics/main.nf b/modules/nf-core/picard/collecthsmetrics/main.nf similarity index 100% rename from modules/nf-core/modules/picard/collecthsmetrics/main.nf rename to modules/nf-core/picard/collecthsmetrics/main.nf diff --git a/modules/nf-core/modules/picard/collecthsmetrics/meta.yml b/modules/nf-core/picard/collecthsmetrics/meta.yml similarity index 100% rename from modules/nf-core/modules/picard/collecthsmetrics/meta.yml rename to modules/nf-core/picard/collecthsmetrics/meta.yml diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/picard/collectmultiplemetrics/main.nf similarity index 100% rename from modules/nf-core/modules/picard/collectmultiplemetrics/main.nf rename to modules/nf-core/picard/collectmultiplemetrics/main.nf diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/picard/collectmultiplemetrics/meta.yml similarity index 100% rename from modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml rename to modules/nf-core/picard/collectmultiplemetrics/meta.yml diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/picard/markduplicates/main.nf similarity index 100% rename from modules/nf-core/modules/picard/markduplicates/main.nf rename to modules/nf-core/picard/markduplicates/main.nf diff --git a/modules/nf-core/modules/picard/markduplicates/meta.yml b/modules/nf-core/picard/markduplicates/meta.yml similarity index 100% rename from modules/nf-core/modules/picard/markduplicates/meta.yml rename to modules/nf-core/picard/markduplicates/meta.yml diff --git a/modules/nf-core/modules/picard/sortvcf/main.nf b/modules/nf-core/picard/sortvcf/main.nf similarity index 100% rename from modules/nf-core/modules/picard/sortvcf/main.nf rename to modules/nf-core/picard/sortvcf/main.nf diff --git a/modules/nf-core/modules/picard/sortvcf/meta.yml b/modules/nf-core/picard/sortvcf/meta.yml similarity index 100% rename from modules/nf-core/modules/picard/sortvcf/meta.yml rename to modules/nf-core/picard/sortvcf/meta.yml diff --git a/modules/nf-core/modules/qualimap/bamqc/main.nf b/modules/nf-core/qualimap/bamqc/main.nf similarity index 100% rename from modules/nf-core/modules/qualimap/bamqc/main.nf rename to modules/nf-core/qualimap/bamqc/main.nf diff --git a/modules/nf-core/modules/qualimap/bamqc/meta.yml b/modules/nf-core/qualimap/bamqc/meta.yml similarity index 100% rename from modules/nf-core/modules/qualimap/bamqc/meta.yml rename to modules/nf-core/qualimap/bamqc/meta.yml diff --git a/modules/nf-core/modules/rhocall/annotate/main.nf b/modules/nf-core/rhocall/annotate/main.nf similarity index 100% rename from modules/nf-core/modules/rhocall/annotate/main.nf rename to modules/nf-core/rhocall/annotate/main.nf diff --git a/modules/nf-core/modules/rhocall/annotate/meta.yml b/modules/nf-core/rhocall/annotate/meta.yml similarity index 100% rename from modules/nf-core/modules/rhocall/annotate/meta.yml rename to modules/nf-core/rhocall/annotate/meta.yml diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/faidx/main.nf rename to modules/nf-core/samtools/faidx/main.nf diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/faidx/meta.yml rename to modules/nf-core/samtools/faidx/meta.yml diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/index/main.nf rename to modules/nf-core/samtools/index/main.nf diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/index/meta.yml rename to modules/nf-core/samtools/index/meta.yml diff --git a/modules/nf-core/modules/samtools/merge/main.nf b/modules/nf-core/samtools/merge/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/merge/main.nf rename to modules/nf-core/samtools/merge/main.nf diff --git a/modules/nf-core/modules/samtools/merge/meta.yml b/modules/nf-core/samtools/merge/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/merge/meta.yml rename to modules/nf-core/samtools/merge/meta.yml diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/sort/main.nf rename to modules/nf-core/samtools/sort/main.nf diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/sort/meta.yml rename to modules/nf-core/samtools/sort/meta.yml diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/stats/main.nf rename to modules/nf-core/samtools/stats/main.nf diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/stats/meta.yml rename to modules/nf-core/samtools/stats/meta.yml diff --git a/modules/nf-core/modules/samtools/view/main.nf b/modules/nf-core/samtools/view/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/view/main.nf rename to modules/nf-core/samtools/view/main.nf diff --git a/modules/nf-core/modules/samtools/view/meta.yml b/modules/nf-core/samtools/view/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/view/meta.yml rename to modules/nf-core/samtools/view/meta.yml diff --git a/modules/nf-core/modules/stranger/main.nf b/modules/nf-core/stranger/main.nf similarity index 100% rename from modules/nf-core/modules/stranger/main.nf rename to modules/nf-core/stranger/main.nf diff --git a/modules/nf-core/modules/stranger/meta.yml b/modules/nf-core/stranger/meta.yml similarity index 100% rename from modules/nf-core/modules/stranger/meta.yml rename to modules/nf-core/stranger/meta.yml diff --git a/modules/nf-core/modules/svdb/merge/main.nf b/modules/nf-core/svdb/merge/main.nf similarity index 100% rename from modules/nf-core/modules/svdb/merge/main.nf rename to modules/nf-core/svdb/merge/main.nf diff --git a/modules/nf-core/modules/svdb/merge/meta.yml b/modules/nf-core/svdb/merge/meta.yml similarity index 100% rename from modules/nf-core/modules/svdb/merge/meta.yml rename to modules/nf-core/svdb/merge/meta.yml diff --git a/modules/nf-core/modules/svdb/query/main.nf b/modules/nf-core/svdb/query/main.nf similarity index 100% rename from modules/nf-core/modules/svdb/query/main.nf rename to modules/nf-core/svdb/query/main.nf diff --git a/modules/nf-core/modules/svdb/query/meta.yml b/modules/nf-core/svdb/query/meta.yml similarity index 100% rename from modules/nf-core/modules/svdb/query/meta.yml rename to modules/nf-core/svdb/query/meta.yml diff --git a/modules/nf-core/modules/tabix/bgziptabix/main.nf b/modules/nf-core/tabix/bgziptabix/main.nf similarity index 100% rename from modules/nf-core/modules/tabix/bgziptabix/main.nf rename to modules/nf-core/tabix/bgziptabix/main.nf diff --git a/modules/nf-core/modules/tabix/bgziptabix/meta.yml b/modules/nf-core/tabix/bgziptabix/meta.yml similarity index 100% rename from modules/nf-core/modules/tabix/bgziptabix/meta.yml rename to modules/nf-core/tabix/bgziptabix/meta.yml diff --git a/modules/nf-core/modules/tabix/tabix/main.nf b/modules/nf-core/tabix/tabix/main.nf similarity index 100% rename from modules/nf-core/modules/tabix/tabix/main.nf rename to modules/nf-core/tabix/tabix/main.nf diff --git a/modules/nf-core/modules/tabix/tabix/meta.yml b/modules/nf-core/tabix/tabix/meta.yml similarity index 100% rename from modules/nf-core/modules/tabix/tabix/meta.yml rename to modules/nf-core/tabix/tabix/meta.yml diff --git a/modules/nf-core/modules/tiddit/cov/main.nf b/modules/nf-core/tiddit/cov/main.nf similarity index 100% rename from modules/nf-core/modules/tiddit/cov/main.nf rename to modules/nf-core/tiddit/cov/main.nf diff --git a/modules/nf-core/modules/tiddit/cov/meta.yml b/modules/nf-core/tiddit/cov/meta.yml similarity index 100% rename from modules/nf-core/modules/tiddit/cov/meta.yml rename to modules/nf-core/tiddit/cov/meta.yml diff --git a/modules/nf-core/modules/tiddit/sv/main.nf b/modules/nf-core/tiddit/sv/main.nf similarity index 100% rename from modules/nf-core/modules/tiddit/sv/main.nf rename to modules/nf-core/tiddit/sv/main.nf diff --git a/modules/nf-core/modules/tiddit/sv/meta.yml b/modules/nf-core/tiddit/sv/meta.yml similarity index 100% rename from modules/nf-core/modules/tiddit/sv/meta.yml rename to modules/nf-core/tiddit/sv/meta.yml diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/main.nf b/modules/nf-core/ucsc/wigtobigwig/main.nf similarity index 100% rename from modules/nf-core/modules/ucsc/wigtobigwig/main.nf rename to modules/nf-core/ucsc/wigtobigwig/main.nf diff --git a/modules/nf-core/modules/ucsc/wigtobigwig/meta.yml b/modules/nf-core/ucsc/wigtobigwig/meta.yml similarity index 100% rename from modules/nf-core/modules/ucsc/wigtobigwig/meta.yml rename to modules/nf-core/ucsc/wigtobigwig/meta.yml diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/untar/main.nf similarity index 100% rename from modules/nf-core/modules/untar/main.nf rename to modules/nf-core/untar/main.nf diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/untar/meta.yml similarity index 100% rename from modules/nf-core/modules/untar/meta.yml rename to modules/nf-core/untar/meta.yml diff --git a/modules/nf-core/modules/vcfanno/main.nf b/modules/nf-core/vcfanno/main.nf similarity index 100% rename from modules/nf-core/modules/vcfanno/main.nf rename to modules/nf-core/vcfanno/main.nf diff --git a/modules/nf-core/modules/vcfanno/meta.yml b/modules/nf-core/vcfanno/meta.yml similarity index 100% rename from modules/nf-core/modules/vcfanno/meta.yml rename to modules/nf-core/vcfanno/meta.yml From dbc47743aeaa42220540080ce8f6f89cc97e2937 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 5 Oct 2022 17:17:49 +0200 Subject: [PATCH 0700/1169] 21.10.03 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec507a1e..7a64a034 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: NXF_VER: - - "21.10.4" + - "21.10.3" - "latest-everything" steps: - name: Check out pipeline code From 873b272995b2d97a8efe020ff350aa61fd4886c2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 5 Oct 2022 17:49:44 +0200 Subject: [PATCH 0701/1169] force update modules --- modules/nf-core/bwamem2/index/main.nf | 2 +- .../custom/dumpsoftwareversions/main.nf | 6 +- .../templates/dumpsoftwareversions.py | 98 +++++++++++-------- modules/nf-core/deepvariant/main.nf | 6 +- modules/nf-core/multiqc/main.nf | 2 +- modules/nf-core/samtools/merge/main.nf | 6 +- modules/nf-core/samtools/merge/meta.yml | 4 + modules/nf-core/samtools/sort/main.nf | 1 + modules/nf-core/samtools/sort/meta.yml | 4 + modules/nf-core/samtools/view/main.nf | 26 +++-- modules/nf-core/samtools/view/meta.yml | 30 +++++- modules/nf-core/ucsc/wigtobigwig/main.nf | 2 +- 12 files changed, 119 insertions(+), 68 deletions(-) mode change 100644 => 100755 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/modules/nf-core/bwamem2/index/main.nf b/modules/nf-core/bwamem2/index/main.nf index 6b63ea59..0b7ad199 100644 --- a/modules/nf-core/bwamem2/index/main.nf +++ b/modules/nf-core/bwamem2/index/main.nf @@ -1,6 +1,6 @@ process BWAMEM2_INDEX { tag "$fasta" - label 'process_high' + label 'process_single' conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 34b50b9f..cebb6e05 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? 'bioconda::multiqc=1.13a' : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13a--pyhdfd78af_1' : - 'quay.io/biocontainers/multiqc:1.13a--pyhdfd78af_1' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py old mode 100644 new mode 100755 index d1390392..da033408 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -1,11 +1,16 @@ #!/usr/bin/env python + +"""Provide functions to merge multiple versions.yml files.""" + + import yaml import platform from textwrap import dedent def _make_versions_html(versions): + """Generate a tabular HTML output of all versions for MultiQC.""" html = [ dedent( """\\ @@ -44,46 +49,53 @@ def _make_versions_html(versions): return "\\n".join(html) -versions_this_module = {} -versions_this_module["${task.process}"] = { - "python": platform.python_version(), - "yaml": yaml.__version__, -} - -with open("$versions") as f: - versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module - -# aggregate versions by the module name (derived from fully-qualified process name) -versions_by_module = {} -for process, process_versions in versions_by_process.items(): - module = process.split(":")[-1] - try: - assert versions_by_module[module] == process_versions, ( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) - except KeyError: - versions_by_module[module] = process_versions - -versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", -} - -versions_mqc = { - "id": "software_versions", - "section_name": "${workflow.manifest.name} Software Versions", - "section_href": "https://github.com/${workflow.manifest.name}", - "plot_type": "html", - "description": "are collected at run time from the software output.", - "data": _make_versions_html(versions_by_module), -} - -with open("software_versions.yml", "w") as f: - yaml.dump(versions_by_module, f, default_flow_style=False) -with open("software_versions_mqc.yml", "w") as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - -with open("versions.yml", "w") as f: - yaml.dump(versions_this_module, f, default_flow_style=False) +def main(): + """Load all version files and generate merged output.""" + versions_this_module = {} + versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, + } + + with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + + # aggregate versions by the module name (derived from fully-qualified process name) + versions_by_module = {} + for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + if versions_by_module[module] != process_versions: + raise AssertionError( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + + versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", + } + + versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), + } + + with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) + with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + + with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) + + +if __name__ == "__main__": + main() diff --git a/modules/nf-core/deepvariant/main.nf b/modules/nf-core/deepvariant/main.nf index e2a0bee7..344fdb03 100644 --- a/modules/nf-core/deepvariant/main.nf +++ b/modules/nf-core/deepvariant/main.nf @@ -4,12 +4,10 @@ process DEEPVARIANT { if (params.enable_conda) { - exit 1, "Conda environments cannot be used when using the DeepVariant tool. Please use docker or singularity containers." + exit 1, "Conda environments cannot be used with DeepVariant at the moment. Please use Docker or Singularity containers." } - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'google/deepvariant:1.3.0' : - 'google/deepvariant:1.3.0' }" + container "google/deepvariant:1.3.0" input: tuple val(meta), path(input), path(index), path(intervals) diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 698461d7..a8159a57 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,5 +1,5 @@ process MULTIQC { - label 'process_medium' + label 'process_single' conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/nf-core/samtools/merge/main.nf b/modules/nf-core/samtools/merge/main.nf index d01bbed8..91f14116 100644 --- a/modules/nf-core/samtools/merge/main.nf +++ b/modules/nf-core/samtools/merge/main.nf @@ -15,15 +15,17 @@ process SAMTOOLS_MERGE { output: tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram + tuple val(meta), path("*.csi") , optional:true, emit: csi path "versions.yml" , emit: versions + when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" - def file_type = input_files[0].getExtension() + def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() def reference = fasta ? "--reference ${fasta}" : "" """ samtools \\ @@ -42,7 +44,7 @@ process SAMTOOLS_MERGE { stub: prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" - def file_type = input_files[0].getExtension() + def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() """ touch ${prefix}.${file_type} diff --git a/modules/nf-core/samtools/merge/meta.yml b/modules/nf-core/samtools/merge/meta.yml index f6833d0c..5bd84bc5 100644 --- a/modules/nf-core/samtools/merge/meta.yml +++ b/modules/nf-core/samtools/merge/meta.yml @@ -51,6 +51,10 @@ output: type: file description: File containing software versions pattern: "versions.yml" + - csi: + type: file + description: BAM index file (optional) + pattern: "*.csi" authors: - "@drpatelh" - "@yuukiiwa " diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf index b4fc1cbe..ab7f1cca 100644 --- a/modules/nf-core/samtools/sort/main.nf +++ b/modules/nf-core/samtools/sort/main.nf @@ -12,6 +12,7 @@ process SAMTOOLS_SORT { output: tuple val(meta), path("*.bam"), emit: bam + tuple val(meta), path("*.csi"), emit: csi, optional: true path "versions.yml" , emit: versions when: diff --git a/modules/nf-core/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml index a820c55a..09289751 100644 --- a/modules/nf-core/samtools/sort/meta.yml +++ b/modules/nf-core/samtools/sort/meta.yml @@ -39,6 +39,10 @@ output: type: file description: File containing software versions pattern: "versions.yml" + - csi: + type: file + description: BAM index file (optional) + pattern: "*.csi" authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/samtools/view/main.nf b/modules/nf-core/samtools/view/main.nf index 59ded5c3..94da5d69 100644 --- a/modules/nf-core/samtools/view/main.nf +++ b/modules/nf-core/samtools/view/main.nf @@ -10,31 +10,39 @@ process SAMTOOLS_VIEW { input: tuple val(meta), path(input), path(index) path fasta + path qname output: - tuple val(meta), path("*.bam") , emit: bam , optional: true - tuple val(meta), path("*.cram"), emit: cram, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.bam"), emit: bam, optional: true + tuple val(meta), path("*.cram"), emit: cram, optional: true + tuple val(meta), path("*.sam"), emit: sam, optional: true + tuple val(meta), path("*.bai"), emit: bai, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val(meta), path("*.crai"), emit: crai, optional: true + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def reference = fasta ? "--reference ${fasta} -C" : "" - def file_type = input.getExtension() + def reference = fasta ? "--reference ${fasta}" : "" + def readnames = qname ? "--qname-file ${qname}": "" + def file_type = args.contains("--output-fmt sam") ? "sam" : + args.contains("--output-fmt bam") ? "bam" : + args.contains("--output-fmt cram") ? "cram" : + input.getExtension() if ("$input" == "${prefix}.${file_type}") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ samtools \\ view \\ --threads ${task.cpus-1} \\ ${reference} \\ + ${readnames} \\ $args \\ - $input \\ - $args2 \\ - > ${prefix}.${file_type} + -o ${prefix}.${file_type} \\ + $input cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/samtools/view/meta.yml b/modules/nf-core/samtools/view/meta.yml index a8b43ecc..a52e4f8d 100644 --- a/modules/nf-core/samtools/view/meta.yml +++ b/modules/nf-core/samtools/view/meta.yml @@ -33,6 +33,10 @@ input: type: optional file description: Reference file the CRAM was created with pattern: "*.{fasta,fa}" + - qname: + type: file + description: Optional file with read names to output only select alignments + pattern: "*.{txt,list}" output: - meta: type: map @@ -41,12 +45,29 @@ output: e.g. [ id:'test', single_end:false ] - bam: type: file - description: filtered/converted BAM/SAM file - pattern: "*.{bam,sam}" + description: optional filtered/converted BAM file + pattern: "*.{bam}" - cram: type: file - description: filtered/converted CRAM file - pattern: "*.cram" + description: optional filtered/converted CRAM file + pattern: "*.{cram}" + - sam: + type: file + description: optional filtered/converted SAM file + pattern: "*.{sam}" + # bai, csi, and crai are created with `--write-index` + - bai: + type: file + description: optional BAM file index + pattern: "*.{bai}" + - csi: + type: file + description: optional tabix BAM file index + pattern: "*.{csi}" + - crai: + type: file + description: optional CRAM file index + pattern: "*.{crai}" - versions: type: file description: File containing software versions @@ -55,3 +76,4 @@ authors: - "@drpatelh" - "@joseespinosa" - "@FriederikeHanssen" + - "@priyanka-surana" diff --git a/modules/nf-core/ucsc/wigtobigwig/main.nf b/modules/nf-core/ucsc/wigtobigwig/main.nf index 4daff1f5..cf76cf0a 100644 --- a/modules/nf-core/ucsc/wigtobigwig/main.nf +++ b/modules/nf-core/ucsc/wigtobigwig/main.nf @@ -1,6 +1,6 @@ process UCSC_WIGTOBIGWIG { tag "$meta.id" - label 'process_medium' + label 'process_single' // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. conda (params.enable_conda ? "bioconda::ucsc-wigtobigwig=377" : null) From 58b442d0dd6ccd18aa7ecec72da1b4c5b328c31d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 5 Oct 2022 21:51:20 +0200 Subject: [PATCH 0702/1169] trigger GitHub actions From 270a10aef6ef16724b56f419ccc50b5d4cfe61f3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 5 Oct 2022 23:41:34 +0200 Subject: [PATCH 0703/1169] fix path in pipeline --- subworkflows/local/align_and_call_MT.nf | 16 ++++++++-------- subworkflows/local/annotate_snvs.nf | 10 +++++----- .../local/annotate_structural_variants.nf | 10 +++++----- subworkflows/local/prepare_MT_alignment.nf | 6 +++--- subworkflows/local/prepare_bed.nf | 10 +++++----- subworkflows/local/prepare_genome.nf | 8 ++++---- subworkflows/local/prepare_references.nf | 4 ++-- subworkflows/local/prepare_vcf.nf | 6 +++--- subworkflows/nf-core/align_bwamem2.nf | 12 ++++++------ subworkflows/nf-core/call_cnv_cnvpytor.nf | 10 +++++----- subworkflows/nf-core/call_repeat_expansions.nf | 4 ++-- subworkflows/nf-core/call_snv_deepvariant.nf | 10 +++++----- subworkflows/nf-core/call_structural_variants.nf | 2 +- subworkflows/nf-core/call_sv_manta.nf | 2 +- subworkflows/nf-core/call_sv_tiddit.nf | 4 ++-- subworkflows/nf-core/genmod.nf | 8 ++++---- subworkflows/nf-core/qc_bam.nf | 12 ++++++------ workflows/raredisease.nf | 6 +++--- 18 files changed, 70 insertions(+), 70 deletions(-) diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index 98c861c1..fe1d849e 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -2,14 +2,14 @@ // Allign and call MT // -include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' -include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' -include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/modules/picard/addorreplacereadgroups/main' -include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' -include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' -include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' +include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/bwamem2/mem/main' +include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/gatk4/mergebamalignment/main' +include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/picard/addorreplacereadgroups/main' +include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/picard/markduplicates/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/samtools/sort/main' +include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/haplocheck/main' +include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/gatk4/mutect2/main' workflow ALIGN_AND_CALL_MT { take: diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index c718f61f..f3982bcd 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -2,11 +2,11 @@ // A subworkflow to annotate snvs // -include { VCFANNO } from '../../modules/nf-core/modules/vcfanno/main' -include { BCFTOOLS_ROH } from '../../modules/nf-core/modules/bcftools/roh/main' -include { RHOCALL_ANNOTATE } from '../../modules/nf-core/modules/rhocall/annotate/main' -include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/nf-core/modules/ensemblvep/main' -include { TABIX_TABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' +include { VCFANNO } from '../../modules/nf-core/vcfanno/main' +include { BCFTOOLS_ROH } from '../../modules/nf-core/bcftools/roh/main' +include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhocall/annotate/main' +include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/nf-core/ensemblvep/main' +include { TABIX_TABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/tabix/tabix/main' workflow ANNOTATE_SNVS { diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 08f33d81..31e7f96e 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -2,11 +2,11 @@ // A subworkflow to annotate structural variants. // -include { SVDB_QUERY } from '../../modules/nf-core/modules/svdb/query/main' -include { PICARD_SORTVCF } from '../../modules/nf-core/modules/picard/sortvcf/main' -include { BCFTOOLS_VIEW } from '../../modules/nf-core/modules/bcftools/view/main' -include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/modules/tabix/tabix/main' -include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/nf-core/modules/ensemblvep/main' +include { SVDB_QUERY } from '../../modules/nf-core/svdb/query/main' +include { PICARD_SORTVCF } from '../../modules/nf-core/picard/sortvcf/main' +include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' +include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/tabix/tabix/main' +include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/nf-core/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/prepare_MT_alignment.nf index 4625996e..4ef2fdb1 100644 --- a/subworkflows/local/prepare_MT_alignment.nf +++ b/subworkflows/local/prepare_MT_alignment.nf @@ -2,9 +2,9 @@ // Prepare bam files for MT allignment // -include { SAMTOOLS_VIEW as SAMTOOLS_VIEW_MT } from '../../modules/nf-core/modules/samtools/view/main' -include { GATK4_REVERTSAM as GATK4_REVERTSAM_MT } from '../../modules/nf-core/modules/gatk4/revertsam/main' -include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../modules/nf-core/modules/gatk4/samtofastq/main' +include { SAMTOOLS_VIEW as SAMTOOLS_VIEW_MT } from '../../modules/nf-core/samtools/view/main' +include { GATK4_REVERTSAM as GATK4_REVERTSAM_MT } from '../../modules/nf-core/gatk4/revertsam/main' +include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../modules/nf-core/gatk4/samtofastq/main' workflow PREPARE_MT_ALIGNMENT { take: diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf index 72d37c83..ba2f8333 100644 --- a/subworkflows/local/prepare_bed.nf +++ b/subworkflows/local/prepare_bed.nf @@ -2,11 +2,11 @@ // Prepare reference bed files // -include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/modules/gatk4/bedtointervallist/main' -include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/modules/gatk4/intervallisttools/main' -include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/modules/cat/cat/main' -include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/modules/tabix/tabix/main' -include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/modules/tabix/bgziptabix/main' +include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/gatk4/bedtointervallist/main' +include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/gatk4/intervallisttools/main' +include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/cat/cat/main' +include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/tabix/bgziptabix/main' workflow CHECK_BED { take: diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index e44bcaea..8e45d214 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -2,10 +2,10 @@ // Prepare reference genome files // -include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/modules/untar/main' -include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' -include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/modules/gatk4/createsequencedictionary/main' +include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/untar/main' +include { BWAMEM2_INDEX } from '../../modules/nf-core/bwamem2/index/main' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' +include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 288cab2e..29290aee 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -5,8 +5,8 @@ include { CHECK_BED } from './prepare_bed' include { CHECK_VCF } from './prepare_vcf' include { PREPARE_GENOME } from './prepare_genome' -include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/modules/tabix/tabix/main' -include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/modules/tabix/tabix/main' +include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/tabix/tabix/main' workflow PREPARE_REFERENCES { diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index 8917aaa6..03a31bcf 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -2,9 +2,9 @@ // Prepare reference vcf files // -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_PV } from '../../modules/nf-core/modules/bcftools/norm/main' -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_PV } from '../../modules/nf-core/modules/bcftools/norm/main' -include { TABIX_TABIX as TABIX_PV } from '../../modules/nf-core/modules/tabix/tabix/main' +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_PV } from '../../modules/nf-core/bcftools/norm/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_PV } from '../../modules/nf-core/bcftools/norm/main' +include { TABIX_TABIX as TABIX_PV } from '../../modules/nf-core/tabix/tabix/main' include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' workflow CHECK_VCF { diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index 3d637122..f446ef4e 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -2,12 +2,12 @@ // Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // -include { BWAMEM2_MEM } from '../../modules/nf-core/modules/bwamem2/mem/main' -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' -include { SAMTOOLS_MERGE } from '../../modules/nf-core/modules/samtools/merge/main' -include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' +include { BWAMEM2_MEM } from '../../modules/nf-core/bwamem2/mem/main' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_STATS } from '../../modules/nf-core/samtools/stats/main' +include { SAMTOOLS_MERGE } from '../../modules/nf-core/samtools/merge/main' +include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/picard/markduplicates/main' workflow ALIGN_BWAMEM2 { diff --git a/subworkflows/nf-core/call_cnv_cnvpytor.nf b/subworkflows/nf-core/call_cnv_cnvpytor.nf index 6c1705c2..262fa2ea 100644 --- a/subworkflows/nf-core/call_cnv_cnvpytor.nf +++ b/subworkflows/nf-core/call_cnv_cnvpytor.nf @@ -2,11 +2,11 @@ // CNVpytor workflow - Calling CNVs // -include { CNVPYTOR_IMPORTREADDEPTH as GENERATE_PYTOR } from '../../modules/nf-core/modules/cnvpytor/importreaddepth/main' -include { CNVPYTOR_HISTOGRAM as HISTOGRAMS } from '../../modules/nf-core/modules/cnvpytor/histogram/main' -include { CNVPYTOR_PARTITION as PARTITIONS } from '../../modules/nf-core/modules/cnvpytor/partition/main' -include { CNVPYTOR_CALLCNVS as CALL_CNVS } from '../../modules/nf-core/modules/cnvpytor/callcnvs/main' -include { CNVPYTOR_VIEW as VIEW } from '../../modules/nf-core/modules/cnvpytor/view/main' +include { CNVPYTOR_IMPORTREADDEPTH as GENERATE_PYTOR } from '../../modules/nf-core/cnvpytor/importreaddepth/main' +include { CNVPYTOR_HISTOGRAM as HISTOGRAMS } from '../../modules/nf-core/cnvpytor/histogram/main' +include { CNVPYTOR_PARTITION as PARTITIONS } from '../../modules/nf-core/cnvpytor/partition/main' +include { CNVPYTOR_CALLCNVS as CALL_CNVS } from '../../modules/nf-core/cnvpytor/callcnvs/main' +include { CNVPYTOR_VIEW as VIEW } from '../../modules/nf-core/cnvpytor/view/main' workflow CALL_CNV_CNVPYTOR { take: diff --git a/subworkflows/nf-core/call_repeat_expansions.nf b/subworkflows/nf-core/call_repeat_expansions.nf index b43a56d4..4040a2e0 100644 --- a/subworkflows/nf-core/call_repeat_expansions.nf +++ b/subworkflows/nf-core/call_repeat_expansions.nf @@ -2,8 +2,8 @@ // Run ExpansionHunter and Stranger // -include { EXPANSIONHUNTER } from '../../modules/nf-core/modules/expansionhunter/main' -include { STRANGER } from '../../modules/nf-core/modules/stranger/main' +include { EXPANSIONHUNTER } from '../../modules/nf-core/expansionhunter/main' +include { STRANGER } from '../../modules/nf-core/stranger/main' workflow CALL_REPEAT_EXPANSIONS { take: diff --git a/subworkflows/nf-core/call_snv_deepvariant.nf b/subworkflows/nf-core/call_snv_deepvariant.nf index 180cb94d..813dc9a9 100644 --- a/subworkflows/nf-core/call_snv_deepvariant.nf +++ b/subworkflows/nf-core/call_snv_deepvariant.nf @@ -2,11 +2,11 @@ // A variant caller workflow for deepvariant // -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_GL } from '../../modules/nf-core/modules/bcftools/norm/main' -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../modules/nf-core/modules/bcftools/norm/main' -include { DEEPVARIANT } from '../../modules/nf-core/modules/deepvariant/main' -include { GLNEXUS } from '../../modules/nf-core/modules/glnexus/main' -include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/modules/tabix/tabix/main' +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_GL } from '../../modules/nf-core/bcftools/norm/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../modules/nf-core/bcftools/norm/main' +include { DEEPVARIANT } from '../../modules/nf-core/deepvariant/main' +include { GLNEXUS } from '../../modules/nf-core/glnexus/main' +include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/tabix/tabix/main' workflow CALL_SNV_DEEPVARIANT { take: diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index a19a0e80..81d6c68a 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -4,7 +4,7 @@ include { CALL_SV_MANTA } from './call_sv_manta' include { CALL_SV_TIDDIT } from './call_sv_tiddit' -include { SVDB_MERGE } from '../../modules/nf-core/modules/svdb/merge/main' +include { SVDB_MERGE } from '../../modules/nf-core/svdb/merge/main' include { CALL_CNV_CNVPYTOR } from './call_cnv_cnvpytor' workflow CALL_STRUCTURAL_VARIANTS { diff --git a/subworkflows/nf-core/call_sv_manta.nf b/subworkflows/nf-core/call_sv_manta.nf index 4d49447d..a07251db 100644 --- a/subworkflows/nf-core/call_sv_manta.nf +++ b/subworkflows/nf-core/call_sv_manta.nf @@ -2,7 +2,7 @@ // A structural variant caller workflow for manta // -include { MANTA_GERMLINE as MANTA } from '../../modules/nf-core/modules/manta/germline/main' +include { MANTA_GERMLINE as MANTA } from '../../modules/nf-core/manta/germline/main' workflow CALL_SV_MANTA { take: diff --git a/subworkflows/nf-core/call_sv_tiddit.nf b/subworkflows/nf-core/call_sv_tiddit.nf index de89e2d8..f8ed45f7 100644 --- a/subworkflows/nf-core/call_sv_tiddit.nf +++ b/subworkflows/nf-core/call_sv_tiddit.nf @@ -2,9 +2,9 @@ // A structural variant caller workflow for tiddit // -include { TIDDIT_SV } from '../../modules/nf-core/modules/tiddit/sv/main' +include { TIDDIT_SV } from '../../modules/nf-core/tiddit/sv/main' -include { SVDB_MERGE as SVDB_MERGE_TIDDIT } from '../../modules/nf-core/modules/svdb/merge/main' +include { SVDB_MERGE as SVDB_MERGE_TIDDIT } from '../../modules/nf-core/svdb/merge/main' workflow CALL_SV_TIDDIT { take: diff --git a/subworkflows/nf-core/genmod.nf b/subworkflows/nf-core/genmod.nf index c3241396..f7e821c0 100644 --- a/subworkflows/nf-core/genmod.nf +++ b/subworkflows/nf-core/genmod.nf @@ -2,10 +2,10 @@ // A subworkflow to score and rank variants. // -include { GENMOD_ANNOTATE } from '../../modules/nf-core/modules/genmod/annotate/main' -include { GENMOD_MODELS } from '../../modules/nf-core/modules/genmod/models/main' -include { GENMOD_SCORE } from '../../modules/nf-core/modules/genmod/score/main' -include { GENMOD_COMPOUND } from '../../modules/nf-core/modules/genmod/compound/main' +include { GENMOD_ANNOTATE } from '../../modules/nf-core/genmod/annotate/main' +include { GENMOD_MODELS } from '../../modules/nf-core/genmod/models/main' +include { GENMOD_SCORE } from '../../modules/nf-core/genmod/score/main' +include { GENMOD_COMPOUND } from '../../modules/nf-core/genmod/compound/main' workflow RANK_VARIANTS { diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/nf-core/qc_bam.nf index 24dffafb..e6ad575f 100644 --- a/subworkflows/nf-core/qc_bam.nf +++ b/subworkflows/nf-core/qc_bam.nf @@ -2,12 +2,12 @@ // A quality check subworkflow for processed bams. // -include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/modules/picard/collectmultiplemetrics/main' -include { PICARD_COLLECTHSMETRICS } from '../../modules/nf-core/modules/picard/collecthsmetrics/main' -include { QUALIMAP_BAMQC } from '../../modules/nf-core/modules/qualimap/bamqc/main' -include { TIDDIT_COV } from '../../modules/nf-core/modules/tiddit/cov/main' -include { MOSDEPTH } from '../../modules/nf-core/modules/mosdepth/main' -include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/modules/ucsc/wigtobigwig/main' +include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/picard/collectmultiplemetrics/main' +include { PICARD_COLLECTHSMETRICS } from '../../modules/nf-core/picard/collecthsmetrics/main' +include { QUALIMAP_BAMQC } from '../../modules/nf-core/qualimap/bamqc/main' +include { TIDDIT_COV } from '../../modules/nf-core/tiddit/cov/main' +include { MOSDEPTH } from '../../modules/nf-core/mosdepth/main' +include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/ucsc/wigtobigwig/main' workflow QC_BAM { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 87238dac..4483a409 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -87,9 +87,9 @@ include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_co // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' +include { FASTQC } from '../modules/nf-core/fastqc/main' +include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' // // SUBWORKFLOW: Consists entirely of nf-core/modules From ab6cbdb0097831a5fb08469d714236c34b8ebc7b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 5 Oct 2022 23:48:46 +0200 Subject: [PATCH 0704/1169] fix pipeline error --- subworkflows/local/prepare_MT_alignment.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/prepare_MT_alignment.nf index 4ef2fdb1..d8b03d43 100644 --- a/subworkflows/local/prepare_MT_alignment.nf +++ b/subworkflows/local/prepare_MT_alignment.nf @@ -14,7 +14,7 @@ workflow PREPARE_MT_ALIGNMENT { ch_versions = Channel.empty() // Outputs bam containing only MT - SAMTOOLS_VIEW_MT ( bam, [] ) + SAMTOOLS_VIEW_MT ( bam, [], [] ) ch_versions = ch_versions.mix(SAMTOOLS_VIEW_MT.out.versions.first()) // Removes alignment information From b23431954713e0ecb917f636126acadf01497a78 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 6 Oct 2022 00:09:55 +0200 Subject: [PATCH 0705/1169] dumpsoftwareversions_merge --- .../custom/dumpsoftwareversions/templates/dumpsoftwareversions.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py old mode 100755 new mode 100644 From 214597988d86d9911180afb0f13dcad44db6d7d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Thu, 6 Oct 2022 11:52:17 +0200 Subject: [PATCH 0706/1169] new file: modules.json --- modules.json | 232 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 modules.json diff --git a/modules.json b/modules.json new file mode 100644 index 00000000..976979f4 --- /dev/null +++ b/modules.json @@ -0,0 +1,232 @@ +{ + "name": "nf-core/raredisease", + "homePage": "https://github.com/nf-core/raredisease", + "repos": { + "https://github.com/nf-core/modules.git": { + "modules": { + "nf-core": { + "bcftools/norm": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "bcftools/roh": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "bcftools/view": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "bwamem2/index": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "bwamem2/mem": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cat/cat": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/callcnvs": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/histogram": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/importreaddepth": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/partition": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "cnvpytor/view": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "8022c68e7403eecbd8ba9c49496f69f8c49d50f0" + }, + "deepvariant": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "ensemblvep": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "expansionhunter": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "fastqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/bedtointervallist": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/createsequencedictionary": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/intervallisttools": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/mergebamalignment": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/mutect2": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/revertsam": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "gatk4/samtofastq": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "genmod/annotate": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "genmod/compound": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "genmod/models": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "genmod/score": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "glnexus": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "haplocheck": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "manta/germline": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "mosdepth": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "multiqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/addorreplacereadgroups": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/collecthsmetrics": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/collectmultiplemetrics": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/markduplicates": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "picard/sortvcf": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "qualimap/bamqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "rhocall/annotate": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/faidx": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/index": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/merge": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/sort": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/stats": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "samtools/view": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "stranger": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "svdb/merge": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "svdb/query": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "tabix/bgziptabix": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "tabix/tabix": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "tiddit/cov": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "tiddit/sv": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "ucsc/wigtobigwig": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "untar": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "vcfanno": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + } + } + } + } + } +} From d4c27dcbe6da9f73deab1c4f1321158dcaf55abc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 8 Oct 2022 01:12:13 +0200 Subject: [PATCH 0707/1169] bwa index --- main.nf | 2 +- modules.json | 4 ++ modules/nf-core/bwa/index/main.nf | 35 ++++++++++++++ modules/nf-core/bwa/index/meta.yml | 32 +++++++++++++ nextflow_schema.json | 17 ++++--- subworkflows/local/align.nf | 7 +-- subworkflows/local/prepare_genome.nf | 48 ++++++++++++------- subworkflows/local/prepare_references.nf | 7 +-- .../nf-core/call_structural_variants.nf | 3 +- subworkflows/nf-core/call_sv_tiddit.nf | 7 +-- workflows/raredisease.nf | 10 ++-- 11 files changed, 132 insertions(+), 40 deletions(-) create mode 100644 modules/nf-core/bwa/index/main.nf create mode 100644 modules/nf-core/bwa/index/meta.yml diff --git a/main.nf b/main.nf index 9ea1f2a0..7e4be075 100644 --- a/main.nf +++ b/main.nf @@ -19,6 +19,7 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') +params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') @@ -34,7 +35,6 @@ params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_p params.score_config_snv = WorkflowMain.getGenomeAttribute(params, 'score_config_snv') params.score_config_sv = WorkflowMain.getGenomeAttribute(params, 'score_config_sv') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') -params.sentieonbwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') params.vep_filters = WorkflowMain.getGenomeAttribute(params, 'vep_filters') diff --git a/modules.json b/modules.json index 976979f4..8b0b6916 100644 --- a/modules.json +++ b/modules.json @@ -17,6 +17,10 @@ "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, + "bwa/index": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, "bwamem2/index": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" diff --git a/modules/nf-core/bwa/index/main.nf b/modules/nf-core/bwa/index/main.nf new file mode 100644 index 00000000..aa75ae5d --- /dev/null +++ b/modules/nf-core/bwa/index/main.nf @@ -0,0 +1,35 @@ +process BWA_INDEX { + tag "$fasta" + label 'process_single' + + conda (params.enable_conda ? "bioconda::bwa=0.7.17" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7' : + 'quay.io/biocontainers/bwa:0.7.17--hed695b0_7' }" + + input: + path fasta + + output: + path "bwa" , emit: index + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + mkdir bwa + bwa \\ + index \\ + $args \\ + -p bwa/${fasta.baseName} \\ + $fasta + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bwa/index/meta.yml b/modules/nf-core/bwa/index/meta.yml new file mode 100644 index 00000000..2bbd81d9 --- /dev/null +++ b/modules/nf-core/bwa/index/meta.yml @@ -0,0 +1,32 @@ +name: bwa_index +description: Create BWA index for reference genome +keywords: + - index + - fasta + - genome + - reference +tools: + - bwa: + description: | + BWA is a software package for mapping DNA sequences against + a large reference genome, such as the human genome. + homepage: http://bio-bwa.sourceforge.net/ + documentation: http://www.htslib.org/doc/samtools.html + arxiv: arXiv:1303.3997 + licence: ["GPL-3.0-or-later"] +input: + - fasta: + type: file + description: Input genome fasta file +output: + - index: + type: file + description: BWA genome index files + pattern: "*.{amb,ann,bwt,pac,sa}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@maxulysse" diff --git a/nextflow_schema.json b/nextflow_schema.json index 6e18bebd..0d423e08 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -86,6 +86,14 @@ "hidden": true, "help_text": "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`." }, + "bwa_index": { + "type": "string", + "format": "directory-path", + "description": "Directory for pre-built bwa index.", + "help_text": "If none provided, will be generated automatically from the FASTA reference.", + "fa_icon": "fas fa-folder-open", + "hidden": true + }, "bwamem2_index": { "type": "string", "format": "directory-path", @@ -193,15 +201,6 @@ "help_text": "If you would like to limit your analysis to specific regions of the genome, you can pass those regions in a bed file using this option", "hidden": true }, - "sentieonbwa_index": { - "type": "string", - "format": "directory-path", - "default": null, - "description": "Directory for pre-built sentieon index.", - "help_text": "If none provided, will be generated automatically from the FASTA reference.", - "fa_icon": "fas fa-folder-open", - "hidden": true - }, "svdb_query_dbs": { "type": "string", "format": "file-path", diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 0b1f40be..39c7ed7d 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -11,7 +11,8 @@ workflow ALIGN { reads_input // channel: [ val(meta), reads_input ] fasta // channel: [genome.fasta] fai // channel: [genome.fai] - index // channel: [ /path/to/bwamem2/index/ ] + index_bwa // channel: [ /path/to/bwamem2/index/ ] + index_bwamem2 // channel: [ /path/to/bwamem2/index/ ] known_dbsnp // channel: [ /path/to/known_dbsnp ] known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] @@ -19,12 +20,12 @@ workflow ALIGN { ch_versions = Channel.empty() if( aligner == "bwamem2" ) { - ALIGN_BWAMEM2 ( reads_input, index, fasta, fai ) + ALIGN_BWAMEM2 ( reads_input, index_bwamem2, fasta, fai ) ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) } else if( aligner == "sentieon" ) { - ALIGN_SENTIEON ( reads_input, fasta, fai, index, known_dbsnp, known_dbsnp_tbi ) + ALIGN_SENTIEON ( reads_input, fasta, fai, index_bwa, known_dbsnp, known_dbsnp_tbi ) ch_marked_bam = ALIGN_SENTIEON.out.marked_bam ch_marked_bai = ALIGN_SENTIEON.out.marked_bai ch_versions = ch_versions.mix(ALIGN_SENTIEON.out.versions) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 8e45d214..05a01c41 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -3,6 +3,7 @@ // include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/untar/main' +include { BWA_INDEX } from '../../modules/nf-core/bwa/index/main' include { BWAMEM2_INDEX } from '../../modules/nf-core/bwamem2/index/main' include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' @@ -12,27 +13,41 @@ include { SENTIEON_BWAINDEX } from '../../modules/local/ workflow PREPARE_GENOME { take: aligner // [mandatory] params.aligner + bwa_index // [mandatory] bwa_index bwamem2_index // [mandatory] bwamem2_index - sentieon_index // [mandatory] sentieon_index fasta // [mandatory] genome.fasta fai // [mandatory] genome.fai variant_catalog // [optional] variant_catalog.json vcfanno_resources // [mandatory] vcfanno resource file main: - ch_fasta = file(fasta) - ch_versions = Channel.empty() + ch_fasta = file(fasta) + ch_versions = Channel.empty() + ch_bwa_index = Channel.empty() + ch_bwamem2_index = Channel.empty() // Fetch aligner index or create from scratch if required if (aligner == "bwamem2") { BWAMEM2_INDEX ( [[], ch_fasta] ) - ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : [[],file(bwamem2_index)] + ch_bwamem2_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : [[],file(bwamem2_index)] ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) - } else if (aligner == "sentieon") { - SENTIEON_BWAINDEX ( [[], ch_fasta] ) - ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : [[],file(sentieon_index)] - ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) + } + + if (!bwa_index) { + if (aligner == "sentieon") { + SENTIEON_BWAINDEX ( [[], ch_fasta] ) + ch_bwa_index = !bwa_index ? SENTIEON_BWAINDEX.out.index : [[],file(sentieon_index)] + ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) + } else { + BWA_INDEX ( [[], ch_fasta] ) + ch_bwa_index = BWA_INDEX.out.index + ch_versions = ch_versions.mix(BWA_INDEX.out.versions) + } } else { + ch_bwa_index = [[],file(bwa_index)] + } + + if (aligner != "bwamem2" && aligner != "sentieon" ) { exit 1, 'Please provide a valid aligner!' } @@ -73,12 +88,13 @@ workflow PREPARE_GENOME { emit: - aligner_index = ch_aligner_index // path: bwamem2/index - chrom_sizes = ch_chrom_sizes // path: chrom.sizes - fasta = ch_fasta // path: genome.fasta - fai = ch_fai // path: genome.fasta.fai - sequence_dict = ch_sequence_dict - variant_catalog = ch_variant_catalog // path: variant_catalog.json - vcfanno_resources = ch_vcfanno_resources // channel: [ untar'd files, ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + bwa_index = ch_bwa_index // path: bwamem2/index + bwamem2_index = ch_bwamem2_index // path: bwamem2/index + chrom_sizes = ch_chrom_sizes // path: chrom.sizes + fasta = ch_fasta // path: genome.fasta + fai = ch_fai // path: genome.fasta.fai + sequence_dict = ch_sequence_dict + variant_catalog = ch_variant_catalog // path: variant_catalog.json + vcfanno_resources = ch_vcfanno_resources // channel: [ untar'd files, ] + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 29290aee..7c53e135 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -12,6 +12,7 @@ include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/tabix/tab workflow PREPARE_REFERENCES { take: aligner // [mandatory] params.aligner + bwa_index bwamem2_index // [mandatory] bwamem2_index fasta // [mandatory] genome.fasta fai // [mandatory] genome.fai @@ -20,7 +21,6 @@ workflow PREPARE_REFERENCES { gnomad_af_tbi known_dbsnp known_dbsnp_tbi - sentieonbwa_index target_bed variant_catalog // [optional] variant_catalog.json vcfanno_resources // [mandatory] vcfanno resource file @@ -30,8 +30,8 @@ workflow PREPARE_REFERENCES { ch_versions = Channel.empty() PREPARE_GENOME ( aligner, + bwa_index, bwamem2_index, - sentieonbwa_index, fasta, fai, variant_catalog, @@ -94,7 +94,8 @@ workflow PREPARE_REFERENCES { } emit: - aligner_index = ch_genome.aligner_index + bwa_index = ch_genome.bwa_index + bwamem2_index = ch_genome.bwamem2_index chrom_sizes = ch_genome.chrom_sizes genome_fasta = ch_genome.fasta genome_fai = ch_genome.fai diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index 81d6c68a..6b78d56b 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -12,6 +12,7 @@ workflow CALL_STRUCTURAL_VARIANTS { take: bam // channel: [ val(meta), path(bam) ] bai // channel: [ val(meta), path(bai) ] + bwa_index // channel: [ val(meta), path(bwa_index)] fasta // channel: [ path(genome.fasta) ] fai // channel: [ path(genome.fai) ] case_info // channel: [ val(case_info) ] @@ -30,7 +31,7 @@ workflow CALL_STRUCTURAL_VARIANTS { //tiddit ch_tiddit_bam = bam.join(bai) - CALL_SV_TIDDIT ( ch_tiddit_bam, fasta, fai, case_info ) + CALL_SV_TIDDIT ( ch_tiddit_bam, fasta, bwa_index, case_info ) .vcf .collect{it[1]} .set { tiddit_vcf } diff --git a/subworkflows/nf-core/call_sv_tiddit.nf b/subworkflows/nf-core/call_sv_tiddit.nf index f8ed45f7..f4de6b5b 100644 --- a/subworkflows/nf-core/call_sv_tiddit.nf +++ b/subworkflows/nf-core/call_sv_tiddit.nf @@ -10,11 +10,12 @@ workflow CALL_SV_TIDDIT { take: bam // channel: [ val(meta), path(bam) ] fasta // path(fasta) - fai // path(fai) - case_info // channel: [ case_id ] + index // [ val(meta), path(bwa_index)] + case_info // channel: [ case_id ] main: - TIDDIT_SV ( bam, fasta, fai ) + index_for_tiddit = index.map { meta, ind -> ind } + TIDDIT_SV ( bam, fasta, index_for_tiddit ) ch_versions = TIDDIT_SV.out.versions TIDDIT_SV.out diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 4483a409..a1f2047e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -11,6 +11,7 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ + params.bwa_index, params.bwamem2_index, params.fasta, params.fasta_fai, @@ -21,7 +22,6 @@ def checkPathParamList = [ params.reduced_penetrance, params.score_config_snv, params.score_config_sv, - params.sentieonbwa_index, params.svdb_query_dbs, params.vcfanno_resources ] @@ -133,6 +133,7 @@ workflow RAREDISEASE { // STEP 0: PREPARE GENOME REFERENCES AND INDICES. PREPARE_REFERENCES ( params.aligner, + params.bwa_index, params.bwamem2_index, params.fasta, params.fasta_fai, @@ -141,7 +142,6 @@ workflow RAREDISEASE { params.gnomad_af_tbi, params.known_dbsnp, params.known_dbsnp_tbi, - params.sentieonbwa_index, params.target_bed, params.variant_catalog, params.vcfanno_resources @@ -155,7 +155,8 @@ workflow RAREDISEASE { CHECK_INPUT.out.reads, ch_references.genome_fasta, ch_references.genome_fai, - ch_references.aligner_index, + ch_references.bwa_index, + ch_references.bwamem2_index, ch_references.known_dbsnp, ch_references.known_dbsnp_tbi ) @@ -200,6 +201,7 @@ workflow RAREDISEASE { CALL_STRUCTURAL_VARIANTS ( ch_mapped.marked_bam, ch_mapped.marked_bai, + ch_references.bwa_index, ch_references.genome_fasta, ch_references.genome_fai, CHECK_INPUT.out.case_info, @@ -261,7 +263,7 @@ workflow RAREDISEASE { ch_intervals_mt = Channel.fromPath(params.intervals_mt) ANALYSE_MT ( ch_mapped.bam_bai, - ch_references.aligner_index, + ch_references.bwamem2_index, ch_references.genome_fasta, ch_references.sequence_dict, ch_references.genome_fai, From 52d9e74764e96554381a0f31ffbb6730c880605a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Mon, 10 Oct 2022 14:02:30 +0200 Subject: [PATCH 0708/1169] new file: modules/nf-core/picard/liftovervcf/main.nf new file: modules/nf-core/picard/liftovervcf/meta.yml modified: subworkflows/local/align_and_call_MT.nf --- modules/nf-core/picard/liftovervcf/main.nf | 61 +++++++++++++++++++++ modules/nf-core/picard/liftovervcf/meta.yml | 55 +++++++++++++++++++ subworkflows/local/align_and_call_MT.nf | 17 +++--- subworkflows/local/analyse_MT.nf | 3 +- subworkflows/local/prepare_genome.nf | 10 ++-- workflows/raredisease.nf | 27 ++++----- 6 files changed, 140 insertions(+), 33 deletions(-) create mode 100644 modules/nf-core/picard/liftovervcf/main.nf create mode 100644 modules/nf-core/picard/liftovervcf/meta.yml diff --git a/modules/nf-core/picard/liftovervcf/main.nf b/modules/nf-core/picard/liftovervcf/main.nf new file mode 100644 index 00000000..334f68b0 --- /dev/null +++ b/modules/nf-core/picard/liftovervcf/main.nf @@ -0,0 +1,61 @@ +process PICARD_LIFTOVERVCF { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + + input: + tuple val(meta), path(input_vcf) + path dict + path chain + path fasta + + output: + tuple val(meta), path("*lifted.vcf.gz") , emit: vcf_lifted + tuple val(meta), path("*unlifted.vcf.gz"), emit: vcf_unlifted + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 1 + if (!task.memory) { + log.info '[Picard LiftoverVcf] Available memory not known - defaulting to 1GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + LiftoverVcf \\ + $args \\ + --INPUT $input_vcf \\ + --OUTPUT ${prefix}.lifted.vcf.gz \\ + --CHAIN $chain \\ + --REJECT ${prefix}.unlifted.vcf.gz \\ + --REFERENCE_SEQUENCE $fasta + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard LiftoverVcf --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.lifted.vcf.gz + touch ${prefix}.unlifted.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard LiftoverVcf --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/picard/liftovervcf/meta.yml b/modules/nf-core/picard/liftovervcf/meta.yml new file mode 100644 index 00000000..55f04963 --- /dev/null +++ b/modules/nf-core/picard/liftovervcf/meta.yml @@ -0,0 +1,55 @@ +name: picard_liftovervcf +description: convert between genome builds +keywords: + - liftOver + - picard +tools: + - picard: + description: Move annotations from one assembly to another + homepage: https://gatk.broadinstitute.org/hc/en-us/articles/360037060932-LiftoverVcf-Picard + documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360037060932-LiftoverVcf-Picard + tool_dev_url: https://github.com/broadinstitute/picard + doi: "" + licence: ["MIT"] + +input: + - meta: + type: map + description: Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_vcf: + type: file + description: VCF file + pattern: "*.{vcf,vcf.gz}" + - chain: + type: file + description: The liftover chain file + - fasta: + type: file + description: fasta file + pattern: "*.fasta" + - dict: + type: file + description: dictionary for fasta file + pattern: "*.{dict}" + +output: + - meta: + type: map + description: Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf_lifted: + type: file + description: VCF file containing successfully lifted variants + pattern: "*.{lifted.vcf.gz}" + - vcf_unlifted: + type: file + description: VCF file containing unsuccessfully lifted variants + pattern: "*.{unlifted.vcf.gz}" + +authors: + - "@lucpen" diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index ab8af39a..f6f9d511 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -2,14 +2,14 @@ // Allign and call MT // -include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/bwamem2/mem/main' -include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/gatk4/mergebamalignment/main' -include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/picard/addorreplacereadgroups/main' -include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/picard/markduplicates/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/samtools/index/main' -include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/samtools/sort/main' -include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/haplocheck/main' -include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/gatk4/mutect2/main' +include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' +include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' +include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/modules/picard/addorreplacereadgroups/main' +include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' +include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' +include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' @@ -36,7 +36,6 @@ workflow ALIGN_AND_CALL_MT { GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, fasta, dict ) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) - // Add read group to merged bam file PICARD_ADDORREPLACEREADGROUPS_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 9cfeaeb0..d85b1ec0 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -5,7 +5,7 @@ include { PREPARE_MT_ALIGNMENT } from './prepare_MT_al include { ALIGN_AND_CALL_MT } from './align_and_call_MT' include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './align_and_call_MT' include { PREPARE_GENOME as PREPARE_GENOME_MT } from './prepare_genome' -include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/modules/picard/liftovervcf/main' +include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/picard/liftovervcf/main' workflow ANALYSE_MT { take: @@ -47,7 +47,6 @@ workflow ANALYSE_MT { ch_fai_shift = ch_genome.fai ch_index_shift =ch_genome.aligner_index - ALIGN_AND_CALL_MT_SHIFT ( PREPARE_MT_ALIGNMENT.out.fastq, PREPARE_MT_ALIGNMENT.out.bam, diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 3f0f1890..e44bcaea 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -2,10 +2,10 @@ // Prepare reference genome files // -include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/untar/main' -include { BWAMEM2_INDEX } from '../../modules/nf-core/bwamem2/index/main' -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' -include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' +include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/modules/untar/main' +include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' +include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/modules/gatk4/createsequencedictionary/main' include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' @@ -29,7 +29,7 @@ workflow PREPARE_GENOME { ch_aligner_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : [[],file(bwamem2_index)] ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) } else if (aligner == "sentieon") { - SENTIEON_BWAINDEX ([ [], ch_fasta] ) + SENTIEON_BWAINDEX ( [[], ch_fasta] ) ch_aligner_index = !sentieon_index ? SENTIEON_BWAINDEX.out.index : [[],file(sentieon_index)] ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) } else { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 7f22fcf1..6225dea6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -47,10 +47,8 @@ ch_vep_filters = params.vep_filters ? file(params.vep_filters) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() -ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() -ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) +ch_multiqc_config = file("$projectDir/assets/multiqc_config.yml", checkIfExists: true) +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -91,9 +89,9 @@ include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_co // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/fastqc/main' -include { MULTIQC } from '../modules/nf-core/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' // // SUBWORKFLOW: Consists entirely of nf-core/modules @@ -329,20 +327,18 @@ workflow RAREDISEASE { workflow_summary = WorkflowRaredisease.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) - methods_description = WorkflowRaredisease.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) - ch_methods_description = Channel.value(methods_description) - ch_multiqc_files = Channel.empty() + ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) + ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( ch_multiqc_files.collect(), - ch_multiqc_config.collect().ifEmpty([]), - ch_multiqc_custom_config.collect().ifEmpty([]), - ch_multiqc_logo.collect().ifEmpty([]) + [], + [], + [] ) multiqc_report = MULTIQC.out.report.toList() ch_versions = ch_versions.mix(MULTIQC.out.versions) @@ -359,9 +355,6 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) } NfcoreTemplate.summary(workflow, params, log) - if (params.hook_url) { - NfcoreTemplate.adaptivecard(workflow, params, summary_params, projectDir, log) - } } /* From 3a328f8c990f82685c02705cde99162be32771ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Mon, 10 Oct 2022 15:02:09 +0200 Subject: [PATCH 0709/1169] deleted: modules/nf-core/modules/picard/liftovervcf/main.nf deleted: modules/nf-core/modules/picard/liftovervcf/meta.yml modified: workflows/raredisease.nf modified: subworkflows/local/align_and_call_MT.nf modified: subworkflows/local/analyse_MT.nf modified: subworkflows/local/prepare_genome.nf --- .../modules/picard/liftovervcf/main.nf | 61 ------------------- .../modules/picard/liftovervcf/meta.yml | 55 ----------------- workflows/raredisease.nf | 6 +- 3 files changed, 3 insertions(+), 119 deletions(-) delete mode 100644 modules/nf-core/modules/picard/liftovervcf/main.nf delete mode 100644 modules/nf-core/modules/picard/liftovervcf/meta.yml diff --git a/modules/nf-core/modules/picard/liftovervcf/main.nf b/modules/nf-core/modules/picard/liftovervcf/main.nf deleted file mode 100644 index 334f68b0..00000000 --- a/modules/nf-core/modules/picard/liftovervcf/main.nf +++ /dev/null @@ -1,61 +0,0 @@ -process PICARD_LIFTOVERVCF { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" - - input: - tuple val(meta), path(input_vcf) - path dict - path chain - path fasta - - output: - tuple val(meta), path("*lifted.vcf.gz") , emit: vcf_lifted - tuple val(meta), path("*unlifted.vcf.gz"), emit: vcf_unlifted - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 1 - if (!task.memory) { - log.info '[Picard LiftoverVcf] Available memory not known - defaulting to 1GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - """ - picard \\ - -Xmx${avail_mem}g \\ - LiftoverVcf \\ - $args \\ - --INPUT $input_vcf \\ - --OUTPUT ${prefix}.lifted.vcf.gz \\ - --CHAIN $chain \\ - --REJECT ${prefix}.unlifted.vcf.gz \\ - --REFERENCE_SEQUENCE $fasta - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$(echo \$(picard LiftoverVcf --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.lifted.vcf.gz - touch ${prefix}.unlifted.vcf.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$(echo \$(picard LiftoverVcf --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/picard/liftovervcf/meta.yml b/modules/nf-core/modules/picard/liftovervcf/meta.yml deleted file mode 100644 index 55f04963..00000000 --- a/modules/nf-core/modules/picard/liftovervcf/meta.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: picard_liftovervcf -description: convert between genome builds -keywords: - - liftOver - - picard -tools: - - picard: - description: Move annotations from one assembly to another - homepage: https://gatk.broadinstitute.org/hc/en-us/articles/360037060932-LiftoverVcf-Picard - documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360037060932-LiftoverVcf-Picard - tool_dev_url: https://github.com/broadinstitute/picard - doi: "" - licence: ["MIT"] - -input: - - meta: - type: map - description: Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input_vcf: - type: file - description: VCF file - pattern: "*.{vcf,vcf.gz}" - - chain: - type: file - description: The liftover chain file - - fasta: - type: file - description: fasta file - pattern: "*.fasta" - - dict: - type: file - description: dictionary for fasta file - pattern: "*.{dict}" - -output: - - meta: - type: map - description: Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - vcf_lifted: - type: file - description: VCF file containing successfully lifted variants - pattern: "*.{lifted.vcf.gz}" - - vcf_unlifted: - type: file - description: VCF file containing unsuccessfully lifted variants - pattern: "*.{unlifted.vcf.gz}" - -authors: - - "@lucpen" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6225dea6..c3294aee 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -89,9 +89,9 @@ include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_co // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' +include { FASTQC } from '../modules/nf-core/fastqc/main' +include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' // // SUBWORKFLOW: Consists entirely of nf-core/modules From 0f3640e8d35085cc5b98e861179fc7590ec7cb6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Mon, 10 Oct 2022 15:07:56 +0200 Subject: [PATCH 0710/1169] modified: subworkflows/local/prepare_genome.nf --- subworkflows/local/prepare_genome.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index e44bcaea..8e45d214 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -2,10 +2,10 @@ // Prepare reference genome files // -include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/modules/untar/main' -include { BWAMEM2_INDEX } from '../../modules/nf-core/modules/bwamem2/index/main' -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' -include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/modules/gatk4/createsequencedictionary/main' +include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/untar/main' +include { BWAMEM2_INDEX } from '../../modules/nf-core/bwamem2/index/main' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' +include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' From cb715d57b0bc6f3b3f548ab9c91ecc23d9a3f3d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thankaswamy=20Kosalai=20Subazini=2C=20Labmed=20US=C3=96=20?= =?UTF-8?q?=28sth036=29?= Date: Mon, 10 Oct 2022 15:10:31 +0200 Subject: [PATCH 0711/1169] modified: subworkflows/local/align_and_call_MT.nf --- subworkflows/local/align_and_call_MT.nf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index f6f9d511..ab080276 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -2,14 +2,14 @@ // Allign and call MT // -include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/modules/bwamem2/mem/main' -include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/modules/gatk4/mergebamalignment/main' -include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/modules/picard/addorreplacereadgroups/main' -include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/modules/picard/markduplicates/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/modules/samtools/index/main' -include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/modules/samtools/sort/main' -include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/modules/haplocheck/main' -include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/modules/gatk4/mutect2/main' +include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/bwamem2/mem/main' +include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/gatk4/mergebamalignment/main' +include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/picard/addorreplacereadgroups/main' +include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/picard/markduplicates/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/samtools/sort/main' +include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/haplocheck/main' +include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/gatk4/mutect2/main' From 38a7cd8c6788e3afd8b0690f0b140aed131f3953 Mon Sep 17 00:00:00 2001 From: Subazini TK Date: Tue, 11 Oct 2022 09:53:54 +0200 Subject: [PATCH 0712/1169] Update workflows/raredisease.nf Co-authored-by: Lucpen --- workflows/raredisease.nf | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c3294aee..8323da46 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -47,8 +47,10 @@ ch_vep_filters = params.vep_filters ? file(params.vep_filters) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() +ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) + ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() +ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From fba9aad8525dda21511e14affca12577b08cced8 Mon Sep 17 00:00:00 2001 From: Subazini TK Date: Tue, 11 Oct 2022 09:54:11 +0200 Subject: [PATCH 0713/1169] Update workflows/raredisease.nf Co-authored-by: Lucpen --- workflows/raredisease.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8323da46..66a99608 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -328,7 +328,8 @@ workflow RAREDISEASE { // workflow_summary = WorkflowRaredisease.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) - + methods_description = WorkflowRaredisease.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) + ch_methods_description = Channel.value(methods_description) ch_multiqc_files = Channel.empty() ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) From eb064eb2abbd7bc5580675575ffd9bd89077d1b3 Mon Sep 17 00:00:00 2001 From: Subazini TK Date: Tue, 11 Oct 2022 09:54:20 +0200 Subject: [PATCH 0714/1169] Update workflows/raredisease.nf Co-authored-by: Lucpen --- workflows/raredisease.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 66a99608..91fd52e4 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -334,6 +334,7 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) From 01852bb8393b54046ad01fb6571953a3578ae5f2 Mon Sep 17 00:00:00 2001 From: Subazini TK Date: Tue, 11 Oct 2022 09:54:31 +0200 Subject: [PATCH 0715/1169] Update workflows/raredisease.nf Co-authored-by: Lucpen --- workflows/raredisease.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 91fd52e4..ee2d025b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -340,9 +340,9 @@ workflow RAREDISEASE { MULTIQC ( ch_multiqc_files.collect(), - [], - [], - [] + ch_multiqc_config.collect().ifEmpty([]), + ch_multiqc_custom_config.collect().ifEmpty([]), + ch_multiqc_logo.collect().ifEmpty([]) ) multiqc_report = MULTIQC.out.report.toList() ch_versions = ch_versions.mix(MULTIQC.out.versions) From 5dd75d650bb586412b51db3216d5442022d25b70 Mon Sep 17 00:00:00 2001 From: Subazini TK Date: Tue, 11 Oct 2022 09:54:53 +0200 Subject: [PATCH 0716/1169] Update conf/modules.config Co-authored-by: Lucpen --- conf/modules.config | 3 --- 1 file changed, 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 2741abb1..52d0992f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -758,9 +758,6 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { ext.args = '--mitochondria-mode TRUE' } - withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { - ext.args = '' - } } From 6b9afea2ae5c430be4a9755fe0fc1b89bf183d5a Mon Sep 17 00:00:00 2001 From: Subazini TK Date: Tue, 11 Oct 2022 09:58:48 +0200 Subject: [PATCH 0717/1169] Update workflows/raredisease.nf Co-authored-by: Lucpen --- workflows/raredisease.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index ee2d025b..f9787ffb 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -359,6 +359,9 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) } NfcoreTemplate.summary(workflow, params, log) + if (params.hook_url) { + NfcoreTemplate.adaptivecard(workflow, params, summary_params, projectDir, log) + } } /* From 5ecf89b42eb3a7b9458b0bd24d74693450c84200 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Tue, 11 Oct 2022 10:03:07 +0200 Subject: [PATCH 0718/1169] Update workflows/raredisease.nf --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f9787ffb..33daf801 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -48,7 +48,7 @@ ch_vep_filters = params.vep_filters ? file(params.vep_filters) */ ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) - ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) From 893c084f5a7f68903c46edcd18be6d21409612c8 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Tue, 11 Oct 2022 10:03:13 +0200 Subject: [PATCH 0719/1169] Update workflows/raredisease.nf --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 33daf801..2db24d5b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -50,7 +50,7 @@ ch_vep_filters = params.vep_filters ? file(params.vep_filters) ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() - ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) +ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 0d4289f69c62cac65961007bc62a836c2e8b46e2 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Tue, 11 Oct 2022 10:03:19 +0200 Subject: [PATCH 0720/1169] Update workflows/raredisease.nf --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 2db24d5b..6ec4cddb 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -329,7 +329,7 @@ workflow RAREDISEASE { workflow_summary = WorkflowRaredisease.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) methods_description = WorkflowRaredisease.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) - ch_methods_description = Channel.value(methods_description) + ch_methods_description = Channel.value(methods_description) ch_multiqc_files = Channel.empty() ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) From 5f69855b21ad4aeab4b9ef91bef0d924b3db7598 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Tue, 11 Oct 2022 10:03:24 +0200 Subject: [PATCH 0721/1169] Update workflows/raredisease.nf --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6ec4cddb..908404c9 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -328,7 +328,7 @@ workflow RAREDISEASE { // workflow_summary = WorkflowRaredisease.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) - methods_description = WorkflowRaredisease.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) + methods_description = WorkflowRaredisease.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) ch_methods_description = Channel.value(methods_description) ch_multiqc_files = Channel.empty() ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) From 41a0d24402a60047d1690287e061fcaeac0a250b Mon Sep 17 00:00:00 2001 From: Lucpen Date: Tue, 11 Oct 2022 10:03:30 +0200 Subject: [PATCH 0722/1169] Update workflows/raredisease.nf --- workflows/raredisease.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 908404c9..8ce2aa6a 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -259,8 +259,8 @@ workflow RAREDISEASE { ch_variant_consequences ) } - - + + // STEP 2.1: ANALYSE MT ch_intervals_mt = Channel.fromPath(params.intervals_mt) ch_fasta_shift=Channel.fromPath(params.fasta_shift) From a2875da2ddf6e410ddc0b0dc88bc39a9bfecc71f Mon Sep 17 00:00:00 2001 From: Lucpen Date: Tue, 11 Oct 2022 10:05:09 +0200 Subject: [PATCH 0723/1169] Update workflows/raredisease.nf --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8ce2aa6a..3d4edbfb 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -261,7 +261,7 @@ workflow RAREDISEASE { } - // STEP 2.1: ANALYSE MT + // STEP 2.1: ANALYSE MT ch_intervals_mt = Channel.fromPath(params.intervals_mt) ch_fasta_shift=Channel.fromPath(params.fasta_shift) ch_intervals_mt_shift = Channel.fromPath(params.intervals_mt_shift) From 25e34dabc30cb26fe6602b3eb6660181298f69f5 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Tue, 11 Oct 2022 10:05:15 +0200 Subject: [PATCH 0724/1169] Update workflows/raredisease.nf --- workflows/raredisease.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3d4edbfb..db63ee31 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -360,8 +360,8 @@ workflow.onComplete { } NfcoreTemplate.summary(workflow, params, log) if (params.hook_url) { - NfcoreTemplate.adaptivecard(workflow, params, summary_params, projectDir, log) - } + NfcoreTemplate.adaptivecard(workflow, params, summary_params, projectDir, log) + } } /* From 75e7fcd4c3e2358e70c8b40093c556be2a399f87 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Tue, 11 Oct 2022 10:23:58 +0200 Subject: [PATCH 0725/1169] Update workflows/raredisease.nf --- workflows/raredisease.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index db63ee31..eb1d7751 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -331,8 +331,6 @@ workflow RAREDISEASE { methods_description = WorkflowRaredisease.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) ch_methods_description = Channel.value(methods_description) ch_multiqc_files = Channel.empty() - ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) - ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) From d97342c668292f6524d334df8fba6a2273c3a619 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 11 Oct 2022 16:53:52 +0200 Subject: [PATCH 0726/1169] fix an error in channel assignment --- subworkflows/local/prepare_genome.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 05a01c41..a20bc45c 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -36,7 +36,7 @@ workflow PREPARE_GENOME { if (!bwa_index) { if (aligner == "sentieon") { SENTIEON_BWAINDEX ( [[], ch_fasta] ) - ch_bwa_index = !bwa_index ? SENTIEON_BWAINDEX.out.index : [[],file(sentieon_index)] + ch_bwa_index = SENTIEON_BWAINDEX.out.index ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) } else { BWA_INDEX ( [[], ch_fasta] ) From 89df85e3f52ced194b5ad5341a6b124a2388546b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 11 Oct 2022 16:55:42 +0200 Subject: [PATCH 0727/1169] fix conflict with mito subw --- subworkflows/local/analyse_MT.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index d85b1ec0..a946586e 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -45,7 +45,7 @@ workflow ANALYSE_MT { ch_versions = ch_versions.mix(ch_genome.versions) ch_dict_shift = ch_genome.sequence_dict ch_fai_shift = ch_genome.fai - ch_index_shift =ch_genome.aligner_index + ch_index_shift =ch_genome.bwamem2_index ALIGN_AND_CALL_MT_SHIFT ( PREPARE_MT_ALIGNMENT.out.fastq, @@ -78,6 +78,6 @@ workflow ANALYSE_MT { html_shift = ALIGN_AND_CALL_MT_SHIFT.out.html vcf_lift = PICARD_LIFTOVERVCF.out.vcf_lifted vcf_unlift = PICARD_LIFTOVERVCF.out.vcf_unlifted - versions = ch_versions // channel: [ versions.yml ] + versions = ch_versions // channel: [ versions.yml ] } From b6d648a0e4a4c0739df524ed1102667ad4d8f7ea Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 11 Oct 2022 17:08:30 +0200 Subject: [PATCH 0728/1169] add switch --- subworkflows/local/analyse_MT.nf | 2 +- subworkflows/local/prepare_genome.nf | 3 ++- subworkflows/local/prepare_references.nf | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index a946586e..c9126032 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -41,7 +41,7 @@ workflow ANALYSE_MT { // STEP 2.2: MT ALLIGNMENT SHIFT AND VARIANT CALLING ch_intervals_mt_shift = Channel.fromPath(params.intervals_mt_shift) - PREPARE_GENOME_MT("bwamem2",[],[],fasta_shift ,[],[],[]).set { ch_genome } + PREPARE_GENOME_MT("bwamem2",[],[],fasta_shift ,[],[],[],false).set { ch_genome } ch_versions = ch_versions.mix(ch_genome.versions) ch_dict_shift = ch_genome.sequence_dict ch_fai_shift = ch_genome.fai diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index a20bc45c..9c2eae80 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -19,6 +19,7 @@ workflow PREPARE_GENOME { fai // [mandatory] genome.fai variant_catalog // [optional] variant_catalog.json vcfanno_resources // [mandatory] vcfanno resource file + bwa_index_switch // boolean val main: ch_fasta = file(fasta) @@ -33,7 +34,7 @@ workflow PREPARE_GENOME { ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) } - if (!bwa_index) { + if ( bwa_index_switch && !bwa_index) { if (aligner == "sentieon") { SENTIEON_BWAINDEX ( [[], ch_fasta] ) ch_bwa_index = SENTIEON_BWAINDEX.out.index diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 7c53e135..5bc820b0 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -35,7 +35,8 @@ workflow PREPARE_REFERENCES { fasta, fai, variant_catalog, - vcfanno_resources + vcfanno_resources, + true ) .set { ch_genome } ch_versions = ch_versions.mix(ch_genome.versions) From 57f1511bf6842a762407fb9f5b45099763da37b0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 11 Oct 2022 17:15:29 +0200 Subject: [PATCH 0729/1169] fix ci error --- subworkflows/local/prepare_genome.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 9c2eae80..19a9dfcb 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -44,7 +44,7 @@ workflow PREPARE_GENOME { ch_bwa_index = BWA_INDEX.out.index ch_versions = ch_versions.mix(BWA_INDEX.out.versions) } - } else { + } else if (bwa_index_switch) { ch_bwa_index = [[],file(bwa_index)] } From 2338e005defea47315ac857807668f406d9a5070 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 13 Oct 2022 00:15:42 +0200 Subject: [PATCH 0730/1169] fix groovy parse error --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 9f0cce39..cbe1ca80 100644 --- a/conf/test.config +++ b/conf/test.config @@ -39,7 +39,7 @@ params { intervals_mt = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' intervals_mt_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/control_region_shifted.chrM.interval_list' - shift_chain = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference//ShiftBack.chain' + shift_chain = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' genome = 'GRCh38' } From 5896c8c63b55b5a7e6acc5c307697c06df3babfd Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 13 Oct 2022 00:18:20 +0200 Subject: [PATCH 0731/1169] fix quotes in configs --- conf/genomes.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 82acb9e6..80a7dd9b 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -15,7 +15,7 @@ params { fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" fasta_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa" index_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" - shift_chain = "${params.local_genomes}/ShiftBack.chain + shift_chain = "${params.local_genomes}/ShiftBack.chain" bwa = "" bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" call_interval = "" @@ -23,7 +23,7 @@ params { gnomad_af = "" gnomad_af_tbi = "" intervals_mt = "" - intervals_mt_shift = "" + intervals_mt_shift = "" known_dbsnp = "" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" @@ -43,10 +43,10 @@ params { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" fasta_shift = "${params.local_genomes}/hg38.chrM.shifted8000.fa" - index_shift = "${params.local_genomes}/bwa/hg38.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" + index_shift = "${params.local_genomes}/bwa/hg38.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" bwa = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.fasta.{amb,ann,bwt,pac,sa}" bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - shift_chain = "${params.local_genomes}/grch38_ShiftBack.chain + shift_chain = "${params.local_genomes}/grch38_ShiftBack.chain" call_interval = "" gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" From 327c2efd4a8fc54f84cbea150ea996e17b6bb0e3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 19 Oct 2022 11:21:48 +0200 Subject: [PATCH 0732/1169] fix test --- conf/genomes.config | 108 ++++++++++++------------ conf/modules.config | 5 +- conf/test.config | 19 ++--- main.nf | 6 +- modules.json | 2 +- modules/nf-core/bwa/index/main.nf | 22 ++++- modules/nf-core/bwa/index/meta.yml | 10 +++ nextflow_schema.json | 30 +++++++ subworkflows/local/align_and_call_MT.nf | 4 +- subworkflows/local/analyse_MT.nf | 17 ++-- workflows/raredisease.nf | 48 +++++------ 11 files changed, 161 insertions(+), 110 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 80a7dd9b..41eb46b9 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -11,62 +11,62 @@ params { genomes { 'GRCh37' { - fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" - fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" - fasta_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa" - index_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" - shift_chain = "${params.local_genomes}/ShiftBack.chain" - bwa = "" - bwamem2 = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - call_interval = "" - gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" - gnomad_af = "" - gnomad_af_tbi = "" - intervals_mt = "" - intervals_mt_shift = "" - known_dbsnp = "" - known_dbsnp_tbi = "" - ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" - reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" - score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" - score_config_sv = "${params.local_genomes}/svrank_model_-v1.8-.ini" - select_feature_file = "${params.local_genomes}/hgnc.txt" - svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" - target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" - variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" - vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" - vep_cache = "${params.local_genomes}/vep_cache" - vep_filters = "${params.local_genomes}/gene_panels.bed" + fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" + fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" + mt_shift_fasta = "${params.local_genomes}/grch37.chrM.shifted8000.fa" + mt_shift_fasta_index = "${params.local_genomes}/grch37.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" + mt_shift_chain = "${params.local_genomes}/ShiftBack.chain" + bwa_index = "" + bwamem2_index = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + call_interval = "" + gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" + gnomad_af = "" + gnomad_af_tbi = "" + intervals_mt = "" + intervals_mt_shift = "" + known_dbsnp = "" + known_dbsnp_tbi = "" + ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" + reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" + score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" + score_config_sv = "${params.local_genomes}/svrank_model_-v1.8-.ini" + select_feature_file = "${params.local_genomes}/hgnc.txt" + svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" + variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" + vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" + vep_cache = "${params.local_genomes}/vep_cache" + vep_filters = "${params.local_genomes}/gene_panels.bed" } 'GRCh38' { - fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" - fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" - fasta_shift = "${params.local_genomes}/hg38.chrM.shifted8000.fa" - index_shift = "${params.local_genomes}/bwa/hg38.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" - bwa = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.fasta.{amb,ann,bwt,pac,sa}" - bwamem2 = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - shift_chain = "${params.local_genomes}/grch38_ShiftBack.chain" - call_interval = "" - gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" - gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" - gnomad_af_tbi = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" - intervals_mt = "${params.local_genomes}/non_control_region.chrM.interval_list" - intervals_mt_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" - known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" - known_dbsnp_tbi = "" - ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" - reduced_penetrance = "" - score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" - score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" - select_feature_file = "${params.local_genomes}/hgnc.txt" - svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" - target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" - variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" - vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" - vep_cache = "${params.local_genomes}/vep_cache" - vep_filters = "${params.local_genomes}/gene_panels.bed" + fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" + fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" + mt_shift_fasta = "${params.local_genomes}/hg38.chrM.shifted8000.fa" + mt_shift_fasta_index = "${params.local_genomes}/bwa/hg38.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" + bwa_index = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.fasta.{amb,ann,bwt,pac,sa}" + bwamem2_index = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + mt_shift_chain = "${params.local_genomes}/grch38_ShiftBack.chain" + call_interval = "" + gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" + gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" + gnomad_af_tbi = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" + intervals_mt = "${params.local_genomes}/non_control_region.chrM.interval_list" + intervals_mt_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" + known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" + known_dbsnp_tbi = "" + ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" + reduced_penetrance = "" + score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" + score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" + select_feature_file = "${params.local_genomes}/hgnc.txt" + svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" + variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" + vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" + vep_cache = "${params.local_genomes}/vep_cache" + vep_filters = "${params.local_genomes}/gene_panels.bed" } } } diff --git a/conf/modules.config b/conf/modules.config index 52d0992f..cd54c2f7 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -715,8 +715,6 @@ process { ] } - - withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:SAMTOOLS_FAIDX' { publishDir = [ path: { "${params.outdir}/references" }, @@ -732,6 +730,7 @@ process { enabled: false, ] } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } } @@ -754,11 +753,9 @@ process { ext.prefix = { "${meta.id}_sorted" } } - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { ext.args = '--mitochondria-mode TRUE' } - } diff --git a/conf/test.config b/conf/test.config index cbe1ca80..21b2eeb2 100644 --- a/conf/test.config +++ b/conf/test.config @@ -21,25 +21,24 @@ params { // Input data // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_MT.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_MT.csv' // Genome references - fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' - fasta_shift='https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' + fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' + bwa_index = '' + mt_shift_fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' // Variant annotation - vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_grch38_small_test.tar.gz' - vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' + vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_grch38_small_test.tar.gz' + vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' + target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' - target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' - - intervals_mt = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' + intervals_mt = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' intervals_mt_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/control_region_shifted.chrM.interval_list' - - shift_chain = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' + mt_shift_chain = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' genome = 'GRCh38' } diff --git a/main.nf b/main.nf index fd5c69ea..825e0c52 100644 --- a/main.nf +++ b/main.nf @@ -20,13 +20,17 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') -params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') +params.mt_shift_fasta = WorkflowMain.getGenomeAttribute(params, 'mt_shift_fasta') +params.mt_shift_fasta_index = WorkflowMain.getGenomeAttribute(params, 'mt_shift_fasta_index') +params.mt_shift_fasta_chain = WorkflowMain.getGenomeAttribute(params, 'mt_shift_fasta_chain') +params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa_index') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') params.gnomad_af = WorkflowMain.getGenomeAttribute(params, 'gnomad_af') params.gnomad_af_tbi = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_tbi') params.intervals_mt = WorkflowMain.getGenomeAttribute(params, 'intervals_mt') +params.intervals_mt_shift = WorkflowMain.getGenomeAttribute(params, 'intervals_mt_shift') params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') diff --git a/modules.json b/modules.json index 8b0b6916..89e58170 100644 --- a/modules.json +++ b/modules.json @@ -19,7 +19,7 @@ }, "bwa/index": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "8ddc73f0a37e6be2e852fd828d3effe9734ffa62" }, "bwamem2/index": { "branch": "master", diff --git a/modules/nf-core/bwa/index/main.nf b/modules/nf-core/bwa/index/main.nf index aa75ae5d..4b81aa82 100644 --- a/modules/nf-core/bwa/index/main.nf +++ b/modules/nf-core/bwa/index/main.nf @@ -8,11 +8,11 @@ process BWA_INDEX { 'quay.io/biocontainers/bwa:0.7.17--hed695b0_7' }" input: - path fasta + tuple val(meta), path(fasta) output: - path "bwa" , emit: index - path "versions.yml", emit: versions + tuple val(meta), path(bwa) , emit: index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -32,4 +32,20 @@ process BWA_INDEX { bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') END_VERSIONS """ + + stub: + """ + mkdir bwa + + touch bwa/genome.amb + touch bwa/genome.ann + touch bwa/genome.bwt + touch bwa/genome.pac + touch bwa/genome.sa + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/bwa/index/meta.yml b/modules/nf-core/bwa/index/meta.yml index 2bbd81d9..2c6cfcd7 100644 --- a/modules/nf-core/bwa/index/meta.yml +++ b/modules/nf-core/bwa/index/meta.yml @@ -15,10 +15,20 @@ tools: arxiv: arXiv:1303.3997 licence: ["GPL-3.0-or-later"] input: + - meta: + type: map + description: | + Groovy Map containing reference information. + e.g. [ id:'test', single_end:false ] - fasta: type: file description: Input genome fasta file output: + - meta: + type: map + description: | + Groovy Map containing reference information. + e.g. [ id:'test', single_end:false ] - index: type: file description: BWA genome index files diff --git a/nextflow_schema.json b/nextflow_schema.json index 03889e1a..2e63e954 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -130,6 +130,13 @@ "description": "Path to the interval list of the non control mitochondral region.", "help_text": "Path to the interval list of the non control mitochondral regions for Mutect2" }, + "intervals_mt_shift": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-file", + "description": "Path to the interval list of the non control mitochondral region in shifted fasta.", + "help_text": "Path to the interval list of the non control mitochondral regions in shifted fasta for Mutect2" + }, "known_dbsnp": { "type": "string", "format": "path", @@ -165,6 +172,29 @@ "description": "Path to sentieon machine learning model file.", "hidden": true }, + "mt_shift_fasta": { + "type": "string", + "format": "file-path", + "mimetype": "text/plain", + "description": "Path to mitochondrial FASTA genome file.", + "fa_icon": "far fa-file-code" + }, + "mt_shift_fasta_index": { + "type": "string", + "format": "directory-path", + "description": "Directory for pre-built bwamem2 index for shifted mitochondrial fasta.", + "help_text": "If none provided, will be generated automatically from the FASTA reference.", + "fa_icon": "fas fa-folder-open", + "hidden": true + }, + "mt_shift_fasta_chain": { + "type": "string", + "format": "directory-path", + "description": "Chain file describing the alignment between the mitochondrial shifted fasta and typical mitochondrial fasta", + "help_text": "For more information, check https://genome.ucsc.edu/goldenPath/help/chain.html", + "fa_icon": "fas fa-folder-open", + "hidden": true + }, "reduced_penetrance": { "type": "string", "format": "path", diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index ab080276..3282691f 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -1,5 +1,5 @@ // -// Allign and call MT +// Align and call MT // include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/bwamem2/mem/main' @@ -11,8 +11,6 @@ include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } fr include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/haplocheck/main' include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/gatk4/mutect2/main' - - workflow ALIGN_AND_CALL_MT { take: fastq // channel: [ val(meta), path('*.fastq.gz') ] diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index c9126032..c9b10bde 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -4,7 +4,7 @@ include { PREPARE_MT_ALIGNMENT } from './prepare_MT_alignment' include { ALIGN_AND_CALL_MT } from './align_and_call_MT' include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './align_and_call_MT' -include { PREPARE_GENOME as PREPARE_GENOME_MT } from './prepare_genome' +include { PREPARE_GENOME as PREPARE_GENOME_SHIFTED_MT } from './prepare_genome' include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/picard/liftovervcf/main' workflow ANALYSE_MT { @@ -39,21 +39,18 @@ workflow ANALYSE_MT { ) ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT.out.versions) - // STEP 2.2: MT ALLIGNMENT SHIFT AND VARIANT CALLING + // STEP 2.2: MT ALIGNMENT SHIFT AND VARIANT CALLING ch_intervals_mt_shift = Channel.fromPath(params.intervals_mt_shift) - PREPARE_GENOME_MT("bwamem2",[],[],fasta_shift ,[],[],[],false).set { ch_genome } - ch_versions = ch_versions.mix(ch_genome.versions) - ch_dict_shift = ch_genome.sequence_dict - ch_fai_shift = ch_genome.fai - ch_index_shift =ch_genome.bwamem2_index + PREPARE_GENOME_SHIFTED_MT("bwamem2",[],[],fasta_shift ,[],[],[],false).set { ch_mt_shifted_genome } + ch_versions = ch_versions.mix(ch_mt_shifted_genome.versions) ALIGN_AND_CALL_MT_SHIFT ( PREPARE_MT_ALIGNMENT.out.fastq, PREPARE_MT_ALIGNMENT.out.bam, - ch_index_shift, + ch_mt_shifted_genome.bwamem2_index, fasta_shift, - ch_dict_shift, - ch_fai_shift, + ch_mt_shifted_genome.sequence_dict, + ch_mt_shifted_genome.fai, ch_intervals_mt_shift ) ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT_SHIFT.out.versions) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index ce684712..901d9e17 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -14,7 +14,8 @@ def checkPathParamList = [ params.bwa_index, params.bwamem2_index, params.fasta, - params.fasta_shift, + params.mt_shift_fasta, + params.mt_shift_fasta_chain, params.fasta_fai, params.gnomad, params.input, @@ -32,14 +33,18 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true // Check mandatory parameters if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -ch_ml_model = params.ml_model ? file(params.ml_model) : [] -ch_call_interval = params.call_interval ? file(params.call_interval) : [] -ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] -ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] -ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] +ch_ml_model = params.ml_model ? file(params.ml_model) : [] +ch_call_interval = params.call_interval ? file(params.call_interval) : [] +ch_intervals_mt = params.intervals_mt ? file(params.intervals_mt) : [] +ch_intervals_mt_shift = params.intervals_mt_shift ? file(params.intervals_mt_shift) : [] +ch_mt_shift_fasta = params.mt_shift_fasta ? file(params.mt_shift_fasta) : [] +ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] +ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] +ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] +ch_shift_fasta_chain = params.mt_shift_fasta_chain? file(params.mt_shift_fasta_chain): [] ch_variant_consequences = file("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true) -ch_vep_cache = params.vep_cache ? file(params.vep_cache) : [] -ch_vep_filters = params.vep_filters ? file(params.vep_filters) : [] +ch_vep_cache = params.vep_cache ? file(params.vep_cache) : [] +ch_vep_filters = params.vep_filters ? file(params.vep_filters) : [] /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -166,7 +171,7 @@ workflow RAREDISEASE { ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) - + // STEP 1.5: BAM QUALITY CHECK QC_BAM ( ch_mapped.marked_bam, @@ -178,7 +183,7 @@ workflow RAREDISEASE { ch_references.chrom_sizes ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) - + // STEP 1.6: EXPANSIONHUNTER AND STRANGER CALL_REPEAT_EXPANSIONS ( ch_mapped.bam_bai, @@ -186,7 +191,7 @@ workflow RAREDISEASE { ch_references.variant_catalog ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) - + // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV ( @@ -201,7 +206,7 @@ workflow RAREDISEASE { CHECK_INPUT.out.case_info ) ch_versions = ch_versions.mix(CALL_SNV.out.versions) - + CALL_STRUCTURAL_VARIANTS ( ch_mapped.marked_bam, ch_mapped.marked_bai, @@ -229,7 +234,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) } - + if (params.annotate_sv_switch) { ANNOTATE_STRUCTURAL_VARIANTS ( CALL_STRUCTURAL_VARIANTS.out.vcf, @@ -262,12 +267,7 @@ workflow RAREDISEASE { ) } - // STEP 2.1: ANALYSE MT - ch_intervals_mt = Channel.fromPath(params.intervals_mt) - ch_fasta_shift=Channel.fromPath(params.fasta_shift) - ch_intervals_mt_shift = Channel.fromPath(params.intervals_mt_shift) - ANALYSE_MT ( ch_mapped.bam_bai, ch_references.bwamem2_index, @@ -275,12 +275,12 @@ workflow RAREDISEASE { ch_references.sequence_dict, ch_references.genome_fai, ch_intervals_mt, - params.fasta_shift, - params.intervals_mt_shift, - params.shift_chain + ch_mt_shift_fasta, + ch_intervals_mt_shift, + ch_shift_fasta_chain ) ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) - + // STEP 3: VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) @@ -317,14 +317,14 @@ workflow RAREDISEASE { ch_variant_consequences ) } - + // // MODULE: Pipeline reporting // CUSTOM_DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') ) - + // // MODULE: MultiQC // From d416def08eec0dc9905e627e715d85e8c2163168 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 23 Oct 2022 01:54:18 +0200 Subject: [PATCH 0733/1169] test works --- conf/genomes.config | 11 +- conf/modules.config | 104 +++++++-- conf/test.config | 3 +- main.nf | 6 +- modules/local/get_chrom_sizes.nf | 2 +- nextflow.config | 3 - nextflow_schema.json | 11 +- subworkflows/local/annotate_snvs.nf | 2 +- subworkflows/local/prepare_bed.nf | 75 ------- subworkflows/local/prepare_references.nf | 175 ++++++++-------- subworkflows/local/prepare_vcf.nf | 5 +- workflows/raredisease.nf | 256 ++++++++++++----------- 12 files changed, 328 insertions(+), 325 deletions(-) delete mode 100644 subworkflows/local/prepare_bed.nf diff --git a/conf/genomes.config b/conf/genomes.config index 41eb46b9..341f1a63 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -19,9 +19,9 @@ params { bwa_index = "" bwamem2_index = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" call_interval = "" - gnomad = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" + gnomad_vcf = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" gnomad_af = "" - gnomad_af_tbi = "" + gnomad_af_idx = "" intervals_mt = "" intervals_mt_shift = "" known_dbsnp = "" @@ -38,6 +38,7 @@ params { vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" vep_cache = "${params.local_genomes}/vep_cache" vep_filters = "${params.local_genomes}/gene_panels.bed" + vep_cache_version = '105' } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" @@ -48,15 +49,16 @@ params { bwamem2_index = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" mt_shift_chain = "${params.local_genomes}/grch38_ShiftBack.chain" call_interval = "" - gnomad = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" + gnomad_vcf = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" - gnomad_af_tbi = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" + gnomad_af_idx = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" intervals_mt = "${params.local_genomes}/non_control_region.chrM.interval_list" intervals_mt_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" reduced_penetrance = "" + sequence_dictionary = "" score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" select_feature_file = "${params.local_genomes}/hgnc.txt" @@ -67,6 +69,7 @@ params { vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" vep_cache = "${params.local_genomes}/vep_cache" vep_filters = "${params.local_genomes}/gene_panels.bed" + vep_cache_version = '105' } } } diff --git a/conf/modules.config b/conf/modules.config index cd54c2f7..fd82f5d2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -58,7 +58,7 @@ process { // process { - withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:BWAMEM2_INDEX' { + withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX' { ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} publishDir = [ path: { "${params.outdir}/references" }, @@ -69,8 +69,8 @@ process { ] } - withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:SENTIEON_BWAINDEX' { - ext.when = {!params.sentieonbwa_index && params.aligner == "sentieon"} + withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX' { + ext.when = {!params.bwa_index && params.aligner == "sentieon"} publishDir = [ path: { "${params.outdir}/references" }, mode: 'copy', @@ -79,7 +79,18 @@ process { ] } - withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:SAMTOOLS_FAIDX' { + withName: '.*PREPARE_REFERENCES:BWA_INDEX' { + ext.when = {!params.bwa_index} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + + withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX' { + ext.when = {!params.fasta_fai} publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, @@ -89,25 +100,61 @@ process { ] } - withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:GET_CHROM_SIZES' { + withName: '.*PREPARE_REFERENCES:GATK_SD' { + ext.when = {!params.sequence_dictionary} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*dict" + ] + } + + withName: '.*PREPARE_REFERENCES:GET_CHROM_SIZES' { publishDir = [ enabled: false, ] } - withName: '.*PREPARE_REFERENCES:PREPARE_GENOME:UNTAR_VCFANNO' { + withName: '.*PREPARE_REFERENCES:UNTAR_VCFANNO' { publishDir = [ enabled: false, ] } + withName: '.*PREPARE_REFERENCES:TABIX_DBSNP' { + ext.when = {params.known_dbsnp && !params.known_dbsnp_tbi} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*tbi" + ] + } + + withName: '.*PREPARE_REFERENCES:TABIX_GNOMAD_AF' { + ext.when = {params.gnomad_af && !params.gnomad_af_idx} + ext.args = '-s 1 -b 2 -e 2' + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*tbi" + ] + } + withName: '.*PREPARE_REFERENCES:CHECK_VCF:CHECK_INPUT_VCF' { + ext.when = {params.gnomad_vcf} publishDir = [ enabled: false, ] } withName: '.*PREPARE_REFERENCES:CHECK_VCF:SPLIT_MULTIALLELICS_PV' { + ext.when = {params.gnomad_vcf} ext.args = '--output-type z --multiallelics -both' ext.prefix = { "${meta.id}_split" } publishDir = [ @@ -116,6 +163,7 @@ process { } withName: '.*PREPARE_REFERENCES:CHECK_VCF:REMOVE_DUPLICATES_PV' { + ext.when = {params.gnomad_vcf} ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ @@ -126,6 +174,16 @@ process { } withName: '.*PREPARE_REFERENCES:CHECK_VCF:TABIX_PV' { + ext.when = {params.gnomad_vcf} + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*PREPARE_REFERENCES:TABIX_PT' { + ext.when = { params.target_bed && params.target_bed.endsWith(".gz") } publishDir = [ path: { "${params.outdir}/processed_references" }, mode: params.publish_dir_mode, @@ -133,7 +191,8 @@ process { ] } - withName: '.*PREPARE_REFERENCES:CHECK_BED:TABIX_.*' { + withName: '.*PREPARE_REFERENCES:TABIX_PBT' { + ext.when = { params.target_bed && !params.target_bed.endsWith(".gz") } publishDir = [ path: { "${params.outdir}/processed_references" }, mode: params.publish_dir_mode, @@ -141,7 +200,8 @@ process { ] } - withName: '.*PREPARE_REFERENCES:CHECK_BED:GATK_BILT' { + withName: '.*PREPARE_REFERENCES:GATK_BILT' { + ext.when = { params.target_bed } ext.prefix = { "${meta.id}_target" } publishDir = [ path: { "${params.outdir}/processed_references" }, @@ -150,14 +210,16 @@ process { ] } - withName: '.*PREPARE_REFERENCES:CHECK_BED:GATK_ILT' { + withName: '.*PREPARE_REFERENCES:GATK_ILT' { + ext.when = { params.target_bed } ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' publishDir = [ enabled: false ] } - withName: '.*PREPARE_REFERENCES:CHECK_BED:CAT_CAT_BAIT' { + withName: '.*PREPARE_REFERENCES:CAT_CAT_BAIT' { + ext.when = { params.target_bed } ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/processed_references" }, @@ -166,14 +228,6 @@ process { ] } - withName: '.*PREPARE_REFERENCES:TABIX_GNOMAD_AF' { - ext.args = '-s 1 -b 2 -e 2' - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } } // @@ -209,6 +263,13 @@ process { ] } + withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_MERGE' { + ext.prefix = { "${meta.id}_sorted_md" } + publishDir = [ + enabled: false, + ] + } + withName: '.*ALIGN:ALIGN_BWAMEM2:MARKDUPLICATES' { ext.prefix = { "${meta.id}_sorted_md" } publishDir = [ @@ -217,6 +278,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + } // @@ -704,7 +766,7 @@ process { // ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT // process { - withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:BWAMEM2_INDEX' { + withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:BWAMEM2_INDEX' { ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} publishDir = [ path: { "${params.outdir}/references" }, @@ -715,7 +777,7 @@ process { ] } - withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:SAMTOOLS_FAIDX' { + withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:SAMTOOLS_FAIDX' { publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, @@ -725,7 +787,7 @@ process { ] } - withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:PREPARE_GENOME:GET_CHROM_SIZES' { + withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:GET_CHROM_SIZES' { publishDir = [ enabled: false, ] diff --git a/conf/test.config b/conf/test.config index 21b2eeb2..0b162fa2 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,7 +25,6 @@ params { // Genome references fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' - bwa_index = '' mt_shift_fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' // Variant catalog file @@ -41,4 +40,6 @@ params { mt_shift_chain = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' genome = 'GRCh38' + vep_cache_version = '105' } + diff --git a/main.nf b/main.nf index 825e0c52..2056d863 100644 --- a/main.nf +++ b/main.nf @@ -26,9 +26,9 @@ params.mt_shift_fasta_chain = WorkflowMain.getGenomeAttribute(params, 'mt_shift_ params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa_index') params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') -params.gnomad = WorkflowMain.getGenomeAttribute(params, 'gnomad') params.gnomad_af = WorkflowMain.getGenomeAttribute(params, 'gnomad_af') -params.gnomad_af_tbi = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_tbi') +params.gnomad_af_idx = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_idx') +params.gnomad_vcf = WorkflowMain.getGenomeAttribute(params, 'gnomad_vcf') params.intervals_mt = WorkflowMain.getGenomeAttribute(params, 'intervals_mt') params.intervals_mt_shift = WorkflowMain.getGenomeAttribute(params, 'intervals_mt_shift') params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') @@ -37,6 +37,7 @@ params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_ind params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') params.ml_model = WorkflowMain.getGenomeAttribute(params, 'ml_model') params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_penetrance') +params.sequence_dictionary = WorkflowMain.getGenomeAttribute(params, 'sequence_dictionary') params.score_config_snv = WorkflowMain.getGenomeAttribute(params, 'score_config_snv') params.score_config_sv = WorkflowMain.getGenomeAttribute(params, 'score_config_sv') params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') @@ -46,6 +47,7 @@ params.vep_filters = WorkflowMain.getGenomeAttribute(params, 'vep_filte params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') params.vep_cache = WorkflowMain.getGenomeAttribute(params, 'vep_cache') +params.vep_cache_version = WorkflowMain.getGenomeAttribute(params, 'vep_cache_version') params.gens_interval_list = WorkflowMain.getGenomeAttribute(params, 'gens_interval_list') params.gens_pon = WorkflowMain.getGenomeAttribute(params, 'gens_pon') params.gens_gnomad_pos = WorkflowMain.getGenomeAttribute(params, 'gens_gnomad_pos') diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index 66919879..d7a2ebf1 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -7,7 +7,7 @@ process GET_CHROM_SIZES { 'quay.io/biocontainers/gnu-wget:1.18--0' }" input: - path fai + tuple val(meta), path(fai) output: path '*.sizes' , emit: sizes diff --git a/nextflow.config b/nextflow.config index 39abcfc1..97ca5bf7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -40,9 +40,6 @@ params { cnvpytor_chr = null cnvpytor_binsizes = '1000' - // Annotation - vep_cache_version = '105' - // MultiQC options multiqc_config = null multiqc_title = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 2e63e954..e7c35a0a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -102,7 +102,7 @@ "fa_icon": "fas fa-folder-open", "hidden": true }, - "gnomad": { + "gnomad_vcf": { "type": "string", "format": "path", "fa_icon": "fas fa-bezier-curve", @@ -116,7 +116,7 @@ "description": "Path to the gnomad tab file with allele frequencies.", "help_text": "Path to the gnomad tab file with CHR/START/REF,ALT/AF. Can be generated from the gnomad annotations vcf." }, - "gnomad_af_tbi": { + "gnomad_af_idx": { "type": "string", "format": "path", "fa_icon": "fas fa-file", @@ -216,6 +216,13 @@ "description": "SV rank model config file for genmod.", "hidden": true }, + "sequence_dictionary": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "Genome dictionary file", + "hidden": true + }, "vep_filters": { "type": "string", "format": "path", diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index f3982bcd..01742abf 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -24,7 +24,7 @@ workflow ANNOTATE_SNVS { main: ch_versions = Channel.empty() - ch_toml = file(vcfanno_toml) + ch_toml = Channel.fromPath(vcfanno_toml) // // annotate vcfanno diff --git a/subworkflows/local/prepare_bed.nf b/subworkflows/local/prepare_bed.nf deleted file mode 100644 index ba2f8333..00000000 --- a/subworkflows/local/prepare_bed.nf +++ /dev/null @@ -1,75 +0,0 @@ -// -// Prepare reference bed files -// - -include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/gatk4/bedtointervallist/main' -include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/gatk4/intervallisttools/main' -include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/cat/cat/main' -include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/tabix/tabix/main' -include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/tabix/bgziptabix/main' - -workflow CHECK_BED { - take: - bed // file: bed file - seq_dictionary // path: sequence_dictionary - - main: - tab_out = Channel.empty() - ch_versions = Channel.empty() - - if (bed) { - bed_file = file(bed) - id = bed.split('/')[-1] - ch_bed = Channel.fromList([[['id':id], bed_file]]) - - if ( bed.endsWith(".gz") && file(bed, checkIfExists:true) ) { - tbi_out = TABIX_PT (ch_bed).tbi - tab_out = ch_bed.join(tbi_out) - ch_versions = ch_versions.mix(TABIX_PT.out.versions) - } else if ( file(bed, checkIfExists:true) ) { - tab_out = TABIX_PBT (ch_bed).gz_tbi - ch_versions = ch_versions.mix(TABIX_PBT.out.versions) - } - - interval_list = GATK_BILT (ch_bed, seq_dictionary).interval_list - ch_versions = ch_versions.mix(GATK_BILT.out.versions) - - GATK_ILT(interval_list) - ch_versions = ch_versions.mix(GATK_ILT.out.versions) - - GATK_ILT.out - .interval_list - .collect{ it[1] } - .set { ch_bait_intervals_split } - - ch_bait_intervals_split - .map { it -> it[0] - .toString() - .split("_split")[0] - .split("/")[-1] + "_bait.intervals_list" - } - .flatten() - .concat(ch_bait_intervals_split) - .toList() - .map { - id, bait -> - return [['id':id], bait] - } - .set { ch_bait_intervals_cat_in } - - CAT_CAT_BAIT ( ch_bait_intervals_cat_in ) - .file_out - .map { - id, file -> - return [file] - } - .set { ch_bait_intervals_cat_out } - - } - - emit: - bed = tab_out - target_intervals = interval_list.collect{it[1]} - bait_intervals = ch_bait_intervals_cat_out - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] -} diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 5bc820b0..cb54173b 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -2,115 +2,104 @@ // Prepare reference files // -include { CHECK_BED } from './prepare_bed' -include { CHECK_VCF } from './prepare_vcf' -include { PREPARE_GENOME } from './prepare_genome' -include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/tabix/tabix/main' -include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/tabix/tabix/main' +include { BWA_INDEX } from '../../modules/nf-core/bwa/index/main' +include { BWAMEM2_INDEX } from '../../modules/nf-core/bwamem2/index/main' +include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/cat/cat/main' +include { CHECK_VCF } from './prepare_vcf' +include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/gatk4/bedtointervallist/main' +include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' +include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/gatk4/intervallisttools/main' +include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' +include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' +include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/tabix/tabix/main' +include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/untar/main' workflow PREPARE_REFERENCES { take: - aligner // [mandatory] params.aligner - bwa_index - bwamem2_index // [mandatory] bwamem2_index - fasta // [mandatory] genome.fasta - fai // [mandatory] genome.fai - gnomad - gnomad_af - gnomad_af_tbi + ch_fasta_no_meta // [mandatory] genome.fasta + ch_fasta_meta + fai // [optional ] genome.fai + gnomad_af_tab + gnomad_vcf_in known_dbsnp - known_dbsnp_tbi target_bed - variant_catalog // [optional] variant_catalog.json vcfanno_resources // [mandatory] vcfanno resource file main: - // Prepare genome - ch_versions = Channel.empty() - PREPARE_GENOME ( - aligner, - bwa_index, - bwamem2_index, - fasta, - fai, - variant_catalog, - vcfanno_resources, - true - ) - .set { ch_genome } - ch_versions = ch_versions.mix(ch_genome.versions) + ch_versions = Channel.empty() + ch_tbi = Channel.empty() + ch_bgzip_tbi = Channel.empty() - // Dbsnp vcf - ch_dbsnp_vcf = Channel.empty() - ch_dbsnp_tbi = Channel.empty() - if (!known_dbsnp_tbi && known_dbsnp) { - TABIX_DBSNP([[id:'dbsnp'], file(known_dbsnp)]) - ch_dbsnp_vcf = file(known_dbsnp) - ch_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect {it[1]} - ch_versions = ch_versions.mix(TABIX_DBSNP.out.versions) - } else if (known_dbsnp_tbi && known_dbsnp) { - ch_dbsnp_vcf = file(known_dbsnp) - ch_dbsnp_tbi = file(known_dbsnp_tbi) - } + BWA_INDEX(ch_fasta_meta) + BWAMEM2_INDEX(ch_fasta_meta) + SENTIEON_BWAINDEX(ch_fasta_meta) + SAMTOOLS_FAIDX(ch_fasta_meta) + GATK_SD(ch_fasta_no_meta) + GET_CHROM_SIZES( SAMTOOLS_FAIDX.out.fai ) + TABIX_DBSNP(known_dbsnp) + TABIX_GNOMAD_AF(gnomad_af_tab) + CHECK_VCF(gnomad_vcf_in, ch_fasta_no_meta) + TABIX_PT(target_bed).tbi.set { ch_tbi } + TABIX_PBT(target_bed).gz_tbi.set { ch_bgzip_tbi } + GATK_BILT(target_bed, GATK_SD.out.dict).interval_list + GATK_ILT(GATK_BILT.out.interval_list) + GATK_ILT.out.interval_list + .collect{ it[1] } + .map { it -> + meta = it[0].toString().split("_split")[0].split("/")[-1] + "_bait.intervals_list" + return [[id:meta], it] + } + .set { ch_bait_intervals_cat_in } - // Gnomad vcf - ch_gnomad_vcf = Channel.empty() - ch_gnomad_idx = Channel.empty() - if (gnomad) { - CHECK_VCF( - gnomad, - ch_genome.fasta - ) - ch_gnomad_vcf = CHECK_VCF.out.vcf - ch_gnomad_idx = CHECK_VCF.out.idx - ch_versions = ch_versions.mix(CHECK_VCF.out.versions) - } + CAT_CAT_BAIT ( ch_bait_intervals_cat_in ) - // Gnomad tab - ch_gnomad_af = Channel.empty() - if (!gnomad_af_tbi && gnomad_af) { - ch_gnomad_tab = [[id:'gnomad'], file(gnomad_af)] - TABIX_GNOMAD_AF(ch_gnomad_tab) - ch_gnomad_tbi = TABIX_GNOMAD_AF.out.tbi - ch_gnomad_af = ch_gnomad_tab.join(ch_gnomad_tbi).collect{ it -> return [it[1], it[2]]} - ch_versions = ch_versions.mix(CHECK_VCF.out.versions) - } else if (gnomad_af_tbi && gnomad_af) { - ch_gnomad_af = [file(gnomad_af), file(gnomad_af_tbi)] + // Uncompress vcfanno resources if nothing else given + if ( params.vcfanno_resources.endsWith('.tar.gz') ) { + ch_vcfanno_resources = UNTAR_VCFANNO ( [[],params.vcfanno_resources] ).untar + .map { + id, resources -> + return [resources] + } + ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) + } else { + ch_vcfanno_resources = Channel.fromPath(vcfanno_resources) } - // Target bed - ch_target_bed = Channel.empty() - ch_target_intervals = Channel.empty() - ch_bait_intervals = Channel.empty() - if (target_bed) { - CHECK_BED( - target_bed, - ch_genome.sequence_dict - ) - ch_target_bed = CHECK_BED.out.bed - ch_target_intervals = CHECK_BED.out.target_intervals - ch_bait_intervals = CHECK_BED.out.bait_intervals - ch_versions = ch_versions.mix(CHECK_BED.out.versions) - } + // Gather versions + ch_versions = ch_versions.mix(BWA_INDEX.out.versions) + ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) + ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) + ch_versions = ch_versions.mix(GATK_SD.out.versions) + ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) + ch_versions = ch_versions.mix(TABIX_DBSNP.out.versions) + ch_versions = ch_versions.mix(TABIX_GNOMAD_AF.out.versions) + ch_versions = ch_versions.mix(CHECK_VCF.out.versions) + ch_versions = ch_versions.mix(TABIX_PT.out.versions) + ch_versions = ch_versions.mix(TABIX_PBT.out.versions) + ch_versions = ch_versions.mix(GATK_BILT.out.versions) + ch_versions = ch_versions.mix(GATK_ILT.out.versions) emit: - bwa_index = ch_genome.bwa_index - bwamem2_index = ch_genome.bwamem2_index - chrom_sizes = ch_genome.chrom_sizes - genome_fasta = ch_genome.fasta - genome_fai = ch_genome.fai - sequence_dict = ch_genome.sequence_dict - variant_catalog = ch_genome.variant_catalog - vcfanno_resources = ch_genome.vcfanno_resources - known_dbsnp = ch_dbsnp_vcf - known_dbsnp_tbi = ch_dbsnp_tbi - gnomad_vcf = ch_gnomad_vcf - gnomad_idx = ch_gnomad_idx - gnomad_af = ch_gnomad_af - target_bed = ch_target_bed - target_intervals = ch_target_intervals - bait_intervals = ch_bait_intervals + bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() + bwa_index = BWA_INDEX.out.index ?: SENTIEON_BWAINDEX.out.index + bwamem2_index = BWAMEM2_INDEX.out.index + chrom_sizes = GET_CHROM_SIZES.out.sizes + fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] }.collect() + gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi + gnomad_tbi = CHECK_VCF.out.index + gnomad_vcf = CHECK_VCF.out.vcf + known_dbsnp_tbi = TABIX_DBSNP.out.tbi + sequence_dict = GATK_SD.out.dict + target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi) + target_intervals = GATK_BILT.out.interval_list.collect{it[1]} + vcfanno_resources = ch_vcfanno_resources versions = ch_versions + } diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/prepare_vcf.nf index 03a31bcf..97f6a3f3 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/prepare_vcf.nf @@ -9,11 +9,10 @@ include { CHECK_INPUT_VCF } from '../../modules/local/ch workflow CHECK_VCF { take: - vcf // file: vcf file + vcf_file // file: vcf file fasta // path(fasta) main: - vcf_file = file(vcf) ch_versions = Channel.empty() CHECK_INPUT_VCF( vcf_file ) @@ -46,6 +45,6 @@ workflow CHECK_VCF { emit: vcf = vcf_out // path: normalized_vcf - idx = TABIX_PV.out.tbi + index = TABIX_PV.out.tbi versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 901d9e17..1752386f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -13,53 +13,56 @@ WorkflowRaredisease.initialise(params, log) def checkPathParamList = [ params.bwa_index, params.bwamem2_index, + params.call_interval, params.fasta, - params.mt_shift_fasta, - params.mt_shift_fasta_chain, params.fasta_fai, - params.gnomad, + params.gens_gnomad_pos, + params.gens_interval_list, + params.gens_pon, + params.gnomad_af, + params.gnomad_af_idx, + params.gnomad_vcf, params.input, params.intervals_mt, params.intervals_mt_shift, + params.known_dbsnp, + params.known_dbsnp_tbi, + params.known_indels, + params.known_mills, + params.ml_model, + params.mt_shift_fasta, + params.mt_shift_fasta_index, + params.mt_shift_fasta_chain, params.multiqc_config, params.reduced_penetrance, params.score_config_snv, params.score_config_sv, + params.sequence_dictionary, + params.target_bed, params.svdb_query_dbs, - params.vcfanno_resources + params.variant_catalog, + params.vep_filters, + params.vcfanno_resources, + params.vcfanno_toml, + params.vep_cache ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } -// Check mandatory parameters -if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } -ch_ml_model = params.ml_model ? file(params.ml_model) : [] -ch_call_interval = params.call_interval ? file(params.call_interval) : [] -ch_intervals_mt = params.intervals_mt ? file(params.intervals_mt) : [] -ch_intervals_mt_shift = params.intervals_mt_shift ? file(params.intervals_mt_shift) : [] -ch_mt_shift_fasta = params.mt_shift_fasta ? file(params.mt_shift_fasta) : [] -ch_reduced_penetrance = params.reduced_penetrance ? file(params.reduced_penetrance) : [] -ch_score_config_snv = params.score_config_snv ? file(params.score_config_snv) : [] -ch_score_config_sv = params.score_config_sv ? file(params.score_config_sv) : [] -ch_shift_fasta_chain = params.mt_shift_fasta_chain? file(params.mt_shift_fasta_chain): [] -ch_variant_consequences = file("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true) -ch_vep_cache = params.vep_cache ? file(params.vep_cache) : [] -ch_vep_filters = params.vep_filters ? file(params.vep_filters) : [] - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CONFIG FILES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() -ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() -ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) +ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() +ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() +ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT LOCAL MODULES/SUBWORKFLOWS + IMPORT MODULES AND SUBWORKFLOWS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @@ -67,48 +70,42 @@ ch_multiqc_custom_methods_description = params.multiqc_methods_description ? fil // MODULE: local modules // -include { MAKE_PED } from '../modules/local/create_pedfile' -include { FILTER_VEP as FILTER_VEP_SNV } from '../modules/local/filter_vep' -include { FILTER_VEP as FILTER_VEP_SV } from '../modules/local/filter_vep' +include { MAKE_PED } from '../modules/local/create_pedfile' +include { FILTER_VEP as FILTER_VEP_SNV } from '../modules/local/filter_vep' +include { FILTER_VEP as FILTER_VEP_SV } from '../modules/local/filter_vep' // -// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules +// MODULE: Installed directly from nf-core/modules // -include { CHECK_INPUT } from '../subworkflows/local/check_input' -include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' -include { ANNOTATE_SNVS } from '../subworkflows/local/annotate_snvs' -include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' -include { GENS } from '../subworkflows/local/gens' -include { ALIGN } from '../subworkflows/local/align' -include { CALL_SNV } from '../subworkflows/local/call_snv' -include { ANALYSE_MT } from '../subworkflows/local/analyse_MT' -include { ANNOTATE_CSQ as ANN_CSQ_SNV } from '../subworkflows/local/annotate_consequence' -include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_consequence' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT NF-CORE MODULES/SUBWORKFLOWS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ +include { FASTQC } from '../modules/nf-core/fastqc/main' +include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' // -// MODULE: Installed directly from nf-core/modules +// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { FASTQC } from '../modules/nf-core/fastqc/main' -include { MULTIQC } from '../modules/nf-core/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' +include { CHECK_INPUT } from '../subworkflows/local/check_input' +include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' +include { ANNOTATE_SNVS } from '../subworkflows/local/annotate_snvs' +include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' +include { GENS } from '../subworkflows/local/gens' +include { ALIGN } from '../subworkflows/local/align' +include { CALL_SNV } from '../subworkflows/local/call_snv' +include { ANALYSE_MT } from '../subworkflows/local/analyse_MT' +include { ANNOTATE_CSQ as ANN_CSQ_SNV } from '../subworkflows/local/annotate_consequence' +include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_consequence' // // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' -include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { RANK_VARIANTS as RANK_VARIANTS_SNV } from '../subworkflows/nf-core/genmod' -include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/nf-core/genmod' +include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' +include { QC_BAM } from '../subworkflows/nf-core/qc_bam' +include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' +include { RANK_VARIANTS as RANK_VARIANTS_SNV } from '../subworkflows/nf-core/genmod' +include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/nf-core/genmod' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -123,51 +120,84 @@ workflow RAREDISEASE { ch_versions = Channel.empty() - // - // SUBWORKFLOW: Read in samplesheet, validate and stage input files - // - CHECK_INPUT ( - ch_input - ) - ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) + // Initialize input channels + if (params.input) { + ch_input = Channel.fromPath(params.input) + CHECK_INPUT (ch_input) + } else { + exit 1, 'Input samplesheet not specified!' + } + // Initialize file channels + ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() : Channel.value([]) + ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta).collect() : ( exit 1, 'Genome fasta not specified!' ) + ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it.baseName], it] } + ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() : Channel.empty() + ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) + ch_intervals_mt = params.intervals_mt ? Channel.fromPath(params.intervals_mt).collect() : Channel.value([]) + ch_intervals_mt_shift = params.intervals_mt_shift ? Channel.fromPath(params.intervals_mt_shift).collect() : Channel.value([]) + ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) + ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() : Channel.value([]) + ch_mt_shift_fasta = params.mt_shift_fasta ? Channel.fromPath(params.mt_shift_fasta).collect() : Channel.value([]) + ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance).collect() : Channel.value([]) + ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv).collect() : Channel.value([]) + ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv).collect() : Channel.value([]) + ch_shift_fasta_chain = params.mt_shift_fasta_chain ? Channel.fromPath(params.mt_shift_fasta_chain).collect() : Channel.value([]) + ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it.baseName], it] } : Channel.value([]) + ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog).collect() : Channel.value([]) + ch_variant_consequences = Channel.fromPath("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true) + ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache).collect() : Channel.value([]) + ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters).collect() : Channel.value([]) + ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).collect() : Channel.value([]) + + // Generate pedigree file MAKE_PED (CHECK_INPUT.out.samples.toList()) - // STEP 0: QUALITY CHECK. - FASTQC ( - CHECK_INPUT.out.reads - ) + // Input QC + FASTQC (CHECK_INPUT.out.reads) + ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) ch_versions = ch_versions.mix(FASTQC.out.versions.first()) - // STEP 0: PREPARE GENOME REFERENCES AND INDICES. + // Prepare references and indices. PREPARE_REFERENCES ( - params.aligner, - params.bwa_index, - params.bwamem2_index, - params.fasta, + ch_genome_fasta_no_meta, + ch_genome_fasta_meta, params.fasta_fai, - params.gnomad, - params.gnomad_af, - params.gnomad_af_tbi, - params.known_dbsnp, - params.known_dbsnp_tbi, - params.target_bed, - params.variant_catalog, + ch_gnomad_af_tab, + ch_gnomad_vcf_unprocessed, + ch_known_dbsnp, + ch_target_bed_unprocessed, params.vcfanno_resources ) .set { ch_references } - ch_versions = ch_versions.mix(ch_references.versions) + + // Gather built indices or get them from the params + ch_bait_intervals = ch_references.bait_intervals + ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index) : ( ch_references.bwa_index ?: Channel.empty() ) + ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index) : ( ch_references.bwamem2_index ?: Channel.empty() ) + ch_chrom_sizes = ch_references.chrom_sizes + ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_genome_af_idx).map {meta, tab, idx -> [tab,idx]} : Channel.empty() + ch_genome_fai = params.fasta_fai ? Channel.fromPath(params.fasta_fai) : ( ch_references.fasta_fai ?: Channel.empty() ) + ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx) : ( ch_references.gnomad_af_idx ?: Channel.empty() ) + ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf : Channel.value([]) + ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi) : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) + ch_sequence_dictionary = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary) : ( ch_references.sequence_dict ?: Channel.empty() ) + ch_target_bed = ch_references.target_bed + ch_target_intervals = ch_references.target_intervals + ch_vcfanno_resources = ch_references.vcfanno_resources + ch_versions = ch_versions.mix(ch_references.versions) + // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( params.aligner, CHECK_INPUT.out.reads, - ch_references.genome_fasta, - ch_references.genome_fai, - ch_references.bwa_index, - ch_references.bwamem2_index, - ch_references.known_dbsnp, - ch_references.known_dbsnp_tbi + ch_genome_fasta_no_meta, + ch_genome_fai, + ch_bwa_index, + ch_bwamem2_index, + ch_known_dbsnp, + ch_known_dbsnp_tbi ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) @@ -176,19 +206,19 @@ workflow RAREDISEASE { QC_BAM ( ch_mapped.marked_bam, ch_mapped.marked_bai, - ch_references.genome_fasta, - ch_references.genome_fai, - ch_references.bait_intervals, - ch_references.target_intervals, - ch_references.chrom_sizes + ch_genome_fasta_no_meta, + ch_genome_fai, + ch_bait_intervals, + ch_target_intervals, + ch_chrom_sizes ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) // STEP 1.6: EXPANSIONHUNTER AND STRANGER CALL_REPEAT_EXPANSIONS ( ch_mapped.bam_bai, - ch_references.genome_fasta, - ch_references.variant_catalog + ch_genome_fasta_no_meta, + ch_variant_catalog ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) @@ -197,10 +227,10 @@ workflow RAREDISEASE { CALL_SNV ( params.variant_caller, ch_mapped.bam_bai, - ch_references.genome_fasta, - ch_references.genome_fai, - ch_references.known_dbsnp, - ch_references.known_dbsnp_tbi, + ch_genome_fasta_no_meta, + ch_genome_fai, + ch_known_dbsnp, + ch_known_dbsnp_tbi, ch_call_interval, ch_ml_model, CHECK_INPUT.out.case_info @@ -210,11 +240,11 @@ workflow RAREDISEASE { CALL_STRUCTURAL_VARIANTS ( ch_mapped.marked_bam, ch_mapped.marked_bai, - ch_references.bwa_index, - ch_references.genome_fasta, - ch_references.genome_fai, + ch_bwa_index, + ch_genome_fasta_no_meta, + ch_genome_fai, CHECK_INPUT.out.case_info, - ch_references.target_bed, + ch_target_bed, params.cnvpytor_binsizes ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) @@ -224,13 +254,13 @@ workflow RAREDISEASE { GENS ( ch_mapped.bam_bai, CALL_SNV.out.vcf, - ch_references.genome_fasta, - ch_references.genome_fai, + ch_genome_fasta_meta, + ch_genome_fai, file(params.gens_interval_list), file(params.gens_pon), file(params.gens_gnomad_pos), CHECK_INPUT.out.case_info, - ch_references.sequence_dict + ch_sequence_dictionary ) ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) } @@ -242,8 +272,8 @@ workflow RAREDISEASE { params.genome, params.vep_cache_version, ch_vep_cache, - ch_references.genome_fasta, - ch_references.sequence_dict + ch_genome_fasta_meta, + ch_sequence_dictionary ).set {ch_sv_annotate} ch_versions = ch_versions.mix(ch_sv_annotate.versions) @@ -267,19 +297,6 @@ workflow RAREDISEASE { ) } - // STEP 2.1: ANALYSE MT - ANALYSE_MT ( - ch_mapped.bam_bai, - ch_references.bwamem2_index, - ch_references.genome_fasta, - ch_references.sequence_dict, - ch_references.genome_fai, - ch_intervals_mt, - ch_mt_shift_fasta, - ch_intervals_mt_shift, - ch_shift_fasta_chain - ) - ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) // STEP 3: VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) @@ -287,13 +304,13 @@ workflow RAREDISEASE { if (params.annotate_snv_switch) { ANNOTATE_SNVS ( ch_vcf, - ch_references.vcfanno_resources, + ch_vcfanno_resources, params.vcfanno_toml, params.genome, params.vep_cache_version, ch_vep_cache, - ch_references.genome_fasta, - ch_references.gnomad_af, + ch_genome_fasta_meta, + ch_gnomad_af, CHECK_INPUT.out.samples ).set {ch_snv_annotate} ch_versions = ch_versions.mix(ch_snv_annotate.versions) @@ -346,6 +363,7 @@ workflow RAREDISEASE { ) multiqc_report = MULTIQC.out.report.toList() ch_versions = ch_versions.mix(MULTIQC.out.versions) + } /* From c8d92c5d19ca0d5c6827ef16c97fe36511a3b928 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 23 Oct 2022 23:41:12 +0200 Subject: [PATCH 0734/1169] fix errors in config --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index fd82f5d2..9efff86d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -264,7 +264,7 @@ process { } withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_MERGE' { - ext.prefix = { "${meta.id}_sorted_md" } + ext.prefix = { "${meta.id}_sorted_merged" } publishDir = [ enabled: false, ] @@ -385,7 +385,7 @@ process { } withName: '.*QC_BAM:TIDDIT_COV' { - ext.args = '-z 500 -w -u' + ext.args = '-z 500 -w' publishDir = [ path: { "${params.outdir}/tiddit_coverage" }, mode: params.publish_dir_mode, From 34e55ac7cb583e8a2c535cc6c80e5d81b59e7070 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 24 Oct 2022 00:18:17 +0200 Subject: [PATCH 0735/1169] add analyse mt --- workflows/raredisease.nf | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 1752386f..6597bea1 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -70,40 +70,40 @@ ch_multiqc_custom_methods_description = params.multiqc_methods_description ? fil // MODULE: local modules // -include { MAKE_PED } from '../modules/local/create_pedfile' include { FILTER_VEP as FILTER_VEP_SNV } from '../modules/local/filter_vep' include { FILTER_VEP as FILTER_VEP_SV } from '../modules/local/filter_vep' +include { MAKE_PED } from '../modules/local/create_pedfile' // // MODULE: Installed directly from nf-core/modules // +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' include { FASTQC } from '../modules/nf-core/fastqc/main' include { MULTIQC } from '../modules/nf-core/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { CHECK_INPUT } from '../subworkflows/local/check_input' -include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' -include { ANNOTATE_SNVS } from '../subworkflows/local/annotate_snvs' -include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' -include { GENS } from '../subworkflows/local/gens' include { ALIGN } from '../subworkflows/local/align' -include { CALL_SNV } from '../subworkflows/local/call_snv' include { ANALYSE_MT } from '../subworkflows/local/analyse_MT' include { ANNOTATE_CSQ as ANN_CSQ_SNV } from '../subworkflows/local/annotate_consequence' include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_consequence' +include { ANNOTATE_SNVS } from '../subworkflows/local/annotate_snvs' +include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' +include { CALL_SNV } from '../subworkflows/local/call_snv' +include { CHECK_INPUT } from '../subworkflows/local/check_input' +include { GENS } from '../subworkflows/local/gens' +include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' // // SUBWORKFLOW: Consists entirely of nf-core/modules // include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' +include { QC_BAM } from '../subworkflows/nf-core/qc_bam' include { RANK_VARIANTS as RANK_VARIANTS_SNV } from '../subworkflows/nf-core/genmod' include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/nf-core/genmod' @@ -128,7 +128,7 @@ workflow RAREDISEASE { exit 1, 'Input samplesheet not specified!' } - // Initialize file channels + // Initialize all file channels including unprocessed vcf, bed and tab files ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() : Channel.value([]) ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta).collect() : ( exit 1, 'Genome fasta not specified!' ) ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it.baseName], it] } @@ -297,6 +297,18 @@ workflow RAREDISEASE { ) } + ANALYSE_MT ( + ch_mapped.bam_bai, + ch_bwamem2_index, + ch_genome_fasta_no_meta, + ch_sequence_dictionary, + ch_references.genome_fai, + ch_intervals_mt, + params.fasta_shift, + params.intervals_mt_shift, + params.shift_chain + ) + ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) // STEP 3: VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) From b0226405347a98934b7cbee8a96b514fcaf77f13 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 24 Oct 2022 14:12:51 +0200 Subject: [PATCH 0736/1169] for PR --- conf/modules.config | 6 +++- subworkflows/local/prepare_references.nf | 21 +++--------- workflows/raredisease.nf | 41 ++++++++++++------------ 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9efff86d..bf5d4a5c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -118,8 +118,12 @@ process { } withName: '.*PREPARE_REFERENCES:UNTAR_VCFANNO' { + ext.when = { params.vcfanno_resources && params.vcfanno_resources.endsWith('.tar.gz') } publishDir = [ - enabled: false, + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, ] } diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index cb54173b..6c62616e 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -55,20 +55,8 @@ workflow PREPARE_REFERENCES { return [[id:meta], it] } .set { ch_bait_intervals_cat_in } - CAT_CAT_BAIT ( ch_bait_intervals_cat_in ) - - // Uncompress vcfanno resources if nothing else given - if ( params.vcfanno_resources.endsWith('.tar.gz') ) { - ch_vcfanno_resources = UNTAR_VCFANNO ( [[],params.vcfanno_resources] ).untar - .map { - id, resources -> - return [resources] - } - ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) - } else { - ch_vcfanno_resources = Channel.fromPath(vcfanno_resources) - } + UNTAR_VCFANNO ( vcfanno_resources ) // Gather versions ch_versions = ch_versions.mix(BWA_INDEX.out.versions) @@ -84,13 +72,14 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(TABIX_PBT.out.versions) ch_versions = ch_versions.mix(GATK_BILT.out.versions) ch_versions = ch_versions.mix(GATK_ILT.out.versions) + ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) emit: - bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() + bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] } bwa_index = BWA_INDEX.out.index ?: SENTIEON_BWAINDEX.out.index bwamem2_index = BWAMEM2_INDEX.out.index chrom_sizes = GET_CHROM_SIZES.out.sizes - fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] }.collect() + fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] } gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi gnomad_tbi = CHECK_VCF.out.index gnomad_vcf = CHECK_VCF.out.vcf @@ -98,7 +87,7 @@ workflow PREPARE_REFERENCES { sequence_dict = GATK_SD.out.dict target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi) target_intervals = GATK_BILT.out.interval_list.collect{it[1]} - vcfanno_resources = ch_vcfanno_resources + vcfanno_resources = UNTAR_VCFANNO.out.untar.map { id, resources -> [resources] } versions = ch_versions } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6597bea1..6938a631 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -129,26 +129,26 @@ workflow RAREDISEASE { } // Initialize all file channels including unprocessed vcf, bed and tab files - ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() : Channel.value([]) - ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta).collect() : ( exit 1, 'Genome fasta not specified!' ) + ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval) : Channel.value([]) + ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta) : ( exit 1, 'Genome fasta not specified!' ) ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it.baseName], it] } - ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() : Channel.empty() - ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) - ch_intervals_mt = params.intervals_mt ? Channel.fromPath(params.intervals_mt).collect() : Channel.value([]) - ch_intervals_mt_shift = params.intervals_mt_shift ? Channel.fromPath(params.intervals_mt_shift).collect() : Channel.value([]) - ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) - ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() : Channel.value([]) - ch_mt_shift_fasta = params.mt_shift_fasta ? Channel.fromPath(params.mt_shift_fasta).collect() : Channel.value([]) - ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance).collect() : Channel.value([]) - ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv).collect() : Channel.value([]) - ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv).collect() : Channel.value([]) - ch_shift_fasta_chain = params.mt_shift_fasta_chain ? Channel.fromPath(params.mt_shift_fasta_chain).collect() : Channel.value([]) - ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it.baseName], it] } : Channel.value([]) - ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog).collect() : Channel.value([]) + ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf) : Channel.empty() + ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) + ch_intervals_mt = params.intervals_mt ? Channel.fromPath(params.intervals_mt) : Channel.value([]) + ch_intervals_mt_shift = params.intervals_mt_shift ? Channel.fromPath(params.intervals_mt_shift) : Channel.value([]) + ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) + ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model) : Channel.value([]) + ch_mt_shift_fasta = params.mt_shift_fasta ? Channel.fromPath(params.mt_shift_fasta) : Channel.value([]) + ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance) : Channel.value([]) + ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv) : Channel.value([]) + ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv) : Channel.value([]) + ch_shift_fasta_chain = params.mt_shift_fasta_chain ? Channel.fromPath(params.mt_shift_fasta_chain) : Channel.value([]) + ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([]) + ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog) : Channel.value([]) ch_variant_consequences = Channel.fromPath("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true) - ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache).collect() : Channel.value([]) - ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters).collect() : Channel.value([]) - ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).collect() : Channel.value([]) + ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache) : Channel.value([]) + ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters) : Channel.value([]) + ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([]) // Generate pedigree file MAKE_PED (CHECK_INPUT.out.samples.toList()) @@ -167,7 +167,7 @@ workflow RAREDISEASE { ch_gnomad_vcf_unprocessed, ch_known_dbsnp, ch_target_bed_unprocessed, - params.vcfanno_resources + ch_vcfanno_resources_unprocessed ) .set { ch_references } @@ -184,10 +184,9 @@ workflow RAREDISEASE { ch_sequence_dictionary = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary) : ( ch_references.sequence_dict ?: Channel.empty() ) ch_target_bed = ch_references.target_bed ch_target_intervals = ch_references.target_intervals - ch_vcfanno_resources = ch_references.vcfanno_resources + ch_vcfanno_resources = params.vcfanno_resources.endsWith('.tar.gz') ? ch_references.vcfanno_resources : Channel.fromPath(params.vcfanno_resources) ch_versions = ch_versions.mix(ch_references.versions) - // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( params.aligner, From a904a370d17f8f5ef8ddd24525870c2ee53310d2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 25 Oct 2022 02:09:38 +0200 Subject: [PATCH 0737/1169] modify MT subworkflow --- conf/genomes.config | 118 +++++++++--------- conf/modules.config | 90 ++++++++----- conf/test.config | 8 +- main.nf | 68 +++++----- nextflow_schema.json | 24 +++- subworkflows/local/analyse_MT.nf | 68 +++++----- ...lignment.nf => convert_mt_bam_to_fastq.nf} | 2 +- subworkflows/local/prepare_genome.nf | 101 --------------- subworkflows/local/prepare_references.nf | 88 +++++++------ workflows/raredisease.nf | 73 ++++++----- 10 files changed, 303 insertions(+), 337 deletions(-) rename subworkflows/local/{prepare_MT_alignment.nf => convert_mt_bam_to_fastq.nf} (97%) delete mode 100644 subworkflows/local/prepare_genome.nf diff --git a/conf/genomes.config b/conf/genomes.config index 341f1a63..95d88578 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -11,65 +11,69 @@ params { genomes { 'GRCh37' { - fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" - fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" - mt_shift_fasta = "${params.local_genomes}/grch37.chrM.shifted8000.fa" - mt_shift_fasta_index = "${params.local_genomes}/grch37.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" - mt_shift_chain = "${params.local_genomes}/ShiftBack.chain" - bwa_index = "" - bwamem2_index = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - call_interval = "" - gnomad_vcf = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" - gnomad_af = "" - gnomad_af_idx = "" - intervals_mt = "" - intervals_mt_shift = "" - known_dbsnp = "" - known_dbsnp_tbi = "" - ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" - reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" - score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" - score_config_sv = "${params.local_genomes}/svrank_model_-v1.8-.ini" - select_feature_file = "${params.local_genomes}/hgnc.txt" - svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" - target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" - variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" - vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" - vep_cache = "${params.local_genomes}/vep_cache" - vep_filters = "${params.local_genomes}/gene_panels.bed" - vep_cache_version = '105' + fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" + fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" + bwa_index = "" + bwamem2_index = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + call_interval = "" + gnomad_vcf = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" + gnomad_af = "" + gnomad_af_idx = "" + known_dbsnp = "" + known_dbsnp_tbi = "" + ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" + mt_backchain_shift = "${params.local_genomes}/ShiftBack.chain" + mt_bwamem2_index_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" + mt_fasta_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa" + mt_fai_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa" + mt_intervals = "" + mt_intervals_shift = "" + mt_sequence_dictionary_shift = "" + reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" + score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" + score_config_sv = "${params.local_genomes}/svrank_model_-v1.8-.ini" + sequence_dictionary = "" + select_feature_file = "${params.local_genomes}/hgnc.txt" + svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" + variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" + vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" + vep_cache = "${params.local_genomes}/vep_cache" + vep_filters = "${params.local_genomes}/gene_panels.bed" + vep_cache_version = '105' } 'GRCh38' { - fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" - fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" - mt_shift_fasta = "${params.local_genomes}/hg38.chrM.shifted8000.fa" - mt_shift_fasta_index = "${params.local_genomes}/bwa/hg38.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" - bwa_index = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.fasta.{amb,ann,bwt,pac,sa}" - bwamem2_index = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - mt_shift_chain = "${params.local_genomes}/grch38_ShiftBack.chain" - call_interval = "" - gnomad_vcf = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" - gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" - gnomad_af_idx = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" - intervals_mt = "${params.local_genomes}/non_control_region.chrM.interval_list" - intervals_mt_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" - known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" - known_dbsnp_tbi = "" - ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" - reduced_penetrance = "" - sequence_dictionary = "" - score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" - score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" - select_feature_file = "${params.local_genomes}/hgnc.txt" - svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" - target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" - variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" - vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" - vep_cache = "${params.local_genomes}/vep_cache" - vep_filters = "${params.local_genomes}/gene_panels.bed" - vep_cache_version = '105' + fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" + fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" + bwa_index = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.fasta.{amb,ann,bwt,pac,sa}" + bwamem2_index = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" + call_interval = "" + gnomad_vcf = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" + gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" + gnomad_af_idx = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" + known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" + known_dbsnp_tbi = "" + ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" + mt_backchain_shift = "${params.local_genomes}/grch38_ShiftBack.chain" + mt_bwamem2_index_shift = "${params.local_genomes}/bwa/hg38.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" + mt_fasta_shift = "${params.local_genomes}/hg38.chrM.shifted8000.fa" + mt_fai_shift = "" + mt_intervals = "${params.local_genomes}/non_control_region.chrM.interval_list" + mt_intervals_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" + reduced_penetrance = "" + sequence_dictionary = "" + score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" + score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" + select_feature_file = "${params.local_genomes}/hgnc.txt" + svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" + target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" + variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" + vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" + vep_cache = "${params.local_genomes}/vep_cache" + vep_filters = "${params.local_genomes}/gene_panels.bed" + vep_cache_version = '105' } } } diff --git a/conf/modules.config b/conf/modules.config index bf5d4a5c..a5d95207 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -69,6 +69,17 @@ process { ] } + withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_SHIFT_MT' { + ext.when = {!params.mt_bwamem2_index_shift && params.mt_fasta_shift} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" + ] + } + withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX' { ext.when = {!params.bwa_index && params.aligner == "sentieon"} publishDir = [ @@ -100,6 +111,17 @@ process { ] } + withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_SHIFT_MT' { + ext.when = {!params.mt_fai_shift && params.mt_fasta_shift} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*fai" + ] + } + withName: '.*PREPARE_REFERENCES:GATK_SD' { ext.when = {!params.sequence_dictionary} publishDir = [ @@ -111,6 +133,17 @@ process { ] } + withName: '.*PREPARE_REFERENCES:GATK_SD_SHIFT_MT' { + ext.when = {!params.mt_sequence_dictionary_shift && params.mt_fasta_shift} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*dict" + ] + } + withName: '.*PREPARE_REFERENCES:GET_CHROM_SIZES' { publishDir = [ enabled: false, @@ -717,20 +750,23 @@ process { // -// ANALYSE_MT:PREPARE_MT_ALIGNMENT +// ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ // process { - withName: '.*ANALYSE_MT:PREPARE_MT_ALIGNMENT:SAMTOOLS_VIEW_MT' { + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:SAMTOOLS_VIEW_MT' { + ext.when = { params.mt_fasta_shift } ext.args = { '-h ' } ext.args2 = { (params.genome == "GRCh37") ? "MT" : "chrM" } } - withName: '.*ANALYSE_MT:PREPARE_MT_ALIGNMENT:GATK4_REVERTSAM_MT' { + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_REVERTSAM_MT' { + ext.when = { params.mt_fasta_shift } ext.args = '--OUTPUT_BY_READGROUP false --VALIDATION_STRINGENCY LENIENT --ATTRIBUTE_TO_CLEAR FT --ATTRIBUTE_TO_CLEAR CO --SORT_ORDER queryname --RESTORE_ORIGINAL_QUALITIES false' } - withName: '.*ANALYSE_MT:PREPARE_MT_ALIGNMENT:GATK4_SAMTOFASTQ_MT' { + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_SAMTOFASTQ_MT' { + ext.when = { params.mt_fasta_shift } ext.args = '--VALIDATION_STRINGENCY LENIENT' } } @@ -741,28 +777,34 @@ process { process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:BWAMEM2_MEM_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals } ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MERGEBAMALIGNMENT_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals } ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}_merged" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals } ext.args = '--VALIDATION_STRINGENCY LENIENT' } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_MARKDUPLICATES_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals } ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:SAMTOOLS_SORT_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals } ext.prefix = { "${meta.id}_sorted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MUTECT2_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals } ext.args = '--mitochondria-mode TRUE' } } @@ -770,60 +812,44 @@ process { // ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT // process { - withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:BWAMEM2_INDEX' { - ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" - ] - } - - withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:SAMTOOLS_FAIDX' { - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*fai" - ] - } - - withName: '.*ANALYSE_MT:PREPARE_GENOME_MT:GET_CHROM_SIZES' { - publishDir = [ - enabled: false, - ] - } - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MERGEBAMALIGNMENT_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}_merged" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_ADDORREPLACEREADGROUPS_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } ext.args = '--VALIDATION_STRINGENCY LENIENT' } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_MARKDUPLICATES_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SAMTOOLS_SORT_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } ext.prefix = { "${meta.id}_sorted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } ext.args = '--mitochondria-mode TRUE' - } + } } +process { + withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { + ext.when = { params.mt_fasta_shift && params.mt_backchain_shift } + } +} // // SENTIEON_TNSCOPE_MT_CALL diff --git a/conf/test.config b/conf/test.config index 0b162fa2..74259f35 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,7 +25,7 @@ params { // Genome references fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' - mt_shift_fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' + mt_fasta_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' @@ -35,9 +35,9 @@ params { vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' - intervals_mt = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' - intervals_mt_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/control_region_shifted.chrM.interval_list' - mt_shift_chain = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' + mt_intervals = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' + mt_intervals_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/control_region_shifted.chrM.interval_list' + mt_backchain_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' genome = 'GRCh38' vep_cache_version = '105' diff --git a/main.nf b/main.nf index 2056d863..c2b9c872 100644 --- a/main.nf +++ b/main.nf @@ -18,39 +18,41 @@ nextflow.enable.dsl = 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') -params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') -params.mt_shift_fasta = WorkflowMain.getGenomeAttribute(params, 'mt_shift_fasta') -params.mt_shift_fasta_index = WorkflowMain.getGenomeAttribute(params, 'mt_shift_fasta_index') -params.mt_shift_fasta_chain = WorkflowMain.getGenomeAttribute(params, 'mt_shift_fasta_chain') -params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa_index') -params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') -params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') -params.gnomad_af = WorkflowMain.getGenomeAttribute(params, 'gnomad_af') -params.gnomad_af_idx = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_idx') -params.gnomad_vcf = WorkflowMain.getGenomeAttribute(params, 'gnomad_vcf') -params.intervals_mt = WorkflowMain.getGenomeAttribute(params, 'intervals_mt') -params.intervals_mt_shift = WorkflowMain.getGenomeAttribute(params, 'intervals_mt_shift') -params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') -params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') -params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') -params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') -params.ml_model = WorkflowMain.getGenomeAttribute(params, 'ml_model') -params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_penetrance') -params.sequence_dictionary = WorkflowMain.getGenomeAttribute(params, 'sequence_dictionary') -params.score_config_snv = WorkflowMain.getGenomeAttribute(params, 'score_config_snv') -params.score_config_sv = WorkflowMain.getGenomeAttribute(params, 'score_config_sv') -params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') -params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') -params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') -params.vep_filters = WorkflowMain.getGenomeAttribute(params, 'vep_filters') -params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') -params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') -params.vep_cache = WorkflowMain.getGenomeAttribute(params, 'vep_cache') -params.vep_cache_version = WorkflowMain.getGenomeAttribute(params, 'vep_cache_version') -params.gens_interval_list = WorkflowMain.getGenomeAttribute(params, 'gens_interval_list') -params.gens_pon = WorkflowMain.getGenomeAttribute(params, 'gens_pon') -params.gens_gnomad_pos = WorkflowMain.getGenomeAttribute(params, 'gens_gnomad_pos') +params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') +params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') +params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa_index') +params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') +params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') +params.gnomad_af = WorkflowMain.getGenomeAttribute(params, 'gnomad_af') +params.gnomad_af_idx = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_idx') +params.gnomad_vcf = WorkflowMain.getGenomeAttribute(params, 'gnomad_vcf') +params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') +params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') +params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') +params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') +params.ml_model = WorkflowMain.getGenomeAttribute(params, 'ml_model') +params.mt_backchain_shift = WorkflowMain.getGenomeAttribute(params, 'mt_backchain_shift') +params.mt_bwamem2_index_shift = WorkflowMain.getGenomeAttribute(params, 'mt_bwamem2_index_shift') +params.mt_fasta_shift = WorkflowMain.getGenomeAttribute(params, 'mt_fasta_shift') +params.mt_fai_shift = WorkflowMain.getGenomeAttribute(params, 'mt_fai_shift') +params.mt_intervals = WorkflowMain.getGenomeAttribute(params, 'mt_intervals') +params.mt_intervals_shift = WorkflowMain.getGenomeAttribute(params, 'mt_intervals_shift') +params.mt_sequence_dictionary_shift = WorkflowMain.getGenomeAttribute(params, 'mt_sequence_dictionary_shift') +params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_penetrance') +params.sequence_dictionary = WorkflowMain.getGenomeAttribute(params, 'sequence_dictionary') +params.score_config_snv = WorkflowMain.getGenomeAttribute(params, 'score_config_snv') +params.score_config_sv = WorkflowMain.getGenomeAttribute(params, 'score_config_sv') +params.target_bed = WorkflowMain.getGenomeAttribute(params, 'target_bed') +params.svdb_query_dbs = WorkflowMain.getGenomeAttribute(params, 'svdb_query_dbs') +params.variant_catalog = WorkflowMain.getGenomeAttribute(params, 'variant_catalog') +params.vep_filters = WorkflowMain.getGenomeAttribute(params, 'vep_filters') +params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') +params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') +params.vep_cache = WorkflowMain.getGenomeAttribute(params, 'vep_cache') +params.vep_cache_version = WorkflowMain.getGenomeAttribute(params, 'vep_cache_version') +params.gens_interval_list = WorkflowMain.getGenomeAttribute(params, 'gens_interval_list') +params.gens_pon = WorkflowMain.getGenomeAttribute(params, 'gens_pon') +params.gens_gnomad_pos = WorkflowMain.getGenomeAttribute(params, 'gens_gnomad_pos') /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/nextflow_schema.json b/nextflow_schema.json index e7c35a0a..9cbd40fe 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -123,14 +123,14 @@ "description": "Path to the index file for the gnomad tab file with allele frequencies.", "help_text": "Path to the index of gnomad tab file with CHR/START/REF,ALT/AF" }, - "intervals_mt": { + "mt_intervals": { "type": "string", "format": "path", "fa_icon": "fas fa-file", "description": "Path to the interval list of the non control mitochondral region.", "help_text": "Path to the interval list of the non control mitochondral regions for Mutect2" }, - "intervals_mt_shift": { + "mt_intervals_shift": { "type": "string", "format": "path", "fa_icon": "fas fa-file", @@ -172,14 +172,21 @@ "description": "Path to sentieon machine learning model file.", "hidden": true }, - "mt_shift_fasta": { + "mt_fasta_shift": { "type": "string", "format": "file-path", "mimetype": "text/plain", "description": "Path to mitochondrial FASTA genome file.", "fa_icon": "far fa-file-code" }, - "mt_shift_fasta_index": { + "mt_fai_shift": { + "type": "string", + "format": "file-path", + "mimetype": "text/plain", + "description": "Path to mitochondrial FASTA genome index file.", + "fa_icon": "far fa-file-code" + }, + "mt_bwamem2_index_shift": { "type": "string", "format": "directory-path", "description": "Directory for pre-built bwamem2 index for shifted mitochondrial fasta.", @@ -187,7 +194,7 @@ "fa_icon": "fas fa-folder-open", "hidden": true }, - "mt_shift_fasta_chain": { + "mt_backchain_shift": { "type": "string", "format": "directory-path", "description": "Chain file describing the alignment between the mitochondrial shifted fasta and typical mitochondrial fasta", @@ -223,6 +230,13 @@ "description": "Genome dictionary file", "hidden": true }, + "mt_sequence_dictionary_shift": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "Shifted mitochondrial genome dictionary file", + "hidden": true + }, "vep_filters": { "type": "string", "format": "path", diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index c9b10bde..425f5f85 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -1,66 +1,62 @@ // // Analyse MT // -include { PREPARE_MT_ALIGNMENT } from './prepare_MT_alignment' +include { CONVERT_MT_BAM_TO_FASTQ } from './convert_mt_bam_to_fastq' include { ALIGN_AND_CALL_MT } from './align_and_call_MT' include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './align_and_call_MT' -include { PREPARE_GENOME as PREPARE_GENOME_SHIFTED_MT } from './prepare_genome' include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/picard/liftovervcf/main' workflow ANALYSE_MT { take: - bam // channel: [ val(meta), file(bam), file(bai) ] - index // channel: [ /path/to/bwamem2/index/ ] - fasta // channel: [ genome.fasta ] - dict // channel: [ genome.dict ] - fai // channel: [ genome.fai ] - intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] - fasta_shift // channel: [ genome.fasta ] - intervals_mt_shift // channel: [ file(control_region_shifted.chrM.interval_list) ] - shift_chain + bam // channel: [ val(meta), file(bam), file(bai) ] + genome_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] + genome_fasta // channel: [ genome.fasta ] + genome_dict // channel: [ genome.dict ] + genome_fai // channel: [ genome.fai ] + mt_intervals // channel: [ file(non_control_region.chrM.interval_list) ] + shift_mt_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] + shift_mt_fasta // channel: [ genome.fasta ] + shift_mt_dict // channel: [ genome.dict ] + shift_mt_fai // channel: [ genome.fai ] + shift_mt_intervals // channel: [ file(control_region_shifted.chrM.interval_list) ] + shift_mt_backchain main: ch_versions = Channel.empty() // STEP 1: PREPARING MT ALIGNMENT - PREPARE_MT_ALIGNMENT ( bam ) - ch_versions = ch_versions.mix(PREPARE_MT_ALIGNMENT.out.versions)// Outputs bam files + CONVERT_MT_BAM_TO_FASTQ ( bam ) + ch_versions = ch_versions.mix(CONVERT_MT_BAM_TO_FASTQ.out.versions)// Outputs bam files //STEP 2.1: MT ALLIGNMENT AND VARIANT CALLING - ch_intervals_mt = Channel.fromPath(params.intervals_mt) ALIGN_AND_CALL_MT ( - PREPARE_MT_ALIGNMENT.out.fastq, - PREPARE_MT_ALIGNMENT.out.bam, - index, - fasta, - dict, - fai, - ch_intervals_mt + CONVERT_MT_BAM_TO_FASTQ.out.fastq, + CONVERT_MT_BAM_TO_FASTQ.out.bam, + genome_bwamem2_index, + genome_fasta, + genome_dict, + genome_fai, + mt_intervals ) ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT.out.versions) - // STEP 2.2: MT ALIGNMENT SHIFT AND VARIANT CALLING - ch_intervals_mt_shift = Channel.fromPath(params.intervals_mt_shift) - PREPARE_GENOME_SHIFTED_MT("bwamem2",[],[],fasta_shift ,[],[],[],false).set { ch_mt_shifted_genome } - ch_versions = ch_versions.mix(ch_mt_shifted_genome.versions) - ALIGN_AND_CALL_MT_SHIFT ( - PREPARE_MT_ALIGNMENT.out.fastq, - PREPARE_MT_ALIGNMENT.out.bam, - ch_mt_shifted_genome.bwamem2_index, - fasta_shift, - ch_mt_shifted_genome.sequence_dict, - ch_mt_shifted_genome.fai, - ch_intervals_mt_shift + CONVERT_MT_BAM_TO_FASTQ.out.fastq, + CONVERT_MT_BAM_TO_FASTQ.out.bam, + shift_mt_bwamem2_index, + shift_mt_fasta, + shift_mt_dict, + shift_mt_fai, + shift_mt_intervals ) ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT_SHIFT.out.versions) // STEP 2.3: PICARD_LIFTOVERVCF PICARD_LIFTOVERVCF ( ALIGN_AND_CALL_MT_SHIFT.out.vcf, - dict, - shift_chain, - fasta) + genome_dict, + shift_mt_backchain, + genome_fasta) ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions) diff --git a/subworkflows/local/prepare_MT_alignment.nf b/subworkflows/local/convert_mt_bam_to_fastq.nf similarity index 97% rename from subworkflows/local/prepare_MT_alignment.nf rename to subworkflows/local/convert_mt_bam_to_fastq.nf index d8b03d43..b126a310 100644 --- a/subworkflows/local/prepare_MT_alignment.nf +++ b/subworkflows/local/convert_mt_bam_to_fastq.nf @@ -6,7 +6,7 @@ include { SAMTOOLS_VIEW as SAMTOOLS_VIEW_MT } from '../../modules/nf-core/ include { GATK4_REVERTSAM as GATK4_REVERTSAM_MT } from '../../modules/nf-core/gatk4/revertsam/main' include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../modules/nf-core/gatk4/samtofastq/main' -workflow PREPARE_MT_ALIGNMENT { +workflow CONVERT_MT_BAM_TO_FASTQ { take: bam // channel: [ val(meta), file(bam), file(bai) ] diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf deleted file mode 100644 index 19a9dfcb..00000000 --- a/subworkflows/local/prepare_genome.nf +++ /dev/null @@ -1,101 +0,0 @@ -// -// Prepare reference genome files -// - -include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/untar/main' -include { BWA_INDEX } from '../../modules/nf-core/bwa/index/main' -include { BWAMEM2_INDEX } from '../../modules/nf-core/bwamem2/index/main' -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' -include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' -include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' -include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' - -workflow PREPARE_GENOME { - take: - aligner // [mandatory] params.aligner - bwa_index // [mandatory] bwa_index - bwamem2_index // [mandatory] bwamem2_index - fasta // [mandatory] genome.fasta - fai // [mandatory] genome.fai - variant_catalog // [optional] variant_catalog.json - vcfanno_resources // [mandatory] vcfanno resource file - bwa_index_switch // boolean val - - main: - ch_fasta = file(fasta) - ch_versions = Channel.empty() - ch_bwa_index = Channel.empty() - ch_bwamem2_index = Channel.empty() - - // Fetch aligner index or create from scratch if required - if (aligner == "bwamem2") { - BWAMEM2_INDEX ( [[], ch_fasta] ) - ch_bwamem2_index = !bwamem2_index ? BWAMEM2_INDEX.out.index : [[],file(bwamem2_index)] - ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) - } - - if ( bwa_index_switch && !bwa_index) { - if (aligner == "sentieon") { - SENTIEON_BWAINDEX ( [[], ch_fasta] ) - ch_bwa_index = SENTIEON_BWAINDEX.out.index - ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) - } else { - BWA_INDEX ( [[], ch_fasta] ) - ch_bwa_index = BWA_INDEX.out.index - ch_versions = ch_versions.mix(BWA_INDEX.out.versions) - } - } else if (bwa_index_switch) { - ch_bwa_index = [[],file(bwa_index)] - } - - if (aligner != "bwamem2" && aligner != "sentieon" ) { - exit 1, 'Please provide a valid aligner!' - } - - if ( fai ) { - ch_fai = file(fai) - } else { - ch_fai = SAMTOOLS_FAIDX ( [[], ch_fasta] ) - .fai - .collect{it[1]} - ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) - } - - // Uncompress vcfanno resources if nothing else given - if ( params.vcfanno_resources.endsWith('.tar.gz') ) { - ch_vcfanno_resources = UNTAR_VCFANNO ( [[],params.vcfanno_resources] ).untar - .map { - id, resources -> - return [resources] - } - ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) - } else { - ch_vcfanno_resources = file(vcfanno_resources) - } - - if ( variant_catalog && file(variant_catalog, checkIfExists:true) ) { - ch_variant_catalog = file(variant_catalog) - } else { - if ( params.genome == 'GRCh38' ) { - ch_variant_catalog = file("https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/reference/variant_catalog_grch38.json") - } else { - ch_variant_catalog = file("https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/reference/variant_catalog_grch37.json") - } - } - - ch_sequence_dict = GATK_SD ( ch_fasta ).dict - ch_chrom_sizes = GET_CHROM_SIZES ( ch_fai ).sizes - ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) - - - emit: - bwa_index = ch_bwa_index // path: bwamem2/index - bwamem2_index = ch_bwamem2_index // path: bwamem2/index - chrom_sizes = ch_chrom_sizes // path: chrom.sizes - fasta = ch_fasta // path: genome.fasta - fai = ch_fai // path: genome.fasta.fai - sequence_dict = ch_sequence_dict - variant_catalog = ch_variant_catalog // path: variant_catalog.json - vcfanno_resources = ch_vcfanno_resources // channel: [ untar'd files, ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] -} diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 6c62616e..b13bcffa 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -2,28 +2,33 @@ // Prepare reference files // -include { BWA_INDEX } from '../../modules/nf-core/bwa/index/main' -include { BWAMEM2_INDEX } from '../../modules/nf-core/bwamem2/index/main' -include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/cat/cat/main' -include { CHECK_VCF } from './prepare_vcf' -include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/gatk4/bedtointervallist/main' -include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' -include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/gatk4/intervallisttools/main' -include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' -include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' -include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/tabix/bgziptabix/main' -include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/tabix/tabix/main' -include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/tabix/tabix/main' -include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/tabix/tabix/main' -include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/untar/main' +include { BWA_INDEX } from '../../modules/nf-core/bwa/index/main' +include { BWAMEM2_INDEX } from '../../modules/nf-core/bwamem2/index/main' +include { BWAMEM2_INDEX as BWAMEM2_INDEX_SHIFT_MT } from '../../modules/nf-core/bwamem2/index/main' +include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/cat/cat/main' +include { CHECK_VCF } from './prepare_vcf' +include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/gatk4/bedtointervallist/main' +include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' +include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD_SHIFT_MT } from '../../modules/nf-core/gatk4/createsequencedictionary/main' +include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/gatk4/intervallisttools/main' +include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' +include { SAMTOOLS_FAIDX as SAMTOOLS_FAIDX_SHIFT_MT } from '../../modules/nf-core/samtools/faidx/main' +include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' +include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/tabix/tabix/main' +include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/untar/main' workflow PREPARE_REFERENCES { take: - ch_fasta_no_meta // [mandatory] genome.fasta - ch_fasta_meta + fasta_no_meta // [mandatory] genome.fasta + fasta_meta fai // [optional ] genome.fai + mt_fasta_shift_no_meta + mt_fasta_shift_meta gnomad_af_tab gnomad_vcf_in known_dbsnp @@ -35,15 +40,18 @@ workflow PREPARE_REFERENCES { ch_tbi = Channel.empty() ch_bgzip_tbi = Channel.empty() - BWA_INDEX(ch_fasta_meta) - BWAMEM2_INDEX(ch_fasta_meta) - SENTIEON_BWAINDEX(ch_fasta_meta) - SAMTOOLS_FAIDX(ch_fasta_meta) - GATK_SD(ch_fasta_no_meta) + BWA_INDEX(fasta_meta) + BWAMEM2_INDEX(fasta_meta) + BWAMEM2_INDEX_SHIFT_MT(mt_fasta_shift_meta) + SENTIEON_BWAINDEX(fasta_meta) + SAMTOOLS_FAIDX(fasta_meta) + SAMTOOLS_FAIDX_SHIFT_MT(mt_fasta_shift_meta) + GATK_SD(fasta_no_meta) + GATK_SD_SHIFT_MT(mt_fasta_shift_no_meta) GET_CHROM_SIZES( SAMTOOLS_FAIDX.out.fai ) TABIX_DBSNP(known_dbsnp) TABIX_GNOMAD_AF(gnomad_af_tab) - CHECK_VCF(gnomad_vcf_in, ch_fasta_no_meta) + CHECK_VCF(gnomad_vcf_in, fasta_no_meta) TABIX_PT(target_bed).tbi.set { ch_tbi } TABIX_PBT(target_bed).gz_tbi.set { ch_bgzip_tbi } GATK_BILT(target_bed, GATK_SD.out.dict).interval_list @@ -61,9 +69,12 @@ workflow PREPARE_REFERENCES { // Gather versions ch_versions = ch_versions.mix(BWA_INDEX.out.versions) ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) + ch_versions = ch_versions.mix(BWAMEM2_INDEX_SHIFT_MT.out.versions) ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX_SHIFT_MT.out.versions) ch_versions = ch_versions.mix(GATK_SD.out.versions) + ch_versions = ch_versions.mix(GATK_SD_SHIFT_MT.out.versions) ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) ch_versions = ch_versions.mix(TABIX_DBSNP.out.versions) ch_versions = ch_versions.mix(TABIX_GNOMAD_AF.out.versions) @@ -75,20 +86,23 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) emit: - bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] } - bwa_index = BWA_INDEX.out.index ?: SENTIEON_BWAINDEX.out.index - bwamem2_index = BWAMEM2_INDEX.out.index - chrom_sizes = GET_CHROM_SIZES.out.sizes - fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] } - gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi - gnomad_tbi = CHECK_VCF.out.index - gnomad_vcf = CHECK_VCF.out.vcf - known_dbsnp_tbi = TABIX_DBSNP.out.tbi - sequence_dict = GATK_SD.out.dict - target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi) - target_intervals = GATK_BILT.out.interval_list.collect{it[1]} - vcfanno_resources = UNTAR_VCFANNO.out.untar.map { id, resources -> [resources] } - versions = ch_versions + bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] } + bwa_index = BWA_INDEX.out.index ?: SENTIEON_BWAINDEX.out.index + bwamem2_index = BWAMEM2_INDEX.out.index + bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index + chrom_sizes = GET_CHROM_SIZES.out.sizes + fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] } + fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] } + gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi + gnomad_tbi = CHECK_VCF.out.index + gnomad_vcf = CHECK_VCF.out.vcf + known_dbsnp_tbi = TABIX_DBSNP.out.tbi + sequence_dict = GATK_SD.out.dict + sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict + target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi) + target_intervals = GATK_BILT.out.interval_list.collect{it[1]} + vcfanno_resources = UNTAR_VCFANNO.out.untar.map { id, resources -> [resources] } + versions = ch_versions } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6938a631..708e8c23 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -23,16 +23,18 @@ def checkPathParamList = [ params.gnomad_af_idx, params.gnomad_vcf, params.input, - params.intervals_mt, - params.intervals_mt_shift, params.known_dbsnp, params.known_dbsnp_tbi, params.known_indels, params.known_mills, params.ml_model, - params.mt_shift_fasta, - params.mt_shift_fasta_index, - params.mt_shift_fasta_chain, + params.mt_backchain_shift, + params.mt_bwamem2_index_shift, + params.mt_fasta_shift, + params.mt_fai_shift, + params.mt_intervals, + params.mt_intervals_shift, + params.mt_sequence_dictionary_shift, params.multiqc_config, params.reduced_penetrance, params.score_config_snv, @@ -131,24 +133,25 @@ workflow RAREDISEASE { // Initialize all file channels including unprocessed vcf, bed and tab files ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval) : Channel.value([]) ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta) : ( exit 1, 'Genome fasta not specified!' ) - ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it.baseName], it] } - ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf) : Channel.empty() + ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it[0].simpleName], it] } ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) - ch_intervals_mt = params.intervals_mt ? Channel.fromPath(params.intervals_mt) : Channel.value([]) - ch_intervals_mt_shift = params.intervals_mt_shift ? Channel.fromPath(params.intervals_mt_shift) : Channel.value([]) + ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf) : Channel.empty() ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model) : Channel.value([]) - ch_mt_shift_fasta = params.mt_shift_fasta ? Channel.fromPath(params.mt_shift_fasta) : Channel.value([]) + ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift) : Channel.value([]) + ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift) : Channel.value([]) + ch_mt_fasta_shift_meta = params.mt_fasta_shift ? ch_mt_fasta_shift_no_meta.map { it -> [[id:it[0].simpleName], it] } : Channel.value([]) + ch_mt_intervals = params.mt_intervals ? Channel.fromPath(params.mt_intervals) : Channel.value([]) + ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift) : Channel.value([]) ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance) : Channel.value([]) ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv) : Channel.value([]) ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv) : Channel.value([]) - ch_shift_fasta_chain = params.mt_shift_fasta_chain ? Channel.fromPath(params.mt_shift_fasta_chain) : Channel.value([]) ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([]) ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog) : Channel.value([]) ch_variant_consequences = Channel.fromPath("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true) + ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([]) ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache) : Channel.value([]) ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters) : Channel.value([]) - ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([]) // Generate pedigree file MAKE_PED (CHECK_INPUT.out.samples.toList()) @@ -163,6 +166,8 @@ workflow RAREDISEASE { ch_genome_fasta_no_meta, ch_genome_fasta_meta, params.fasta_fai, + ch_mt_fasta_shift_no_meta, + ch_mt_fasta_shift_meta, ch_gnomad_af_tab, ch_gnomad_vcf_unprocessed, ch_known_dbsnp, @@ -172,20 +177,23 @@ workflow RAREDISEASE { .set { ch_references } // Gather built indices or get them from the params - ch_bait_intervals = ch_references.bait_intervals - ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index) : ( ch_references.bwa_index ?: Channel.empty() ) - ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index) : ( ch_references.bwamem2_index ?: Channel.empty() ) - ch_chrom_sizes = ch_references.chrom_sizes - ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_genome_af_idx).map {meta, tab, idx -> [tab,idx]} : Channel.empty() - ch_genome_fai = params.fasta_fai ? Channel.fromPath(params.fasta_fai) : ( ch_references.fasta_fai ?: Channel.empty() ) - ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx) : ( ch_references.gnomad_af_idx ?: Channel.empty() ) - ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf : Channel.value([]) - ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi) : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) - ch_sequence_dictionary = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary) : ( ch_references.sequence_dict ?: Channel.empty() ) - ch_target_bed = ch_references.target_bed - ch_target_intervals = ch_references.target_intervals - ch_vcfanno_resources = params.vcfanno_resources.endsWith('.tar.gz') ? ch_references.vcfanno_resources : Channel.fromPath(params.vcfanno_resources) - ch_versions = ch_versions.mix(ch_references.versions) + ch_bait_intervals = ch_references.bait_intervals + ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index) : ( ch_references.bwa_index ?: Channel.empty() ) + ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index) : ( ch_references.bwamem2_index ?: Channel.empty() ) + ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift) : ( ch_references.bwamem2_index_mt_shift ?: Channel.empty() ) + ch_chrom_sizes = ch_references.chrom_sizes + ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_genome_af_idx).map {meta, tab, idx -> [tab,idx]} : Channel.empty() + ch_genome_fai = params.fasta_fai ? Channel.fromPath(params.fasta_fai) : ( ch_references.fasta_fai ?: Channel.empty() ) + ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift) : ( ch_references.fasta_fai_mt_shift ?: Channel.empty() ) + ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx) : ( ch_references.gnomad_af_idx ?: Channel.empty() ) + ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf : Channel.value([]) + ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi) : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) + ch_sequence_dictionary = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary) : ( ch_references.sequence_dict ?: Channel.empty() ) + ch_sequence_dictionary_mt_shift = params.mt_sequence_dictionary_shift ? Channel.fromPath(params.mt_sequence_dictionary_shift) : ( ch_references.sequence_dict_mt_shift ?: Channel.empty() ) + ch_target_bed = ch_references.target_bed + ch_target_intervals = ch_references.target_intervals + ch_vcfanno_resources = params.vcfanno_resources.endsWith('.tar.gz') ? ch_references.vcfanno_resources : Channel.fromPath(params.vcfanno_resources) + ch_versions = ch_versions.mix(ch_references.versions) // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( @@ -301,11 +309,14 @@ workflow RAREDISEASE { ch_bwamem2_index, ch_genome_fasta_no_meta, ch_sequence_dictionary, - ch_references.genome_fai, - ch_intervals_mt, - params.fasta_shift, - params.intervals_mt_shift, - params.shift_chain + ch_genome_fai, + ch_mt_intervals, + ch_bwamem2_index_mt_shift, + ch_mt_fasta_shift_no_meta, + ch_sequence_dictionary_mt_shift, + ch_mt_shift_fai, + ch_mt_intervals_shift, + ch_mt_backchain_shift ) ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) From 5d535ad4f56e6e6a0f13a531ded2ae8426ce6db0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 25 Oct 2022 02:29:50 +0200 Subject: [PATCH 0738/1169] add empty lines --- conf/modules.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index a5d95207..1f2254dc 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -808,9 +808,11 @@ process { ext.args = '--mitochondria-mode TRUE' } } + // // ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT // + process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } From f676e6dae5e9cecf2667a97afd374595108bc3fc Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 25 Oct 2022 13:50:16 +0200 Subject: [PATCH 0739/1169] Removed unsupported argument of tiddit --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 52d0992f..b74b15df 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -323,7 +323,7 @@ process { } withName: '.*QC_BAM:TIDDIT_COV' { - ext.args = '-z 500 -w -u' + ext.args = '-z 500 -w' publishDir = [ path: { "${params.outdir}/tiddit_coverage" }, mode: params.publish_dir_mode, From 7e1d36f6cc0d774de949de2c6c04b533f92d9038 Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 25 Oct 2022 13:59:38 +0200 Subject: [PATCH 0740/1169] nfcore modules update --- modules.json | 22 ++++++------ modules/nf-core/bwa/index/main.nf | 22 ++++++++++-- modules/nf-core/bwa/index/meta.yml | 10 ++++++ modules/nf-core/fastqc/main.nf | 34 ++++++------------- .../nf-core/gatk4/bedtointervallist/main.nf | 6 ++-- .../gatk4/createsequencedictionary/main.nf | 6 ++-- .../nf-core/gatk4/intervallisttools/main.nf | 6 ++-- .../nf-core/gatk4/mergebamalignment/main.nf | 6 ++-- modules/nf-core/gatk4/mutect2/main.nf | 6 ++-- modules/nf-core/gatk4/revertsam/main.nf | 6 ++-- modules/nf-core/gatk4/samtofastq/main.nf | 6 ++-- modules/nf-core/picard/markduplicates/main.nf | 3 ++ .../nf-core/picard/markduplicates/meta.yml | 10 +++++- modules/nf-core/samtools/view/main.nf | 4 ++- 14 files changed, 86 insertions(+), 61 deletions(-) diff --git a/modules.json b/modules.json index 8b0b6916..281dd436 100644 --- a/modules.json +++ b/modules.json @@ -19,7 +19,7 @@ }, "bwa/index": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "9518fa4f65f3fb8cde24fde7d40333b39ec8fd65" }, "bwamem2/index": { "branch": "master", @@ -71,35 +71,35 @@ }, "fastqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "f6a11408536fbee6cbea1f5977605011873de3ca" }, "gatk4/bedtointervallist": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, "gatk4/createsequencedictionary": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, "gatk4/intervallisttools": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, "gatk4/mergebamalignment": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, "gatk4/mutect2": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, "gatk4/revertsam": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, "gatk4/samtofastq": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, "genmod/annotate": { "branch": "master", @@ -151,7 +151,7 @@ }, "picard/markduplicates": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "eca65aa4a5e2e192ac44d6962c8f9260f314ffb8" }, "picard/sortvcf": { "branch": "master", @@ -187,7 +187,7 @@ }, "samtools/view": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "202683bfc98ddecdd456ea73268e330bca2e5c5a" }, "stranger": { "branch": "master", diff --git a/modules/nf-core/bwa/index/main.nf b/modules/nf-core/bwa/index/main.nf index aa75ae5d..6d70fc15 100644 --- a/modules/nf-core/bwa/index/main.nf +++ b/modules/nf-core/bwa/index/main.nf @@ -8,11 +8,11 @@ process BWA_INDEX { 'quay.io/biocontainers/bwa:0.7.17--hed695b0_7' }" input: - path fasta + tuple val(meta), path(fasta) output: - path "bwa" , emit: index - path "versions.yml", emit: versions + tuple val(meta), path(bwa) , emit: index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -32,4 +32,20 @@ process BWA_INDEX { bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') END_VERSIONS """ + + stub: + """ + mkdir bwa + + touch bwa/genome.amb + touch bwa/genome.ann + touch bwa/genome.bwt + touch bwa/genome.pac + touch bwa/genome.sa + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/bwa/index/meta.yml b/modules/nf-core/bwa/index/meta.yml index 2bbd81d9..2c6cfcd7 100644 --- a/modules/nf-core/bwa/index/meta.yml +++ b/modules/nf-core/bwa/index/meta.yml @@ -15,10 +15,20 @@ tools: arxiv: arXiv:1303.3997 licence: ["GPL-3.0-or-later"] input: + - meta: + type: map + description: | + Groovy Map containing reference information. + e.g. [ id:'test', single_end:false ] - fasta: type: file description: Input genome fasta file output: + - meta: + type: map + description: | + Groovy Map containing reference information. + e.g. [ id:'test', single_end:false ] - index: type: file description: BWA genome index files diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 05730368..55c50c87 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -8,7 +8,7 @@ process FASTQC { 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: - tuple val(meta), path(reads) + tuple val(meta), path(reads, stageAs: "?/*") output: tuple val(meta), path("*.html"), emit: html @@ -20,30 +20,16 @@ process FASTQC { script: def args = task.ext.args ?: '' - // Add soft-links to original FastQs for consistent naming in pipeline def prefix = task.ext.prefix ?: "${meta.id}" - if (meta.single_end) { - """ - [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $args --threads $task.cpus ${prefix}.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS - """ - } else { - """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS - """ - } + """ + printf "%s\\n" $reads | while read f; do ln -s \$f ${prefix}_\$(basename \$f) ; done + fastqc $args --threads $task.cpus ${prefix}_* + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ stub: def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/gatk4/bedtointervallist/main.nf b/modules/nf-core/gatk4/bedtointervallist/main.nf index 6224d9b3..64a3fa9a 100644 --- a/modules/nf-core/gatk4/bedtointervallist/main.nf +++ b/modules/nf-core/gatk4/bedtointervallist/main.nf @@ -2,10 +2,10 @@ process GATK4_BEDTOINTERVALLIST { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(bed) diff --git a/modules/nf-core/gatk4/createsequencedictionary/main.nf b/modules/nf-core/gatk4/createsequencedictionary/main.nf index 13fa9e81..fb78cdf5 100644 --- a/modules/nf-core/gatk4/createsequencedictionary/main.nf +++ b/modules/nf-core/gatk4/createsequencedictionary/main.nf @@ -2,10 +2,10 @@ process GATK4_CREATESEQUENCEDICTIONARY { tag "$fasta" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" input: path fasta diff --git a/modules/nf-core/gatk4/intervallisttools/main.nf b/modules/nf-core/gatk4/intervallisttools/main.nf index 7ab26c15..09e2b257 100644 --- a/modules/nf-core/gatk4/intervallisttools/main.nf +++ b/modules/nf-core/gatk4/intervallisttools/main.nf @@ -2,10 +2,10 @@ process GATK4_INTERVALLISTTOOLS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(intervals) diff --git a/modules/nf-core/gatk4/mergebamalignment/main.nf b/modules/nf-core/gatk4/mergebamalignment/main.nf index ff51de06..55f9b6a5 100644 --- a/modules/nf-core/gatk4/mergebamalignment/main.nf +++ b/modules/nf-core/gatk4/mergebamalignment/main.nf @@ -2,10 +2,10 @@ process GATK4_MERGEBAMALIGNMENT { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(aligned), path(unmapped) diff --git a/modules/nf-core/gatk4/mutect2/main.nf b/modules/nf-core/gatk4/mutect2/main.nf index abec0d73..693340d9 100644 --- a/modules/nf-core/gatk4/mutect2/main.nf +++ b/modules/nf-core/gatk4/mutect2/main.nf @@ -2,10 +2,10 @@ process GATK4_MUTECT2 { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(input), path(input_index), path(intervals) diff --git a/modules/nf-core/gatk4/revertsam/main.nf b/modules/nf-core/gatk4/revertsam/main.nf index 959c3e79..1c52aeff 100644 --- a/modules/nf-core/gatk4/revertsam/main.nf +++ b/modules/nf-core/gatk4/revertsam/main.nf @@ -2,10 +2,10 @@ process GATK4_REVERTSAM { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(bam) diff --git a/modules/nf-core/gatk4/samtofastq/main.nf b/modules/nf-core/gatk4/samtofastq/main.nf index de83293a..b7a6bcb0 100644 --- a/modules/nf-core/gatk4/samtofastq/main.nf +++ b/modules/nf-core/gatk4/samtofastq/main.nf @@ -2,10 +2,10 @@ process GATK4_SAMTOFASTQ { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.6.1" : null) + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.6.1--hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.2.6.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(bam) diff --git a/modules/nf-core/picard/markduplicates/main.nf b/modules/nf-core/picard/markduplicates/main.nf index 4e559fea..d1f3aaa1 100644 --- a/modules/nf-core/picard/markduplicates/main.nf +++ b/modules/nf-core/picard/markduplicates/main.nf @@ -9,6 +9,8 @@ process PICARD_MARKDUPLICATES { input: tuple val(meta), path(bam) + path fasta + path fai output: tuple val(meta), path("*.bam") , emit: bam @@ -35,6 +37,7 @@ process PICARD_MARKDUPLICATES { $args \\ --INPUT $bam \\ --OUTPUT ${prefix}.bam \\ + --REFERENCE_SEQUENCE $fasta \\ --METRICS_FILE ${prefix}.MarkDuplicates.metrics.txt cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/picard/markduplicates/meta.yml b/modules/nf-core/picard/markduplicates/meta.yml index 842817bc..3f2357bb 100644 --- a/modules/nf-core/picard/markduplicates/meta.yml +++ b/modules/nf-core/picard/markduplicates/meta.yml @@ -24,7 +24,15 @@ input: - bam: type: file description: BAM file - pattern: "*.{bam}" + pattern: "*.{bam,cram,sam}" + - fasta: + type: file + description: Reference genome fasta file + pattern: "*.{fasta,fa}" + - fai: + type: file + description: Reference genome fasta index + pattern: "*.{fai}" output: - meta: type: map diff --git a/modules/nf-core/samtools/view/main.nf b/modules/nf-core/samtools/view/main.nf index 94da5d69..b2f5c678 100644 --- a/modules/nf-core/samtools/view/main.nf +++ b/modules/nf-core/samtools/view/main.nf @@ -26,6 +26,7 @@ process SAMTOOLS_VIEW { script: def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference ${fasta}" : "" def readnames = qname ? "--qname-file ${qname}": "" @@ -42,7 +43,8 @@ process SAMTOOLS_VIEW { ${readnames} \\ $args \\ -o ${prefix}.${file_type} \\ - $input + $input \\ + $args2 cat <<-END_VERSIONS > versions.yml "${task.process}": From 7e2f7f1541877707dd38f4f059f478545567c2ca Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 25 Oct 2022 14:01:49 +0200 Subject: [PATCH 0741/1169] updated align_bwamem2 based on changes on PICARD_MARKDUPLICATES module --- subworkflows/nf-core/align_bwamem2.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index f446ef4e..e5a38d8d 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -51,7 +51,7 @@ workflow ALIGN_BWAMEM2 { ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) // Marking duplicates - MARKDUPLICATES ( prepared_bam ) + MARKDUPLICATES ( prepared_bam , fasta, fai ) SAMTOOLS_INDEX_MD ( MARKDUPLICATES.out.bam ) ch_versions = ch_versions.mix(MARKDUPLICATES.out.versions) From 5be705da3e6a996e451aa67ebcf3546c6c7117d5 Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 25 Oct 2022 14:13:40 +0200 Subject: [PATCH 0742/1169] updated the inputs of picard_markduplicates_mt --- subworkflows/local/align_and_call_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index ab080276..2ef9cc0c 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -41,7 +41,7 @@ workflow ALIGN_AND_CALL_MT { ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) // Marks duplicates - PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam ) + PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam, fasta, fai ) ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) // Sort bam file From 441675cac01172c98b74b72dd8037415d91e3459 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 25 Oct 2022 14:15:48 +0200 Subject: [PATCH 0743/1169] review suggestions and add comments --- conf/genomes.config | 3 ++- subworkflows/local/prepare_references.nf | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index 95d88578..5b11a860 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -61,10 +61,11 @@ params { mt_fai_shift = "" mt_intervals = "${params.local_genomes}/non_control_region.chrM.interval_list" mt_intervals_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" + mt_sequence_dictionary_shift = "" reduced_penetrance = "" - sequence_dictionary = "" score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" + sequence_dictionary = "" select_feature_file = "${params.local_genomes}/hgnc.txt" svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index b13bcffa..4903c267 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -40,6 +40,7 @@ workflow PREPARE_REFERENCES { ch_tbi = Channel.empty() ch_bgzip_tbi = Channel.empty() + // Genome indices BWA_INDEX(fasta_meta) BWAMEM2_INDEX(fasta_meta) BWAMEM2_INDEX_SHIFT_MT(mt_fasta_shift_meta) @@ -49,11 +50,18 @@ workflow PREPARE_REFERENCES { GATK_SD(fasta_no_meta) GATK_SD_SHIFT_MT(mt_fasta_shift_no_meta) GET_CHROM_SIZES( SAMTOOLS_FAIDX.out.fai ) + + // Vcf, tab and bed indices TABIX_DBSNP(known_dbsnp) TABIX_GNOMAD_AF(gnomad_af_tab) CHECK_VCF(gnomad_vcf_in, fasta_no_meta) TABIX_PT(target_bed).tbi.set { ch_tbi } TABIX_PBT(target_bed).gz_tbi.set { ch_bgzip_tbi } + + // Check if a vcf file is normalized and create index + CHECK_VCF(gnomad_vcf_in, fasta_no_meta) + + // Generate bait and target intervals GATK_BILT(target_bed, GATK_SD.out.dict).interval_list GATK_ILT(GATK_BILT.out.interval_list) GATK_ILT.out.interval_list @@ -64,6 +72,8 @@ workflow PREPARE_REFERENCES { } .set { ch_bait_intervals_cat_in } CAT_CAT_BAIT ( ch_bait_intervals_cat_in ) + + // Untar vcfanno UNTAR_VCFANNO ( vcfanno_resources ) // Gather versions From 579106f0db88c912856ff5a3c01d4fab87ba04f8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 25 Oct 2022 20:11:28 +0200 Subject: [PATCH 0744/1169] fix bwamem2 error --- subworkflows/local/prepare_references.nf | 3 +- subworkflows/nf-core/align_bwamem2.nf | 3 +- workflows/raredisease.nf | 64 ++++++++++++------------ 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 4903c267..012493fb 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -54,7 +54,6 @@ workflow PREPARE_REFERENCES { // Vcf, tab and bed indices TABIX_DBSNP(known_dbsnp) TABIX_GNOMAD_AF(gnomad_af_tab) - CHECK_VCF(gnomad_vcf_in, fasta_no_meta) TABIX_PT(target_bed).tbi.set { ch_tbi } TABIX_PBT(target_bed).gz_tbi.set { ch_bgzip_tbi } @@ -98,7 +97,7 @@ workflow PREPARE_REFERENCES { emit: bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] } bwa_index = BWA_INDEX.out.index ?: SENTIEON_BWAINDEX.out.index - bwamem2_index = BWAMEM2_INDEX.out.index + bwamem2_index = BWAMEM2_INDEX.out.index.collect() bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index chrom_sizes = GET_CHROM_SIZES.out.sizes fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] } diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index f446ef4e..4e3d8e3e 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -45,7 +45,8 @@ workflow ALIGN_BWAMEM2 { } .set{ bams } // create a new multi-channel named bams - // TODO: If there are no samples to merge, skip the process + bams.multiple.view() + // If there are no samples to merge, skip the process SAMTOOLS_MERGE ( bams.multiple, fasta, fai ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 708e8c23..0b0a6c70 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -131,27 +131,27 @@ workflow RAREDISEASE { } // Initialize all file channels including unprocessed vcf, bed and tab files - ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval) : Channel.value([]) - ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta) : ( exit 1, 'Genome fasta not specified!' ) + ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() : Channel.value([]) + ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta).collect() : ( exit 1, 'Genome fasta not specified!' ) ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it[0].simpleName], it] } - ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) - ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf) : Channel.empty() - ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([[],[]]) - ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model) : Channel.value([]) - ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift) : Channel.value([]) - ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift) : Channel.value([]) - ch_mt_fasta_shift_meta = params.mt_fasta_shift ? ch_mt_fasta_shift_no_meta.map { it -> [[id:it[0].simpleName], it] } : Channel.value([]) - ch_mt_intervals = params.mt_intervals ? Channel.fromPath(params.mt_intervals) : Channel.value([]) - ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift) : Channel.value([]) - ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance) : Channel.value([]) - ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv) : Channel.value([]) - ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv) : Channel.value([]) - ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([]) - ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog) : Channel.value([]) - ch_variant_consequences = Channel.fromPath("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true) - ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).map{ it -> [[id:it[0].simpleName], it] } : Channel.value([]) - ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache) : Channel.value([]) - ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters) : Channel.value([]) + ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) + ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() : Channel.empty() + ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) + ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() : Channel.value([]) + ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() : Channel.value([]) + ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift).collect() : Channel.value([]) + ch_mt_fasta_shift_meta = params.mt_fasta_shift ? ch_mt_fasta_shift_no_meta.map { it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([]) + ch_mt_intervals = params.mt_intervals ? Channel.fromPath(params.mt_intervals).collect() : Channel.value([]) + ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift).collect() : Channel.value([]) + ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance).collect() : Channel.value([]) + ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv).collect() : Channel.value([]) + ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv).collect() : Channel.value([]) + ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([]) + ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog).collect() : Channel.value([]) + ch_variant_consequences = Channel.fromPath("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true).collect() + ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([]) + ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache).collect() : Channel.value([]) + ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters).collect() : Channel.value([]) // Generate pedigree file MAKE_PED (CHECK_INPUT.out.samples.toList()) @@ -178,21 +178,21 @@ workflow RAREDISEASE { // Gather built indices or get them from the params ch_bait_intervals = ch_references.bait_intervals - ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index) : ( ch_references.bwa_index ?: Channel.empty() ) - ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index) : ( ch_references.bwamem2_index ?: Channel.empty() ) - ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift) : ( ch_references.bwamem2_index_mt_shift ?: Channel.empty() ) + ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index).collect() : ( ch_references.bwa_index ?: Channel.empty() ) + ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index).collect() : ( ch_references.bwamem2_index ?: Channel.empty() ) + ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift).collect() : ( ch_references.bwamem2_index_mt_shift ?: Channel.empty() ) ch_chrom_sizes = ch_references.chrom_sizes - ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_genome_af_idx).map {meta, tab, idx -> [tab,idx]} : Channel.empty() - ch_genome_fai = params.fasta_fai ? Channel.fromPath(params.fasta_fai) : ( ch_references.fasta_fai ?: Channel.empty() ) - ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift) : ( ch_references.fasta_fai_mt_shift ?: Channel.empty() ) - ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx) : ( ch_references.gnomad_af_idx ?: Channel.empty() ) - ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf : Channel.value([]) - ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi) : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) - ch_sequence_dictionary = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary) : ( ch_references.sequence_dict ?: Channel.empty() ) - ch_sequence_dictionary_mt_shift = params.mt_sequence_dictionary_shift ? Channel.fromPath(params.mt_sequence_dictionary_shift) : ( ch_references.sequence_dict_mt_shift ?: Channel.empty() ) + ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_genome_af_idx).map {meta, tab, idx -> [tab,idx]} : Channel.empty() + ch_genome_fai = params.fasta_fai ? Channel.fromPath(params.fasta_fai).collect() : ( ch_references.fasta_fai ?: Channel.empty() ) + ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift).collect() : ( ch_references.fasta_fai_mt_shift ?: Channel.empty() ) + ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx).collect() : ( ch_references.gnomad_af_idx ?: Channel.empty() ) + ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf : Channel.value([]) + ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi).collect() : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) + ch_sequence_dictionary = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).collect() : ( ch_references.sequence_dict ?: Channel.empty() ) + ch_sequence_dictionary_mt_shift = params.mt_sequence_dictionary_shift ? Channel.fromPath(params.mt_sequence_dictionary_shift).collect() : ( ch_references.sequence_dict_mt_shift ?: Channel.empty() ) ch_target_bed = ch_references.target_bed ch_target_intervals = ch_references.target_intervals - ch_vcfanno_resources = params.vcfanno_resources.endsWith('.tar.gz') ? ch_references.vcfanno_resources : Channel.fromPath(params.vcfanno_resources) + ch_vcfanno_resources = params.vcfanno_resources.endsWith('.tar.gz') ? ch_references.vcfanno_resources : Channel.fromPath(params.vcfanno_resources).collect() ch_versions = ch_versions.mix(ch_references.versions) // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. From 93f05e62d9b9a3d90fbefc7c26e991a3e3625793 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 25 Oct 2022 20:11:42 +0200 Subject: [PATCH 0745/1169] renove view --- subworkflows/nf-core/align_bwamem2.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/nf-core/align_bwamem2.nf index 4e3d8e3e..e449f1fa 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/nf-core/align_bwamem2.nf @@ -45,7 +45,6 @@ workflow ALIGN_BWAMEM2 { } .set{ bams } // create a new multi-channel named bams - bams.multiple.view() // If there are no samples to merge, skip the process SAMTOOLS_MERGE ( bams.multiple, fasta, fai ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) From a4ae2585e89818f9f46723c8fa38fc0fe6104e19 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Oct 2022 13:42:11 +0200 Subject: [PATCH 0746/1169] review suggestions --- conf/modules.config | 38 ++++++++++++++++---------------- nextflow_schema.json | 17 ++++++++++++++ subworkflows/local/analyse_MT.nf | 6 ++--- 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1f2254dc..bdf494ea 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -70,7 +70,7 @@ process { } withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_SHIFT_MT' { - ext.when = {!params.mt_bwamem2_index_shift && params.mt_fasta_shift} + ext.when = {!params.mt_bwamem2_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, @@ -112,7 +112,7 @@ process { } withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_SHIFT_MT' { - ext.when = {!params.mt_fai_shift && params.mt_fasta_shift} + ext.when = {!params.mt_fai_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, @@ -134,7 +134,7 @@ process { } withName: '.*PREPARE_REFERENCES:GATK_SD_SHIFT_MT' { - ext.when = {!params.mt_sequence_dictionary_shift && params.mt_fasta_shift} + ext.when = {!params.mt_sequence_dictionary_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, @@ -755,18 +755,18 @@ process { process { withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:SAMTOOLS_VIEW_MT' { - ext.when = { params.mt_fasta_shift } + ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } ext.args = { '-h ' } ext.args2 = { (params.genome == "GRCh37") ? "MT" : "chrM" } } withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_REVERTSAM_MT' { - ext.when = { params.mt_fasta_shift } + ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } ext.args = '--OUTPUT_BY_READGROUP false --VALIDATION_STRINGENCY LENIENT --ATTRIBUTE_TO_CLEAR FT --ATTRIBUTE_TO_CLEAR CO --SORT_ORDER queryname --RESTORE_ORIGINAL_QUALITIES false' } withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_SAMTOFASTQ_MT' { - ext.when = { params.mt_fasta_shift } + ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT' } } @@ -777,34 +777,34 @@ process { process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:BWAMEM2_MEM_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MERGEBAMALIGNMENT_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}_merged" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT' } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_MARKDUPLICATES_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:SAMTOOLS_SORT_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_sorted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MUTECT2_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--mitochondria-mode TRUE' } } @@ -815,41 +815,41 @@ process { process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MERGEBAMALIGNMENT_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}_merged" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_ADDORREPLACEREADGROUPS_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT' } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_MARKDUPLICATES_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SAMTOOLS_SORT_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_sorted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--mitochondria-mode TRUE' } } process { withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { - ext.when = { params.mt_fasta_shift && params.mt_backchain_shift } + ext.when = { params.mt_fasta_shift && params.mt_backchain_shift && !(params.analysis_type == "wes") } } } diff --git a/nextflow_schema.json b/nextflow_schema.json index 9cbd40fe..98533526 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -68,6 +68,7 @@ "format": "file-path", "help_text": "If none provided, will be generated automatically from the FASTA reference", "description": "Path to FASTA genome index file.", + "pattern": "^\\S+\\.fn?a(sta)?\\.fai$", "fa_icon": "far fa-file-code", "hidden": true }, @@ -106,6 +107,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-bezier-curve", + "pattern": "^\\S+\\.vcf(\\.gz)?$", "description": "Path to directory for gnomad vcf.", "help_text": "Path to the gnomad annotations vcf file. If you don't provide one, gnomad annotations will not be used." }, @@ -113,6 +115,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-file", + "pattern": "^\\S+\\.tab(\\.gz)?$", "description": "Path to the gnomad tab file with allele frequencies.", "help_text": "Path to the gnomad tab file with CHR/START/REF,ALT/AF. Can be generated from the gnomad annotations vcf." }, @@ -120,6 +123,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-file", + "pattern": "^\\S+\\.bed(\\.gz)?\\.idx$", "description": "Path to the index file for the gnomad tab file with allele frequencies.", "help_text": "Path to the index of gnomad tab file with CHR/START/REF,ALT/AF" }, @@ -127,6 +131,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-file", + "pattern": "^\\S+\\.intervals?(_list)?$", "description": "Path to the interval list of the non control mitochondral region.", "help_text": "Path to the interval list of the non control mitochondral regions for Mutect2" }, @@ -134,6 +139,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-file", + "pattern": "^\\S+\\.intervals?(\\_list)?$", "description": "Path to the interval list of the non control mitochondral region in shifted fasta.", "help_text": "Path to the interval list of the non control mitochondral regions in shifted fasta for Mutect2" }, @@ -141,6 +147,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-chart-bar", + "pattern": "^\\S+\\.vcf(\\.gz)?$", "description": "Path to known dbSNP file.", "hidden": true }, @@ -148,6 +155,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-chart-bar", + "pattern": "^\\S+\\.vcf(\\.gz)?\\.tbi$", "description": "Path to known dbSNP file index.", "hidden": true }, @@ -155,6 +163,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-chart-bar", + "pattern": "^\\S+\\.vcf(\\.gz)?$", "description": "Path to known indels file.", "hidden": true }, @@ -162,6 +171,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-chart-bar", + "pattern": "^\\S+\\.vcf(\\.gz)?$", "description": "Path to known Mills file.", "hidden": true }, @@ -176,6 +186,7 @@ "type": "string", "format": "file-path", "mimetype": "text/plain", + "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to mitochondrial FASTA genome file.", "fa_icon": "far fa-file-code" }, @@ -183,6 +194,7 @@ "type": "string", "format": "file-path", "mimetype": "text/plain", + "pattern": "^\\S+\\.fn?a(sta)?\\.fai?$", "description": "Path to mitochondrial FASTA genome index file.", "fa_icon": "far fa-file-code" }, @@ -227,6 +239,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-chart-bar", + "pattern": "^\\S+\\.dict$", "description": "Genome dictionary file", "hidden": true }, @@ -234,6 +247,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-chart-bar", + "pattern": "^\\S+\\.dict$", "description": "Shifted mitochondrial genome dictionary file", "hidden": true }, @@ -248,6 +262,7 @@ "type": "string", "format": "path", "fa_icon": "fas fa-bezier-curve", + "pattern": "^\\S+\\.bed(\\.gz)?$", "description": "Path to directory for target bed file.", "help_text": "If you would like to limit your analysis to specific regions of the genome, you can pass those regions in a bed file using this option", "hidden": true @@ -277,6 +292,7 @@ "vcfanno_toml": { "type": "string", "description": "Path to the vcfanno toml file.", + "pattern": "^\\S+\\.toml$", "help_text": "If no toml is passed, default configurations will be used according to genome build within the context of the pipeline.", "fa_icon": "fas fa-file-csv", "hidden": true @@ -305,6 +321,7 @@ "format": "file-path", "default": null, "fa_icon": "fas fa-bezier-curve", + "pattern": "^\\S+\\.interval_list?$", "description": "Path to interval list for Gens.", "help_text": "This file contains the binning intervals used for CollectReadCounts.", "hidden": true diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 425f5f85..bece2ea4 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -16,10 +16,10 @@ workflow ANALYSE_MT { mt_intervals // channel: [ file(non_control_region.chrM.interval_list) ] shift_mt_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] shift_mt_fasta // channel: [ genome.fasta ] - shift_mt_dict // channel: [ genome.dict ] - shift_mt_fai // channel: [ genome.fai ] + shift_mt_dict // channel: [ genome.dict ] + shift_mt_fai // channel: [ genome.fai ] shift_mt_intervals // channel: [ file(control_region_shifted.chrM.interval_list) ] - shift_mt_backchain + shift_mt_backchain // channel: [ file(shift.back_chain) ] main: ch_versions = Channel.empty() From 7093b9c27e615891d97bf94169a2d940db0bca3d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Oct 2022 13:42:27 +0200 Subject: [PATCH 0747/1169] fix line limits --- workflows/raredisease.nf | 94 +++++++++++++++++++++++++++------------- 1 file changed, 63 insertions(+), 31 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 0b0a6c70..43c983b5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -131,27 +131,47 @@ workflow RAREDISEASE { } // Initialize all file channels including unprocessed vcf, bed and tab files - ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() : Channel.value([]) - ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta).collect() : ( exit 1, 'Genome fasta not specified!' ) + ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() + : Channel.value([]) + ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta).collect() + : ( exit 1, 'Genome fasta not specified!' ) ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it[0].simpleName], it] } - ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) - ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() : Channel.empty() - ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) - ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() : Channel.value([]) - ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() : Channel.value([]) - ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift).collect() : Channel.value([]) - ch_mt_fasta_shift_meta = params.mt_fasta_shift ? ch_mt_fasta_shift_no_meta.map { it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([]) - ch_mt_intervals = params.mt_intervals ? Channel.fromPath(params.mt_intervals).collect() : Channel.value([]) - ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift).collect() : Channel.value([]) - ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance).collect() : Channel.value([]) - ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv).collect() : Channel.value([]) - ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv).collect() : Channel.value([]) - ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([]) - ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog).collect() : Channel.value([]) + ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] }.collect() + : Channel.value([[],[]]) + ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() + : Channel.empty() + ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() + : Channel.value([[],[]]) + ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() + : Channel.value([]) + ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() + : Channel.value([]) + ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift).collect() + : Channel.value([]) + ch_mt_fasta_shift_meta = params.mt_fasta_shift ? ch_mt_fasta_shift_no_meta.map { it -> [[id:it[0].simpleName], it] }.collect() + : Channel.value([]) + ch_mt_intervals = params.mt_intervals ? Channel.fromPath(params.mt_intervals).collect() + : Channel.value([]) + ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift).collect() + : Channel.value([]) + ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance).collect() + : Channel.value([]) + ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv).collect() + : Channel.value([]) + ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv).collect() + : Channel.value([]) + ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it[0].simpleName], it] }.collect() + : Channel.value([]) + ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog).collect() + : Channel.value([]) ch_variant_consequences = Channel.fromPath("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true).collect() - ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([]) - ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache).collect() : Channel.value([]) - ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters).collect() : Channel.value([]) + + ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).map{ it -> [[id:it[0].simpleName], it] }.collect() + : Channel.value([]) + ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache).collect() + : Channel.value([]) + ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters).collect() + : Channel.value([]) // Generate pedigree file MAKE_PED (CHECK_INPUT.out.samples.toList()) @@ -178,21 +198,33 @@ workflow RAREDISEASE { // Gather built indices or get them from the params ch_bait_intervals = ch_references.bait_intervals - ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index).collect() : ( ch_references.bwa_index ?: Channel.empty() ) - ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index).collect() : ( ch_references.bwamem2_index ?: Channel.empty() ) - ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift).collect() : ( ch_references.bwamem2_index_mt_shift ?: Channel.empty() ) + ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index).collect() + : ( ch_references.bwa_index ?: Channel.empty() ) + ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index).collect() + : ( ch_references.bwamem2_index ?: Channel.empty() ) + ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift).collect() + : ( ch_references.bwamem2_index_mt_shift ?: Channel.empty() ) ch_chrom_sizes = ch_references.chrom_sizes - ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_genome_af_idx).map {meta, tab, idx -> [tab,idx]} : Channel.empty() - ch_genome_fai = params.fasta_fai ? Channel.fromPath(params.fasta_fai).collect() : ( ch_references.fasta_fai ?: Channel.empty() ) - ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift).collect() : ( ch_references.fasta_fai_mt_shift ?: Channel.empty() ) - ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx).collect() : ( ch_references.gnomad_af_idx ?: Channel.empty() ) - ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf : Channel.value([]) - ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi).collect() : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) - ch_sequence_dictionary = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).collect() : ( ch_references.sequence_dict ?: Channel.empty() ) - ch_sequence_dictionary_mt_shift = params.mt_sequence_dictionary_shift ? Channel.fromPath(params.mt_sequence_dictionary_shift).collect() : ( ch_references.sequence_dict_mt_shift ?: Channel.empty() ) + ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_genome_af_idx).map {meta, tab, idx -> [tab,idx]} + : Channel.empty() + ch_genome_fai = params.fasta_fai ? Channel.fromPath(params.fasta_fai).collect() + : ( ch_references.fasta_fai ?: Channel.empty() ) + ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift).collect() + : ( ch_references.fasta_fai_mt_shift ?: Channel.empty() ) + ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx).collect() + : ( ch_references.gnomad_af_idx ?: Channel.empty() ) + ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf + : Channel.value([]) + ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi).collect() + : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) + ch_sequence_dictionary = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).collect() + : ( ch_references.sequence_dict ?: Channel.empty() ) + ch_sequence_dictionary_mt_shift = params.mt_sequence_dictionary_shift ? Channel.fromPath(params.mt_sequence_dictionary_shift).collect() + : ( ch_references.sequence_dict_mt_shift ?: Channel.empty() ) ch_target_bed = ch_references.target_bed ch_target_intervals = ch_references.target_intervals - ch_vcfanno_resources = params.vcfanno_resources.endsWith('.tar.gz') ? ch_references.vcfanno_resources : Channel.fromPath(params.vcfanno_resources).collect() + ch_vcfanno_resources = params.vcfanno_resources.endsWith('.tar.gz') ? ch_references.vcfanno_resources + : Channel.fromPath(params.vcfanno_resources).collect() ch_versions = ch_versions.mix(ch_references.versions) // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. From 0aed84af47395fba9265730aaf181ec76d672def Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Oct 2022 14:41:29 +0200 Subject: [PATCH 0748/1169] fix lint error --- nextflow_schema.json | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 98533526..db099e44 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -321,7 +321,6 @@ "format": "file-path", "default": null, "fa_icon": "fas fa-bezier-curve", - "pattern": "^\\S+\\.interval_list?$", "description": "Path to interval list for Gens.", "help_text": "This file contains the binning intervals used for CollectReadCounts.", "hidden": true From f4745a8149bedb02e6c2b39376fbc43e7f53e96a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Oct 2022 15:24:26 +0200 Subject: [PATCH 0749/1169] update make_ped --- modules/local/create_pedfile.nf | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/local/create_pedfile.nf b/modules/local/create_pedfile.nf index b4761f07..6acae0d9 100644 --- a/modules/local/create_pedfile.nf +++ b/modules/local/create_pedfile.nf @@ -17,9 +17,15 @@ process MAKE_PED { script: def pedinfo = ['#family_id', 'sample_id', 'father', 'mother', 'sex', 'phenotype'].join('\t') + def samples_list = [] for(int i = 0; i family.ped From e781aaa91a298649a9f21e98b2810086db749f20 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Oct 2022 16:41:06 +0200 Subject: [PATCH 0750/1169] refactor alignment subworkflows --- subworkflows/local/align.nf | 26 +++++++------------ .../alignment}/align_bwamem2.nf | 12 ++++----- .../local/{ => alignment}/align_sentieon.nf | 10 +++---- workflows/raredisease.nf | 2 +- 4 files changed, 21 insertions(+), 29 deletions(-) rename subworkflows/{nf-core => local/alignment}/align_bwamem2.nf (92%) rename subworkflows/local/{ => alignment}/align_sentieon.nf (85%) diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 39c7ed7d..6fd07f2c 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -2,8 +2,8 @@ // Map to reference // -include { ALIGN_BWAMEM2 } from '../nf-core/align_bwamem2' -include { ALIGN_SENTIEON } from './align_sentieon' +include { ALIGN_BWAMEM2 } from './alignment/align_bwamem2' +include { ALIGN_SENTIEON } from './alignment/align_sentieon' workflow ALIGN { take: @@ -19,26 +19,18 @@ workflow ALIGN { main: ch_versions = Channel.empty() - if( aligner == "bwamem2" ) { - ALIGN_BWAMEM2 ( reads_input, index_bwamem2, fasta, fai ) - ch_marked_bam = ALIGN_BWAMEM2.out.marked_bam - ch_marked_bai = ALIGN_BWAMEM2.out.marked_bai - ch_versions = ch_versions.mix(ALIGN_BWAMEM2.out.versions) - } else if( aligner == "sentieon" ) { - ALIGN_SENTIEON ( reads_input, fasta, fai, index_bwa, known_dbsnp, known_dbsnp_tbi ) - ch_marked_bam = ALIGN_SENTIEON.out.marked_bam - ch_marked_bai = ALIGN_SENTIEON.out.marked_bai - ch_versions = ch_versions.mix(ALIGN_SENTIEON.out.versions) - } else { - exit 1, 'Please provide a valid aligner!' - } + ALIGN_BWAMEM2 ( reads_input, index_bwamem2, fasta, fai ) + ALIGN_SENTIEON ( reads_input, fasta, fai, index_bwa, known_dbsnp, known_dbsnp_tbi ) + ch_marked_bam = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bam, ALIGN_SENTIEON.out.marked_bam) + ch_marked_bai = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bai, ALIGN_SENTIEON.out.marked_bai) + ch_versions = Channel.empty().mix(ALIGN_BWAMEM2.out.versions, ALIGN_SENTIEON.out.versions) ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) + emit: - marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bam ] ] + marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bai ] ] marked_bai = ch_marked_bai // channel: [ val(meta), [ marked_bai ] ] bam_bai = ch_bam_bai // channel: [ val(meta), [ marked_bam, marked_bai ] ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf similarity index 92% rename from subworkflows/nf-core/align_bwamem2.nf rename to subworkflows/local/alignment/align_bwamem2.nf index 7879bfd5..2993a906 100644 --- a/subworkflows/nf-core/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -2,12 +2,12 @@ // Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // -include { BWAMEM2_MEM } from '../../modules/nf-core/bwamem2/mem/main' -include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../modules/nf-core/samtools/index/main' -include { SAMTOOLS_STATS } from '../../modules/nf-core/samtools/stats/main' -include { SAMTOOLS_MERGE } from '../../modules/nf-core/samtools/merge/main' -include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../modules/nf-core/picard/markduplicates/main' +include { BWAMEM2_MEM } from '../../../modules/nf-core/bwamem2/mem/main' +include { SAMTOOLS_INDEX } from '../../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main' +include { SAMTOOLS_MERGE } from '../../../modules/nf-core/samtools/merge/main' +include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../../modules/nf-core/picard/markduplicates/main' workflow ALIGN_BWAMEM2 { diff --git a/subworkflows/local/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf similarity index 85% rename from subworkflows/local/align_sentieon.nf rename to subworkflows/local/alignment/align_sentieon.nf index 9949b5d5..c498958e 100644 --- a/subworkflows/local/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -2,11 +2,11 @@ // A subworkflow to annotate structural variants. // -include { SENTIEON_BWAMEM } from '../../modules/local/sentieon/bwamem' -include { SENTIEON_DATAMETRICS } from '../../modules/local/sentieon/datametrics' -include { SENTIEON_LOCUSCOLLECTOR } from '../../modules/local/sentieon/locuscollector' -include { SENTIEON_DEDUP } from '../../modules/local/sentieon/dedup' -include { SENTIEON_BQSR } from '../../modules/local/sentieon/bqsr' +include { SENTIEON_BWAMEM } from '../../../modules/local/sentieon/bwamem' +include { SENTIEON_DATAMETRICS } from '../../../modules/local/sentieon/datametrics' +include { SENTIEON_LOCUSCOLLECTOR } from '../../../modules/local/sentieon/locuscollector' +include { SENTIEON_DEDUP } from '../../../modules/local/sentieon/dedup' +include { SENTIEON_BQSR } from '../../../modules/local/sentieon/bqsr' workflow ALIGN_SENTIEON { take: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 43c983b5..f3a49698 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -227,7 +227,7 @@ workflow RAREDISEASE { : Channel.fromPath(params.vcfanno_resources).collect() ch_versions = ch_versions.mix(ch_references.versions) - // STEP 1: ALIGNING READS, FETCH STATS, AND MERGE. + // ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( params.aligner, CHECK_INPUT.out.reads, From 2cff42a9e2500e1a9b7150e6a4c7da6cc0611ced Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Oct 2022 20:03:49 +0200 Subject: [PATCH 0751/1169] fix typo --- subworkflows/local/align.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 6fd07f2c..b9e09eeb 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -29,7 +29,7 @@ workflow ALIGN { emit: - marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bai ] ] + marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bam ] ] marked_bai = ch_marked_bai // channel: [ val(meta), [ marked_bai ] ] bam_bai = ch_bam_bai // channel: [ val(meta), [ marked_bam, marked_bai ] ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] From d0484bfc2947bbf4f57e82b6fb5e69836751b35c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 28 Oct 2022 03:10:33 +0200 Subject: [PATCH 0752/1169] update pipeline --- subworkflows/local/prepare_references.nf | 30 ++++++++++++------------ workflows/raredisease.nf | 12 +++++----- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 012493fb..42ce93b6 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -95,22 +95,22 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) emit: - bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] } - bwa_index = BWA_INDEX.out.index ?: SENTIEON_BWAINDEX.out.index + bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() + bwa_index = BWA_INDEX.out.index.collect() ?: SENTIEON_BWAINDEX.out.index.collect() bwamem2_index = BWAMEM2_INDEX.out.index.collect() - bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index - chrom_sizes = GET_CHROM_SIZES.out.sizes - fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] } - fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] } - gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi - gnomad_tbi = CHECK_VCF.out.index - gnomad_vcf = CHECK_VCF.out.vcf - known_dbsnp_tbi = TABIX_DBSNP.out.tbi - sequence_dict = GATK_SD.out.dict - sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict - target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi) - target_intervals = GATK_BILT.out.interval_list.collect{it[1]} - vcfanno_resources = UNTAR_VCFANNO.out.untar.map { id, resources -> [resources] } + bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() + chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() + fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] }.collect() + fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] }.collect() + gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi.collect() + gnomad_tbi = CHECK_VCF.out.index.collect() + gnomad_vcf = CHECK_VCF.out.vcf.collect() + known_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect() + sequence_dict = GATK_SD.out.dict.collect() + sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict.collect() + target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi).collect() + target_intervals = GATK_BILT.out.interval_list.collect{it[1]}.collect() + vcfanno_resources = UNTAR_VCFANNO.out.untar.map { id, resources -> [resources] }.collect() versions = ch_versions } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 43c983b5..42f8e980 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -147,9 +147,9 @@ workflow RAREDISEASE { ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() : Channel.value([]) ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift).collect() - : Channel.value([]) + : Channel.empty() ch_mt_fasta_shift_meta = params.mt_fasta_shift ? ch_mt_fasta_shift_no_meta.map { it -> [[id:it[0].simpleName], it] }.collect() - : Channel.value([]) + : Channel.empty() ch_mt_intervals = params.mt_intervals ? Channel.fromPath(params.mt_intervals).collect() : Channel.value([]) ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift).collect() @@ -198,21 +198,21 @@ workflow RAREDISEASE { // Gather built indices or get them from the params ch_bait_intervals = ch_references.bait_intervals - ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index).collect() + ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index).map {it -> [[id:it[0].simpleName], it]}.collect() : ( ch_references.bwa_index ?: Channel.empty() ) - ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index).collect() + ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index).map {it -> [[id:it[0].simpleName], it]}.collect() : ( ch_references.bwamem2_index ?: Channel.empty() ) ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift).collect() : ( ch_references.bwamem2_index_mt_shift ?: Channel.empty() ) ch_chrom_sizes = ch_references.chrom_sizes - ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_genome_af_idx).map {meta, tab, idx -> [tab,idx]} - : Channel.empty() ch_genome_fai = params.fasta_fai ? Channel.fromPath(params.fasta_fai).collect() : ( ch_references.fasta_fai ?: Channel.empty() ) ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift).collect() : ( ch_references.fasta_fai_mt_shift ?: Channel.empty() ) ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx).collect() : ( ch_references.gnomad_af_idx ?: Channel.empty() ) + ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_gnomad_af_idx).map {meta, tab, idx -> [tab,idx]}.collect() + : Channel.empty() ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf : Channel.value([]) ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi).collect() From cb6ad660c1025312724d04033fd7a8f5d9760568 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 31 Oct 2022 13:58:35 +0100 Subject: [PATCH 0753/1169] recursion --- main.nf | 1 + modules/nf-core/svdb/query/main.nf | 47 ++++++++----------- nextflow_schema.json | 2 +- .../local/annotate_structural_variants.nf | 40 ++++++++++------ workflows/raredisease.nf | 2 +- 5 files changed, 47 insertions(+), 45 deletions(-) diff --git a/main.nf b/main.nf index c2b9c872..7335d481 100644 --- a/main.nf +++ b/main.nf @@ -11,6 +11,7 @@ */ nextflow.enable.dsl = 2 +nextflow.preview.recursion = true /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/modules/nf-core/svdb/query/main.nf b/modules/nf-core/svdb/query/main.nf index dbab5259..ac9eead3 100644 --- a/modules/nf-core/svdb/query/main.nf +++ b/modules/nf-core/svdb/query/main.nf @@ -9,39 +9,30 @@ process SVDB_QUERY { input: tuple val(meta), path(vcf) - val(in_occs) - val(in_frqs) - val(out_occs) - val(out_frqs) - path (vcf_dbs) + tuple val(in_occs), val(in_frqs), val(out_occs), val(out_frqs), path (vcf_dbs) + val(placeholder) output: - tuple val(meta), path("*_query.vcf"), emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*_query.vcf") , emit: vcf + tuple val(in_occs_rem), val(in_frqs_rem), val(out_occs_rem), val(out_frqs_rem), path (vcf_dbs_rem) , emit: vals + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def in_occ = "" - def in_frq = "" - def out_occ = "" - def out_frq = "" - if (in_occs) { - in_occ = "--in_occ ${in_occs.join(',')}" - } - if (in_frqs) { - in_frq = "--in_frq ${in_frqs.join(',')}" - } - if (out_occs) { - out_occ = "--out_occ ${out_occs.join(',')}" - } - if (out_frqs) { - out_frq = "--out_frq ${out_frqs.join(',')}" - } - + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def in_occ = "--in_occ " + in_occs.head() + in_occs_rem = in_occs.tail() + def in_frq = "--in_frq " + in_frqs.head() + in_frqs_rem = in_frqs.tail() + def out_occ = "--out_occ " + out_occs.head() + out_occs_rem = out_occs.tail() + def out_frq = "--out_frq " + out_frqs.head() + out_frqs_rem = out_frqs.tail() + def vcf_db = vcf_dbs.head() + vcf_dbs_rem = vcf_dbs.tail() """ svdb \\ --query \\ @@ -50,9 +41,9 @@ process SVDB_QUERY { $out_occ \\ $out_frq \\ $args \\ - --db ${vcf_dbs.join(',')} \\ + --db $vcf_db \\ --query_vcf $vcf \\ - --prefix ${prefix} + --prefix ${prefix}_${task.index} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/nextflow_schema.json b/nextflow_schema.json index db099e44..4253f52c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -466,7 +466,7 @@ "default": "104", "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", - "enum": ["104", "105"] + "enum": ["104", "105", "106"] } } }, diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 31e7f96e..2a37efdb 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -3,6 +3,7 @@ // include { SVDB_QUERY } from '../../modules/nf-core/svdb/query/main' +include { SVDB_MERGE } from '../../modules/nf-core/svdb/merge/main' include { PICARD_SORTVCF } from '../../modules/nf-core/picard/sortvcf/main' include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/tabix/tabix/main' @@ -33,27 +34,36 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { } .set { ch_svdb_dbs } - SVDB_QUERY(vcf, - ch_svdb_dbs.in_occs.toList(), - ch_svdb_dbs.in_frqs.toList(), - ch_svdb_dbs.out_occs.toList(), - ch_svdb_dbs.out_frqs.toList(), - ch_svdb_dbs.vcf_dbs.toList() - ) + ch_svdb_dbs.in_occs.toList() + .concat(ch_svdb_dbs.in_frqs.toList(), + ch_svdb_dbs.out_occs.toList(), + ch_svdb_dbs.out_frqs.toList(), + ch_svdb_dbs.vcf_dbs.toList()) + .toList() + .set { ch_dbs_in } + + vcf.collect().set {ch_vcf_in} + SVDB_QUERY + .recurse(ch_vcf_in, ch_dbs_in,[] ) + .until{ it -> it[1][1] == [] } + + SVDB_QUERY.out.vcf.groupTuple().set { ch_merge_in } + ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) + SVDB_MERGE(ch_merge_in, []) - PICARD_SORTVCF(SVDB_QUERY.out.vcf, - fasta, - seq_dict - ) + // PICARD_SORTVCF(SVDB_MERGE.out.vcf, + // fasta, + // seq_dict + // ) - PICARD_SORTVCF.out.vcf - .map { - meta, vcf -> + // PICARD_SORTVCF.out.vcf + SVDB_MERGE.out.vcf + .map { meta, vcf -> return [meta,vcf,[]] } .set { ch_sortvcf } - ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) + // ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) BCFTOOLS_VIEW(ch_sortvcf,[],[],[]) ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 42f8e980..c29cf610 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -311,7 +311,7 @@ workflow RAREDISEASE { params.genome, params.vep_cache_version, ch_vep_cache, - ch_genome_fasta_meta, + ch_genome_fasta_no_meta, ch_sequence_dictionary ).set {ch_sv_annotate} ch_versions = ch_versions.mix(ch_sv_annotate.versions) From b00736d12741aeb484eef381bc7b55ec23218c52 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 1 Nov 2022 02:23:51 +0100 Subject: [PATCH 0754/1169] add pli --- bin/add_most_severe_pli.py | 139 +++++++++++++++++++ modules/local/add_most_severe_consequence.nf | 15 +- 2 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 bin/add_most_severe_pli.py diff --git a/bin/add_most_severe_pli.py b/bin/add_most_severe_pli.py new file mode 100644 index 00000000..351b5041 --- /dev/null +++ b/bin/add_most_severe_pli.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python +import argparse +import sys +from pathlib import Path +from typing import TextIO + + +def parse_vep_transcripts(transcripts: list, symbol_ind: int) -> list: + """ + Parse each transcript and return a list of gene symbols. + + Args: + transcripts (list): A list of vep transcript annotation + symbol_ind (int) : Index of the "allele" in the vep annotation record + + Returns: + gene_ids (list): list of gene ids in the record + """ + + gene_ids = [] + for transcript in transcripts: + vep_fields = transcript.strip().split("|") + gene_id = vep_fields[symbol_ind] + gene_ids.append(gene_id) + return gene_ids + + +def construct_most_severe_pli_info(line: str, symbol_ind: int, pli_gene: dict) -> list: + """ + Parse gene symbols, find the highest pli value of all gene symbols, add most_severe_pli tag to the info + field and return a list of modified columns + + Args: + line (str) : Vcf record + symbol_ind (int) : Index of the "SYMBOL" in the vep annotation record + pli_gene (dict): A dict of pli values, where gene symbols are the keys + + Returns: + columns (list): A list of fields in the vcf record with most severe pli added + to the INFO column + """ + + columns = line.strip().split() + info_fields = columns[7].split(";") + for field in info_fields: + if field.startswith("CSQ="): + transcripts = field.split("CSQ=")[1].split(",") + gene_ids = parse_vep_transcripts(transcripts, symbol_ind) + unique_ids = list(set(gene_ids)) + pli_values = [] + for gene_id in unique_ids: + if gene_id != "" and pli_gene.get(gene_id) is not None: + pli_values.append(pli_gene.get(gene_id)) + if pli_values: + columns[7] += ";most_severe_pli={:.2f}".format(max(pli_values)) + return columns + + +def parse_vep_csq_schema(line: str) -> int: + """ + Get indices of gene symbol in the annotation + + Args: + line: INFO line in the vcf header with CSQ information + + Returns: + symbol_ind (int) : Index of the "SYMBOL" in the vep annotation record + """ + fields = line.strip().split("Format: ")[1].replace('">', "").split("|") + symbol_ind = fields.index("SYMBOL") + + return symbol_ind + + +def write_pli_annotated_vcf(file_in: TextIO, file_out: TextIO, var_csq: list): + """Add most severe pli field to record, and write the record to a vcf file""" + for line in file_in: + if line.startswith("#"): + file_out.write(line) + if line.startswith("##INFO=\n' + ) + else: + vcf_record = construct_most_severe_pli_info(line, symbol_ind, var_csq) + file_out.write("\t".join(vcf_record) + "\n") + + +def parse_args(argv=None): + """Define and immediately parse command line arguments.""" + parser = argparse.ArgumentParser( + description="Annotate vcf with the most severe pli field.", + epilog="Example: python vcfparser.py --file_in vep.vcf --file_out vep.most_severe_pli.vcf --pli pli_per_gene.txt", + ) + parser.add_argument( + "--file_in", + metavar="FILE_IN", + type=Path, + help="Vcf file annotated with vep.", + ) + parser.add_argument( + "--file_out", + metavar="FILE_OUT", + type=Path, + help="Vcf with most_severe_pli annotations added to it.", + ) + parser.add_argument( + "--pli", + metavar="PLI", + type=Path, + help="Pli", + ) + return parser.parse_args(argv) + + +def main(argv=None): + """Coordinate argument parsing and program execution.""" + args = parse_args(argv) + if not args.file_in.is_file(): + print(f"The given input file {args.file_in} was not found!") + sys.exit(2) + if not args.pli.is_file(): + print(f"The given variant consequence file {args.pli} was not found!") + sys.exit(2) + args.file_out.parent.mkdir(parents=True, exist_ok=True) + pli_gene = {} + with open(args.pli) as f: + for line in f: + cols = line.strip().split() + if cols[0] != "gene": + pli_gene[cols[0]] = float(cols[1]) + with open(args.file_out, "w") as out_vcf: + with open(args.file_in) as in_vcf: + write_pli_annotated_vcf(in_vcf, out_vcf, pli_gene) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/modules/local/add_most_severe_consequence.nf b/modules/local/add_most_severe_consequence.nf index c17dcc2f..4d1397fb 100644 --- a/modules/local/add_most_severe_consequence.nf +++ b/modules/local/add_most_severe_consequence.nf @@ -10,10 +10,12 @@ process ADD_MOST_SEVERE_CSQ { input: tuple val(meta), path(vcf) path (variant_consequences) + path (pli_gene) output: - tuple val(meta), path("*.vcfparser.vcf") , emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*.csq_pli.vcf") , emit: csq_pli_vcf + tuple val(meta), path("*.csq.vcf") , emit: csq_vcf + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -22,22 +24,23 @@ process ADD_MOST_SEVERE_CSQ { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - python3 add_most_severe_consequence.py ${vcf} ${prefix}.vcfparser.vcf ${variant_consequences} + python3 add_most_severe_consequence.py --file_in ${vcf} --file_out ${prefix}.csq.vcf --variant_csq ${variant_consequences} + python3 add_most_severe_pli.py --file_in ${prefix}.csq.vcf --file_out ${prefix}.csq_pli.vcf --pli ${pli} cat <<-END_VERSIONS > versions.yml "${task.process}": - add_most_severe_consequence: v1.0 + add_most_severe_consequence_pli: v1.0 END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.vcfparser.vcf + touch ${prefix}.csq_pli.vcf cat <<-END_VERSIONS > versions.yml "${task.process}": - add_most_severe_consequence: v1.0 + add_most_severe_consequence_pli: v1.0 END_VERSIONS """ } From edb96c472a00fff5b211690dcf4fd371645e058d Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 10:11:30 +0100 Subject: [PATCH 0755/1169] feat updated modules.config --- conf/modules.config | 62 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index bdf494ea..318668f0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -643,7 +643,6 @@ process { mode: params.publish_dir_mode, ] } - } // @@ -806,7 +805,7 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MUTECT2_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--mitochondria-mode TRUE' - } + } } // @@ -845,6 +844,65 @@ process { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--mitochondria-mode TRUE' } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_FILTERMUTECTCALLS_MT' { + ext.prefix = { "${meta.id}_filtered" } + } +} + +// +// ANALYSE_MT:MERGE_ANNOTATE_MT +// + +process { + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_MERGEVCFS_LIFT_UNLIFT_MT' { + ext.prefix = { "${meta.id}_merged" } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_VARIANTFILTRATION_MT' { + ext.prefix = { "${meta.id}_filt" } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:REMOVE_DUPLICATES_MT' { + ext.args = '--output-type z --rm-dup none' + ext.prefix = { "${meta.id}_split_rmdup" } + publishDir = [ + path: { "${params.outdir}/gatk4" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ENSEMBLVEP_MT' { + ext.args = [ + '--plugin LoFtool,cache/Plugins/LoFtool_scores.txt', + '--distance 0', + '--buffer_size 20000', + '--format vcf --max_sv_size 16600', + '--appris --biotype --cache --canonical --ccds --compress_output bgzip', + '--domains --exclude_predicted --force_overwrite', + '--hgvs --humdiv --no_progress --numbers', + '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl', + '--uniprot' + ].join(' ') + publishDir = [ + path: { "${params.outdir}/mt_annotation" }, + mode: params.publish_dir_mode, + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:SPLIT_MULTIALLELICS_MT' { + ext.args = '--output-type z --multiallelics -both' + ext.prefix = { "${meta.id}_split" } + publishDir = [ + enabled: false + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:CHANGE_NAME_VCF_MT' { + ext.file_type = 'vcf.gz' + } } process { From f2bb3495f68e48d0a53765189b3a638f60b414aa Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 10:21:51 +0100 Subject: [PATCH 0756/1169] feat installed and updated modules --- modules.json | 32 +++++++ modules/nf-core/bcftools/merge/main.nf | 46 ++++++++++ modules/nf-core/bcftools/merge/meta.yml | 72 ++++++++++++++++ .../nf-core/gatk4/filtermutectcalls/main.nf | 70 +++++++++++++++ .../nf-core/gatk4/filtermutectcalls/meta.yml | 85 +++++++++++++++++++ modules/nf-core/gatk4/mergevcfs/main.nf | 59 +++++++++++++ modules/nf-core/gatk4/mergevcfs/meta.yml | 48 +++++++++++ .../nf-core/gatk4/variantfiltration/main.nf | 47 ++++++++++ .../nf-core/gatk4/variantfiltration/meta.yml | 56 ++++++++++++ modules/nf-core/haplogrep2/classify/main.nf | 49 +++++++++++ modules/nf-core/haplogrep2/classify/meta.yml | 43 ++++++++++ modules/nf-core/hmtnote/main.nf | 45 ++++++++++ modules/nf-core/hmtnote/meta.yml | 39 +++++++++ modules/nf-core/picard/liftovervcf/main.nf | 6 +- .../nf-core/picard/renamesampleinvcf/main.nf | 56 ++++++++++++ .../nf-core/picard/renamesampleinvcf/meta.yml | 44 ++++++++++ 16 files changed, 794 insertions(+), 3 deletions(-) create mode 100644 modules/nf-core/bcftools/merge/main.nf create mode 100644 modules/nf-core/bcftools/merge/meta.yml create mode 100644 modules/nf-core/gatk4/filtermutectcalls/main.nf create mode 100644 modules/nf-core/gatk4/filtermutectcalls/meta.yml create mode 100644 modules/nf-core/gatk4/mergevcfs/main.nf create mode 100644 modules/nf-core/gatk4/mergevcfs/meta.yml create mode 100644 modules/nf-core/gatk4/variantfiltration/main.nf create mode 100644 modules/nf-core/gatk4/variantfiltration/meta.yml create mode 100644 modules/nf-core/haplogrep2/classify/main.nf create mode 100644 modules/nf-core/haplogrep2/classify/meta.yml create mode 100644 modules/nf-core/hmtnote/main.nf create mode 100644 modules/nf-core/hmtnote/meta.yml create mode 100644 modules/nf-core/picard/renamesampleinvcf/main.nf create mode 100644 modules/nf-core/picard/renamesampleinvcf/meta.yml diff --git a/modules.json b/modules.json index 281dd436..9c564d2a 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,10 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "bcftools/merge": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, "bcftools/norm": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" @@ -81,6 +85,10 @@ "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, + "gatk4/filtermutectcalls": { + "branch": "master", + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + }, "gatk4/intervallisttools": { "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" @@ -89,6 +97,10 @@ "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, + "gatk4/mergevcfs": { + "branch": "master", + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + }, "gatk4/mutect2": { "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" @@ -101,6 +113,10 @@ "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, + "gatk4/variantfiltration": { + "branch": "master", + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + }, "genmod/annotate": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" @@ -125,6 +141,14 @@ "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, + "haplogrep2/classify": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "hmtnote": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, "manta/germline": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" @@ -149,10 +173,18 @@ "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, + "picard/liftovervcf": { + "branch": "master", + "git_sha": "3d5d18db1b39e1133505ae2fa2a062b0073c8a6a" + }, "picard/markduplicates": { "branch": "master", "git_sha": "eca65aa4a5e2e192ac44d6962c8f9260f314ffb8" }, + "picard/renamesampleinvcf": { + "branch": "master", + "git_sha": "af53d9fcbc10982ff8fd1b87f9fec60b19eaba3d" + }, "picard/sortvcf": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" diff --git a/modules/nf-core/bcftools/merge/main.nf b/modules/nf-core/bcftools/merge/main.nf new file mode 100644 index 00000000..af586cd1 --- /dev/null +++ b/modules/nf-core/bcftools/merge/main.nf @@ -0,0 +1,46 @@ +process BCFTOOLS_MERGE { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': + 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" + + input: + tuple val(meta), path(vcfs), path(tbis) + path bed + path fasta + path fasta_fai + + output: + tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: merged_variants + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def regions = bed ? "--regions-file $bed" : "" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf.gz" + + """ + bcftools merge \\ + $regions \\ + --threads $task.cpus \\ + --output ${prefix}.${extension} \\ + $args \\ + *.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/merge/meta.yml b/modules/nf-core/bcftools/merge/meta.yml new file mode 100644 index 00000000..53dc23eb --- /dev/null +++ b/modules/nf-core/bcftools/merge/meta.yml @@ -0,0 +1,72 @@ +name: bcftools_merge +description: Merge VCF files +keywords: + - variant calling + - merge + - VCF +tools: + - merge: + description: | + Merge VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcfs: + type: files + description: | + List containing 2 or more vcf files + e.g. [ 'file1.vcf', 'file2.vcf' ] + - tbis: + type: files + description: | + List containing the tbi index files corresponding to the vcfs input files + e.g. [ 'file1.vcf.tbi', 'file2.vcf.tbi' ] + - bed: + type: file + description: "(Optional) The bed regions to merge on" + pattern: "*.bed" + - fasta: + type: file + description: "(Optional) The fasta reference file (only necessary for the `--gvcf FILE` parameter)" + pattern: "*.{fasta,fa}" + - fasta: + type: file + description: "(Optional) The fasta reference file index (only necessary for the `--gvcf FILE` parameter)" + pattern: "*.fai" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf_gz: + type: file + description: VCF merged output file (bgzipped) => when `--output-type z` is used + pattern: "*.vcf.gz" + - vcf: + type: file + description: VCF merged output file => when `--output-type v` is used + pattern: "*.vcf" + - bcf_gz: + type: file + description: BCF merged output file (bgzipped) => when `--output-type b` is used + pattern: "*.bcf.gz" + - bcf: + type: file + description: BCF merged output file => when `--output-type u` is used + pattern: "*.bcf" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" + - "@nvnieuwk" diff --git a/modules/nf-core/gatk4/filtermutectcalls/main.nf b/modules/nf-core/gatk4/filtermutectcalls/main.nf new file mode 100644 index 00000000..130c83b6 --- /dev/null +++ b/modules/nf-core/gatk4/filtermutectcalls/main.nf @@ -0,0 +1,70 @@ +process GATK4_FILTERMUTECTCALLS { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(vcf), path(vcf_tbi), path(stats), path(orientationbias), path(segmentation), path(table), val(estimate) + path fasta + path fai + path dict + + output: + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi + tuple val(meta), path("*.filteringStats.tsv"), emit: stats + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def orientationbias_command = orientationbias ? orientationbias.collect{"--orientation-bias-artifact-priors $it"}.join(' ') : '' + def segmentation_command = segmentation ? segmentation.collect{"--tumor-segmentation $it"}.join(' ') : '' + def estimate_command = estimate ? " --contamination-estimate ${estimate} " : '' + def table_command = table ? " --contamination-table ${table} " : '' + + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK FilterMutectCalls] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" FilterMutectCalls \\ + --variant $vcf \\ + --output ${prefix}.vcf.gz \\ + --reference $fasta \\ + $orientationbias_command \\ + $segmentation_command \\ + $estimate_command \\ + $table_command \\ + --tmp-dir . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + touch ${prefix}.vcf.gz.filteringStats.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/gatk4/filtermutectcalls/meta.yml b/modules/nf-core/gatk4/filtermutectcalls/meta.yml new file mode 100644 index 00000000..d1972d70 --- /dev/null +++ b/modules/nf-core/gatk4/filtermutectcalls/meta.yml @@ -0,0 +1,85 @@ +name: gatk4_filtermutectcalls +description: | + Filters the raw output of mutect2, can optionally use outputs of calculatecontamination and learnreadorientationmodel to improve filtering. +keywords: + - filtermutectcalls + - mutect2 + - gatk4 + - filtervcf +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - vcf: + type: file + description: compressed vcf file of mutect2calls + pattern: "*.vcf.gz" + - vcf_tbi: + type: file + description: Tabix index of vcf file + pattern: "*vcf.gz.tbi" + - stats: + type: file + description: Stats file that pairs with output vcf file + pattern: "*vcf.gz.stats" + - orientationbias: + type: list + description: files containing artifact priors for input vcf. Optional input. + pattern: "*.artifact-prior.tar.gz" + - segmentation: + type: list + description: tables containing segmentation information for input vcf. Optional input. + pattern: "*.segmentation.table" + - table: + type: list + description: table(s) containing contamination data for input vcf. Optional input, takes priority over estimate. + pattern: "*.contamination.table" + - estimate: + type: val + description: estimation of contamination value as a double. Optional input, will only be used if table is not specified. + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fasta.fai" + - dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" + +output: + - vcf: + type: file + description: file containing filtered mutect2 calls. + pattern: "*.vcf.gz" + - tbi: + type: file + description: tbi file that pairs with vcf. + pattern: "*.vcf.gz.tbi" + - stats: + type: file + description: file containing statistics of the filtermutectcalls run. + pattern: "*.filteringStats.tsv" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@GCJMackenzie" + - "@maxulysse" diff --git a/modules/nf-core/gatk4/mergevcfs/main.nf b/modules/nf-core/gatk4/mergevcfs/main.nf new file mode 100644 index 00000000..0b065b5b --- /dev/null +++ b/modules/nf-core/gatk4/mergevcfs/main.nf @@ -0,0 +1,59 @@ +process GATK4_MERGEVCFS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(vcf) + path dict + + output: + tuple val(meta), path('*.vcf.gz'), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def input_list = vcf.collect{ "--INPUT $it"}.join(' ') + def reference_command = dict ? "--SEQUENCE_DICTIONARY $dict" : "" + + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK MergeVcfs] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" MergeVcfs \\ + $input_list \\ + --OUTPUT ${prefix}.vcf.gz \\ + $reference_command \\ + --TMP_DIR . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/gatk4/mergevcfs/meta.yml b/modules/nf-core/gatk4/mergevcfs/meta.yml new file mode 100644 index 00000000..3ebce0b9 --- /dev/null +++ b/modules/nf-core/gatk4/mergevcfs/meta.yml @@ -0,0 +1,48 @@ +name: gatk4_mergevcfs +description: Merges several vcf files +keywords: + - vcf + - merge +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - vcf: + type: list + description: Two or more VCF files + pattern: "*.{vcf,vcf.gz}" + - ref_dict: + type: file + description: Optional Sequence Dictionary as input + pattern: "*.dict" + - use_ref_dict: + type: boolean + description: Specify whether or not to use a given reference dictionary +output: + - vcf: + type: file + description: merged vcf file + pattern: "*.vcf.gz" + - tbi: + type: file + description: index files for the merged vcf files + pattern: "*.tbi" + + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@kevinmenden" diff --git a/modules/nf-core/gatk4/variantfiltration/main.nf b/modules/nf-core/gatk4/variantfiltration/main.nf new file mode 100644 index 00000000..ad269b15 --- /dev/null +++ b/modules/nf-core/gatk4/variantfiltration/main.nf @@ -0,0 +1,47 @@ +process GATK4_VARIANTFILTRATION { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(vcf), path(tbi) + path fasta + path fai + path dict + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK VariantFiltration] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.toGiga() + } + """ + gatk --java-options "-Xmx${avail_mem}G" VariantFiltration \\ + --variant $vcf \\ + --output ${prefix}.vcf.gz \\ + --reference $fasta \\ + --tmp-dir . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/gatk4/variantfiltration/meta.yml b/modules/nf-core/gatk4/variantfiltration/meta.yml new file mode 100644 index 00000000..04b1c086 --- /dev/null +++ b/modules/nf-core/gatk4/variantfiltration/meta.yml @@ -0,0 +1,56 @@ +name: gatk4_variantfiltration +description: Filter variants +keywords: + - vcf + - filter +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - vcf: + type: list + description: List of VCF(.gz) files + pattern: "*.{vcf,vcf.gz}" + - vcf_tbi: + type: list + description: List of VCF file indexes + pattern: "*.{idx,tbi}" + - fasta: + type: file + description: Fasta file of reference genome + pattern: "*.fasta" + - fai: + type: file + description: Index of fasta file + pattern: "*.fasta.fai" + - dict: + type: file + description: Sequence dictionary of fastea file + pattern: "*.dict" +output: + - vcf: + type: file + description: Compressed VCF file + pattern: "*.vcf.gz" + - tbi: + type: file + description: Index of VCF file + pattern: "*.vcf.gz.tbi" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@kevinmenden" diff --git a/modules/nf-core/haplogrep2/classify/main.nf b/modules/nf-core/haplogrep2/classify/main.nf new file mode 100644 index 00000000..c49cb957 --- /dev/null +++ b/modules/nf-core/haplogrep2/classify/main.nf @@ -0,0 +1,49 @@ +process HAPLOGREP2_CLASSIFY { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::haplogrep=2.4.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/haplogrep:2.4.0--hdfd78af_0': + 'quay.io/biocontainers/haplogrep:2.4.0--hdfd78af_0' }" + + input: + tuple val(meta), path(inputfile) + val(format) + + output: + tuple val(meta), path("*.txt"), emit: txt + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + haplogrep \\ + classify \\ + $args \\ + --in $inputfile \\ + --out ${prefix}.txt \\ + --format $format + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + haplogrep2: \$(echo \$(haplogrep --version 2>&1) | (sed 's/htt.*//') | (sed 's/.*v//')) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + haplogrep2: \$(echo \$(haplogrep --version 2>&1) | (sed 's/htt.*//') | (sed 's/.*v//')) + END_VERSIONS + """ + +} diff --git a/modules/nf-core/haplogrep2/classify/meta.yml b/modules/nf-core/haplogrep2/classify/meta.yml new file mode 100644 index 00000000..b4c2ec66 --- /dev/null +++ b/modules/nf-core/haplogrep2/classify/meta.yml @@ -0,0 +1,43 @@ +name: "haplogrep2_classify" +description: classification into haplogroups +keywords: + - haplogroups. +tools: + - "haplogrep2": + description: "A tool for mtDNA haplogroup classification." + homepage: "https://github.com/seppinho/haplogrep-cmd" + documentation: "https://github.com/seppinho/haplogrep-cmd" + tool_dev_url: "https://github.com/seppinho/haplogrep-cmd" + doi: "" + licence: "['MIT']" + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - inputfile: + type: file + description: valid options are hsd, vcf, or fasta files + pattern: "*.{vcf,vcf.gz,fasta,hsd}" + - format: + type: stringformat of file either vcf fasta or hsd + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - txt: + type: file + description: text file with classification information + pattern: "*.{txt}" + +authors: + - "@lucpen" diff --git a/modules/nf-core/hmtnote/main.nf b/modules/nf-core/hmtnote/main.nf new file mode 100644 index 00000000..a1796924 --- /dev/null +++ b/modules/nf-core/hmtnote/main.nf @@ -0,0 +1,45 @@ +process HMTNOTE { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::hmtnote=0.7.2" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/hmtnote:0.7.2--pyhdfd78af_0': + 'quay.io/biocontainers/hmtnote:0.7.2--pyhdfd78af_0' }" + + input: + tuple val(meta), path(vcf) + + output: + tuple val(meta), path("*_annotated.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + hmtnote \\ + annotate \\ + $vcf \\ + ${prefix}_annotated.vcf \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + hmtnote: \$(echo \$(hmtnote --version 2>&1) | sed 's/^.*hmtnote, version //; s/Using.*\$//' )) + END_VERSIONS + """ + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_annotated.vcf + cat <<-END_VERSIONS > versions.yml + "${task.process}": + hmtnote: \$(echo \$(hmtnote --version 2>&1) | sed 's/^.*hmtnote, version //; s/Using.*\$//' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/hmtnote/meta.yml b/modules/nf-core/hmtnote/meta.yml new file mode 100644 index 00000000..92b4be1b --- /dev/null +++ b/modules/nf-core/hmtnote/meta.yml @@ -0,0 +1,39 @@ +name: hmtnote +description: Human mitochondrial variants annotation using HmtVar. +keywords: + - hmtnote mitochondria annotation +tools: + - hmtnote: + description: Human mitochondrial variants annotation using HmtVar. + homepage: https://github.com/robertopreste/HmtNote + documentation: https://hmtnote.readthedocs.io/en/latest/usage.html + tool_dev_url: None + doi: "https://doi.org/10.1101/600619" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + - vcf: + type: file + description: vcf file + pattern: "*.vcf" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: annotated vcf + pattern: "*_annotated.vcf" + +authors: + - "@sysbiocoder" diff --git a/modules/nf-core/picard/liftovervcf/main.nf b/modules/nf-core/picard/liftovervcf/main.nf index 334f68b0..d4f6be95 100644 --- a/modules/nf-core/picard/liftovervcf/main.nf +++ b/modules/nf-core/picard/liftovervcf/main.nf @@ -14,9 +14,9 @@ process PICARD_LIFTOVERVCF { path fasta output: - tuple val(meta), path("*lifted.vcf.gz") , emit: vcf_lifted - tuple val(meta), path("*unlifted.vcf.gz"), emit: vcf_unlifted - path "versions.yml" , emit: versions + tuple val(meta), path("*.lifted.vcf.gz") , emit: vcf_lifted + tuple val(meta), path("*.unlifted.vcf.gz"), emit: vcf_unlifted + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/picard/renamesampleinvcf/main.nf b/modules/nf-core/picard/renamesampleinvcf/main.nf new file mode 100644 index 00000000..da492b0d --- /dev/null +++ b/modules/nf-core/picard/renamesampleinvcf/main.nf @@ -0,0 +1,56 @@ + +process PICARD_RENAMESAMPLEINVCF { + tag "$meta.id" + label 'process_single' + + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + + input: + tuple val(meta), path(vcf) + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def extended_args = args.contains("--NEW_SAMPLE_NAME") ? $args : "${args} --NEW_SAMPLE_NAME ${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard RenameSampleInVcf] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + + """ + picard \\ + RenameSampleInVcf \\ + -Xmx${avail_mem}g \\ + --INPUT $vcf \\ + --OUTPUT ${prefix}_renam.vcf.gz \\ + $extended_args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard RenameSampleInVcf --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_renam.vcf.gz + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard RenameSampleInVcf --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/picard/renamesampleinvcf/meta.yml b/modules/nf-core/picard/renamesampleinvcf/meta.yml new file mode 100644 index 00000000..8f3ed6b4 --- /dev/null +++ b/modules/nf-core/picard/renamesampleinvcf/meta.yml @@ -0,0 +1,44 @@ +name: "picard_renamesampleinvcf" +description: changes name of sample in the vcf file +keywords: + - picard + - picard/renamesampleinvcf +tools: + - "picard": + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ + tool_dev_url: "https://github.com/broadinstitute/picard" + doi: "" + licence: "['MIT']" + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF file + pattern: "*.{vcf,vcf.gz}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: VCF file + pattern: "*.{vcf,vcf.gz}" + +authors: + - "@Lucpen" From 1133d903cb022b96a166acd21b13460223ccdf91 Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 10:23:26 +0100 Subject: [PATCH 0757/1169] feat added local module to change file name --- modules/local/change_name.nf | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 modules/local/change_name.nf diff --git a/modules/local/change_name.nf b/modules/local/change_name.nf new file mode 100644 index 00000000..ea8b8869 --- /dev/null +++ b/modules/local/change_name.nf @@ -0,0 +1,36 @@ +process CHANGE_NAME { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'quay.io/biocontainers/python:3.9--1' }" + + input: + tuple val(meta), path(input_file) + + output: + tuple val(meta), path( "*.${file_type}"), emit: file + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + file_type = task.ext.file_type ?: input_file.getExtension() + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + mv \\ + $input_file \\ + ${meta.id}.${file_type} + """ + + stub: + def args = task.ext.args ?: '' + file_type = task.ext.file_type ?: input_file.getExtension() + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.${file_type} + """ +} \ No newline at end of file From 5b8b63ca8ac68007749b727b88294cc22bb8e8b9 Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 12:29:19 +0100 Subject: [PATCH 0758/1169] feat updated align_and_call_MT --- subworkflows/local/align_and_call_MT.nf | 34 +++++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index bf0339f2..c2c1b39a 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -10,6 +10,9 @@ include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } fr include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/samtools/sort/main' include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/haplocheck/main' include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/gatk4/mutect2/main' +include { GATK4_FILTERMUTECTCALLS as GATK4_FILTERMUTECTCALLS_MT } from '../../modules/nf-core/gatk4/filtermutectcalls/main' +include { PICARD_RENAMESAMPLEINVCF as PICARD_RENAMESAMPLEINVCF_MT } from '../../modules/nf-core/picard/renamesampleinvcf/main' +include { TABIX_TABIX as TABIX_TABIX_MT } from '../../modules/nf-core/tabix/tabix/main' workflow ALIGN_AND_CALL_MT { take: @@ -62,11 +65,32 @@ workflow ALIGN_AND_CALL_MT { HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) + // Filter Mutect2 calls + ch_mutect_tbi = GATK4_MUTECT2_MT.out.vcf.join(GATK4_MUTECT2_MT.out.tbi, by: [0]) + ch_mutect_out = ch_mutect_tbi.join(GATK4_MUTECT2_MT.out.stats, by: [0]) + ch_to_filt = ch_mutect_out.map { + meta, vcf, tbi, stats -> + return [meta, vcf, tbi, stats, [], [], [], []]} + GATK4_FILTERMUTECTCALLS_MT( ch_to_filt, + fasta, + fai, + dict ) + ch_versions = ch_versions.mix(GATK4_FILTERMUTECTCALLS_MT.out.versions.first()) + + // Replace within the vcf sample as a sample name with meta.id + PICARD_RENAMESAMPLEINVCF_MT(GATK4_FILTERMUTECTCALLS_MT.out.vcf) + ch_versions = ch_versions.mix(PICARD_RENAMESAMPLEINVCF_MT.out.versions.first()) + + TABIX_TABIX_MT(PICARD_RENAMESAMPLEINVCF_MT.out.vcf) + ch_versions = ch_versions.mix(TABIX_TABIX_MT.out.versions.first()) + emit: - vcf = GATK4_MUTECT2_MT.out.vcf - tbi = GATK4_MUTECT2_MT.out.tbi - txt = HAPLOCHECK_MT.out.txt - html = HAPLOCHECK_MT.out.html - versions = ch_versions // channel: [ versions.yml ] + vcf = PICARD_RENAMESAMPLEINVCF_MT.out.vcf + tbi = TABIX_TABIX_MT.out.tbi + stats = GATK4_MUTECT2_MT.out.stats + filt_sats = GATK4_FILTERMUTECTCALLS_MT.out.stats + txt = HAPLOCHECK_MT.out.txt + html = HAPLOCHECK_MT.out.html + versions = ch_versions } From 9a7241c97e95bbe7f73c3f7c70948a86d1b018ab Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 12:31:55 +0100 Subject: [PATCH 0759/1169] feat updated reference names --- subworkflows/local/align_and_call_MT.nf | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index c2c1b39a..db045dc9 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -18,23 +18,23 @@ workflow ALIGN_AND_CALL_MT { take: fastq // channel: [ val(meta), path('*.fastq.gz') ] ubam // channel: [ val(meta), path('*.bam') ] - index // channel: [ /path/to/bwamem2/index/ ] - fasta // channel: [ genome.fasta ] - dict // channel: [ genome.dict ] - fai // channel: [ genome.fai ] + genome_index // channel: [ /path/to/bwamem2/index/ ] + genome_fasta // channel: [ genome.fasta ] + genome_dict // channel: [ genome.dict ] + genome_fai // channel: [ genome.fai ] intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] main: ch_versions = Channel.empty() // Outputs bam files - BWAMEM2_MEM_MT ( fastq , index, true) + BWAMEM2_MEM_MT ( fastq , genome_index, true) ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) ch_mt_bam = BWAMEM2_MEM_MT.out.bam ch_fastq_ubam = ch_mt_bam.join(ubam, by: [0]) // Merges bam files - GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, fasta, dict ) + GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, genome_fasta, genome_dict ) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) // Add read group to merged bam file @@ -42,7 +42,7 @@ workflow ALIGN_AND_CALL_MT { ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) // Marks duplicates - PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam, fasta, fai ) + PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam, genome_fasta, genome_fai ) ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) // Sort bam file @@ -56,7 +56,7 @@ workflow ALIGN_AND_CALL_MT { ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MT.out.versions.first()) // Calls variants with Mutect2 - GATK4_MUTECT2_MT (ch_sort_index_bam_intervals_mt, fasta, fai, dict, [], [], [],[]) + GATK4_MUTECT2_MT (ch_sort_index_bam_intervals_mt, genome_fasta, genome_fai, genome_dict, [], [], [],[]) ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) // Haplocheck @@ -72,9 +72,9 @@ workflow ALIGN_AND_CALL_MT { meta, vcf, tbi, stats -> return [meta, vcf, tbi, stats, [], [], [], []]} GATK4_FILTERMUTECTCALLS_MT( ch_to_filt, - fasta, - fai, - dict ) + genome_fasta, + genome_fai, + genome_dict ) ch_versions = ch_versions.mix(GATK4_FILTERMUTECTCALLS_MT.out.versions.first()) // Replace within the vcf sample as a sample name with meta.id From 9146c7f4fe8412280cf5543c69563c283e75b6c6 Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 12:39:28 +0100 Subject: [PATCH 0760/1169] feat added merge_annotate_MT sw --- subworkflows/local/merge_annotate_MT.nf | 124 ++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 subworkflows/local/merge_annotate_MT.nf diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/merge_annotate_MT.nf new file mode 100644 index 00000000..3851ea4f --- /dev/null +++ b/subworkflows/local/merge_annotate_MT.nf @@ -0,0 +1,124 @@ +// +// Merge and annotate MT +// + +include { GATK4_MERGEVCFS as GATK4_MERGEVCFS_LIFT_UNLIFT_MT } from '../../modules/nf-core/gatk4/mergevcfs/main' +include { GATK4_VARIANTFILTRATION as GATK4_VARIANTFILTRATION_MT } from '../../modules/nf-core/gatk4/variantfiltration/main' +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_MT } from '../../modules/nf-core/bcftools/norm/main' +include { TABIX_TABIX as TABIX_TABIX_MT } from '../../modules/nf-core/tabix/tabix/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_MT } from '../../modules/nf-core/bcftools/norm/main' +include { TABIX_TABIX as TABIX_TABIX_MT2 } from '../../modules/nf-core/tabix/tabix/main' +include { CHANGE_NAME as CHANGE_NAME_VCF_MT } from '../../modules/local/change_name_vcf' +include { BCFTOOLS_MERGE as BCFTOOLS_MERGE_MT } from '../../modules/nf-core/bcftools/merge/main' +include { HMTNOTE as HMTNOTE_MT } from '../../modules/nf-core/hmtnote/main' +include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../modules/nf-core/tabix/tabix/main' +include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../modules/nf-core/ensemblvep/main' +include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../modules/nf-core/haplogrep2/classify/main' + +workflow MERGE_ANNOTATE_MT { + take: + vcf1 // channel: [ val(meta), path('*.vcf.gz') ] + vcf2 // channel: [ val(meta), path('*.vcf.gz') ] + genome_fasta // channel: [ genome.fasta ] + genome_dict // channel: [ genome.dict ] + genome_fai // channel: [ genome.fai ] + vep_genome + vep_cache_version + vep_cache + case_info // channel: [ val(case_info) ] + vep_genome + vep_cache_version + vep_cache + + main: + ch_versions = Channel.empty() + + ch_vcfs = vcf1 + .join(vcf2, remainder: true) + .map{ meta, vcf1, vcf2 -> + [meta, [vcf1, vcf2]] + } + + GATK4_MERGEVCFS_LIFT_UNLIFT_MT( ch_vcfs, genome_dict) + ch_versions = ch_versions.mix(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.versions.first()) + + // Filtering Variants + ch_filt_vcf = GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.vcf.join(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.tbi, by:[0]) + GATK4_VARIANTFILTRATION_MT(ch_filt_vcf, + genome_fasta, + genome_fai, + genome_dict) + ch_versions = ch_versions.mix(GATK4_VARIANTFILTRATION_MT.out.versions.first()) + + // Spliting multiallelic calls + ch_in_split=GATK4_VARIANTFILTRATION_MT.out.vcf.join( GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]) + SPLIT_MULTIALLELICS_MT (ch_in_split, genome_fasta) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_MT.out.versions) + + TABIX_TABIX_MT(SPLIT_MULTIALLELICS_MT.out.vcf) + ch_in_remdup = SPLIT_MULTIALLELICS_MT.out.vcf.join(TABIX_TABIX_MT.out.tbi) + + // Removing duplicates and merging if there is more than one sample + REMOVE_DUPLICATES_MT(ch_in_remdup, genome_fasta) + TABIX_TABIX_MT2(REMOVE_DUPLICATES_MT.out.vcf) + ch_versions = ch_versions.mix(REMOVE_DUPLICATES_MT.out.versions) + + REMOVE_DUPLICATES_MT.out.vcf + .collect{it[1]} + .toList() + .set { file_list } + + TABIX_TABIX_MT2.out.tbi + .collect{it[1]} + .toList() + .set { file_list2 } + + case_info + .combine(file_list) + .combine(file_list2) + .set { ch_br } + + ch_br.branch { + meta, vcf, tbi -> + single: vcf.size() == 1 + return [meta, vcf] + multiple: vcf.size() > 1 + return [meta, vcf, tbi] + }.set { ch_dedup_vcf } + + BCFTOOLS_MERGE_MT( ch_dedup_vcf.multiple, + [], + genome_fasta, + genome_fai) + ch_mer_vcf=BCFTOOLS_MERGE_MT.out.merged_variants + ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) + + ch_ch_n=CHANGE_NAME_VCF_MT(ch_dedup_vcf.single) + ch_in_vep=ch_mer_vcf.mix(ch_dedup_vcf.single) + + // Annotating with Hmtnote + //HMTNOTE_MT(ch_in_vep) + //ch_versions = ch_versions.mix(HMTNOTE_MT.out.versions.first()) + + // Annotating with ensembl Vep + ENSEMBLVEP_MT( ch_in_vep, + vep_genome, + "homo_sapiens", + vep_cache_version, + vep_cache, + genome_fasta, + []) + ch_versions = ch_versions.mix(ENSEMBLVEP_MT.out.versions) + + // Running haplogrep2 + TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf) + HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") + ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) + + emit: + haplog = HAPLOGREP2_CLASSIFY_MT.out.txt + vcf = ENSEMBLVEP_MT.out.vcf_gz + tbi = TABIX_TABIX_MT3.out.tbi + report = ENSEMBLVEP_MT.out.report + versions = ch_versions // channel: [ versions.yml ] +} \ No newline at end of file From 8f66099d3ba3e8674e5adea3c56173e21cd4d550 Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 12:40:19 +0100 Subject: [PATCH 0761/1169] feat updated analyse_MT --- subworkflows/local/analyse_MT.nf | 45 ++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index bece2ea4..2cf672e5 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -5,6 +5,7 @@ include { CONVERT_MT_BAM_TO_FASTQ } from './convert_mt_ba include { ALIGN_AND_CALL_MT } from './align_and_call_MT' include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './align_and_call_MT' include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/picard/liftovervcf/main' +include { MERGE_ANNOTATE_MT } from './merge_annotate_MT' workflow ANALYSE_MT { take: @@ -20,6 +21,10 @@ workflow ANALYSE_MT { shift_mt_fai // channel: [ genome.fai ] shift_mt_intervals // channel: [ file(control_region_shifted.chrM.interval_list) ] shift_mt_backchain // channel: [ file(shift.back_chain) ] + vep_genome + vep_cache_version + vep_cache + case_info // channel: [ val(case_info) ] main: ch_versions = Channel.empty() @@ -59,18 +64,36 @@ workflow ANALYSE_MT { genome_fasta) ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions) + // STEP 3: MT MERGE AND ANNOTATE VARIANTS + MERGE_ANNOTATE_MT( + ALIGN_AND_CALL_MT.out.vcf, + PICARD_LIFTOVERVCF.out.vcf_lifted, + genome_fasta, + genome_dict, + genome_fai, + vep_genome, + vep_cache_version, + vep_cache, + case_info + ) + ch_versions = ch_versions.mix(MERGE_ANNOTATE_MT.out.versions) emit: - vcf = ALIGN_AND_CALL_MT.out.vcf - tbi = ALIGN_AND_CALL_MT.out.tbi - txt = ALIGN_AND_CALL_MT.out.txt - html = ALIGN_AND_CALL_MT.out.html - vcf_shift = ALIGN_AND_CALL_MT_SHIFT.out.vcf - tbi_shift = ALIGN_AND_CALL_MT_SHIFT.out.tbi - txt_shift = ALIGN_AND_CALL_MT_SHIFT.out.txt - html_shift = ALIGN_AND_CALL_MT_SHIFT.out.html - vcf_lift = PICARD_LIFTOVERVCF.out.vcf_lifted - vcf_unlift = PICARD_LIFTOVERVCF.out.vcf_unlifted + vcf = MERGE_ANNOTATE_MT.out.vcf + tbi = MERGE_ANNOTATE_MT.out.tbi + stats = ALIGN_AND_CALL_MT.out.stats + filt_sats = ALIGN_AND_CALL_MT.out.filt_sats + stats_sh = ALIGN_AND_CALL_MT_SHIFT.out.stats + filt_sats_sh = ALIGN_AND_CALL_MT_SHIFT.out.filt_sats + haplog = MERGE_ANNOTATE_MT.out.haplog + report = MERGE_ANNOTATE_MT.out.report + txt = ALIGN_AND_CALL_MT.out.txt + html = ALIGN_AND_CALL_MT.out.html +// vcf_shift = ALIGN_AND_CALL_MT_SHIFT.out.vcf +// tbi_shift = ALIGN_AND_CALL_MT_SHIFT.out.tbi + txt_sh = ALIGN_AND_CALL_MT_SHIFT.out.txt + html_sh = ALIGN_AND_CALL_MT_SHIFT.out.html +// vcf_lift = PICARD_LIFTOVERVCF.out.vcf_lifted +// vcf_unlift = PICARD_LIFTOVERVCF.out.vcf_unlifted versions = ch_versions // channel: [ versions.yml ] - } From af99b0007992b3e8c3040d2276c5171e0b0963a1 Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 13:02:53 +0100 Subject: [PATCH 0762/1169] feat adding parameters to analyse_MT --- workflows/raredisease.nf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 43c983b5..5077e361 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -348,7 +348,11 @@ workflow RAREDISEASE { ch_sequence_dictionary_mt_shift, ch_mt_shift_fai, ch_mt_intervals_shift, - ch_mt_backchain_shift + ch_mt_backchain_shift, + params.genome, + params.vep_cache_version, + ch_vep_cache, + CHECK_INPUT.out.case_info ) ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) From 2878d43cfe40c7a07364440ed13a564aafae0fad Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 13:03:37 +0100 Subject: [PATCH 0763/1169] fix removed extra space --- subworkflows/local/call_snv.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index 8af1eb4d..82a0c216 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -13,7 +13,7 @@ workflow CALL_SNV { fai // channel: [genome.fai] known_dbsnp // channel: [ /path/to/known_dbsnp ] known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] - call_interval // channel: [ /path/to/call_intervals ] + call_interval // channel: [ /path/to/call_intervals ] ml_model // channel: [ /path/to/ml_model ] case_info // channel: [ case_id ] From d6bfaeed99bdd2dc95ceebefcc9188b601bf1c6d Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 13:14:02 +0100 Subject: [PATCH 0764/1169] fix changed name of module and added configs for filtermutect --- conf/modules.config | 6 +++++- subworkflows/local/merge_annotate_MT.nf | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 318668f0..9c9fbc6e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -806,6 +806,10 @@ process { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--mitochondria-mode TRUE' } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_FILTERMUTECTCALLS_MT' { + ext.prefix = { "${meta.id}_filtered" } + } } // @@ -845,7 +849,7 @@ process { ext.args = '--mitochondria-mode TRUE' } - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_FILTERMUTECTCALLS_MT' { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_FILTERMUTECTCALLS_MT' { ext.prefix = { "${meta.id}_filtered" } } } diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/merge_annotate_MT.nf index 3851ea4f..7186db6e 100644 --- a/subworkflows/local/merge_annotate_MT.nf +++ b/subworkflows/local/merge_annotate_MT.nf @@ -8,7 +8,7 @@ include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_MT } from '../../m include { TABIX_TABIX as TABIX_TABIX_MT } from '../../modules/nf-core/tabix/tabix/main' include { BCFTOOLS_NORM as REMOVE_DUPLICATES_MT } from '../../modules/nf-core/bcftools/norm/main' include { TABIX_TABIX as TABIX_TABIX_MT2 } from '../../modules/nf-core/tabix/tabix/main' -include { CHANGE_NAME as CHANGE_NAME_VCF_MT } from '../../modules/local/change_name_vcf' +include { CHANGE_NAME as CHANGE_NAME_VCF_MT } from '../../modules/local/change_name' include { BCFTOOLS_MERGE as BCFTOOLS_MERGE_MT } from '../../modules/nf-core/bcftools/merge/main' include { HMTNOTE as HMTNOTE_MT } from '../../modules/nf-core/hmtnote/main' include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../modules/nf-core/tabix/tabix/main' From 14bd5dcc8322416416ebf00103cd821570355616 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 1 Nov 2022 13:26:27 +0100 Subject: [PATCH 0765/1169] update tiddit --- modules/nf-core/tiddit/cov/main.nf | 6 +++--- modules/nf-core/tiddit/sv/main.nf | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/nf-core/tiddit/cov/main.nf b/modules/nf-core/tiddit/cov/main.nf index 4d7e2827..a0a79523 100644 --- a/modules/nf-core/tiddit/cov/main.nf +++ b/modules/nf-core/tiddit/cov/main.nf @@ -2,10 +2,10 @@ process TIDDIT_COV { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::tiddit=3.0.0" : null) + conda (params.enable_conda ? "bioconda::tiddit=3.3.2" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tiddit:3.0.0--py39h59fae87_1' : - 'quay.io/biocontainers/tiddit:3.0.0--py39h59fae87_1' }" + 'https://depot.galaxyproject.org/singularity/tiddit:3.3.2--py310hc2b7f4b_0' : + 'quay.io/biocontainers/tiddit:3.3.2--py310hc2b7f4b_0' }" input: tuple val(meta), path(input) diff --git a/modules/nf-core/tiddit/sv/main.nf b/modules/nf-core/tiddit/sv/main.nf index 2e876ef1..7faefa99 100644 --- a/modules/nf-core/tiddit/sv/main.nf +++ b/modules/nf-core/tiddit/sv/main.nf @@ -2,15 +2,15 @@ process TIDDIT_SV { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::tiddit=3.1.0" : null) + conda (params.enable_conda ? "bioconda::tiddit=3.3.2" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tiddit:3.1.0--py39h59fae87_1' : - 'quay.io/biocontainers/tiddit:3.1.0--py39h59fae87_1' }" + 'https://depot.galaxyproject.org/singularity/tiddit:3.3.2--py310hc2b7f4b_0' : + 'quay.io/biocontainers/tiddit:3.3.2--py310hc2b7f4b_0' }" input: tuple val(meta), path(input), path(input_index) - path fasta - path bwa_index + tuple val(meta2), path(fasta) + tuple val(meta3), path(bwa_index) output: tuple val(meta), path("*.vcf") , emit: vcf From b9ba65b20564f425202cb140e2b7c133c4f7b830 Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 13:52:02 +0100 Subject: [PATCH 0766/1169] fix naming output file --- conf/modules.config | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9c9fbc6e..85f0812e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -825,7 +825,7 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MERGEBAMALIGNMENT_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' - ext.prefix = { "${meta.id}_merged" } + ext.prefix = { "${meta.id}_merged_shifted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_ADDORREPLACEREADGROUPS_MT' { @@ -836,12 +836,12 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_MARKDUPLICATES_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' - ext.prefix = { "${meta.id}_markduplicates" } + ext.prefix = { "${meta.id}_markduplicates__shifted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SAMTOOLS_SORT_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } - ext.prefix = { "${meta.id}_sorted" } + ext.prefix = { "${meta.id}_sorted_shifted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { @@ -849,8 +849,14 @@ process { ext.args = '--mitochondria-mode TRUE' } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:HAPLOCHECK_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } + ext.prefix = { "${meta.id}_shifted" } + } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_FILTERMUTECTCALLS_MT' { - ext.prefix = { "${meta.id}_filtered" } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } + ext.prefix = { "${meta.id}_filtered__shifted" } } } From 74476f343c5fe921dfcb293db377ecf51f88a250 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 1 Nov 2022 13:53:17 +0100 Subject: [PATCH 0767/1169] update subworkflows --- subworkflows/nf-core/call_structural_variants.nf | 9 +++++---- subworkflows/nf-core/call_sv_tiddit.nf | 5 ++--- workflows/raredisease.nf | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index 6b78d56b..51db5d0e 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -13,7 +13,8 @@ workflow CALL_STRUCTURAL_VARIANTS { bam // channel: [ val(meta), path(bam) ] bai // channel: [ val(meta), path(bai) ] bwa_index // channel: [ val(meta), path(bwa_index)] - fasta // channel: [ path(genome.fasta) ] + fasta_no_meta // channel: [ path(genome.fasta) ] + fasta_meta // channel: [ val(meta), path(genome.fasta) ] fai // channel: [ path(genome.fai) ] case_info // channel: [ val(case_info) ] target_bed // channel: [ path(target.bed) ] @@ -23,7 +24,7 @@ workflow CALL_STRUCTURAL_VARIANTS { ch_versions = Channel.empty() //manta - CALL_SV_MANTA ( bam, bai, fasta, fai, case_info, target_bed ) + CALL_SV_MANTA ( bam, bai, fasta_no_meta, fai, case_info, target_bed ) .diploid_sv_vcf .collect{it[1]} .set{ manta_vcf } @@ -31,14 +32,14 @@ workflow CALL_STRUCTURAL_VARIANTS { //tiddit ch_tiddit_bam = bam.join(bai) - CALL_SV_TIDDIT ( ch_tiddit_bam, fasta, bwa_index, case_info ) + CALL_SV_TIDDIT ( ch_tiddit_bam, fasta_meta, bwa_index, case_info ) .vcf .collect{it[1]} .set { tiddit_vcf } ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) //cnvpytor - CALL_CNV_CNVPYTOR ( bam, bai, case_info, cnvpytor_bins, fasta, fai) + CALL_CNV_CNVPYTOR ( bam, bai, case_info, cnvpytor_bins, fasta_no_meta, fai) .candidate_cnvs_vcf .collect{it[1]} .set {cnvpytor_vcf } diff --git a/subworkflows/nf-core/call_sv_tiddit.nf b/subworkflows/nf-core/call_sv_tiddit.nf index f4de6b5b..2dde0c31 100644 --- a/subworkflows/nf-core/call_sv_tiddit.nf +++ b/subworkflows/nf-core/call_sv_tiddit.nf @@ -9,13 +9,12 @@ include { SVDB_MERGE as SVDB_MERGE_TIDDIT } from '../../modules/nf-core/svdb/mer workflow CALL_SV_TIDDIT { take: bam // channel: [ val(meta), path(bam) ] - fasta // path(fasta) + fasta // channel: [ val(meta), path(fasta) ] index // [ val(meta), path(bwa_index)] case_info // channel: [ case_id ] main: - index_for_tiddit = index.map { meta, ind -> ind } - TIDDIT_SV ( bam, fasta, index_for_tiddit ) + TIDDIT_SV ( bam, fasta, index ) ch_versions = TIDDIT_SV.out.versions TIDDIT_SV.out diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 7cdc31e5..4d44e0f5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -281,6 +281,7 @@ workflow RAREDISEASE { ch_mapped.marked_bai, ch_bwa_index, ch_genome_fasta_no_meta, + ch_genome_fasta_meta, ch_genome_fai, CHECK_INPUT.out.case_info, ch_target_bed, From 8df1d15c1a6f1e814f918d60f6ddb46c9f1a304a Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 14:03:01 +0100 Subject: [PATCH 0768/1169] fix whitespaces --- conf/modules.config | 6 +++--- modules/local/change_name.nf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 85f0812e..04b2a148 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -808,8 +808,8 @@ process { } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_FILTERMUTECTCALLS_MT' { - ext.prefix = { "${meta.id}_filtered" } - } + ext.prefix = { "${meta.id}_filtered" } + } } // @@ -857,7 +857,7 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_FILTERMUTECTCALLS_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_filtered__shifted" } - } + } } // diff --git a/modules/local/change_name.nf b/modules/local/change_name.nf index ea8b8869..3a194c04 100644 --- a/modules/local/change_name.nf +++ b/modules/local/change_name.nf @@ -19,7 +19,7 @@ process CHANGE_NAME { def args = task.ext.args ?: '' file_type = task.ext.file_type ?: input_file.getExtension() def prefix = task.ext.prefix ?: "${meta.id}" - + """ mv \\ $input_file \\ From a87e169064b587ef5981293cfe136e9e732e1035 Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 14:05:13 +0100 Subject: [PATCH 0769/1169] fix empty line at end --- modules/local/change_name.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/change_name.nf b/modules/local/change_name.nf index 3a194c04..63badda9 100644 --- a/modules/local/change_name.nf +++ b/modules/local/change_name.nf @@ -33,4 +33,4 @@ process CHANGE_NAME { """ touch ${prefix}.${file_type} """ -} \ No newline at end of file +} From 0fa526cf3c1a97bc074f1d2cba882153c255bac2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 1 Nov 2022 14:11:06 +0100 Subject: [PATCH 0770/1169] remove mods --- modules.json | 8 ----- modules/nf-core/tiddit/cov/main.nf | 51 -------------------------- modules/nf-core/tiddit/cov/meta.yml | 52 --------------------------- modules/nf-core/tiddit/sv/main.nf | 55 ----------------------------- modules/nf-core/tiddit/sv/meta.yml | 55 ----------------------------- 5 files changed, 221 deletions(-) delete mode 100644 modules/nf-core/tiddit/cov/main.nf delete mode 100644 modules/nf-core/tiddit/cov/meta.yml delete mode 100644 modules/nf-core/tiddit/sv/main.nf delete mode 100644 modules/nf-core/tiddit/sv/meta.yml diff --git a/modules.json b/modules.json index 281dd436..fb21310b 100644 --- a/modules.json +++ b/modules.json @@ -209,14 +209,6 @@ "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, - "tiddit/cov": { - "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" - }, - "tiddit/sv": { - "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" - }, "ucsc/wigtobigwig": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" diff --git a/modules/nf-core/tiddit/cov/main.nf b/modules/nf-core/tiddit/cov/main.nf deleted file mode 100644 index a0a79523..00000000 --- a/modules/nf-core/tiddit/cov/main.nf +++ /dev/null @@ -1,51 +0,0 @@ -process TIDDIT_COV { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::tiddit=3.3.2" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tiddit:3.3.2--py310hc2b7f4b_0' : - 'quay.io/biocontainers/tiddit:3.3.2--py310hc2b7f4b_0' }" - - input: - tuple val(meta), path(input) - path fasta - - output: - tuple val(meta), path("*.bed"), optional: true, emit: cov - tuple val(meta), path("*.wig"), optional: true, emit: wig - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def reference = fasta ? "--ref $fasta" : "" - """ - tiddit \\ - --cov \\ - -o $prefix \\ - $args \\ - --bam $input \\ - $reference - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.wig - touch ${prefix}.tab - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/tiddit/cov/meta.yml b/modules/nf-core/tiddit/cov/meta.yml deleted file mode 100644 index 98ea27c2..00000000 --- a/modules/nf-core/tiddit/cov/meta.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: tiddit_cov -description: Computes the coverage of different regions from the bam file. -keywords: - - coverage - - bam - - statistics - - chromosomal rearrangements -tools: - - tiddit: - description: TIDDIT - structural variant calling. - homepage: https://github.com/SciLifeLab/TIDDIT - documentation: https://github.com/SciLifeLab/TIDDIT/blob/master/README.md - doi: "10.12688/f1000research.11168.1" - licence: ["GPL v3"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: - type: file - description: BAM/CRAM file - pattern: "*.{bam,cram}" - - fasta: - type: file - description: | - Reference genome file. Only needed when passing in CRAM instead of BAM. - If not using CRAM, please pass an empty file instead. - pattern: "*.fasta" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - cov: - type: file - description: The coverage of different regions. Optional. - pattern: "*.tab" - - wig: - type: file - description: The coverage of different regions in WIG format. Optional. - pattern: "*.wig" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@projectoriented" diff --git a/modules/nf-core/tiddit/sv/main.nf b/modules/nf-core/tiddit/sv/main.nf deleted file mode 100644 index 7faefa99..00000000 --- a/modules/nf-core/tiddit/sv/main.nf +++ /dev/null @@ -1,55 +0,0 @@ -process TIDDIT_SV { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::tiddit=3.3.2" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tiddit:3.3.2--py310hc2b7f4b_0' : - 'quay.io/biocontainers/tiddit:3.3.2--py310hc2b7f4b_0' }" - - input: - tuple val(meta), path(input), path(input_index) - tuple val(meta2), path(fasta) - tuple val(meta3), path(bwa_index) - - output: - tuple val(meta), path("*.vcf") , emit: vcf - tuple val(meta), path("*.ploidies.tab"), emit: ploidy - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def bwa_command = bwa_index ? "[[ -d $bwa_index ]] && for i in $bwa_index/*; do [[ -f $fasta && ! \"\$i\" =~ .*\"$fasta\".* ]] && ln -s \$i ${fasta}.\${i##*.} || ln -s \$i .; done" : "" - - """ - $bwa_command - - tiddit \\ - --sv \\ - $args \\ - --bam $input \\ - --ref $fasta \\ - -o $prefix - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.vcf - touch ${prefix}.ploidies.tab - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/tiddit/sv/meta.yml b/modules/nf-core/tiddit/sv/meta.yml deleted file mode 100644 index 8b41c69c..00000000 --- a/modules/nf-core/tiddit/sv/meta.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: tiddit_sv -description: Identify chromosomal rearrangements. -keywords: - - structural - - variants - - vcf -tools: - - sv: - description: Search for structural variants. - homepage: https://github.com/SciLifeLab/TIDDIT - documentation: https://github.com/SciLifeLab/TIDDIT/blob/master/README.md - doi: 10.12688/f1000research.11168.1 - licence: ["GPL-3.0-or-later"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: - type: file - description: BAM/CRAM file - pattern: "*.{bam,cram}" - - index: - type: file - description: BAM/CRAM index file - pattern: "*.{bai,crai}" - - fasta: - type: file - description: Input FASTA file - pattern: "*.{fasta,fa}" - - bwa_index: - type: file - description: BWA genome index files - pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: vcf - pattern: "*.{vcf}" - - ploidy: - type: file - description: tab - pattern: "*.{ploidies.tab}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@maxulysse" From 0b5643f7e3f92b2c74c7ef3deec636062e648e6d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 1 Nov 2022 14:12:01 +0100 Subject: [PATCH 0771/1169] add mods --- modules.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules.json b/modules.json index fb21310b..9ec7ddef 100644 --- a/modules.json +++ b/modules.json @@ -209,6 +209,14 @@ "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, + "tiddit/cov": { + "branch": "master", + "git_sha": "3a54013f0790674624b77e9a074ce8d22400d4fa" + }, + "tiddit/sv": { + "branch": "master", + "git_sha": "89f98091ac9e1653657b9e324e394b158d723a4f" + }, "ucsc/wigtobigwig": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" From 9667a760f2ffc051faceaa130f712a4790921bc9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 1 Nov 2022 14:14:37 +0100 Subject: [PATCH 0772/1169] add tiddit mods --- modules/nf-core/tiddit/cov/main.nf | 51 ++++++++++++++++++++++++++ modules/nf-core/tiddit/cov/meta.yml | 52 +++++++++++++++++++++++++++ modules/nf-core/tiddit/sv/main.nf | 55 +++++++++++++++++++++++++++++ modules/nf-core/tiddit/sv/meta.yml | 55 +++++++++++++++++++++++++++++ 4 files changed, 213 insertions(+) create mode 100644 modules/nf-core/tiddit/cov/main.nf create mode 100644 modules/nf-core/tiddit/cov/meta.yml create mode 100644 modules/nf-core/tiddit/sv/main.nf create mode 100644 modules/nf-core/tiddit/sv/meta.yml diff --git a/modules/nf-core/tiddit/cov/main.nf b/modules/nf-core/tiddit/cov/main.nf new file mode 100644 index 00000000..a0a79523 --- /dev/null +++ b/modules/nf-core/tiddit/cov/main.nf @@ -0,0 +1,51 @@ +process TIDDIT_COV { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::tiddit=3.3.2" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tiddit:3.3.2--py310hc2b7f4b_0' : + 'quay.io/biocontainers/tiddit:3.3.2--py310hc2b7f4b_0' }" + + input: + tuple val(meta), path(input) + path fasta + + output: + tuple val(meta), path("*.bed"), optional: true, emit: cov + tuple val(meta), path("*.wig"), optional: true, emit: wig + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--ref $fasta" : "" + """ + tiddit \\ + --cov \\ + -o $prefix \\ + $args \\ + --bam $input \\ + $reference + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.wig + touch ${prefix}.tab + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/tiddit/cov/meta.yml b/modules/nf-core/tiddit/cov/meta.yml new file mode 100644 index 00000000..98ea27c2 --- /dev/null +++ b/modules/nf-core/tiddit/cov/meta.yml @@ -0,0 +1,52 @@ +name: tiddit_cov +description: Computes the coverage of different regions from the bam file. +keywords: + - coverage + - bam + - statistics + - chromosomal rearrangements +tools: + - tiddit: + description: TIDDIT - structural variant calling. + homepage: https://github.com/SciLifeLab/TIDDIT + documentation: https://github.com/SciLifeLab/TIDDIT/blob/master/README.md + doi: "10.12688/f1000research.11168.1" + licence: ["GPL v3"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file + pattern: "*.{bam,cram}" + - fasta: + type: file + description: | + Reference genome file. Only needed when passing in CRAM instead of BAM. + If not using CRAM, please pass an empty file instead. + pattern: "*.fasta" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - cov: + type: file + description: The coverage of different regions. Optional. + pattern: "*.tab" + - wig: + type: file + description: The coverage of different regions in WIG format. Optional. + pattern: "*.wig" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@projectoriented" diff --git a/modules/nf-core/tiddit/sv/main.nf b/modules/nf-core/tiddit/sv/main.nf new file mode 100644 index 00000000..7faefa99 --- /dev/null +++ b/modules/nf-core/tiddit/sv/main.nf @@ -0,0 +1,55 @@ +process TIDDIT_SV { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::tiddit=3.3.2" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tiddit:3.3.2--py310hc2b7f4b_0' : + 'quay.io/biocontainers/tiddit:3.3.2--py310hc2b7f4b_0' }" + + input: + tuple val(meta), path(input), path(input_index) + tuple val(meta2), path(fasta) + tuple val(meta3), path(bwa_index) + + output: + tuple val(meta), path("*.vcf") , emit: vcf + tuple val(meta), path("*.ploidies.tab"), emit: ploidy + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def bwa_command = bwa_index ? "[[ -d $bwa_index ]] && for i in $bwa_index/*; do [[ -f $fasta && ! \"\$i\" =~ .*\"$fasta\".* ]] && ln -s \$i ${fasta}.\${i##*.} || ln -s \$i .; done" : "" + + """ + $bwa_command + + tiddit \\ + --sv \\ + $args \\ + --bam $input \\ + --ref $fasta \\ + -o $prefix + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf + touch ${prefix}.ploidies.tab + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/tiddit/sv/meta.yml b/modules/nf-core/tiddit/sv/meta.yml new file mode 100644 index 00000000..8b41c69c --- /dev/null +++ b/modules/nf-core/tiddit/sv/meta.yml @@ -0,0 +1,55 @@ +name: tiddit_sv +description: Identify chromosomal rearrangements. +keywords: + - structural + - variants + - vcf +tools: + - sv: + description: Search for structural variants. + homepage: https://github.com/SciLifeLab/TIDDIT + documentation: https://github.com/SciLifeLab/TIDDIT/blob/master/README.md + doi: 10.12688/f1000research.11168.1 + licence: ["GPL-3.0-or-later"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file + pattern: "*.{bam,cram}" + - index: + type: file + description: BAM/CRAM index file + pattern: "*.{bai,crai}" + - fasta: + type: file + description: Input FASTA file + pattern: "*.{fasta,fa}" + - bwa_index: + type: file + description: BWA genome index files + pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: vcf + pattern: "*.{vcf}" + - ploidy: + type: file + description: tab + pattern: "*.{ploidies.tab}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@maxulysse" From c608340e1d19908e8a67c8685cc0cbd4c455d3cb Mon Sep 17 00:00:00 2001 From: lucpen Date: Tue, 1 Nov 2022 14:53:11 +0100 Subject: [PATCH 0773/1169] fix merge_annotate_MT take --- subworkflows/local/merge_annotate_MT.nf | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/merge_annotate_MT.nf index 7186db6e..85e66d00 100644 --- a/subworkflows/local/merge_annotate_MT.nf +++ b/subworkflows/local/merge_annotate_MT.nf @@ -26,9 +26,6 @@ workflow MERGE_ANNOTATE_MT { vep_cache_version vep_cache case_info // channel: [ val(case_info) ] - vep_genome - vep_cache_version - vep_cache main: ch_versions = Channel.empty() @@ -47,7 +44,7 @@ workflow MERGE_ANNOTATE_MT { GATK4_VARIANTFILTRATION_MT(ch_filt_vcf, genome_fasta, genome_fai, - genome_dict) + genome_dict ) ch_versions = ch_versions.mix(GATK4_VARIANTFILTRATION_MT.out.versions.first()) // Spliting multiallelic calls From ecf58854ede454e9dab8b2825becb99fded718e5 Mon Sep 17 00:00:00 2001 From: lucpen Date: Wed, 2 Nov 2022 09:36:20 +0100 Subject: [PATCH 0774/1169] troubleshooting CI --- modules/nf-core/gatk4/variantfiltration/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/gatk4/variantfiltration/main.nf b/modules/nf-core/gatk4/variantfiltration/main.nf index ad269b15..486b9a4b 100644 --- a/modules/nf-core/gatk4/variantfiltration/main.nf +++ b/modules/nf-core/gatk4/variantfiltration/main.nf @@ -38,7 +38,7 @@ process GATK4_VARIANTFILTRATION { --reference $fasta \\ --tmp-dir . \\ $args - + echo "$(ls -lh)" > /dev/stderr cat <<-END_VERSIONS > versions.yml "${task.process}": gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') From bdf0262ff1cd8215907d16cc3abf0deb2b1e8b7b Mon Sep 17 00:00:00 2001 From: lucpen Date: Wed, 2 Nov 2022 09:45:42 +0100 Subject: [PATCH 0775/1169] troubleshooting CI --- modules/nf-core/gatk4/variantfiltration/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/gatk4/variantfiltration/main.nf b/modules/nf-core/gatk4/variantfiltration/main.nf index 486b9a4b..1770e482 100644 --- a/modules/nf-core/gatk4/variantfiltration/main.nf +++ b/modules/nf-core/gatk4/variantfiltration/main.nf @@ -38,7 +38,7 @@ process GATK4_VARIANTFILTRATION { --reference $fasta \\ --tmp-dir . \\ $args - echo "$(ls -lh)" > /dev/stderr + "ls -l".execute().text cat <<-END_VERSIONS > versions.yml "${task.process}": gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') From 8d43ec2ad162c9b49516fd5271f7d08ff878930b Mon Sep 17 00:00:00 2001 From: lucpen Date: Wed, 2 Nov 2022 09:56:43 +0100 Subject: [PATCH 0776/1169] troubleshooting CI --- modules/nf-core/gatk4/variantfiltration/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/gatk4/variantfiltration/main.nf b/modules/nf-core/gatk4/variantfiltration/main.nf index 1770e482..c891db6a 100644 --- a/modules/nf-core/gatk4/variantfiltration/main.nf +++ b/modules/nf-core/gatk4/variantfiltration/main.nf @@ -38,7 +38,7 @@ process GATK4_VARIANTFILTRATION { --reference $fasta \\ --tmp-dir . \\ $args - "ls -l".execute().text + "ls -l".execute().text > /dev/stderr cat <<-END_VERSIONS > versions.yml "${task.process}": gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') From 51acd74ed5e88d5efc0ff9b44318dd90078e9e2d Mon Sep 17 00:00:00 2001 From: lucpen Date: Wed, 2 Nov 2022 10:14:43 +0100 Subject: [PATCH 0777/1169] troubleshooting CI --- modules/nf-core/gatk4/variantfiltration/main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/nf-core/gatk4/variantfiltration/main.nf b/modules/nf-core/gatk4/variantfiltration/main.nf index c891db6a..9b121e14 100644 --- a/modules/nf-core/gatk4/variantfiltration/main.nf +++ b/modules/nf-core/gatk4/variantfiltration/main.nf @@ -32,13 +32,14 @@ process GATK4_VARIANTFILTRATION { avail_mem = task.memory.toGiga() } """ + "ls -l".execute().text > /dev/stderr gatk --java-options "-Xmx${avail_mem}G" VariantFiltration \\ --variant $vcf \\ --output ${prefix}.vcf.gz \\ --reference $fasta \\ --tmp-dir . \\ $args - "ls -l".execute().text > /dev/stderr + cat <<-END_VERSIONS > versions.yml "${task.process}": gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') From 5c28035bddd19e384396b37d06a59de3e1bc68a8 Mon Sep 17 00:00:00 2001 From: lucpen Date: Wed, 2 Nov 2022 10:39:14 +0100 Subject: [PATCH 0778/1169] troubleshooting CI --- modules/nf-core/gatk4/variantfiltration/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/nf-core/gatk4/variantfiltration/main.nf b/modules/nf-core/gatk4/variantfiltration/main.nf index 9b121e14..ad269b15 100644 --- a/modules/nf-core/gatk4/variantfiltration/main.nf +++ b/modules/nf-core/gatk4/variantfiltration/main.nf @@ -32,7 +32,6 @@ process GATK4_VARIANTFILTRATION { avail_mem = task.memory.toGiga() } """ - "ls -l".execute().text > /dev/stderr gatk --java-options "-Xmx${avail_mem}G" VariantFiltration \\ --variant $vcf \\ --output ${prefix}.vcf.gz \\ From c54a09c97cde18164e2a7b396fd5024a7883f67b Mon Sep 17 00:00:00 2001 From: lucpen Date: Wed, 2 Nov 2022 11:08:21 +0100 Subject: [PATCH 0779/1169] fix spacing --- subworkflows/local/analyse_MT.nf | 13 +++++------ subworkflows/local/merge_annotate_MT.nf | 30 ++++++++++++------------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 2cf672e5..3efac41d 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -24,7 +24,7 @@ workflow ANALYSE_MT { vep_genome vep_cache_version vep_cache - case_info // channel: [ val(case_info) ] + case_info // channel: [ val(case_info) ] main: ch_versions = Channel.empty() @@ -58,10 +58,10 @@ workflow ANALYSE_MT { // STEP 2.3: PICARD_LIFTOVERVCF PICARD_LIFTOVERVCF ( - ALIGN_AND_CALL_MT_SHIFT.out.vcf, - genome_dict, - shift_mt_backchain, - genome_fasta) + ALIGN_AND_CALL_MT_SHIFT.out.vcf, + genome_dict, + shift_mt_backchain, + genome_fasta) ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions) // STEP 3: MT MERGE AND ANNOTATE VARIANTS @@ -74,8 +74,7 @@ workflow ANALYSE_MT { vep_genome, vep_cache_version, vep_cache, - case_info - ) + case_info) ch_versions = ch_versions.mix(MERGE_ANNOTATE_MT.out.versions) emit: diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/merge_annotate_MT.nf index 85e66d00..961470a8 100644 --- a/subworkflows/local/merge_annotate_MT.nf +++ b/subworkflows/local/merge_annotate_MT.nf @@ -17,18 +17,18 @@ include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../m workflow MERGE_ANNOTATE_MT { take: - vcf1 // channel: [ val(meta), path('*.vcf.gz') ] - vcf2 // channel: [ val(meta), path('*.vcf.gz') ] - genome_fasta // channel: [ genome.fasta ] - genome_dict // channel: [ genome.dict ] - genome_fai // channel: [ genome.fai ] - vep_genome - vep_cache_version - vep_cache - case_info // channel: [ val(case_info) ] + vcf1 // channel: [ val(meta), path('*.vcf.gz') ] + vcf2 // channel: [ val(meta), path('*.vcf.gz') ] + genome_fasta // channel: [ genome.fasta ] + genome_dict // channel: [ genome.dict ] + genome_fai // channel: [ genome.fai ] + vep_genome + vep_cache_version + vep_cache + case_info // channel: [ val(case_info) ] main: - ch_versions = Channel.empty() + ch_versions = Channel.empty() ch_vcfs = vcf1 .join(vcf2, remainder: true) @@ -51,10 +51,10 @@ workflow MERGE_ANNOTATE_MT { ch_in_split=GATK4_VARIANTFILTRATION_MT.out.vcf.join( GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]) SPLIT_MULTIALLELICS_MT (ch_in_split, genome_fasta) ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_MT.out.versions) - + TABIX_TABIX_MT(SPLIT_MULTIALLELICS_MT.out.vcf) ch_in_remdup = SPLIT_MULTIALLELICS_MT.out.vcf.join(TABIX_TABIX_MT.out.tbi) - + // Removing duplicates and merging if there is more than one sample REMOVE_DUPLICATES_MT(ch_in_remdup, genome_fasta) TABIX_TABIX_MT2(REMOVE_DUPLICATES_MT.out.vcf) @@ -82,17 +82,17 @@ workflow MERGE_ANNOTATE_MT { multiple: vcf.size() > 1 return [meta, vcf, tbi] }.set { ch_dedup_vcf } - + BCFTOOLS_MERGE_MT( ch_dedup_vcf.multiple, [], genome_fasta, genome_fai) ch_mer_vcf=BCFTOOLS_MERGE_MT.out.merged_variants ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) - + ch_ch_n=CHANGE_NAME_VCF_MT(ch_dedup_vcf.single) ch_in_vep=ch_mer_vcf.mix(ch_dedup_vcf.single) - + // Annotating with Hmtnote //HMTNOTE_MT(ch_in_vep) //ch_versions = ch_versions.mix(HMTNOTE_MT.out.versions.first()) From fc5826c090b5f5796602bd3a2b540c749389149a Mon Sep 17 00:00:00 2001 From: lucpen Date: Wed, 2 Nov 2022 15:48:10 +0100 Subject: [PATCH 0780/1169] fix adding stub --- modules/nf-core/gatk4/variantfiltration/main.nf | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/nf-core/gatk4/variantfiltration/main.nf b/modules/nf-core/gatk4/variantfiltration/main.nf index ad269b15..9365bfa8 100644 --- a/modules/nf-core/gatk4/variantfiltration/main.nf +++ b/modules/nf-core/gatk4/variantfiltration/main.nf @@ -39,6 +39,17 @@ process GATK4_VARIANTFILTRATION { --tmp-dir . \\ $args + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + cat <<-END_VERSIONS > versions.yml "${task.process}": gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') From f4108dce573a0f4c4dc326a8e9b709daaa7fc745 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 2 Nov 2022 15:52:24 +0100 Subject: [PATCH 0781/1169] turn off cnvpytor --- bin/add_most_severe_consequence.py | 0 bin/add_most_severe_pli.py | 0 conf/genomes.config | 2 + main.nf | 1 + modules/local/add_most_severe_consequence.nf | 13 ++--- modules/local/add_most_severe_pli.nf | 43 +++++++++++++++++ modules/nf-core/svdb/query/main.nf | 47 +++++++++++-------- nextflow_schema.json | 7 +++ subworkflows/local/annotate_consequence.nf | 30 ------------ .../local/annotate_consequence_pli.nf | 29 ++++++++++++ .../local/annotate_structural_variants.nf | 37 +++++---------- workflows/raredisease.nf | 20 ++++---- 12 files changed, 140 insertions(+), 89 deletions(-) mode change 100644 => 100755 bin/add_most_severe_consequence.py mode change 100644 => 100755 bin/add_most_severe_pli.py create mode 100644 modules/local/add_most_severe_pli.nf delete mode 100644 subworkflows/local/annotate_consequence.nf create mode 100644 subworkflows/local/annotate_consequence_pli.nf diff --git a/bin/add_most_severe_consequence.py b/bin/add_most_severe_consequence.py old mode 100644 new mode 100755 diff --git a/bin/add_most_severe_pli.py b/bin/add_most_severe_pli.py old mode 100644 new mode 100755 diff --git a/conf/genomes.config b/conf/genomes.config index 5b11a860..e21a05f8 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -29,6 +29,7 @@ params { mt_intervals = "" mt_intervals_shift = "" mt_sequence_dictionary_shift = "" + pli_per_gene = "" reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" score_config_sv = "${params.local_genomes}/svrank_model_-v1.8-.ini" @@ -62,6 +63,7 @@ params { mt_intervals = "${params.local_genomes}/non_control_region.chrM.interval_list" mt_intervals_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" mt_sequence_dictionary_shift = "" + pli_per_gene = "" reduced_penetrance = "" score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" diff --git a/main.nf b/main.nf index 7335d481..ad557136 100644 --- a/main.nf +++ b/main.nf @@ -39,6 +39,7 @@ params.mt_fai_shift = WorkflowMain.getGenomeAttribute(params, params.mt_intervals = WorkflowMain.getGenomeAttribute(params, 'mt_intervals') params.mt_intervals_shift = WorkflowMain.getGenomeAttribute(params, 'mt_intervals_shift') params.mt_sequence_dictionary_shift = WorkflowMain.getGenomeAttribute(params, 'mt_sequence_dictionary_shift') +params.pli_per_gene = WorkflowMain.getGenomeAttribute(params, 'pli_per_gene') params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_penetrance') params.sequence_dictionary = WorkflowMain.getGenomeAttribute(params, 'sequence_dictionary') params.score_config_snv = WorkflowMain.getGenomeAttribute(params, 'score_config_snv') diff --git a/modules/local/add_most_severe_consequence.nf b/modules/local/add_most_severe_consequence.nf index 4d1397fb..ff99b76c 100644 --- a/modules/local/add_most_severe_consequence.nf +++ b/modules/local/add_most_severe_consequence.nf @@ -10,11 +10,9 @@ process ADD_MOST_SEVERE_CSQ { input: tuple val(meta), path(vcf) path (variant_consequences) - path (pli_gene) output: - tuple val(meta), path("*.csq_pli.vcf") , emit: csq_pli_vcf - tuple val(meta), path("*.csq.vcf") , emit: csq_vcf + tuple val(meta), path("*_csq.vcf") , emit: vcf path "versions.yml" , emit: versions when: @@ -24,23 +22,22 @@ process ADD_MOST_SEVERE_CSQ { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - python3 add_most_severe_consequence.py --file_in ${vcf} --file_out ${prefix}.csq.vcf --variant_csq ${variant_consequences} - python3 add_most_severe_pli.py --file_in ${prefix}.csq.vcf --file_out ${prefix}.csq_pli.vcf --pli ${pli} + add_most_severe_consequence.py --file_in ${vcf} --file_out ${prefix}_csq.vcf --variant_csq ${variant_consequences} cat <<-END_VERSIONS > versions.yml "${task.process}": - add_most_severe_consequence_pli: v1.0 + add_most_severe_consequence: v1.0 END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.csq_pli.vcf + touch ${prefix}_csq.vcf cat <<-END_VERSIONS > versions.yml "${task.process}": - add_most_severe_consequence_pli: v1.0 + add_most_severe_consequence: v1.0 END_VERSIONS """ } diff --git a/modules/local/add_most_severe_pli.nf b/modules/local/add_most_severe_pli.nf new file mode 100644 index 00000000..dc7d4a22 --- /dev/null +++ b/modules/local/add_most_severe_pli.nf @@ -0,0 +1,43 @@ +process ADD_MOST_SEVERE_PLI { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'quay.io/biocontainers/python:3.9--1' }" + + input: + tuple val(meta), path(vcf) + path (pli_gene) + + output: + tuple val(meta), path("*_pli.vcf") , emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + add_most_severe_pli.py --file_in ${vcf} --file_out ${prefix}_pli.vcf --pli ${pli_gene} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + add_most_severe_pli: v1.0 + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_pli.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + add_most_severe_pli: v1.0 + END_VERSIONS + """ +} diff --git a/modules/nf-core/svdb/query/main.nf b/modules/nf-core/svdb/query/main.nf index ac9eead3..dbab5259 100644 --- a/modules/nf-core/svdb/query/main.nf +++ b/modules/nf-core/svdb/query/main.nf @@ -9,30 +9,39 @@ process SVDB_QUERY { input: tuple val(meta), path(vcf) - tuple val(in_occs), val(in_frqs), val(out_occs), val(out_frqs), path (vcf_dbs) - val(placeholder) + val(in_occs) + val(in_frqs) + val(out_occs) + val(out_frqs) + path (vcf_dbs) output: - tuple val(meta), path("*_query.vcf") , emit: vcf - tuple val(in_occs_rem), val(in_frqs_rem), val(out_occs_rem), val(out_frqs_rem), path (vcf_dbs_rem) , emit: vals - path "versions.yml" , emit: versions + tuple val(meta), path("*_query.vcf"), emit: vcf + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def in_occ = "--in_occ " + in_occs.head() - in_occs_rem = in_occs.tail() - def in_frq = "--in_frq " + in_frqs.head() - in_frqs_rem = in_frqs.tail() - def out_occ = "--out_occ " + out_occs.head() - out_occs_rem = out_occs.tail() - def out_frq = "--out_frq " + out_frqs.head() - out_frqs_rem = out_frqs.tail() - def vcf_db = vcf_dbs.head() - vcf_dbs_rem = vcf_dbs.tail() + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def in_occ = "" + def in_frq = "" + def out_occ = "" + def out_frq = "" + if (in_occs) { + in_occ = "--in_occ ${in_occs.join(',')}" + } + if (in_frqs) { + in_frq = "--in_frq ${in_frqs.join(',')}" + } + if (out_occs) { + out_occ = "--out_occ ${out_occs.join(',')}" + } + if (out_frqs) { + out_frq = "--out_frq ${out_frqs.join(',')}" + } + """ svdb \\ --query \\ @@ -41,9 +50,9 @@ process SVDB_QUERY { $out_occ \\ $out_frq \\ $args \\ - --db $vcf_db \\ + --db ${vcf_dbs.join(',')} \\ --query_vcf $vcf \\ - --prefix ${prefix}_${task.index} + --prefix ${prefix} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/nextflow_schema.json b/nextflow_schema.json index 4253f52c..47477439 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -214,6 +214,13 @@ "fa_icon": "fas fa-folder-open", "hidden": true }, + "pli_per_gene": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-chart-bar", + "description": "File with gene ids and their corresponding pli values", + "hidden": true + }, "reduced_penetrance": { "type": "string", "format": "path", diff --git a/subworkflows/local/annotate_consequence.nf b/subworkflows/local/annotate_consequence.nf deleted file mode 100644 index da220c13..00000000 --- a/subworkflows/local/annotate_consequence.nf +++ /dev/null @@ -1,30 +0,0 @@ -// -// A subworkflow to call SNVs by sentieon dnascope with a machine learning model. -// - -include { ADD_MOST_SEVERE_CSQ as ADD_MOST_SEVERE_CSQ_CLIN } from '../../modules/local/add_most_severe_consequence' -include { ADD_MOST_SEVERE_CSQ as ADD_MOST_SEVERE_CSQ_RES } from '../../modules/local/add_most_severe_consequence' - -workflow ANNOTATE_CSQ { - take: - clinical // channel: [ val(meta), vcf ] - research // channel: [ val(meta), vcf ] - variant_consequences // path: consequences.txt - - main: - ch_versions = Channel.empty() - - ADD_MOST_SEVERE_CSQ_CLIN ( - clinical, - variant_consequences - ) - ADD_MOST_SEVERE_CSQ_RES ( - research, - variant_consequences - ) - - emit: - clinical_vcf = ADD_MOST_SEVERE_CSQ_CLIN.out.vcf - research_vcf = ADD_MOST_SEVERE_CSQ_RES.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] -} diff --git a/subworkflows/local/annotate_consequence_pli.nf b/subworkflows/local/annotate_consequence_pli.nf new file mode 100644 index 00000000..b269a4a6 --- /dev/null +++ b/subworkflows/local/annotate_consequence_pli.nf @@ -0,0 +1,29 @@ +// +// A subworkflow to call SNVs by sentieon dnascope with a machine learning model. +// + +include { ADD_MOST_SEVERE_CSQ } from '../../modules/local/add_most_severe_consequence' +include { ADD_MOST_SEVERE_PLI } from '../../modules/local/add_most_severe_pli' + +workflow ANNOTATE_CSQ_PLI { + take: + vcf // channel: [ val(meta), vcf ] + variant_consequences // path: consequences.txt + pli_gene // path: pli_per_gene.txt + + main: + ch_versions = Channel.empty() + + ADD_MOST_SEVERE_CSQ ( + vcf, + variant_consequences + ) + ADD_MOST_SEVERE_PLI ( + ADD_MOST_SEVERE_CSQ.out.vcf, + pli_gene + ) + + emit: + vcf_ann = ADD_MOST_SEVERE_PLI.out.vcf + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 2a37efdb..8d5c73a4 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -3,7 +3,6 @@ // include { SVDB_QUERY } from '../../modules/nf-core/svdb/query/main' -include { SVDB_MERGE } from '../../modules/nf-core/svdb/merge/main' include { PICARD_SORTVCF } from '../../modules/nf-core/picard/sortvcf/main' include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/tabix/tabix/main' @@ -34,36 +33,26 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { } .set { ch_svdb_dbs } - ch_svdb_dbs.in_occs.toList() - .concat(ch_svdb_dbs.in_frqs.toList(), - ch_svdb_dbs.out_occs.toList(), - ch_svdb_dbs.out_frqs.toList(), - ch_svdb_dbs.vcf_dbs.toList()) - .toList() - .set { ch_dbs_in } - - vcf.collect().set {ch_vcf_in} - SVDB_QUERY - .recurse(ch_vcf_in, ch_dbs_in,[] ) - .until{ it -> it[1][1] == [] } - - SVDB_QUERY.out.vcf.groupTuple().set { ch_merge_in } - + SVDB_QUERY(vcf, + ch_svdb_dbs.in_occs.toList(), + ch_svdb_dbs.in_frqs.toList(), + ch_svdb_dbs.out_occs.toList(), + ch_svdb_dbs.out_frqs.toList(), + ch_svdb_dbs.vcf_dbs.toList() + ) ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) - SVDB_MERGE(ch_merge_in, []) - // PICARD_SORTVCF(SVDB_MERGE.out.vcf, - // fasta, - // seq_dict - // ) + PICARD_SORTVCF(SVDB_QUERY.out.vcf, + fasta, + seq_dict + ) + ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) - // PICARD_SORTVCF.out.vcf - SVDB_MERGE.out.vcf + PICARD_SORTVCF.out.vcf .map { meta, vcf -> return [meta,vcf,[]] } .set { ch_sortvcf } - // ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) BCFTOOLS_VIEW(ch_sortvcf,[],[],[]) ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c16ae94c..082dcb58 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -36,6 +36,7 @@ def checkPathParamList = [ params.mt_intervals_shift, params.mt_sequence_dictionary_shift, params.multiqc_config, + params.pli_per_gene, params.reduced_penetrance, params.score_config_snv, params.score_config_sv, @@ -90,8 +91,8 @@ include { MULTIQC } from '../modules/nf-core/multi include { ALIGN } from '../subworkflows/local/align' include { ANALYSE_MT } from '../subworkflows/local/analyse_MT' -include { ANNOTATE_CSQ as ANN_CSQ_SNV } from '../subworkflows/local/annotate_consequence' -include { ANNOTATE_CSQ as ANN_CSQ_SV } from '../subworkflows/local/annotate_consequence' +include { ANNOTATE_CSQ_PLI as ANN_CSQ_PLI_SNV } from '../subworkflows/local/annotate_consequence_pli' +include { ANNOTATE_CSQ_PLI as ANN_CSQ_PLI_SV } from '../subworkflows/local/annotate_consequence_pli' include { ANNOTATE_SNVS } from '../subworkflows/local/annotate_snvs' include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' include { CALL_SNV } from '../subworkflows/local/call_snv' @@ -154,6 +155,8 @@ workflow RAREDISEASE { : Channel.value([]) ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift).collect() : Channel.value([]) + ch_pli_per_gene = params.pli_per_gene ? Channel.fromPath(params.pli_per_gene).collect() + : Channel.value([]) ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance).collect() : Channel.value([]) ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv).collect() @@ -317,8 +320,14 @@ workflow RAREDISEASE { ).set {ch_sv_annotate} ch_versions = ch_versions.mix(ch_sv_annotate.versions) - RANK_VARIANTS_SV ( + ANN_CSQ_PLI_SV ( ch_sv_annotate.vcf_ann, + ch_variant_consequences, + ch_pli_per_gene + ) + + RANK_VARIANTS_SV ( + ANN_CSQ_PLI_SV.out.vcf_ann, MAKE_PED.out.ped, ch_reduced_penetrance, ch_score_config_sv @@ -330,11 +339,6 @@ workflow RAREDISEASE { ch_vep_filters ) - ANN_CSQ_SV ( - FILTER_VEP_SV.out.vcf, - RANK_VARIANTS_SV.out.vcf, - ch_variant_consequences - ) } ANALYSE_MT ( From bc94224448563066f28020dd71bbc28d9b8e4fca Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 2 Nov 2022 15:54:57 +0100 Subject: [PATCH 0782/1169] remove recursion --- main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/main.nf b/main.nf index ad557136..ef2c4a3d 100644 --- a/main.nf +++ b/main.nf @@ -11,7 +11,6 @@ */ nextflow.enable.dsl = 2 -nextflow.preview.recursion = true /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 09f30794a072da2ec3e73b66784f46dd56b7a015 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 2 Nov 2022 16:07:44 +0100 Subject: [PATCH 0783/1169] fix CI errors --- .../nf-core/call_structural_variants.nf | 21 ++++++++++++------- workflows/raredisease.nf | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/nf-core/call_structural_variants.nf index 51db5d0e..3af80827 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/nf-core/call_structural_variants.nf @@ -39,23 +39,30 @@ workflow CALL_STRUCTURAL_VARIANTS { ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) //cnvpytor - CALL_CNV_CNVPYTOR ( bam, bai, case_info, cnvpytor_bins, fasta_no_meta, fai) - .candidate_cnvs_vcf - .collect{it[1]} - .set {cnvpytor_vcf } - ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) + // CALL_CNV_CNVPYTOR ( bam, bai, case_info, cnvpytor_bins, fasta_no_meta, fai) + // .candidate_cnvs_vcf + // .collect{it[1]} + // .set {cnvpytor_vcf } + // ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) + + // //merge + // tiddit_vcf + // .combine(manta_vcf) + // .combine(cnvpytor_vcf) + // .toList() + // .set { vcf_list } //merge tiddit_vcf .combine(manta_vcf) - .combine(cnvpytor_vcf) .toList() .set { vcf_list } case_info.combine(vcf_list) .set { merge_input_vcfs } - SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta","cnvpytor"] ) + // SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta","cnvpytor"] ) + SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta"] ) emit: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 082dcb58..95a575c3 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -387,7 +387,7 @@ workflow RAREDISEASE { ch_vep_filters ) - ANN_CSQ_SNV ( + ANN_CSQ_PLI_SNV ( FILTER_VEP_SNV.out.vcf, RANK_VARIANTS_SNV.out.vcf, ch_variant_consequences From 71dab8ba61cf5f0d1408751dc965993f098cfffb Mon Sep 17 00:00:00 2001 From: lucpen Date: Wed, 2 Nov 2022 16:39:36 +0100 Subject: [PATCH 0784/1169] feat added stubs by updating gatk4/variantfiltration --- conf/modules.config | 2 +- modules.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 04b2a148..51b93958 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -886,7 +886,7 @@ process { withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ENSEMBLVEP_MT' { ext.args = [ - '--plugin LoFtool,cache/Plugins/LoFtool_scores.txt', + '--plugin LoFtool,vep_cache/LoFtool_scores.txt', '--distance 0', '--buffer_size 20000', '--format vcf --max_sv_size 16600', diff --git a/modules.json b/modules.json index b66cbc5a..4358163c 100644 --- a/modules.json +++ b/modules.json @@ -115,7 +115,7 @@ }, "gatk4/variantfiltration": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "c95bed5b125e90553814b8720875c8c663524619" }, "genmod/annotate": { "branch": "master", From 71afa79a7898eb875ef3c6abefc090070385493f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 2 Nov 2022 16:47:40 +0100 Subject: [PATCH 0785/1169] Move subworkflows to from nf-core to local --- conf/modules.config | 4 ++-- subworkflows/local/alignment/align_bwamem2.nf | 20 +++++++++---------- subworkflows/local/analyse_MT.nf | 6 +++--- .../call_repeat_expansions.nf | 0 subworkflows/local/call_snv.nf | 4 ++-- .../call_structural_variants.nf | 6 +++--- .../{ => mitochondria}/align_and_call_MT.nf | 16 +++++++-------- .../convert_mt_bam_to_fastq.nf | 6 +++--- subworkflows/local/prepare_references.nf | 20 +++++++++---------- .../local/{ => preprocessing}/prepare_vcf.nf | 8 ++++---- subworkflows/{nf-core => local}/qc_bam.nf | 0 .../genmod.nf => local/rank_variants.nf} | 0 .../variant_calling}/call_cnv_cnvpytor.nf | 10 +++++----- .../variant_calling}/call_snv_deepvariant.nf | 10 +++++----- .../call_snv_sentieon.nf | 4 ++-- .../variant_calling}/call_sv_manta.nf | 2 +- .../variant_calling}/call_sv_tiddit.nf | 5 ++--- workflows/raredisease.nf | 12 +++++------ 18 files changed, 66 insertions(+), 67 deletions(-) rename subworkflows/{nf-core => local}/call_repeat_expansions.nf (100%) rename subworkflows/{nf-core => local}/call_structural_variants.nf (91%) rename subworkflows/local/{ => mitochondria}/align_and_call_MT.nf (85%) rename subworkflows/local/{ => mitochondria}/convert_mt_bam_to_fastq.nf (89%) rename subworkflows/local/{ => preprocessing}/prepare_vcf.nf (91%) rename subworkflows/{nf-core => local}/qc_bam.nf (100%) rename subworkflows/{nf-core/genmod.nf => local/rank_variants.nf} (100%) rename subworkflows/{nf-core => local/variant_calling}/call_cnv_cnvpytor.nf (88%) rename subworkflows/{nf-core => local/variant_calling}/call_snv_deepvariant.nf (91%) rename subworkflows/local/{ => variant_calling}/call_snv_sentieon.nf (86%) rename subworkflows/{nf-core => local/variant_calling}/call_sv_manta.nf (95%) rename subworkflows/{nf-core => local/variant_calling}/call_sv_tiddit.nf (82%) diff --git a/conf/modules.config b/conf/modules.config index bdf494ea..f98dddba 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -58,7 +58,7 @@ process { // process { - withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX' { + withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_GENOME' { ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} publishDir = [ path: { "${params.outdir}/references" }, @@ -100,7 +100,7 @@ process { ] } - withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX' { + withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_GENOME' { ext.when = {!params.fasta_fai} publishDir = [ path: { "${params.outdir}/references" }, diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 2993a906..9e53e49f 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -2,12 +2,12 @@ // Map to reference, fetch stats for each demultiplexed read pair, merge, mark duplicates, and index. // -include { BWAMEM2_MEM } from '../../../modules/nf-core/bwamem2/mem/main' -include { SAMTOOLS_INDEX } from '../../../modules/nf-core/samtools/index/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MD } from '../../../modules/nf-core/samtools/index/main' -include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main' -include { SAMTOOLS_MERGE } from '../../../modules/nf-core/samtools/merge/main' -include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../../modules/nf-core/picard/markduplicates/main' +include { BWAMEM2_MEM } from '../../../modules/nf-core/bwamem2/mem/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_ALIGN } from '../../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MARKDUP } from '../../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main' +include { SAMTOOLS_MERGE } from '../../../modules/nf-core/samtools/merge/main' +include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../../modules/nf-core/picard/markduplicates/main' workflow ALIGN_BWAMEM2 { @@ -24,11 +24,11 @@ workflow ALIGN_BWAMEM2 { BWAMEM2_MEM ( reads_input, index, true ) ch_versions = ch_versions.mix(BWAMEM2_MEM.out.versions) - SAMTOOLS_INDEX ( BWAMEM2_MEM.out.bam ) + SAMTOOLS_INDEX_ALIGN ( BWAMEM2_MEM.out.bam ) // Join the mapped bam + bai paths by their keys for stats // Get stats for each demultiplexed read pair. - bam_sorted_indexed = BWAMEM2_MEM.out.bam.join(SAMTOOLS_INDEX.out.bai) + bam_sorted_indexed = BWAMEM2_MEM.out.bam.join(SAMTOOLS_INDEX_ALIGN.out.bai) SAMTOOLS_STATS ( bam_sorted_indexed, [] ) // Merge multiple lane samples and index @@ -52,14 +52,14 @@ workflow ALIGN_BWAMEM2 { // Marking duplicates MARKDUPLICATES ( prepared_bam , fasta, fai ) - SAMTOOLS_INDEX_MD ( MARKDUPLICATES.out.bam ) + SAMTOOLS_INDEX_MARKDUP ( MARKDUPLICATES.out.bam ) ch_versions = ch_versions.mix(MARKDUPLICATES.out.versions) emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] metrics = MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] marked_bam = MARKDUPLICATES.out.bam // channel: [ val(meta), [ marked_bam ] ] - marked_bai = SAMTOOLS_INDEX_MD.out.bai // channel: [ val(meta), [ marked_bai ] ] + marked_bai = SAMTOOLS_INDEX_MARKDUP.out.bai // channel: [ val(meta), [ marked_bai ] ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index bece2ea4..ca12f290 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -1,9 +1,9 @@ // // Analyse MT // -include { CONVERT_MT_BAM_TO_FASTQ } from './convert_mt_bam_to_fastq' -include { ALIGN_AND_CALL_MT } from './align_and_call_MT' -include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './align_and_call_MT' +include { CONVERT_MT_BAM_TO_FASTQ } from './mitochondria/convert_mt_bam_to_fastq' +include { ALIGN_AND_CALL_MT } from './mitochondria/align_and_call_MT' +include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './mitochondria/align_and_call_MT' include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/picard/liftovervcf/main' workflow ANALYSE_MT { diff --git a/subworkflows/nf-core/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf similarity index 100% rename from subworkflows/nf-core/call_repeat_expansions.nf rename to subworkflows/local/call_repeat_expansions.nf diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index 8af1eb4d..096821d0 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -2,8 +2,8 @@ // call Single-nucleotide Varinats // -include { CALL_SNV_DEEPVARIANT } from '../nf-core/call_snv_deepvariant' -include { CALL_SNV_SENTIEON } from './call_snv_sentieon' +include { CALL_SNV_DEEPVARIANT } from './variant_calling/call_snv_deepvariant' +include { CALL_SNV_SENTIEON } from './variant_calling/call_snv_sentieon' workflow CALL_SNV { take: diff --git a/subworkflows/nf-core/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf similarity index 91% rename from subworkflows/nf-core/call_structural_variants.nf rename to subworkflows/local/call_structural_variants.nf index 3af80827..0b457b63 100644 --- a/subworkflows/nf-core/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -2,10 +2,10 @@ // A nested subworkflow to call structural variants. // -include { CALL_SV_MANTA } from './call_sv_manta' -include { CALL_SV_TIDDIT } from './call_sv_tiddit' +include { CALL_SV_MANTA } from './variant_calling/call_sv_manta' +include { CALL_SV_TIDDIT } from './variant_calling/call_sv_tiddit' include { SVDB_MERGE } from '../../modules/nf-core/svdb/merge/main' -include { CALL_CNV_CNVPYTOR } from './call_cnv_cnvpytor' +include { CALL_CNV_CNVPYTOR } from './variant_calling/call_cnv_cnvpytor' workflow CALL_STRUCTURAL_VARIANTS { diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf similarity index 85% rename from subworkflows/local/align_and_call_MT.nf rename to subworkflows/local/mitochondria/align_and_call_MT.nf index bf0339f2..9244f40d 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -2,14 +2,14 @@ // Align and call MT // -include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/bwamem2/mem/main' -include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/gatk4/mergebamalignment/main' -include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/picard/addorreplacereadgroups/main' -include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/picard/markduplicates/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/samtools/index/main' -include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/samtools/sort/main' -include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/haplocheck/main' -include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/gatk4/mutect2/main' +include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../../modules/nf-core/bwamem2/mem/main' +include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../../modules/nf-core/gatk4/mergebamalignment/main' +include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../../modules/nf-core/picard/addorreplacereadgroups/main' +include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../../modules/nf-core/picard/markduplicates/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../../modules/nf-core/samtools/sort/main' +include { HAPLOCHECK as HAPLOCHECK_MT } from '../../../modules/nf-core/haplocheck/main' +include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../../modules/nf-core/gatk4/mutect2/main' workflow ALIGN_AND_CALL_MT { take: diff --git a/subworkflows/local/convert_mt_bam_to_fastq.nf b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf similarity index 89% rename from subworkflows/local/convert_mt_bam_to_fastq.nf rename to subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf index b126a310..60228de8 100644 --- a/subworkflows/local/convert_mt_bam_to_fastq.nf +++ b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf @@ -2,9 +2,9 @@ // Prepare bam files for MT allignment // -include { SAMTOOLS_VIEW as SAMTOOLS_VIEW_MT } from '../../modules/nf-core/samtools/view/main' -include { GATK4_REVERTSAM as GATK4_REVERTSAM_MT } from '../../modules/nf-core/gatk4/revertsam/main' -include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../modules/nf-core/gatk4/samtofastq/main' +include { SAMTOOLS_VIEW as SAMTOOLS_VIEW_MT } from '../../../modules/nf-core/samtools/view/main' +include { GATK4_REVERTSAM as GATK4_REVERTSAM_MT } from '../../../modules/nf-core/gatk4/revertsam/main' +include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../../modules/nf-core/gatk4/samtofastq/main' workflow CONVERT_MT_BAM_TO_FASTQ { take: diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 42ce93b6..ddb3f806 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -3,16 +3,16 @@ // include { BWA_INDEX } from '../../modules/nf-core/bwa/index/main' -include { BWAMEM2_INDEX } from '../../modules/nf-core/bwamem2/index/main' +include { BWAMEM2_INDEX as BWAMEM2_INDEX_GENOME } from '../../modules/nf-core/bwamem2/index/main' include { BWAMEM2_INDEX as BWAMEM2_INDEX_SHIFT_MT } from '../../modules/nf-core/bwamem2/index/main' include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/cat/cat/main' -include { CHECK_VCF } from './prepare_vcf' +include { CHECK_VCF } from './preprocessing/prepare_vcf' include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/gatk4/bedtointervallist/main' include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD_SHIFT_MT } from '../../modules/nf-core/gatk4/createsequencedictionary/main' include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modules/nf-core/gatk4/intervallisttools/main' include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' +include { SAMTOOLS_FAIDX as SAMTOOLS_FAIDX_GENOME } from '../../modules/nf-core/samtools/faidx/main' include { SAMTOOLS_FAIDX as SAMTOOLS_FAIDX_SHIFT_MT } from '../../modules/nf-core/samtools/faidx/main' include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/tabix/bgziptabix/main' @@ -42,14 +42,14 @@ workflow PREPARE_REFERENCES { // Genome indices BWA_INDEX(fasta_meta) - BWAMEM2_INDEX(fasta_meta) + BWAMEM2_INDEX_GENOME(fasta_meta) BWAMEM2_INDEX_SHIFT_MT(mt_fasta_shift_meta) SENTIEON_BWAINDEX(fasta_meta) - SAMTOOLS_FAIDX(fasta_meta) + SAMTOOLS_FAIDX_GENOME(fasta_meta) SAMTOOLS_FAIDX_SHIFT_MT(mt_fasta_shift_meta) GATK_SD(fasta_no_meta) GATK_SD_SHIFT_MT(mt_fasta_shift_no_meta) - GET_CHROM_SIZES( SAMTOOLS_FAIDX.out.fai ) + GET_CHROM_SIZES( SAMTOOLS_FAIDX_GENOME.out.fai ) // Vcf, tab and bed indices TABIX_DBSNP(known_dbsnp) @@ -77,10 +77,10 @@ workflow PREPARE_REFERENCES { // Gather versions ch_versions = ch_versions.mix(BWA_INDEX.out.versions) - ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) + ch_versions = ch_versions.mix(BWAMEM2_INDEX_GENOME.out.versions) ch_versions = ch_versions.mix(BWAMEM2_INDEX_SHIFT_MT.out.versions) ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) - ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX_GENOME.out.versions) ch_versions = ch_versions.mix(SAMTOOLS_FAIDX_SHIFT_MT.out.versions) ch_versions = ch_versions.mix(GATK_SD.out.versions) ch_versions = ch_versions.mix(GATK_SD_SHIFT_MT.out.versions) @@ -97,10 +97,10 @@ workflow PREPARE_REFERENCES { emit: bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() bwa_index = BWA_INDEX.out.index.collect() ?: SENTIEON_BWAINDEX.out.index.collect() - bwamem2_index = BWAMEM2_INDEX.out.index.collect() + bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() - fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] }.collect() + fasta_fai = SAMTOOLS_FAIDX_GENOME.out.fai.map{ meta, fai -> [fai] }.collect() fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] }.collect() gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi.collect() gnomad_tbi = CHECK_VCF.out.index.collect() diff --git a/subworkflows/local/prepare_vcf.nf b/subworkflows/local/preprocessing/prepare_vcf.nf similarity index 91% rename from subworkflows/local/prepare_vcf.nf rename to subworkflows/local/preprocessing/prepare_vcf.nf index 97f6a3f3..7716f3f3 100644 --- a/subworkflows/local/prepare_vcf.nf +++ b/subworkflows/local/preprocessing/prepare_vcf.nf @@ -2,10 +2,10 @@ // Prepare reference vcf files // -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_PV } from '../../modules/nf-core/bcftools/norm/main' -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_PV } from '../../modules/nf-core/bcftools/norm/main' -include { TABIX_TABIX as TABIX_PV } from '../../modules/nf-core/tabix/tabix/main' -include { CHECK_INPUT_VCF } from '../../modules/local/check_input_vcf' +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_PV } from '../../../modules/nf-core/bcftools/norm/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_PV } from '../../../modules/nf-core/bcftools/norm/main' +include { TABIX_TABIX as TABIX_PV } from '../../../modules/nf-core/tabix/tabix/main' +include { CHECK_INPUT_VCF } from '../../../modules/local/check_input_vcf' workflow CHECK_VCF { take: diff --git a/subworkflows/nf-core/qc_bam.nf b/subworkflows/local/qc_bam.nf similarity index 100% rename from subworkflows/nf-core/qc_bam.nf rename to subworkflows/local/qc_bam.nf diff --git a/subworkflows/nf-core/genmod.nf b/subworkflows/local/rank_variants.nf similarity index 100% rename from subworkflows/nf-core/genmod.nf rename to subworkflows/local/rank_variants.nf diff --git a/subworkflows/nf-core/call_cnv_cnvpytor.nf b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf similarity index 88% rename from subworkflows/nf-core/call_cnv_cnvpytor.nf rename to subworkflows/local/variant_calling/call_cnv_cnvpytor.nf index 262fa2ea..f956799a 100644 --- a/subworkflows/nf-core/call_cnv_cnvpytor.nf +++ b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf @@ -2,11 +2,11 @@ // CNVpytor workflow - Calling CNVs // -include { CNVPYTOR_IMPORTREADDEPTH as GENERATE_PYTOR } from '../../modules/nf-core/cnvpytor/importreaddepth/main' -include { CNVPYTOR_HISTOGRAM as HISTOGRAMS } from '../../modules/nf-core/cnvpytor/histogram/main' -include { CNVPYTOR_PARTITION as PARTITIONS } from '../../modules/nf-core/cnvpytor/partition/main' -include { CNVPYTOR_CALLCNVS as CALL_CNVS } from '../../modules/nf-core/cnvpytor/callcnvs/main' -include { CNVPYTOR_VIEW as VIEW } from '../../modules/nf-core/cnvpytor/view/main' +include { CNVPYTOR_IMPORTREADDEPTH as GENERATE_PYTOR } from '../../../modules/nf-core/cnvpytor/importreaddepth/main' +include { CNVPYTOR_HISTOGRAM as HISTOGRAMS } from '../../../modules/nf-core/cnvpytor/histogram/main' +include { CNVPYTOR_PARTITION as PARTITIONS } from '../../../modules/nf-core/cnvpytor/partition/main' +include { CNVPYTOR_CALLCNVS as CALL_CNVS } from '../../../modules/nf-core/cnvpytor/callcnvs/main' +include { CNVPYTOR_VIEW as VIEW } from '../../../modules/nf-core/cnvpytor/view/main' workflow CALL_CNV_CNVPYTOR { take: diff --git a/subworkflows/nf-core/call_snv_deepvariant.nf b/subworkflows/local/variant_calling/call_snv_deepvariant.nf similarity index 91% rename from subworkflows/nf-core/call_snv_deepvariant.nf rename to subworkflows/local/variant_calling/call_snv_deepvariant.nf index 813dc9a9..a0757835 100644 --- a/subworkflows/nf-core/call_snv_deepvariant.nf +++ b/subworkflows/local/variant_calling/call_snv_deepvariant.nf @@ -2,11 +2,11 @@ // A variant caller workflow for deepvariant // -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_GL } from '../../modules/nf-core/bcftools/norm/main' -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../modules/nf-core/bcftools/norm/main' -include { DEEPVARIANT } from '../../modules/nf-core/deepvariant/main' -include { GLNEXUS } from '../../modules/nf-core/glnexus/main' -include { TABIX_TABIX as TABIX_GL } from '../../modules/nf-core/tabix/tabix/main' +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_GL } from '../../../modules/nf-core/bcftools/norm/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_GL } from '../../../modules/nf-core/bcftools/norm/main' +include { DEEPVARIANT } from '../../../modules/nf-core/deepvariant/main' +include { GLNEXUS } from '../../../modules/nf-core/glnexus/main' +include { TABIX_TABIX as TABIX_GL } from '../../../modules/nf-core/tabix/tabix/main' workflow CALL_SNV_DEEPVARIANT { take: diff --git a/subworkflows/local/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf similarity index 86% rename from subworkflows/local/call_snv_sentieon.nf rename to subworkflows/local/variant_calling/call_snv_sentieon.nf index f9f2c3cf..52dac412 100644 --- a/subworkflows/local/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -2,8 +2,8 @@ // A subworkflow to call SNVs by sentieon dnascope with a machine learning model. // -include { SENTIEON_DNASCOPE } from '../../modules/local/sentieon/dnascope' -include { SENTIEON_DNAMODELAPPLY } from '../../modules/local/sentieon/dnamodelapply' +include { SENTIEON_DNASCOPE } from '../../../modules/local/sentieon/dnascope' +include { SENTIEON_DNAMODELAPPLY } from '../../../modules/local/sentieon/dnamodelapply' workflow CALL_SNV_SENTIEON { take: diff --git a/subworkflows/nf-core/call_sv_manta.nf b/subworkflows/local/variant_calling/call_sv_manta.nf similarity index 95% rename from subworkflows/nf-core/call_sv_manta.nf rename to subworkflows/local/variant_calling/call_sv_manta.nf index a07251db..59e58ed7 100644 --- a/subworkflows/nf-core/call_sv_manta.nf +++ b/subworkflows/local/variant_calling/call_sv_manta.nf @@ -2,7 +2,7 @@ // A structural variant caller workflow for manta // -include { MANTA_GERMLINE as MANTA } from '../../modules/nf-core/manta/germline/main' +include { MANTA_GERMLINE as MANTA } from '../../../modules/nf-core/manta/germline/main' workflow CALL_SV_MANTA { take: diff --git a/subworkflows/nf-core/call_sv_tiddit.nf b/subworkflows/local/variant_calling/call_sv_tiddit.nf similarity index 82% rename from subworkflows/nf-core/call_sv_tiddit.nf rename to subworkflows/local/variant_calling/call_sv_tiddit.nf index 2dde0c31..53303239 100644 --- a/subworkflows/nf-core/call_sv_tiddit.nf +++ b/subworkflows/local/variant_calling/call_sv_tiddit.nf @@ -2,9 +2,8 @@ // A structural variant caller workflow for tiddit // -include { TIDDIT_SV } from '../../modules/nf-core/tiddit/sv/main' - -include { SVDB_MERGE as SVDB_MERGE_TIDDIT } from '../../modules/nf-core/svdb/merge/main' +include { TIDDIT_SV } from '../../../modules/nf-core/tiddit/sv/main' +include { SVDB_MERGE as SVDB_MERGE_TIDDIT } from '../../../modules/nf-core/svdb/merge/main' workflow CALL_SV_TIDDIT { take: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 95a575c3..9b470d3f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -86,7 +86,7 @@ include { FASTQC } from '../modules/nf-core/fastq include { MULTIQC } from '../modules/nf-core/multiqc/main' // -// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules +// SUBWORKFLOWS // include { ALIGN } from '../subworkflows/local/align' @@ -95,20 +95,20 @@ include { ANNOTATE_CSQ_PLI as ANN_CSQ_PLI_SNV } from '../subworkflows/local/an include { ANNOTATE_CSQ_PLI as ANN_CSQ_PLI_SV } from '../subworkflows/local/annotate_consequence_pli' include { ANNOTATE_SNVS } from '../subworkflows/local/annotate_snvs' include { ANNOTATE_STRUCTURAL_VARIANTS } from '../subworkflows/local/annotate_structural_variants' +include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/local/call_repeat_expansions' include { CALL_SNV } from '../subworkflows/local/call_snv' +include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/local/call_structural_variants' include { CHECK_INPUT } from '../subworkflows/local/check_input' include { GENS } from '../subworkflows/local/gens' include { PREPARE_REFERENCES } from '../subworkflows/local/prepare_references' +include { QC_BAM } from '../subworkflows/local/qc_bam' +include { RANK_VARIANTS as RANK_VARIANTS_SNV } from '../subworkflows/local/rank_variants' +include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/local/rank_variants' // // SUBWORKFLOW: Consists entirely of nf-core/modules // -include { CALL_REPEAT_EXPANSIONS } from '../subworkflows/nf-core/call_repeat_expansions' -include { CALL_STRUCTURAL_VARIANTS } from '../subworkflows/nf-core/call_structural_variants' -include { QC_BAM } from '../subworkflows/nf-core/qc_bam' -include { RANK_VARIANTS as RANK_VARIANTS_SNV } from '../subworkflows/nf-core/genmod' -include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/nf-core/genmod' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From d1ca81f3ab5434d7c606731705f1b5ecf3bf65f9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 4 Nov 2022 11:36:10 +0100 Subject: [PATCH 0786/1169] fix snv subworkflow --- modules/{nf-core => local}/ensemblvep/main.nf | 14 +++++---- .../{nf-core => local}/ensemblvep/meta.yml | 0 modules/local/filter_vep.nf | 8 ++--- modules/nf-core/ensemblvep/Dockerfile | 31 ------------------- modules/nf-core/ensemblvep/build.sh | 28 ----------------- modules/nf-core/ensemblvep/environment.yml | 10 ------ nextflow_schema.json | 2 +- subworkflows/local/annotate_snvs.nf | 28 +++++++++-------- .../local/annotate_structural_variants.nf | 6 +--- workflows/raredisease.nf | 15 ++++----- 10 files changed, 37 insertions(+), 105 deletions(-) rename modules/{nf-core => local}/ensemblvep/main.nf (82%) rename modules/{nf-core => local}/ensemblvep/meta.yml (100%) delete mode 100644 modules/nf-core/ensemblvep/Dockerfile delete mode 100755 modules/nf-core/ensemblvep/build.sh delete mode 100644 modules/nf-core/ensemblvep/environment.yml diff --git a/modules/nf-core/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf similarity index 82% rename from modules/nf-core/ensemblvep/main.nf rename to modules/local/ensemblvep/main.nf index fd2c893a..28e819f2 100644 --- a/modules/nf-core/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -2,10 +2,11 @@ process ENSEMBLVEP { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::ensembl-vep=106.1" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ensembl-vep:106.1--pl5321h4a94de4_0' : - 'quay.io/biocontainers/ensembl-vep:106.1--pl5321h4a94de4_0' }" + if (params.enable_conda) { + exit 1, "Conda environments cannot be used with vep at the moment. Please use Docker or Singularity containers." + } + + container "ensemblorg/ensembl-vep:release_107.0" input: tuple val(meta), path(vcf) @@ -23,7 +24,7 @@ process ENSEMBLVEP { tuple val(meta), path("*.ann.vcf.gz") , optional:true, emit: vcf_gz tuple val(meta), path("*.ann.tab.gz") , optional:true, emit: tab_gz tuple val(meta), path("*.ann.json.gz") , optional:true, emit: json_gz - path "*.summary.html" , emit: report + path "*.summary.html" , optional:true, emit: report path "versions.yml" , emit: versions when: @@ -34,6 +35,7 @@ process ENSEMBLVEP { def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json")? 'json' : args.contains("--tab")? 'tab' : 'vcf' def compress_out = args.contains("--compress_output") ? '.gz' : '' def prefix = task.ext.prefix ?: "${meta.id}" + def stats_file = args.contains("--no-stats") ? '' : "--stats_file ${prefix}.summary.html" def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" def reference = fasta ? "--fasta $fasta" : "" @@ -49,7 +51,7 @@ process ENSEMBLVEP { --cache_version $cache_version \\ --dir_cache $dir_cache \\ --fork $task.cpus \\ - --stats_file ${prefix}.summary.html \\ + ${stats_file} cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/ensemblvep/meta.yml b/modules/local/ensemblvep/meta.yml similarity index 100% rename from modules/nf-core/ensemblvep/meta.yml rename to modules/local/ensemblvep/meta.yml diff --git a/modules/local/filter_vep.nf b/modules/local/filter_vep.nf index 7d1fb448..3122b43b 100644 --- a/modules/local/filter_vep.nf +++ b/modules/local/filter_vep.nf @@ -2,10 +2,10 @@ process FILTER_VEP { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::ensembl-vep=105.0" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ensembl-vep:105.0--pl5321h4a94de4_1' : - 'quay.io/biocontainers/ensembl-vep:105.0--pl5321h4a94de4_1' }" + if (params.enable_conda) { + exit 1, "Conda environments cannot be used with vep at the moment. Please use Docker or Singularity containers." + } + container "ensemblorg/ensembl-vep:release_107.0" input: tuple val(meta), path(vcf) diff --git a/modules/nf-core/ensemblvep/Dockerfile b/modules/nf-core/ensemblvep/Dockerfile deleted file mode 100644 index 7d2c99c4..00000000 --- a/modules/nf-core/ensemblvep/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -FROM nfcore/base:1.14 -LABEL \ - author="Maxime Garcia" \ - description="VEP image for nf-core pipelines" \ - maintainer="maxime.garcia@scilifelab.se" - -# Install the conda environment -COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a - -# Setup default ARG variables -ARG GENOME=GRCh38 -ARG SPECIES=homo_sapiens -ARG VEP_CACHE_VERSION=106 -ARG VEP_VERSION=106.1 - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-vep-${VEP_VERSION}/bin:$PATH - -# Download Genome -RUN vep_install \ - -a c \ - -c .vep \ - -s ${SPECIES} \ - -y ${GENOME} \ - --CACHE_VERSION ${VEP_CACHE_VERSION} \ - --CONVERT \ - --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-vep-${VEP_VERSION} > nf-core-vep-${VEP_VERSION}.yml diff --git a/modules/nf-core/ensemblvep/build.sh b/modules/nf-core/ensemblvep/build.sh deleted file mode 100755 index eaa3ed5b..00000000 --- a/modules/nf-core/ensemblvep/build.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Build and push all containers - -build_push() { - GENOME=$1 - SPECIES=$2 - VEP_CACHE_VERSION=$3 - VEP_VERSION=$4 - - docker build \ - . \ - -t nfcore/vep:${VEP_VERSION}.${GENOME} \ - --build-arg GENOME=${GENOME} \ - --build-arg SPECIES=${SPECIES} \ - --build-arg VEP_CACHE_VERSION=${VEP_CACHE_VERSION} \ - --build-arg VEP_VERSION=${VEP_VERSION} - - docker push nfcore/vep:${VEP_VERSION}.${GENOME} -} - -build_push "GRCh37" "homo_sapiens" "106" "106.1" -build_push "GRCh38" "homo_sapiens" "106" "106.1" -build_push "GRCm38" "mus_musculus" "102" "106.1" -build_push "GRCm39" "mus_musculus" "106" "106.1" -build_push "CanFam3.1" "canis_lupus_familiaris" "104" "106.1" -build_push "WBcel235" "caenorhabditis_elegans" "106" "106.1" diff --git a/modules/nf-core/ensemblvep/environment.yml b/modules/nf-core/ensemblvep/environment.yml deleted file mode 100644 index d378f810..00000000 --- a/modules/nf-core/ensemblvep/environment.yml +++ /dev/null @@ -1,10 +0,0 @@ -# You can use this file to create a conda environment for this module: -# conda env create -f environment.yml -name: nf-core-vep-106.1 -channels: - - conda-forge - - bioconda - - defaults - -dependencies: - - bioconda::ensembl-vep=106.1 diff --git a/nextflow_schema.json b/nextflow_schema.json index 47477439..c0130d67 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -473,7 +473,7 @@ "default": "104", "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", - "enum": ["104", "105", "106"] + "enum": ["104", "105", "106", "107"] } } }, diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 01742abf..d36b5d40 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -2,11 +2,11 @@ // A subworkflow to annotate snvs // -include { VCFANNO } from '../../modules/nf-core/vcfanno/main' -include { BCFTOOLS_ROH } from '../../modules/nf-core/bcftools/roh/main' -include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhocall/annotate/main' -include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/nf-core/ensemblvep/main' -include { TABIX_TABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/tabix/tabix/main' +include { VCFANNO } from '../../modules/nf-core/vcfanno/main' +include { BCFTOOLS_ROH } from '../../modules/nf-core/bcftools/roh/main' +include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhocall/annotate/main' +include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' +include { TABIX_BGZIPTABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/tabix/bgziptabix/main' workflow ANNOTATE_SNVS { @@ -26,13 +26,6 @@ workflow ANNOTATE_SNVS { ch_versions = Channel.empty() ch_toml = Channel.fromPath(vcfanno_toml) - // - // annotate vcfanno - // - - VCFANNO (vcf, ch_toml, vcfanno_resource_dir) - ch_versions = ch_versions.mix(VCFANNO.out.versions) - // // annotate rhocall // @@ -67,7 +60,16 @@ workflow ANNOTATE_SNVS { TABIX_SNV_ANNO (RHOCALL_ANNOTATE.out.vcf) ch_versions = ch_versions.mix(TABIX_SNV_ANNO.out.versions) - ENSEMBLVEP_SNV(RHOCALL_ANNOTATE.out.vcf, + // + // annotate vcfanno + // + VCFANNO (TABIX_SNV_ANNO.out.gz_tbi, ch_toml, vcfanno_resource_dir) + ch_versions = ch_versions.mix(VCFANNO.out.versions) + + // + // annotate vep + // + ENSEMBLVEP_SNV(VCFANNO.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 8d5c73a4..0d71639a 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -5,8 +5,7 @@ include { SVDB_QUERY } from '../../modules/nf-core/svdb/query/main' include { PICARD_SORTVCF } from '../../modules/nf-core/picard/sortvcf/main' include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' -include { TABIX_TABIX as TABIX_SV_ANNO } from '../../modules/nf-core/tabix/tabix/main' -include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/nf-core/ensemblvep/main' +include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { @@ -57,9 +56,6 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { BCFTOOLS_VIEW(ch_sortvcf,[],[],[]) ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) - TABIX_SV_ANNO (BCFTOOLS_VIEW.out.vcf) - ch_versions = ch_versions.mix(TABIX_SV_ANNO.out.versions) - ENSEMBLVEP_SV(BCFTOOLS_VIEW.out.vcf, vep_genome, "homo_sapiens", diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 9b470d3f..64eee078 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -368,14 +368,20 @@ workflow RAREDISEASE { params.genome, params.vep_cache_version, ch_vep_cache, - ch_genome_fasta_meta, + ch_genome_fasta_no_meta, ch_gnomad_af, CHECK_INPUT.out.samples ).set {ch_snv_annotate} ch_versions = ch_versions.mix(ch_snv_annotate.versions) - RANK_VARIANTS_SNV ( + ANN_CSQ_PLI_SNV ( ch_snv_annotate.vcf_ann, + ch_variant_consequences, + ch_pli_per_gene + ) + + RANK_VARIANTS_SNV ( + ANN_CSQ_PLI_SNV.out.vcf_ann, MAKE_PED.out.ped, ch_reduced_penetrance, ch_score_config_snv @@ -387,11 +393,6 @@ workflow RAREDISEASE { ch_vep_filters ) - ANN_CSQ_PLI_SNV ( - FILTER_VEP_SNV.out.vcf, - RANK_VARIANTS_SNV.out.vcf, - ch_variant_consequences - ) } // From 5a38244b02aa38d37d216d57aa454d502325dba3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 5 Nov 2022 06:23:48 +0100 Subject: [PATCH 0787/1169] include gatk printreads --- conf/modules.config | 10 ++- modules/local/gatk4/printreads/main.nf | 56 ++++++++++++++++ modules/local/gatk4/printreads/meta.yml | 64 +++++++++++++++++++ subworkflows/local/analyse_MT.nf | 11 ++-- .../mitochondria/convert_mt_bam_to_fastq.nf | 13 ++-- workflows/raredisease.nf | 1 + 6 files changed, 142 insertions(+), 13 deletions(-) create mode 100644 modules/local/gatk4/printreads/main.nf create mode 100644 modules/local/gatk4/printreads/meta.yml diff --git a/conf/modules.config b/conf/modules.config index f98dddba..611038a0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -754,10 +754,14 @@ process { // process { - withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:SAMTOOLS_VIEW_MT' { + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_PRINTREADS_MT' { + beforeScript = {"mkdir ./tmp"} ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } - ext.args = { '-h ' } - ext.args2 = { (params.genome == "GRCh37") ? "MT" : "chrM" } + ext.args = [ + params.genome == "GRCh37" ? "-L MT" : "-L chrM", + "--read-filter MateOnSameContigOrNoMappedMateReadFilter", + "--read-filter MateUnmappedAndUnmappedReadFilter" + ].join(" ").trim() } withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_REVERTSAM_MT' { diff --git a/modules/local/gatk4/printreads/main.nf b/modules/local/gatk4/printreads/main.nf new file mode 100644 index 00000000..795def9f --- /dev/null +++ b/modules/local/gatk4/printreads/main.nf @@ -0,0 +1,56 @@ +process GATK4_PRINTREADS { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(bam), path(bai) + tuple val(meta2), path(fasta) + path (fai) + path (dict) + + output: + tuple val(meta), path("*.reads.bam"), emit: bam + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK PrintReads] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" PrintReads \\ + $args \\ + --reference $fasta \\ + --input $bam \\ + --read-index $bai \\ + --output ${prefix}.reads.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.reads.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/gatk4/printreads/meta.yml b/modules/local/gatk4/printreads/meta.yml new file mode 100644 index 00000000..79050411 --- /dev/null +++ b/modules/local/gatk4/printreads/meta.yml @@ -0,0 +1,64 @@ +name: "gatk4_printreads" +description: Print reads in the SAM/BAM/CRAM file +keywords: + - printreads +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" + - meta2: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: reference fasta file + pattern: "*.{fa,fasta}" + - fai: + type: file + description: reference fasta index file + pattern: "*.{fai}" + - dict: + type: file + description: reference fasta dictionary file + pattern: "*.{dict}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - bam: + type: file + description: Sorted BAM/CRAM file + pattern: "*.{bam,cram}" + +authors: + - "@ramprasadn" diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index ca12f290..fc7957d8 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -10,7 +10,8 @@ workflow ANALYSE_MT { take: bam // channel: [ val(meta), file(bam), file(bai) ] genome_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] - genome_fasta // channel: [ genome.fasta ] + genome_fasta_no_meta // channel: [ genome.fasta ] + genome_fasta_meta // channel: [ [], genome.fasta ] genome_dict // channel: [ genome.dict ] genome_fai // channel: [ genome.fai ] mt_intervals // channel: [ file(non_control_region.chrM.interval_list) ] @@ -25,15 +26,15 @@ workflow ANALYSE_MT { ch_versions = Channel.empty() // STEP 1: PREPARING MT ALIGNMENT - CONVERT_MT_BAM_TO_FASTQ ( bam ) + CONVERT_MT_BAM_TO_FASTQ ( bam , genome_fasta_meta, genome_fai, genome_dict, ) ch_versions = ch_versions.mix(CONVERT_MT_BAM_TO_FASTQ.out.versions)// Outputs bam files - //STEP 2.1: MT ALLIGNMENT AND VARIANT CALLING + //STEP 2.1: MT ALIGNMENT AND VARIANT CALLING ALIGN_AND_CALL_MT ( CONVERT_MT_BAM_TO_FASTQ.out.fastq, CONVERT_MT_BAM_TO_FASTQ.out.bam, genome_bwamem2_index, - genome_fasta, + genome_fasta_no_meta, genome_dict, genome_fai, mt_intervals @@ -56,7 +57,7 @@ workflow ANALYSE_MT { ALIGN_AND_CALL_MT_SHIFT.out.vcf, genome_dict, shift_mt_backchain, - genome_fasta) + genome_fasta_no_meta) ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions) diff --git a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf index 60228de8..19644b90 100644 --- a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf +++ b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf @@ -2,23 +2,26 @@ // Prepare bam files for MT allignment // -include { SAMTOOLS_VIEW as SAMTOOLS_VIEW_MT } from '../../../modules/nf-core/samtools/view/main' +include { GATK4_PRINTREADS as GATK4_PRINTREADS_MT } from '../../../modules/local/gatk4/printreads/main' include { GATK4_REVERTSAM as GATK4_REVERTSAM_MT } from '../../../modules/nf-core/gatk4/revertsam/main' include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../../modules/nf-core/gatk4/samtofastq/main' workflow CONVERT_MT_BAM_TO_FASTQ { take: - bam // channel: [ val(meta), file(bam), file(bai) ] + bam // channel: [ val(meta), file(bam), file(bai) ] + genome_fasta_meta // channel: [ [], genome.fasta ] + genome_fai // channel: [ genome.fai ] + genome_dict // channel: [ genome.dict ] main: ch_versions = Channel.empty() // Outputs bam containing only MT - SAMTOOLS_VIEW_MT ( bam, [], [] ) - ch_versions = ch_versions.mix(SAMTOOLS_VIEW_MT.out.versions.first()) + GATK4_PRINTREADS_MT ( bam, genome_fasta_meta, genome_fai, genome_dict ) + ch_versions = ch_versions.mix(GATK4_PRINTREADS_MT.out.versions.first()) // Removes alignment information - GATK4_REVERTSAM_MT ( SAMTOOLS_VIEW_MT.out.bam ) + GATK4_REVERTSAM_MT ( GATK4_PRINTREADS_MT.out.bam ) ch_versions = ch_versions.mix(GATK4_REVERTSAM_MT.out.versions.first()) // Outputs fastq files diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 64eee078..ef6238ad 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -345,6 +345,7 @@ workflow RAREDISEASE { ch_mapped.bam_bai, ch_bwamem2_index, ch_genome_fasta_no_meta, + ch_genome_fasta_meta, ch_sequence_dictionary, ch_genome_fai, ch_mt_intervals, From 94edd0397ffb10221c41f6c9b7f54be5b21abaf0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 5 Nov 2022 06:33:39 +0100 Subject: [PATCH 0788/1169] update modules.json --- modules.json | 8 --- modules/nf-core/samtools/view/main.nf | 66 --------------------- modules/nf-core/samtools/view/meta.yml | 79 -------------------------- 3 files changed, 153 deletions(-) delete mode 100644 modules/nf-core/samtools/view/main.nf delete mode 100644 modules/nf-core/samtools/view/meta.yml diff --git a/modules.json b/modules.json index 9ec7ddef..59643d80 100644 --- a/modules.json +++ b/modules.json @@ -61,10 +61,6 @@ "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, - "ensemblvep": { - "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" - }, "expansionhunter": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" @@ -185,10 +181,6 @@ "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, - "samtools/view": { - "branch": "master", - "git_sha": "202683bfc98ddecdd456ea73268e330bca2e5c5a" - }, "stranger": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" diff --git a/modules/nf-core/samtools/view/main.nf b/modules/nf-core/samtools/view/main.nf deleted file mode 100644 index b2f5c678..00000000 --- a/modules/nf-core/samtools/view/main.nf +++ /dev/null @@ -1,66 +0,0 @@ -process SAMTOOLS_VIEW { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" - - input: - tuple val(meta), path(input), path(index) - path fasta - path qname - - output: - tuple val(meta), path("*.bam"), emit: bam, optional: true - tuple val(meta), path("*.cram"), emit: cram, optional: true - tuple val(meta), path("*.sam"), emit: sam, optional: true - tuple val(meta), path("*.bai"), emit: bai, optional: true - tuple val(meta), path("*.csi"), emit: csi, optional: true - tuple val(meta), path("*.crai"), emit: crai, optional: true - path "versions.yml", emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def reference = fasta ? "--reference ${fasta}" : "" - def readnames = qname ? "--qname-file ${qname}": "" - def file_type = args.contains("--output-fmt sam") ? "sam" : - args.contains("--output-fmt bam") ? "bam" : - args.contains("--output-fmt cram") ? "cram" : - input.getExtension() - if ("$input" == "${prefix}.${file_type}") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" - """ - samtools \\ - view \\ - --threads ${task.cpus-1} \\ - ${reference} \\ - ${readnames} \\ - $args \\ - -o ${prefix}.${file_type} \\ - $input \\ - $args2 - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.bam - touch ${prefix}.cram - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/samtools/view/meta.yml b/modules/nf-core/samtools/view/meta.yml deleted file mode 100644 index a52e4f8d..00000000 --- a/modules/nf-core/samtools/view/meta.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: samtools_view -description: filter/convert SAM/BAM/CRAM file -keywords: - - view - - bam - - sam - - cram -tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - index: - type: optional file - description: BAM.BAI/CRAM.CRAI file - pattern: "*.{.bai,.crai}" - - fasta: - type: optional file - description: Reference file the CRAM was created with - pattern: "*.{fasta,fa}" - - qname: - type: file - description: Optional file with read names to output only select alignments - pattern: "*.{txt,list}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: optional filtered/converted BAM file - pattern: "*.{bam}" - - cram: - type: file - description: optional filtered/converted CRAM file - pattern: "*.{cram}" - - sam: - type: file - description: optional filtered/converted SAM file - pattern: "*.{sam}" - # bai, csi, and crai are created with `--write-index` - - bai: - type: file - description: optional BAM file index - pattern: "*.{bai}" - - csi: - type: file - description: optional tabix BAM file index - pattern: "*.{csi}" - - crai: - type: file - description: optional CRAM file index - pattern: "*.{crai}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@drpatelh" - - "@joseespinosa" - - "@FriederikeHanssen" - - "@priyanka-surana" From 050147c1d6a255cb3fd449869faffb81ab591893 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 5 Nov 2022 22:58:00 +0100 Subject: [PATCH 0789/1169] fix typo --- modules/local/ensemblvep/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index 28e819f2..a893c4d5 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -35,7 +35,7 @@ process ENSEMBLVEP { def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json")? 'json' : args.contains("--tab")? 'tab' : 'vcf' def compress_out = args.contains("--compress_output") ? '.gz' : '' def prefix = task.ext.prefix ?: "${meta.id}" - def stats_file = args.contains("--no-stats") ? '' : "--stats_file ${prefix}.summary.html" + def stats_file = args.contains("--no_stats") ? '' : "--stats_file ${prefix}.summary.html" def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" def reference = fasta ? "--fasta $fasta" : "" From 646ba8049a7d55a8e828351186b7f5feaf2d46ab Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 6 Nov 2022 01:00:31 +0100 Subject: [PATCH 0790/1169] add bcftools view --- conf/modules.config | 9 +++++++++ subworkflows/local/annotate_snvs.nf | 18 +++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f98dddba..a80641c0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -701,6 +701,15 @@ process { ] } + withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { + ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70 | INFO/SWEGENAF > 0.70" ' } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { ext.args = [ '--plugin LoFtool,vep_cache/LoFtool_scores.txt', diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index d36b5d40..c8537043 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -4,9 +4,11 @@ include { VCFANNO } from '../../modules/nf-core/vcfanno/main' include { BCFTOOLS_ROH } from '../../modules/nf-core/bcftools/roh/main' +include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhocall/annotate/main' include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' -include { TABIX_BGZIPTABIX as TABIX_SNV_ANNO } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_BGZIPTABIX as TABIX_ROHCALL } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_BGZIPTABIX as TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' workflow ANNOTATE_SNVS { @@ -57,19 +59,25 @@ workflow ANNOTATE_SNVS { RHOCALL_ANNOTATE (vcf, ch_roh_rhocall, []) - TABIX_SNV_ANNO (RHOCALL_ANNOTATE.out.vcf) - ch_versions = ch_versions.mix(TABIX_SNV_ANNO.out.versions) + TABIX_ROHCALL (RHOCALL_ANNOTATE.out.vcf) + ch_versions = ch_versions.mix(TABIX_ROHCALL.out.versions) // // annotate vcfanno // - VCFANNO (TABIX_SNV_ANNO.out.gz_tbi, ch_toml, vcfanno_resource_dir) + VCFANNO (TABIX_ROHCALL.out.gz_tbi, ch_toml, vcfanno_resource_dir) ch_versions = ch_versions.mix(VCFANNO.out.versions) + TABIX_VCFANNO (VCFANNO.out.vcf) + ch_versions = ch_versions.mix(TABIX_VCFANNO.out.versions) + + BCFTOOLS_VIEW(TABIX_VCFANNO.out.gz_tbi,[],[],[]) + ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) + // // annotate vep // - ENSEMBLVEP_SNV(VCFANNO.out.vcf, + ENSEMBLVEP_SNV(BCFTOOLS_VIEW.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, From 2ff66b7f9053203ef23963a63c43954061e97812 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 6 Nov 2022 19:27:51 +0100 Subject: [PATCH 0791/1169] update file suffix --- conf/modules.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index a455464a..3c1f31cf 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -621,6 +621,7 @@ process { } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:BCFTOOLS_VIEW' { + ext.prefix = { "${meta.id}_view" } publishDir = [ enabled: false, ] @@ -702,6 +703,7 @@ process { } withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { + ext.prefix = { "${meta.id}_view" } ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70 | INFO/SWEGENAF > 0.70" ' } publishDir = [ path: { "${params.outdir}/snv_annotation" }, From fa02328e58c9998e0a5f7da8993f2f837ff67741 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 6 Nov 2022 22:37:33 +0100 Subject: [PATCH 0792/1169] add split intervals --- modules.json | 4 ++ modules/local/create_bed_from_fai.nf | 38 +++++++++++++ modules/nf-core/gatk4/splitintervals/main.nf | 48 +++++++++++++++++ modules/nf-core/gatk4/splitintervals/meta.yml | 53 +++++++++++++++++++ subworkflows/local/prepare_references.nf | 1 + subworkflows/local/scatter_genome.nf | 24 +++++++++ workflows/raredisease.nf | 26 ++++++--- 7 files changed, 186 insertions(+), 8 deletions(-) create mode 100644 modules/local/create_bed_from_fai.nf create mode 100644 modules/nf-core/gatk4/splitintervals/main.nf create mode 100644 modules/nf-core/gatk4/splitintervals/meta.yml create mode 100644 subworkflows/local/scatter_genome.nf diff --git a/modules.json b/modules.json index 59643d80..79bb1f15 100644 --- a/modules.json +++ b/modules.json @@ -97,6 +97,10 @@ "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, + "gatk4/splitintervals": { + "branch": "master", + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + }, "genmod/annotate": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" diff --git a/modules/local/create_bed_from_fai.nf b/modules/local/create_bed_from_fai.nf new file mode 100644 index 00000000..a4b13898 --- /dev/null +++ b/modules/local/create_bed_from_fai.nf @@ -0,0 +1,38 @@ +process BUILD_BED { + tag "$meta.id" + + conda (params.enable_conda ? "anaconda::gawk=5.1.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gawk:5.1.0' : + 'quay.io/biocontainers/gawk:5.1.0' }" + + input: + tuple val(meta), path(fasta_fai) + + output: + tuple val(meta), path("*.bed") , emit: bed + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + """ + awk 'BEGIN {SEP="\t"}; {print \$1 SEP "0" SEP \$2}' ${fasta_fai} > ${fasta_fai.baseName}.bed + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gawk: \$(awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//') + END_VERSIONS + """ + + stub: + """ + touch chr.bed + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gawk: \$(awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/gatk4/splitintervals/main.nf b/modules/nf-core/gatk4/splitintervals/main.nf new file mode 100644 index 00000000..5473ae42 --- /dev/null +++ b/modules/nf-core/gatk4/splitintervals/main.nf @@ -0,0 +1,48 @@ +process GATK4_SPLITINTERVALS { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(intervals) + path(fasta) + path(fasta_fai) + path(dict) + + output: + tuple val(meta), path("**.interval_list"), emit: split_intervals + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--reference $fasta" : "" + + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK SplitIntervals] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + + """ + gatk --java-options "-Xmx${avail_mem}g" SplitIntervals \\ + --output ${prefix} \\ + --intervals $intervals \\ + $reference \\ + --tmp-dir . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/gatk4/splitintervals/meta.yml b/modules/nf-core/gatk4/splitintervals/meta.yml new file mode 100644 index 00000000..ba557544 --- /dev/null +++ b/modules/nf-core/gatk4/splitintervals/meta.yml @@ -0,0 +1,53 @@ +name: gatk4_splitintervals +keywords: + - interval + - bed +tools: + - gatk4: + description: Genome Analysis Toolkit (GATK4) + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + tool_dev_url: https://github.com/broadinstitute/gatk + doi: "10.1158/1538-7445.AM2017-3590" + licence: ["BSD-3-clause"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - interval: + type: file + description: Interval list or BED + pattern: "*.{interval,interval_list,bed}" + - fasta: + type: file + description: Reference FASTA + pattern: "*.{fa,fasta}" + - fasta_fai: + type: file + description: Reference FASTA index + pattern: "*.fai" + - dict: + type: file + description: Reference sequence dictionary + pattern: "*.dict" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - bed: + type: file + description: A list of scattered interval lists + pattern: "*.interval_list" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@nvnieuwk" diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index ddb3f806..d3186d7f 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -101,6 +101,7 @@ workflow PREPARE_REFERENCES { bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() fasta_fai = SAMTOOLS_FAIDX_GENOME.out.fai.map{ meta, fai -> [fai] }.collect() + fasta_fai_meta = SAMTOOLS_FAIDX_GENOME.out.fai.collect() fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] }.collect() gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi.collect() gnomad_tbi = CHECK_VCF.out.index.collect() diff --git a/subworkflows/local/scatter_genome.nf b/subworkflows/local/scatter_genome.nf new file mode 100644 index 00000000..2d8e0217 --- /dev/null +++ b/subworkflows/local/scatter_genome.nf @@ -0,0 +1,24 @@ +include { BUILD_BED } from '../../modules/local/create_bed_from_fai' +include { GATK4_SPLITINTERVALS } from '../../modules/nf-core/gatk4/splitintervals/main' +workflow SCATTER_GENOME { + + take: + dict + fai_meta // channel: [ val(meta), path(vcf) ] + fai_no_meta + fasta_no_meta + + + main: + ch_versions = Channel.empty() + + BUILD_BED (fai_meta) + ch_versions = ch_versions.mix(BUILD_BED.out.versions) + + GATK4_SPLITINTERVALS(BUILD_BED.out.bed, fasta_no_meta, fai_no_meta, dict) + ch_versions = ch_versions.mix(GATK4_SPLITINTERVALS.out.versions) + + emit: + bed = BUILD_BED.out.bed + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index ef6238ad..1c06a22b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -104,7 +104,7 @@ include { PREPARE_REFERENCES } from '../subworkflows/local/pr include { QC_BAM } from '../subworkflows/local/qc_bam' include { RANK_VARIANTS as RANK_VARIANTS_SNV } from '../subworkflows/local/rank_variants' include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/local/rank_variants' - +include { SCATTER_GENOME } from '../subworkflows/local/scatter_genome' // // SUBWORKFLOW: Consists entirely of nf-core/modules // @@ -208,8 +208,10 @@ workflow RAREDISEASE { ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift).collect() : ( ch_references.bwamem2_index_mt_shift ?: Channel.empty() ) ch_chrom_sizes = ch_references.chrom_sizes - ch_genome_fai = params.fasta_fai ? Channel.fromPath(params.fasta_fai).collect() + ch_genome_fai_no_meta = params.fasta_fai ? Channel.fromPath(params.fasta_fai).collect() : ( ch_references.fasta_fai ?: Channel.empty() ) + ch_genome_fai_meta = params.fasta_fai ? Channel.fromPath(params.fasta_fai).map {it -> [[id:it[0].simpleName], it]}.collect() + : ( ch_references.fasta_fai_meta ?: Channel.empty() ) ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift).collect() : ( ch_references.fasta_fai_mt_shift ?: Channel.empty() ) ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx).collect() @@ -230,12 +232,20 @@ workflow RAREDISEASE { : Channel.fromPath(params.vcfanno_resources).collect() ch_versions = ch_versions.mix(ch_references.versions) + // CREATE CHROMOSOME BED AND INTERVALS + SCATTER_GENOME ( + ch_sequence_dictionary, + ch_genome_fai_meta, + ch_genome_fai_no_meta, + ch_genome_fasta_no_meta + ) + // ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( params.aligner, CHECK_INPUT.out.reads, ch_genome_fasta_no_meta, - ch_genome_fai, + ch_genome_fai_no_meta, ch_bwa_index, ch_bwamem2_index, ch_known_dbsnp, @@ -249,7 +259,7 @@ workflow RAREDISEASE { ch_mapped.marked_bam, ch_mapped.marked_bai, ch_genome_fasta_no_meta, - ch_genome_fai, + ch_genome_fai_no_meta, ch_bait_intervals, ch_target_intervals, ch_chrom_sizes @@ -270,7 +280,7 @@ workflow RAREDISEASE { params.variant_caller, ch_mapped.bam_bai, ch_genome_fasta_no_meta, - ch_genome_fai, + ch_genome_fai_no_meta, ch_known_dbsnp, ch_known_dbsnp_tbi, ch_call_interval, @@ -285,7 +295,7 @@ workflow RAREDISEASE { ch_bwa_index, ch_genome_fasta_no_meta, ch_genome_fasta_meta, - ch_genome_fai, + ch_genome_fai_no_meta, CHECK_INPUT.out.case_info, ch_target_bed, params.cnvpytor_binsizes @@ -298,7 +308,7 @@ workflow RAREDISEASE { ch_mapped.bam_bai, CALL_SNV.out.vcf, ch_genome_fasta_meta, - ch_genome_fai, + ch_genome_fai_no_meta, file(params.gens_interval_list), file(params.gens_pon), file(params.gens_gnomad_pos), @@ -347,7 +357,7 @@ workflow RAREDISEASE { ch_genome_fasta_no_meta, ch_genome_fasta_meta, ch_sequence_dictionary, - ch_genome_fai, + ch_genome_fai_no_meta, ch_mt_intervals, ch_bwamem2_index_mt_shift, ch_mt_fasta_shift_no_meta, From 8cd1a2c8331985a99408c0c19c475f50a58fa87d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 6 Nov 2022 23:02:08 +0100 Subject: [PATCH 0793/1169] update modules config --- conf/modules.config | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 3c1f31cf..7205540e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -267,6 +267,24 @@ process { } +// +// Create bed and interval files for scatter operations +// + +process { + withName: '.*SCATTER_GENOME:GATK4_SPLITINTERVALS' { + ext.args = { "--subdivision-mode BALANCING_WITHOUT_INTERVAL_SUBDIVISION --scatter-count 22" } + ext.when = { params.annotate_snv_switch } + ext.prefix = { "${meta.id}_genome_intervals" } + publishDir = [ + enabled: params.save_reference, + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} + // // Bwamem2 alignment options // From 304b80ae82855103c6429822285025d06b75b6e6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 6 Nov 2022 23:03:52 +0100 Subject: [PATCH 0794/1169] update emit --- subworkflows/local/scatter_genome.nf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/scatter_genome.nf b/subworkflows/local/scatter_genome.nf index 2d8e0217..65315bb9 100644 --- a/subworkflows/local/scatter_genome.nf +++ b/subworkflows/local/scatter_genome.nf @@ -19,6 +19,7 @@ workflow SCATTER_GENOME { ch_versions = ch_versions.mix(GATK4_SPLITINTERVALS.out.versions) emit: - bed = BUILD_BED.out.bed - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + bed = BUILD_BED.out.bed + split_intervals = GATK4_SPLITINTERVALS.out.split_intervals + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 22eda70a9a5af129c11f980d01874aae3a20c55d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 6 Nov 2022 23:05:02 +0100 Subject: [PATCH 0795/1169] add selectvariants --- modules.json | 4 ++ modules/nf-core/gatk4/selectvariants/main.nf | 43 +++++++++++++++ modules/nf-core/gatk4/selectvariants/meta.yml | 55 +++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 modules/nf-core/gatk4/selectvariants/main.nf create mode 100644 modules/nf-core/gatk4/selectvariants/meta.yml diff --git a/modules.json b/modules.json index 79bb1f15..9b55b923 100644 --- a/modules.json +++ b/modules.json @@ -97,6 +97,10 @@ "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, + "gatk4/selectvariants": { + "branch": "master", + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + }, "gatk4/splitintervals": { "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" diff --git a/modules/nf-core/gatk4/selectvariants/main.nf b/modules/nf-core/gatk4/selectvariants/main.nf new file mode 100644 index 00000000..ac385f4f --- /dev/null +++ b/modules/nf-core/gatk4/selectvariants/main.nf @@ -0,0 +1,43 @@ +process GATK4_SELECTVARIANTS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(vcf), path(vcf_idx) + + output: + tuple val(meta), path("*.selectvariants.vcf.gz") , emit: vcf + tuple val(meta), path("*.selectvariants.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK VariantFiltration] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.toGiga() + } + """ + gatk --java-options "-Xmx${avail_mem}G" SelectVariants \\ + --variant $vcf \\ + --output ${prefix}.selectvariants.vcf.gz \\ + --tmp-dir . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/gatk4/selectvariants/meta.yml b/modules/nf-core/gatk4/selectvariants/meta.yml new file mode 100644 index 00000000..381af249 --- /dev/null +++ b/modules/nf-core/gatk4/selectvariants/meta.yml @@ -0,0 +1,55 @@ +name: gatk4_selectvariants +description: Select a subset of variants from a VCF file +keywords: + - gatk + - gatk4 + - selectvariants + - vcf +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360036362532-SelectVariants + tool_dev_url: https://github.com/broadinstitute/gatk + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - vcf: + type: list + description: VCF(.gz) file + pattern: "*.{vcf,vcf.gz}" + - vcf_idx: + type: list + description: VCF file index + pattern: "*.{idx,tbi}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: Compressed VCF file + pattern: "*.selectvariants.vcf.gz" + - vcf_tbi: + type: list + description: VCF file index + pattern: "*.{idx,tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@mjcipriano" From 68265db604d9e50070692eca833eeaf614d8bbe9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 03:15:12 +0100 Subject: [PATCH 0796/1169] selectvariants --- modules/local/gatk4/selectvariants/main.nf | 57 +++++++++++++++++++++ modules/local/gatk4/selectvariants/meta.yml | 55 ++++++++++++++++++++ subworkflows/local/annotate_snvs.nf | 21 ++++++-- subworkflows/local/scatter_genome.nf | 5 +- workflows/raredisease.nf | 6 ++- 5 files changed, 135 insertions(+), 9 deletions(-) create mode 100644 modules/local/gatk4/selectvariants/main.nf create mode 100644 modules/local/gatk4/selectvariants/meta.yml diff --git a/modules/local/gatk4/selectvariants/main.nf b/modules/local/gatk4/selectvariants/main.nf new file mode 100644 index 00000000..c4364ea4 --- /dev/null +++ b/modules/local/gatk4/selectvariants/main.nf @@ -0,0 +1,57 @@ +process GATK4_SELECTVARIANTS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(vcf), path(vcf_idx) + path (intervals_list) + + output: + tuple val(meta), path("*.selectvariants.vcf.gz") , emit: vcf + tuple val(meta), path("*.selectvariants.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def interval = intervals_list ? "--intervals ${intervals_list}" : "" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK SelectVariants] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.toGiga() + } + """ + gatk --java-options "-Xmx${avail_mem}G" SelectVariants \\ + --variant $vcf \\ + --output ${prefix}.selectvariants.vcf.gz \\ + $interval \\ + --tmp-dir . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.selectvariants.vcf.gz + touch ${prefix}.selectvariants.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/gatk4/selectvariants/meta.yml b/modules/local/gatk4/selectvariants/meta.yml new file mode 100644 index 00000000..381af249 --- /dev/null +++ b/modules/local/gatk4/selectvariants/meta.yml @@ -0,0 +1,55 @@ +name: gatk4_selectvariants +description: Select a subset of variants from a VCF file +keywords: + - gatk + - gatk4 + - selectvariants + - vcf +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360036362532-SelectVariants + tool_dev_url: https://github.com/broadinstitute/gatk + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - vcf: + type: list + description: VCF(.gz) file + pattern: "*.{vcf,vcf.gz}" + - vcf_idx: + type: list + description: VCF file index + pattern: "*.{idx,tbi}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: Compressed VCF file + pattern: "*.selectvariants.vcf.gz" + - vcf_tbi: + type: list + description: VCF file index + pattern: "*.{idx,tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@mjcipriano" diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index c8537043..8ef4fdb0 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -9,7 +9,8 @@ include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhoc include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' include { TABIX_BGZIPTABIX as TABIX_ROHCALL } from '../../modules/nf-core/tabix/bgziptabix/main' include { TABIX_BGZIPTABIX as TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' - +include { TABIX_TABIX as TABIX_BCFTOOLS } from '../../modules/nf-core/tabix/tabix/main' +include { GATK4_SELECTVARIANTS } from '../../modules/local/gatk4/selectvariants/main' workflow ANNOTATE_SNVS { @@ -22,11 +23,13 @@ workflow ANNOTATE_SNVS { vep_cache fasta gnomad_af + split_intervals samples main: - ch_versions = Channel.empty() - ch_toml = Channel.fromPath(vcfanno_toml) + ch_versions = Channel.empty() + ch_toml = Channel.fromPath(vcfanno_toml) + ch_vcf_scatter_in = Channel.empty() // // annotate rhocall @@ -74,10 +77,18 @@ workflow ANNOTATE_SNVS { BCFTOOLS_VIEW(TABIX_VCFANNO.out.gz_tbi,[],[],[]) ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) + TABIX_BCFTOOLS (BCFTOOLS_VIEW.out.vcf) + ch_versions = ch_versions.mix(TABIX_BCFTOOLS.out.versions) + + BCFTOOLS_VIEW.out.vcf.join(TABIX_BCFTOOLS.out.tbi).collect().set { ch_vcf_scatter_in } + + GATK4_SELECTVARIANTS (ch_vcf_scatter_in, split_intervals) + ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions) + // // annotate vep // - ENSEMBLVEP_SNV(BCFTOOLS_VIEW.out.vcf, + ENSEMBLVEP_SNV(GATK4_SELECTVARIANTS.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, @@ -88,6 +99,6 @@ workflow ANNOTATE_SNVS { ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) emit: - vcf_ann = ENSEMBLVEP_SNV.out.vcf + vcf_ann = BCFTOOLS_VIEW.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/scatter_genome.nf b/subworkflows/local/scatter_genome.nf index 65315bb9..d60a04fc 100644 --- a/subworkflows/local/scatter_genome.nf +++ b/subworkflows/local/scatter_genome.nf @@ -8,7 +8,6 @@ workflow SCATTER_GENOME { fai_no_meta fasta_no_meta - main: ch_versions = Channel.empty() @@ -19,7 +18,7 @@ workflow SCATTER_GENOME { ch_versions = ch_versions.mix(GATK4_SPLITINTERVALS.out.versions) emit: - bed = BUILD_BED.out.bed - split_intervals = GATK4_SPLITINTERVALS.out.split_intervals + bed = BUILD_BED.out.bed.collect() + split_intervals = GATK4_SPLITINTERVALS.out.split_intervals.map { meta, it -> it }.flatten().collate(1) versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 1c06a22b..e0f91b01 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -238,7 +238,10 @@ workflow RAREDISEASE { ch_genome_fai_meta, ch_genome_fai_no_meta, ch_genome_fasta_no_meta - ) + ) + .set { ch_scatter } + + ch_scatter_split_intervals = ch_scatter.split_intervals ?: Channel.empty() // ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( @@ -381,6 +384,7 @@ workflow RAREDISEASE { ch_vep_cache, ch_genome_fasta_no_meta, ch_gnomad_af, + ch_scatter_split_intervals, CHECK_INPUT.out.samples ).set {ch_snv_annotate} ch_versions = ch_versions.mix(ch_snv_annotate.versions) From 56a5d025c0de2a16e660261da0facf296bc37c44 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 03:16:43 +0100 Subject: [PATCH 0797/1169] selvar local --- modules.json | 4 -- modules/nf-core/gatk4/selectvariants/main.nf | 43 --------------- modules/nf-core/gatk4/selectvariants/meta.yml | 55 ------------------- 3 files changed, 102 deletions(-) delete mode 100644 modules/nf-core/gatk4/selectvariants/main.nf delete mode 100644 modules/nf-core/gatk4/selectvariants/meta.yml diff --git a/modules.json b/modules.json index 9b55b923..79bb1f15 100644 --- a/modules.json +++ b/modules.json @@ -97,10 +97,6 @@ "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, - "gatk4/selectvariants": { - "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" - }, "gatk4/splitintervals": { "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" diff --git a/modules/nf-core/gatk4/selectvariants/main.nf b/modules/nf-core/gatk4/selectvariants/main.nf deleted file mode 100644 index ac385f4f..00000000 --- a/modules/nf-core/gatk4/selectvariants/main.nf +++ /dev/null @@ -1,43 +0,0 @@ -process GATK4_SELECTVARIANTS { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" - - input: - tuple val(meta), path(vcf), path(vcf_idx) - - output: - tuple val(meta), path("*.selectvariants.vcf.gz") , emit: vcf - tuple val(meta), path("*.selectvariants.vcf.gz.tbi") , emit: tbi - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - - def avail_mem = 3 - if (!task.memory) { - log.info '[GATK VariantFiltration] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.toGiga() - } - """ - gatk --java-options "-Xmx${avail_mem}G" SelectVariants \\ - --variant $vcf \\ - --output ${prefix}.selectvariants.vcf.gz \\ - --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/gatk4/selectvariants/meta.yml b/modules/nf-core/gatk4/selectvariants/meta.yml deleted file mode 100644 index 381af249..00000000 --- a/modules/nf-core/gatk4/selectvariants/meta.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: gatk4_selectvariants -description: Select a subset of variants from a VCF file -keywords: - - gatk - - gatk4 - - selectvariants - - vcf -tools: - - gatk4: - description: | - Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools - with a primary focus on variant discovery and genotyping. Its powerful processing engine - and high-performance computing features make it capable of taking on projects of any size. - homepage: https://gatk.broadinstitute.org/hc/en-us - documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360036362532-SelectVariants - tool_dev_url: https://github.com/broadinstitute/gatk - doi: 10.1158/1538-7445.AM2017-3590 - licence: ["Apache-2.0"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test'] - - vcf: - type: list - description: VCF(.gz) file - pattern: "*.{vcf,vcf.gz}" - - vcf_idx: - type: list - description: VCF file index - pattern: "*.{idx,tbi}" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: Compressed VCF file - pattern: "*.selectvariants.vcf.gz" - - vcf_tbi: - type: list - description: VCF file index - pattern: "*.{idx,tbi}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@mjcipriano" From d0bd4e9edcd94382286d1334a70a28e0525182c0 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 7 Nov 2022 10:53:04 +0100 Subject: [PATCH 0798/1169] fix removed commented outputs from emit analyse_MT --- subworkflows/local/analyse_MT.nf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 3efac41d..b5ad1762 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -88,11 +88,7 @@ workflow ANALYSE_MT { report = MERGE_ANNOTATE_MT.out.report txt = ALIGN_AND_CALL_MT.out.txt html = ALIGN_AND_CALL_MT.out.html -// vcf_shift = ALIGN_AND_CALL_MT_SHIFT.out.vcf -// tbi_shift = ALIGN_AND_CALL_MT_SHIFT.out.tbi txt_sh = ALIGN_AND_CALL_MT_SHIFT.out.txt html_sh = ALIGN_AND_CALL_MT_SHIFT.out.html -// vcf_lift = PICARD_LIFTOVERVCF.out.vcf_lifted -// vcf_unlift = PICARD_LIFTOVERVCF.out.vcf_unlifted versions = ch_versions // channel: [ versions.yml ] } From 8ba8b8e33eb0d024d7e7aa93a22f5c6b5f7a278f Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 7 Nov 2022 10:56:02 +0100 Subject: [PATCH 0799/1169] fix clear name for channel in align_and_call_MT --- subworkflows/local/align_and_call_MT.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index db045dc9..5bc81264 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -66,8 +66,8 @@ workflow ALIGN_AND_CALL_MT { ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) // Filter Mutect2 calls - ch_mutect_tbi = GATK4_MUTECT2_MT.out.vcf.join(GATK4_MUTECT2_MT.out.tbi, by: [0]) - ch_mutect_out = ch_mutect_tbi.join(GATK4_MUTECT2_MT.out.stats, by: [0]) + ch_mutect_vcf = GATK4_MUTECT2_MT.out.vcf.join(GATK4_MUTECT2_MT.out.tbi, by: [0]) + ch_mutect_out = ch_mutect_vcf.join(GATK4_MUTECT2_MT.out.stats, by: [0]) ch_to_filt = ch_mutect_out.map { meta, vcf, tbi, stats -> return [meta, vcf, tbi, stats, [], [], [], []]} From 705c680fa62811de253613f3386dd6301efb6394 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 7 Nov 2022 10:57:43 +0100 Subject: [PATCH 0800/1169] Update subworkflows/local/merge_annotate_MT.nf Co-authored-by: Anders Jemt --- subworkflows/local/merge_annotate_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/merge_annotate_MT.nf index 961470a8..446eb4f6 100644 --- a/subworkflows/local/merge_annotate_MT.nf +++ b/subworkflows/local/merge_annotate_MT.nf @@ -48,7 +48,7 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(GATK4_VARIANTFILTRATION_MT.out.versions.first()) // Spliting multiallelic calls - ch_in_split=GATK4_VARIANTFILTRATION_MT.out.vcf.join( GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]) + ch_in_split = GATK4_VARIANTFILTRATION_MT.out.vcf.join( GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]) SPLIT_MULTIALLELICS_MT (ch_in_split, genome_fasta) ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_MT.out.versions) From 6922325cd621838f66bf7f37b25b750e31f087f7 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 7 Nov 2022 10:58:09 +0100 Subject: [PATCH 0801/1169] Update subworkflows/local/align_and_call_MT.nf Co-authored-by: Anders Jemt --- subworkflows/local/align_and_call_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index db045dc9..4a30fc18 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -66,7 +66,7 @@ workflow ALIGN_AND_CALL_MT { ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) // Filter Mutect2 calls - ch_mutect_tbi = GATK4_MUTECT2_MT.out.vcf.join(GATK4_MUTECT2_MT.out.tbi, by: [0]) + ch_mutect_vcf = GATK4_MUTECT2_MT.out.vcf.join(GATK4_MUTECT2_MT.out.tbi, by: [0]) ch_mutect_out = ch_mutect_tbi.join(GATK4_MUTECT2_MT.out.stats, by: [0]) ch_to_filt = ch_mutect_out.map { meta, vcf, tbi, stats -> From b5bd306575c9a0e0f9823d91e19bbc131c255fd0 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 7 Nov 2022 11:12:10 +0100 Subject: [PATCH 0802/1169] Update subworkflows/local/merge_annotate_MT.nf Co-authored-by: Anders Jemt --- subworkflows/local/merge_annotate_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/merge_annotate_MT.nf index 446eb4f6..3592b9e0 100644 --- a/subworkflows/local/merge_annotate_MT.nf +++ b/subworkflows/local/merge_annotate_MT.nf @@ -87,7 +87,7 @@ workflow MERGE_ANNOTATE_MT { [], genome_fasta, genome_fai) - ch_mer_vcf=BCFTOOLS_MERGE_MT.out.merged_variants + ch_merged_vcf = BCFTOOLS_MERGE_MT.out.merged_variants ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) ch_ch_n=CHANGE_NAME_VCF_MT(ch_dedup_vcf.single) From 8a1a95d70f5121926f0306c918fbf7b2b082840c Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 7 Nov 2022 11:12:35 +0100 Subject: [PATCH 0803/1169] Update modules/local/change_name.nf Co-authored-by: Anders Jemt --- modules/local/change_name.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/local/change_name.nf b/modules/local/change_name.nf index 63badda9..080f717c 100644 --- a/modules/local/change_name.nf +++ b/modules/local/change_name.nf @@ -12,6 +12,7 @@ process CHANGE_NAME { output: tuple val(meta), path( "*.${file_type}"), emit: file + when: task.ext.when == null || task.ext.when From 38ba4ad95be31664d0e065d36ce489712c72738d Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 7 Nov 2022 11:12:50 +0100 Subject: [PATCH 0804/1169] Update subworkflows/local/merge_annotate_MT.nf Co-authored-by: Anders Jemt --- subworkflows/local/merge_annotate_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/merge_annotate_MT.nf index 3592b9e0..ec43d5c4 100644 --- a/subworkflows/local/merge_annotate_MT.nf +++ b/subworkflows/local/merge_annotate_MT.nf @@ -90,7 +90,7 @@ workflow MERGE_ANNOTATE_MT { ch_merged_vcf = BCFTOOLS_MERGE_MT.out.merged_variants ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) - ch_ch_n=CHANGE_NAME_VCF_MT(ch_dedup_vcf.single) + ch_case_vcf_single = CHANGE_NAME_VCF_MT(ch_dedup_vcf.single) ch_in_vep=ch_mer_vcf.mix(ch_dedup_vcf.single) // Annotating with Hmtnote From 3023af62101bb4a9bf67a49b6ca01c9055d4885c Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 7 Nov 2022 11:14:52 +0100 Subject: [PATCH 0805/1169] fix spacing and naming of channels --- subworkflows/local/merge_annotate_MT.nf | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/merge_annotate_MT.nf index 961470a8..a8140448 100644 --- a/subworkflows/local/merge_annotate_MT.nf +++ b/subworkflows/local/merge_annotate_MT.nf @@ -63,35 +63,35 @@ workflow MERGE_ANNOTATE_MT { REMOVE_DUPLICATES_MT.out.vcf .collect{it[1]} .toList() - .set { file_list } + .set { file_list_rem_dup } TABIX_TABIX_MT2.out.tbi .collect{it[1]} .toList() - .set { file_list2 } + .set { file_list_tbi } case_info - .combine(file_list) - .combine(file_list2) - .set { ch_br } + .combine(file_list_rem_dup) + .combine(file_list_tbi) + .set { ch_rem_dup_vcf_tbi } - ch_br.branch { + ch_rem_dup_vcf_tbi.branch { meta, vcf, tbi -> single: vcf.size() == 1 return [meta, vcf] multiple: vcf.size() > 1 return [meta, vcf, tbi] - }.set { ch_dedup_vcf } + }.set { ch_case_vcf } - BCFTOOLS_MERGE_MT( ch_dedup_vcf.multiple, + BCFTOOLS_MERGE_MT( ch_case_vcf.multiple, [], genome_fasta, genome_fai) - ch_mer_vcf=BCFTOOLS_MERGE_MT.out.merged_variants + ch_merged_vcf=BCFTOOLS_MERGE_MT.out.merged_variants ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) - ch_ch_n=CHANGE_NAME_VCF_MT(ch_dedup_vcf.single) - ch_in_vep=ch_mer_vcf.mix(ch_dedup_vcf.single) + ch_vcf_changed_name = CHANGE_NAME_VCF_MT( ch_case_vcf.single ) + ch_in_vep = ch_merged_vcf.mix( ch_vcf_changed_name ) // Annotating with Hmtnote //HMTNOTE_MT(ch_in_vep) From 7ce9afdb925735e12f708f9bd2925e0dcc052481 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 7 Nov 2022 11:33:02 +0100 Subject: [PATCH 0806/1169] fix spacing --- subworkflows/local/align_and_call_MT.nf | 4 ++-- subworkflows/local/analyse_MT.nf | 4 ++-- subworkflows/local/merge_annotate_MT.nf | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/subworkflows/local/align_and_call_MT.nf b/subworkflows/local/align_and_call_MT.nf index 5bc81264..9ec66d50 100644 --- a/subworkflows/local/align_and_call_MT.nf +++ b/subworkflows/local/align_and_call_MT.nf @@ -51,8 +51,8 @@ workflow ALIGN_AND_CALL_MT { // Index bam file SAMTOOLS_INDEX_MT(SAMTOOLS_SORT_MT.out.bam) - ch_sort_index_bam=SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) - ch_sort_index_bam_intervals_mt=ch_sort_index_bam.combine(intervals_mt) + ch_sort_index_bam = SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) + ch_sort_index_bam_intervals_mt = ch_sort_index_bam.combine(intervals_mt) ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MT.out.versions.first()) // Calls variants with Mutect2 diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index b5ad1762..3b6446e9 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -30,7 +30,7 @@ workflow ANALYSE_MT { ch_versions = Channel.empty() // STEP 1: PREPARING MT ALIGNMENT - CONVERT_MT_BAM_TO_FASTQ ( bam ) + CONVERT_MT_BAM_TO_FASTQ(bam) ch_versions = ch_versions.mix(CONVERT_MT_BAM_TO_FASTQ.out.versions)// Outputs bam files //STEP 2.1: MT ALLIGNMENT AND VARIANT CALLING @@ -90,5 +90,5 @@ workflow ANALYSE_MT { html = ALIGN_AND_CALL_MT.out.html txt_sh = ALIGN_AND_CALL_MT_SHIFT.out.txt html_sh = ALIGN_AND_CALL_MT_SHIFT.out.html - versions = ch_versions // channel: [ versions.yml ] + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/merge_annotate_MT.nf index 28dae997..786c8882 100644 --- a/subworkflows/local/merge_annotate_MT.nf +++ b/subworkflows/local/merge_annotate_MT.nf @@ -48,7 +48,7 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(GATK4_VARIANTFILTRATION_MT.out.versions.first()) // Spliting multiallelic calls - ch_in_split = GATK4_VARIANTFILTRATION_MT.out.vcf.join( GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]) + ch_in_split = GATK4_VARIANTFILTRATION_MT.out.vcf.join(GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]) SPLIT_MULTIALLELICS_MT (ch_in_split, genome_fasta) ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_MT.out.versions) @@ -63,7 +63,7 @@ workflow MERGE_ANNOTATE_MT { REMOVE_DUPLICATES_MT.out.vcf .collect{it[1]} .toList() - .set { file_list_rem_dup } + .set { file_list_vcf } TABIX_TABIX_MT2.out.tbi .collect{it[1]} @@ -71,7 +71,7 @@ workflow MERGE_ANNOTATE_MT { .set { file_list_tbi } case_info - .combine(file_list_rem_dup) + .combine(file_list_vcf) .combine(file_list_tbi) .set { ch_rem_dup_vcf_tbi } @@ -87,11 +87,11 @@ workflow MERGE_ANNOTATE_MT { [], genome_fasta, genome_fai) - ch_merged_vcf=BCFTOOLS_MERGE_MT.out.merged_variants + ch_merged_vcf = BCFTOOLS_MERGE_MT.out.merged_variants ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) - ch_vcf_changed_name = CHANGE_NAME_VCF_MT( ch_case_vcf.single ) - ch_in_vep = ch_merged_vcf.mix( ch_vcf_changed_name ) + ch_vcf_changed_name = CHANGE_NAME_VCF_MT(ch_case_vcf.single) + ch_in_vep = ch_merged_vcf.mix(ch_vcf_changed_name) // Annotating with Hmtnote //HMTNOTE_MT(ch_in_vep) From dde617a002441611dba9440b10db6b47f6e0680c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 13:23:22 +0100 Subject: [PATCH 0807/1169] update modules conf --- conf/modules.config | 14 ++++++++++++++ subworkflows/local/annotate_snvs.nf | 16 ++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 7205540e..2b287030 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -730,7 +730,21 @@ process { ] } + withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { + cpus = 1 + memory = 60.GB + ext.prefix = { "${meta.id}_${intervals_list.simpleName}" } + ext.when = { params.annotate_snv_switch } + publishDir = [ + enabled: params.save_reference, + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { + ext.prefix = { "${vcf.simpleName}_vep" } ext.args = [ '--plugin LoFtool,vep_cache/LoFtool_scores.txt', '--distance 5000', diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 8ef4fdb0..0ff54c43 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -9,6 +9,7 @@ include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhoc include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' include { TABIX_BGZIPTABIX as TABIX_ROHCALL } from '../../modules/nf-core/tabix/bgziptabix/main' include { TABIX_BGZIPTABIX as TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_BGZIPTABIX as TABIX_VEP } from '../../modules/nf-core/tabix/bgziptabix/main' include { TABIX_TABIX as TABIX_BCFTOOLS } from '../../modules/nf-core/tabix/tabix/main' include { GATK4_SELECTVARIANTS } from '../../modules/local/gatk4/selectvariants/main' @@ -98,6 +99,21 @@ workflow ANNOTATE_SNVS { ) ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) + TABIX_VEP (ENSEMBLVEP_SNV.out.vcf) + ch_versions = ch_versions.mix(TABIX_VEP.out.versions) + + TABIX_VEP.out.gz_tbi + .groupTuple() + .map { meta, vcfs, tbis -> + def sortedvcfs = vcfs.sort() + def sortedtbis = tbis.sort() + return [ meta, sortedvcfs, sortedtbis ] + } + .set { ch_vep_ann } + + ch_vep_ann.view() + + emit: vcf_ann = BCFTOOLS_VIEW.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] From 0393f6092cb284639ea9ac330ef8e1fe0918506a Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 7 Nov 2022 13:30:12 +0100 Subject: [PATCH 0808/1169] feat updated bcftools merge --- modules.json | 2 +- modules/nf-core/bcftools/merge/main.nf | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 4358163c..c851a2f0 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "bcftools/merge": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "d1147c1baa105d01e5e39bd668a101bb213f1c37" }, "bcftools/norm": { "branch": "master", diff --git a/modules/nf-core/bcftools/merge/main.nf b/modules/nf-core/bcftools/merge/main.nf index af586cd1..2c9d68fd 100644 --- a/modules/nf-core/bcftools/merge/main.nf +++ b/modules/nf-core/bcftools/merge/main.nf @@ -43,4 +43,20 @@ process BCFTOOLS_MERGE { bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') END_VERSIONS """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf.gz" + """ + touch ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ } From 66bd624eb5da385807980ff909af7bb638873f12 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 7 Nov 2022 13:36:07 +0100 Subject: [PATCH 0809/1169] fix name of file in change_name.nf --- modules/local/change_name.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/change_name.nf b/modules/local/change_name.nf index 080f717c..6d1df51b 100644 --- a/modules/local/change_name.nf +++ b/modules/local/change_name.nf @@ -24,7 +24,7 @@ process CHANGE_NAME { """ mv \\ $input_file \\ - ${meta.id}.${file_type} + ${prefix}.${file_type} """ stub: From e26146a0b33d50e7abfd7616f251f8fefb49fdf9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:57:03 +0100 Subject: [PATCH 0810/1169] update python script to use pli info in file --- bin/add_most_severe_pli.py | 65 +++++++------------ modules/local/add_most_severe_pli.nf | 3 +- .../local/annotate_consequence_pli.nf | 2 - workflows/raredisease.nf | 3 +- 4 files changed, 26 insertions(+), 47 deletions(-) diff --git a/bin/add_most_severe_pli.py b/bin/add_most_severe_pli.py index 351b5041..eb2d8d29 100755 --- a/bin/add_most_severe_pli.py +++ b/bin/add_most_severe_pli.py @@ -5,35 +5,34 @@ from typing import TextIO -def parse_vep_transcripts(transcripts: list, symbol_ind: int) -> list: +def parse_vep_transcripts(transcripts: list, pli_ind: int) -> list: """ Parse each transcript and return a list of gene symbols. Args: transcripts (list): A list of vep transcript annotation - symbol_ind (int) : Index of the "allele" in the vep annotation record + pli_ind (int) : Index of pli value in the vep annotation record Returns: - gene_ids (list): list of gene ids in the record + pli_values (list): list of pli values in the record """ - gene_ids = [] + pli_values = [] for transcript in transcripts: vep_fields = transcript.strip().split("|") - gene_id = vep_fields[symbol_ind] - gene_ids.append(gene_id) - return gene_ids + pli_value = vep_fields[pli_ind] + pli_values.append(pli_value) + return pli_values -def construct_most_severe_pli_info(line: str, symbol_ind: int, pli_gene: dict) -> list: +def construct_most_severe_pli_info(line: str, pli_ind: int) -> list: """ Parse gene symbols, find the highest pli value of all gene symbols, add most_severe_pli tag to the info field and return a list of modified columns Args: line (str) : Vcf record - symbol_ind (int) : Index of the "SYMBOL" in the vep annotation record - pli_gene (dict): A dict of pli values, where gene symbols are the keys + pli_ind (int) : Index of pli value in the vep annotation record Returns: columns (list): A list of fields in the vcf record with most severe pli added @@ -45,14 +44,13 @@ def construct_most_severe_pli_info(line: str, symbol_ind: int, pli_gene: dict) - for field in info_fields: if field.startswith("CSQ="): transcripts = field.split("CSQ=")[1].split(",") - gene_ids = parse_vep_transcripts(transcripts, symbol_ind) - unique_ids = list(set(gene_ids)) - pli_values = [] - for gene_id in unique_ids: - if gene_id != "" and pli_gene.get(gene_id) is not None: - pli_values.append(pli_gene.get(gene_id)) - if pli_values: - columns[7] += ";most_severe_pli={:.2f}".format(max(pli_values)) + pli_values = parse_vep_transcripts(transcripts, pli_ind) + try: + pli_max = max(pli_values) + except ValueError: + pli_max = "" + if pli_max: + columns[7] += ";most_severe_pli={:.2f}".format(float(pli_max)) return columns @@ -64,26 +62,26 @@ def parse_vep_csq_schema(line: str) -> int: line: INFO line in the vcf header with CSQ information Returns: - symbol_ind (int) : Index of the "SYMBOL" in the vep annotation record + pli_ind (int) : Index of pli value in the vep annotation record """ fields = line.strip().split("Format: ")[1].replace('">', "").split("|") - symbol_ind = fields.index("SYMBOL") + pli_ind = fields.index("pLI_gene_value") - return symbol_ind + return pli_ind -def write_pli_annotated_vcf(file_in: TextIO, file_out: TextIO, var_csq: list): +def write_pli_annotated_vcf(file_in: TextIO, file_out: TextIO): """Add most severe pli field to record, and write the record to a vcf file""" for line in file_in: if line.startswith("#"): file_out.write(line) if line.startswith("##INFO=\n' ) else: - vcf_record = construct_most_severe_pli_info(line, symbol_ind, var_csq) + vcf_record = construct_most_severe_pli_info(line, pli_ind) file_out.write("\t".join(vcf_record) + "\n") @@ -97,7 +95,7 @@ def parse_args(argv=None): "--file_in", metavar="FILE_IN", type=Path, - help="Vcf file annotated with vep.", + help="Vcf file annotated with vep's pli plugin.", ) parser.add_argument( "--file_out", @@ -105,12 +103,6 @@ def parse_args(argv=None): type=Path, help="Vcf with most_severe_pli annotations added to it.", ) - parser.add_argument( - "--pli", - metavar="PLI", - type=Path, - help="Pli", - ) return parser.parse_args(argv) @@ -120,19 +112,10 @@ def main(argv=None): if not args.file_in.is_file(): print(f"The given input file {args.file_in} was not found!") sys.exit(2) - if not args.pli.is_file(): - print(f"The given variant consequence file {args.pli} was not found!") - sys.exit(2) args.file_out.parent.mkdir(parents=True, exist_ok=True) - pli_gene = {} - with open(args.pli) as f: - for line in f: - cols = line.strip().split() - if cols[0] != "gene": - pli_gene[cols[0]] = float(cols[1]) with open(args.file_out, "w") as out_vcf: with open(args.file_in) as in_vcf: - write_pli_annotated_vcf(in_vcf, out_vcf, pli_gene) + write_pli_annotated_vcf(in_vcf, out_vcf) if __name__ == "__main__": diff --git a/modules/local/add_most_severe_pli.nf b/modules/local/add_most_severe_pli.nf index dc7d4a22..53108c87 100644 --- a/modules/local/add_most_severe_pli.nf +++ b/modules/local/add_most_severe_pli.nf @@ -9,7 +9,6 @@ process ADD_MOST_SEVERE_PLI { input: tuple val(meta), path(vcf) - path (pli_gene) output: tuple val(meta), path("*_pli.vcf") , emit: vcf @@ -22,7 +21,7 @@ process ADD_MOST_SEVERE_PLI { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - add_most_severe_pli.py --file_in ${vcf} --file_out ${prefix}_pli.vcf --pli ${pli_gene} + add_most_severe_pli.py --file_in ${vcf} --file_out ${prefix}_pli.vcf cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/annotate_consequence_pli.nf b/subworkflows/local/annotate_consequence_pli.nf index b269a4a6..dbc1f5cd 100644 --- a/subworkflows/local/annotate_consequence_pli.nf +++ b/subworkflows/local/annotate_consequence_pli.nf @@ -9,7 +9,6 @@ workflow ANNOTATE_CSQ_PLI { take: vcf // channel: [ val(meta), vcf ] variant_consequences // path: consequences.txt - pli_gene // path: pli_per_gene.txt main: ch_versions = Channel.empty() @@ -20,7 +19,6 @@ workflow ANNOTATE_CSQ_PLI { ) ADD_MOST_SEVERE_PLI ( ADD_MOST_SEVERE_CSQ.out.vcf, - pli_gene ) emit: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 95a575c3..90b665d3 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -322,8 +322,7 @@ workflow RAREDISEASE { ANN_CSQ_PLI_SV ( ch_sv_annotate.vcf_ann, - ch_variant_consequences, - ch_pli_per_gene + ch_variant_consequences ) RANK_VARIANTS_SV ( From bbfecb3358aaa9afa0063d3d2f54a3d1e11726fe Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 15:05:57 +0100 Subject: [PATCH 0811/1169] fix CI error --- workflows/raredisease.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 20ab9d9c..419dd821 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -392,7 +392,6 @@ workflow RAREDISEASE { ANN_CSQ_PLI_SNV ( FILTER_VEP_SNV.out.vcf, - RANK_VARIANTS_SNV.out.vcf, ch_variant_consequences ) } From 77f3e9d68bb20050f41018e2eddee60e7295a9b7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 16:49:33 +0100 Subject: [PATCH 0812/1169] remove pli_per_gene refs --- conf/genomes.config | 2 -- main.nf | 1 - nextflow_schema.json | 7 ------- workflows/raredisease.nf | 3 --- 4 files changed, 13 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index e21a05f8..5b11a860 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -29,7 +29,6 @@ params { mt_intervals = "" mt_intervals_shift = "" mt_sequence_dictionary_shift = "" - pli_per_gene = "" reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" score_config_sv = "${params.local_genomes}/svrank_model_-v1.8-.ini" @@ -63,7 +62,6 @@ params { mt_intervals = "${params.local_genomes}/non_control_region.chrM.interval_list" mt_intervals_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" mt_sequence_dictionary_shift = "" - pli_per_gene = "" reduced_penetrance = "" score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" diff --git a/main.nf b/main.nf index ef2c4a3d..c2b9c872 100644 --- a/main.nf +++ b/main.nf @@ -38,7 +38,6 @@ params.mt_fai_shift = WorkflowMain.getGenomeAttribute(params, params.mt_intervals = WorkflowMain.getGenomeAttribute(params, 'mt_intervals') params.mt_intervals_shift = WorkflowMain.getGenomeAttribute(params, 'mt_intervals_shift') params.mt_sequence_dictionary_shift = WorkflowMain.getGenomeAttribute(params, 'mt_sequence_dictionary_shift') -params.pli_per_gene = WorkflowMain.getGenomeAttribute(params, 'pli_per_gene') params.reduced_penetrance = WorkflowMain.getGenomeAttribute(params, 'reduced_penetrance') params.sequence_dictionary = WorkflowMain.getGenomeAttribute(params, 'sequence_dictionary') params.score_config_snv = WorkflowMain.getGenomeAttribute(params, 'score_config_snv') diff --git a/nextflow_schema.json b/nextflow_schema.json index 47477439..4253f52c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -214,13 +214,6 @@ "fa_icon": "fas fa-folder-open", "hidden": true }, - "pli_per_gene": { - "type": "string", - "format": "path", - "fa_icon": "fas fa-chart-bar", - "description": "File with gene ids and their corresponding pli values", - "hidden": true - }, "reduced_penetrance": { "type": "string", "format": "path", diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 419dd821..773f5d08 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -36,7 +36,6 @@ def checkPathParamList = [ params.mt_intervals_shift, params.mt_sequence_dictionary_shift, params.multiqc_config, - params.pli_per_gene, params.reduced_penetrance, params.score_config_snv, params.score_config_sv, @@ -155,8 +154,6 @@ workflow RAREDISEASE { : Channel.value([]) ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift).collect() : Channel.value([]) - ch_pli_per_gene = params.pli_per_gene ? Channel.fromPath(params.pli_per_gene).collect() - : Channel.value([]) ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance).collect() : Channel.value([]) ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv).collect() From 7d1bb848536d6105f978c2e28e626e4777bd2dea Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 17:25:53 +0100 Subject: [PATCH 0813/1169] review suggestions --- bin/add_most_severe_pli.py | 2 +- subworkflows/local/annotate_consequence_pli.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/add_most_severe_pli.py b/bin/add_most_severe_pli.py index eb2d8d29..34a58916 100755 --- a/bin/add_most_severe_pli.py +++ b/bin/add_most_severe_pli.py @@ -7,7 +7,7 @@ def parse_vep_transcripts(transcripts: list, pli_ind: int) -> list: """ - Parse each transcript and return a list of gene symbols. + Parse each transcript and return a list of pli values. Args: transcripts (list): A list of vep transcript annotation diff --git a/subworkflows/local/annotate_consequence_pli.nf b/subworkflows/local/annotate_consequence_pli.nf index dbc1f5cd..24410abd 100644 --- a/subworkflows/local/annotate_consequence_pli.nf +++ b/subworkflows/local/annotate_consequence_pli.nf @@ -1,5 +1,5 @@ // -// A subworkflow to call SNVs by sentieon dnascope with a machine learning model. +// A subworkflow to add most severe consequence and pli to a vep annotated vcf // include { ADD_MOST_SEVERE_CSQ } from '../../modules/local/add_most_severe_consequence' From 75a826168bd8a6b97332cae57b88324f9d0a86e7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 17:28:04 +0100 Subject: [PATCH 0814/1169] update paths --- .../local/mitochondria/align_and_call_MT.nf | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 126a669a..2857c64e 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -2,17 +2,17 @@ // Align and call MT // -include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../modules/nf-core/bwamem2/mem/main' -include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../modules/nf-core/gatk4/mergebamalignment/main' -include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../modules/nf-core/picard/addorreplacereadgroups/main' -include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../modules/nf-core/picard/markduplicates/main' -include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../modules/nf-core/samtools/index/main' -include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../modules/nf-core/samtools/sort/main' -include { HAPLOCHECK as HAPLOCHECK_MT } from '../../modules/nf-core/haplocheck/main' -include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../modules/nf-core/gatk4/mutect2/main' -include { GATK4_FILTERMUTECTCALLS as GATK4_FILTERMUTECTCALLS_MT } from '../../modules/nf-core/gatk4/filtermutectcalls/main' -include { PICARD_RENAMESAMPLEINVCF as PICARD_RENAMESAMPLEINVCF_MT } from '../../modules/nf-core/picard/renamesampleinvcf/main' -include { TABIX_TABIX as TABIX_TABIX_MT } from '../../modules/nf-core/tabix/tabix/main' +include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../../modules/nf-core/bwamem2/mem/main' +include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../../modules/nf-core/gatk4/mergebamalignment/main' +include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../../modules/nf-core/picard/addorreplacereadgroups/main' +include { PICARD_MARKDUPLICATES as PICARD_MARKDUPLICATES_MT } from '../../../modules/nf-core/picard/markduplicates/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MT } from '../../../modules/nf-core/samtools/index/main' +include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } from '../../../modules/nf-core/samtools/sort/main' +include { HAPLOCHECK as HAPLOCHECK_MT } from '../../../modules/nf-core/haplocheck/main' +include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../../modules/nf-core/gatk4/mutect2/main' +include { GATK4_FILTERMUTECTCALLS as GATK4_FILTERMUTECTCALLS_MT } from '../../../modules/nf-core/gatk4/filtermutectcalls/main' +include { PICARD_RENAMESAMPLEINVCF as PICARD_RENAMESAMPLEINVCF_MT } from '../../../modules/nf-core/picard/renamesampleinvcf/main' +include { TABIX_TABIX as TABIX_TABIX_MT } from '../../../modules/nf-core/tabix/tabix/main' workflow ALIGN_AND_CALL_MT { take: From 8663ad16b4da4c285154f1725b32f5b7180abaf8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 17:52:49 +0100 Subject: [PATCH 0815/1169] update paths --- subworkflows/local/analyse_MT.nf | 6 +++--- .../{ => mitochondria}/merge_annotate_MT.nf | 20 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) rename subworkflows/local/{ => mitochondria}/merge_annotate_MT.nf (94%) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 52f50156..c60272bd 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -5,7 +5,7 @@ include { CONVERT_MT_BAM_TO_FASTQ } from './mitochondria/ include { ALIGN_AND_CALL_MT } from './mitochondria/align_and_call_MT' include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './mitochondria/align_and_call_MT' include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/picard/liftovervcf/main' -include { MERGE_ANNOTATE_MT } from './merge_annotate_MT' +include { MERGE_ANNOTATE_MT } from './mitochondria/merge_annotate_MT' workflow ANALYSE_MT { take: @@ -65,8 +65,8 @@ workflow ANALYSE_MT { ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions) // STEP 3: MT MERGE AND ANNOTATE VARIANTS - MERGE_ANNOTATE_MT( - ALIGN_AND_CALL_MT.out.vcf, + MERGE_ANNOTATE_MT( + ALIGN_AND_CALL_MT.out.vcf, PICARD_LIFTOVERVCF.out.vcf_lifted, genome_fasta, genome_dict, diff --git a/subworkflows/local/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf similarity index 94% rename from subworkflows/local/merge_annotate_MT.nf rename to subworkflows/local/mitochondria/merge_annotate_MT.nf index 786c8882..410d80ff 100644 --- a/subworkflows/local/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -12,7 +12,7 @@ include { CHANGE_NAME as CHANGE_NAME_VCF_MT } from '../../m include { BCFTOOLS_MERGE as BCFTOOLS_MERGE_MT } from '../../modules/nf-core/bcftools/merge/main' include { HMTNOTE as HMTNOTE_MT } from '../../modules/nf-core/hmtnote/main' include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../modules/nf-core/tabix/tabix/main' -include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../modules/nf-core/ensemblvep/main' +include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../modules/local/ensemblvep/main' include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../modules/nf-core/haplogrep2/classify/main' workflow MERGE_ANNOTATE_MT { @@ -29,7 +29,7 @@ workflow MERGE_ANNOTATE_MT { main: ch_versions = Channel.empty() - + ch_vcfs = vcf1 .join(vcf2, remainder: true) .map{ meta, vcf1, vcf2 -> @@ -41,12 +41,12 @@ workflow MERGE_ANNOTATE_MT { // Filtering Variants ch_filt_vcf = GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.vcf.join(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.tbi, by:[0]) - GATK4_VARIANTFILTRATION_MT(ch_filt_vcf, - genome_fasta, - genome_fai, + GATK4_VARIANTFILTRATION_MT(ch_filt_vcf, + genome_fasta, + genome_fai, genome_dict ) ch_versions = ch_versions.mix(GATK4_VARIANTFILTRATION_MT.out.versions.first()) - + // Spliting multiallelic calls ch_in_split = GATK4_VARIANTFILTRATION_MT.out.vcf.join(GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]) SPLIT_MULTIALLELICS_MT (ch_in_split, genome_fasta) @@ -83,9 +83,9 @@ workflow MERGE_ANNOTATE_MT { return [meta, vcf, tbi] }.set { ch_case_vcf } - BCFTOOLS_MERGE_MT( ch_case_vcf.multiple, - [], - genome_fasta, + BCFTOOLS_MERGE_MT( ch_case_vcf.multiple, + [], + genome_fasta, genome_fai) ch_merged_vcf = BCFTOOLS_MERGE_MT.out.merged_variants ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) @@ -118,4 +118,4 @@ workflow MERGE_ANNOTATE_MT { tbi = TABIX_TABIX_MT3.out.tbi report = ENSEMBLVEP_MT.out.report versions = ch_versions // channel: [ versions.yml ] -} \ No newline at end of file +} From b4850cba18c83f8d4b3ed4f10d58b584f5abad67 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 17:56:05 +0100 Subject: [PATCH 0816/1169] udpate module paths --- .../local/mitochondria/merge_annotate_MT.nf | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 410d80ff..659b5f4e 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -2,18 +2,18 @@ // Merge and annotate MT // -include { GATK4_MERGEVCFS as GATK4_MERGEVCFS_LIFT_UNLIFT_MT } from '../../modules/nf-core/gatk4/mergevcfs/main' -include { GATK4_VARIANTFILTRATION as GATK4_VARIANTFILTRATION_MT } from '../../modules/nf-core/gatk4/variantfiltration/main' -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_MT } from '../../modules/nf-core/bcftools/norm/main' -include { TABIX_TABIX as TABIX_TABIX_MT } from '../../modules/nf-core/tabix/tabix/main' -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_MT } from '../../modules/nf-core/bcftools/norm/main' -include { TABIX_TABIX as TABIX_TABIX_MT2 } from '../../modules/nf-core/tabix/tabix/main' -include { CHANGE_NAME as CHANGE_NAME_VCF_MT } from '../../modules/local/change_name' -include { BCFTOOLS_MERGE as BCFTOOLS_MERGE_MT } from '../../modules/nf-core/bcftools/merge/main' -include { HMTNOTE as HMTNOTE_MT } from '../../modules/nf-core/hmtnote/main' -include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../modules/nf-core/tabix/tabix/main' -include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../modules/local/ensemblvep/main' -include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../modules/nf-core/haplogrep2/classify/main' +include { GATK4_MERGEVCFS as GATK4_MERGEVCFS_LIFT_UNLIFT_MT } from '../../../modules/nf-core/gatk4/mergevcfs/main' +include { GATK4_VARIANTFILTRATION as GATK4_VARIANTFILTRATION_MT } from '../../../modules/nf-core/gatk4/variantfiltration/main' +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_MT } from '../../../modules/nf-core/bcftools/norm/main' +include { TABIX_TABIX as TABIX_TABIX_MT } from '../../../modules/nf-core/tabix/tabix/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_MT } from '../../../modules/nf-core/bcftools/norm/main' +include { TABIX_TABIX as TABIX_TABIX_MT2 } from '../../../modules/nf-core/tabix/tabix/main' +include { CHANGE_NAME as CHANGE_NAME_VCF_MT } from '../../../modules/local/change_name' +include { BCFTOOLS_MERGE as BCFTOOLS_MERGE_MT } from '../../../modules/nf-core/bcftools/merge/main' +include { HMTNOTE as HMTNOTE_MT } from '../../../modules/nf-core/hmtnote/main' +include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../../modules/nf-core/tabix/tabix/main' +include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../../modules/local/ensemblvep/main' +include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../../modules/nf-core/haplogrep2/classify/main' workflow MERGE_ANNOTATE_MT { take: From 06931f0288741c87764123baadd0b08b89de1135 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 19:14:40 +0100 Subject: [PATCH 0817/1169] update a function call --- workflows/raredisease.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c90385c1..54f61dda 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -377,8 +377,7 @@ workflow RAREDISEASE { ANN_CSQ_PLI_SNV ( ch_snv_annotate.vcf_ann, - ch_variant_consequences, - ch_pli_per_gene + ch_variant_consequences ) RANK_VARIANTS_SNV ( From ce3bbac8878fb533f766d033917a8a8872c77d67 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 7 Nov 2022 23:08:09 +0100 Subject: [PATCH 0818/1169] add bcftools concat --- bin/add_most_severe_consequence.py | 4 +- bin/add_most_severe_pli.py | 4 +- conf/modules.config | 8 ++++ modules.json | 4 ++ modules/nf-core/bcftools/concat/main.nf | 35 +++++++++++++++++ modules/nf-core/bcftools/concat/meta.yml | 48 ++++++++++++++++++++++++ subworkflows/local/annotate_snvs.nf | 7 ++-- 7 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 modules/nf-core/bcftools/concat/main.nf create mode 100644 modules/nf-core/bcftools/concat/meta.yml diff --git a/bin/add_most_severe_consequence.py b/bin/add_most_severe_consequence.py index 0a28c4d6..08d7d66d 100755 --- a/bin/add_most_severe_consequence.py +++ b/bin/add_most_severe_consequence.py @@ -1,5 +1,6 @@ #!/usr/bin/env python import argparse +import gzip import sys from pathlib import Path from typing import Tuple, TextIO @@ -177,8 +178,9 @@ def main(argv=None): args.file_out.parent.mkdir(parents=True, exist_ok=True) with open(args.variant_csq) as f: var_csq = [line.strip() for line in f] + opener = gzip.open if (args.file_in.suffix == ".gz") else open with open(args.file_out, "w") as out_vcf: - with open(args.file_in) as in_vcf: + with opener(args.file_in, "rt") as in_vcf: write_csq_annotated_vcf(in_vcf, out_vcf, var_csq) diff --git a/bin/add_most_severe_pli.py b/bin/add_most_severe_pli.py index 351b5041..22f2c47d 100755 --- a/bin/add_most_severe_pli.py +++ b/bin/add_most_severe_pli.py @@ -1,5 +1,6 @@ #!/usr/bin/env python import argparse +import gzip import sys from pathlib import Path from typing import TextIO @@ -130,8 +131,9 @@ def main(argv=None): cols = line.strip().split() if cols[0] != "gene": pli_gene[cols[0]] = float(cols[1]) + opener = gzip.open if (args.file_in.suffix == ".gz") else open with open(args.file_out, "w") as out_vcf: - with open(args.file_in) as in_vcf: + with opener(args.file_in, "rt") as in_vcf: write_pli_annotated_vcf(in_vcf, out_vcf, pli_gene) diff --git a/conf/modules.config b/conf/modules.config index 2b287030..61fe6b76 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -761,6 +761,14 @@ process { mode: params.publish_dir_mode, ] } + + withName: '.*ANNOTATE_SNVS:TABIX_VEP' { + ext.prefix = { "${input.simpleName}_vep" } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + ] + } } // diff --git a/modules.json b/modules.json index 79bb1f15..22a21064 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,10 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "bcftools/concat": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, "bcftools/norm": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf new file mode 100644 index 00000000..d2a58a55 --- /dev/null +++ b/modules/nf-core/bcftools/concat/main.nf @@ -0,0 +1,35 @@ +process BCFTOOLS_CONCAT { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': + 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" + + input: + tuple val(meta), path(vcfs), path(tbi) + + output: + tuple val(meta), path("*.gz"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + """ + bcftools concat \\ + --output ${prefix}.vcf.gz \\ + $args \\ + --threads $task.cpus \\ + ${vcfs} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/concat/meta.yml b/modules/nf-core/bcftools/concat/meta.yml new file mode 100644 index 00000000..167dbe5a --- /dev/null +++ b/modules/nf-core/bcftools/concat/meta.yml @@ -0,0 +1,48 @@ +name: bcftools_concat +description: Concatenate VCF files +keywords: + - variant calling + - concat + - bcftools + - VCF + +tools: + - concat: + description: | + Concatenate VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcfs: + type: files + description: | + List containing 2 or more vcf files + e.g. [ 'file1.vcf', 'file2.vcf' ] + - tbi: + type: files + description: | + List containing 2 or more index files (optional) + e.g. [ 'file1.tbi', 'file2.tbi' ] +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF concatenated output file + pattern: "*.{vcf.gz}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@abhi18av" diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 0ff54c43..4183ee16 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -3,6 +3,7 @@ // include { VCFANNO } from '../../modules/nf-core/vcfanno/main' +include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' include { BCFTOOLS_ROH } from '../../modules/nf-core/bcftools/roh/main' include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhocall/annotate/main' @@ -111,10 +112,10 @@ workflow ANNOTATE_SNVS { } .set { ch_vep_ann } - ch_vep_ann.view() - + BCFTOOLS_CONCAT (ch_vep_ann) + ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) emit: - vcf_ann = BCFTOOLS_VIEW.out.vcf + vcf_ann = BCFTOOLS_CONCAT.out.vcf versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 0f1d44a68c4d61a129effd58883c2403f2f9da93 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 8 Nov 2022 12:02:42 +0100 Subject: [PATCH 0819/1169] fix CI error --- subworkflows/local/analyse_MT.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index fc950fbf..dadc4214 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -59,17 +59,17 @@ workflow ANALYSE_MT { // STEP 2.3: PICARD_LIFTOVERVCF PICARD_LIFTOVERVCF ( - ALIGN_AND_CALL_MT_SHIFT.out.vcf, - genome_dict, - shift_mt_backchain, - genome_fasta_no_meta) + ALIGN_AND_CALL_MT_SHIFT.out.vcf, + genome_dict, + shift_mt_backchain, + genome_fasta_no_meta) ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions) // STEP 3: MT MERGE AND ANNOTATE VARIANTS MERGE_ANNOTATE_MT( ALIGN_AND_CALL_MT.out.vcf, PICARD_LIFTOVERVCF.out.vcf_lifted, - genome_fasta, + genome_fasta_no_meta, genome_dict, genome_fai, vep_genome, From 212e65ab4fd69e0c6ebe8afebb0ee3ba9a4952df Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 8 Nov 2022 13:30:55 +0100 Subject: [PATCH 0820/1169] fix editor config --- modules/local/gatk4/printreads/main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/local/gatk4/printreads/main.nf b/modules/local/gatk4/printreads/main.nf index 795def9f..25026cc8 100644 --- a/modules/local/gatk4/printreads/main.nf +++ b/modules/local/gatk4/printreads/main.nf @@ -31,11 +31,11 @@ process GATK4_PRINTREADS { } """ gatk --java-options "-Xmx${avail_mem}g" PrintReads \\ - $args \\ - --reference $fasta \\ - --input $bam \\ - --read-index $bai \\ - --output ${prefix}.reads.bam + $args \\ + --reference $fasta \\ + --input $bam \\ + --read-index $bai \\ + --output ${prefix}.reads.bam cat <<-END_VERSIONS > versions.yml "${task.process}": From 7bde794ab13c1f48bec9944494511152bcdbe436 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Nov 2022 15:37:31 +0100 Subject: [PATCH 0821/1169] update modules --- modules.json | 16 +++- modules/local/gatk4/selectvariants/main.nf | 3 +- modules/nf-core/bcftools/concat/main.nf | 11 +++ modules/nf-core/fastqc/main.nf | 6 +- modules/nf-core/gatk4/printreads/main.nf | 64 ++++++++++++++++ modules/nf-core/gatk4/printreads/meta.yml | 76 +++++++++++++++++++ modules/nf-core/gatk4/selectvariants/main.nf | 56 ++++++++++++++ modules/nf-core/gatk4/selectvariants/meta.yml | 60 +++++++++++++++ modules/nf-core/gatk4/splitintervals/main.nf | 13 ++++ .../picard/addorreplacereadgroups/main.nf | 17 +---- .../picard/addorreplacereadgroups/meta.yml | 6 ++ subworkflows/local/annotate_snvs.nf | 2 +- 12 files changed, 306 insertions(+), 24 deletions(-) create mode 100644 modules/nf-core/gatk4/printreads/main.nf create mode 100644 modules/nf-core/gatk4/printreads/meta.yml create mode 100644 modules/nf-core/gatk4/selectvariants/main.nf create mode 100644 modules/nf-core/gatk4/selectvariants/meta.yml diff --git a/modules.json b/modules.json index a456b8ca..21e7ac69 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "bcftools/concat": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "f60fe628e71a25cbbe303f02a01eff706f4bd87d" }, "bcftools/merge": { "branch": "master", @@ -75,7 +75,7 @@ }, "fastqc": { "branch": "master", - "git_sha": "f6a11408536fbee6cbea1f5977605011873de3ca" + "git_sha": "3dd73937b084b547f9272bc901e0f120a7913fd8" }, "gatk4/bedtointervallist": { "branch": "master", @@ -105,6 +105,10 @@ "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, + "gatk4/printreads": { + "branch": "master", + "git_sha": "6220bc7d99377159f4cc7f6a421b494f3e2466d6" + }, "gatk4/revertsam": { "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" @@ -113,9 +117,13 @@ "branch": "master", "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" }, + "gatk4/selectvariants": { + "branch": "master", + "git_sha": "9b7ca0f32e122a0cd1f33689fafbad4112407b42" + }, "gatk4/splitintervals": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "f6ee593e77fbb9fb88e506b761611cccb0bf51ac" }, "gatk4/variantfiltration": { "branch": "master", @@ -167,7 +175,7 @@ }, "picard/addorreplacereadgroups": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "a50554f372baf3e079425e5d3ac4d09dc5ff8bc5" }, "picard/collecthsmetrics": { "branch": "master", diff --git a/modules/local/gatk4/selectvariants/main.nf b/modules/local/gatk4/selectvariants/main.nf index c4364ea4..348f2eb6 100644 --- a/modules/local/gatk4/selectvariants/main.nf +++ b/modules/local/gatk4/selectvariants/main.nf @@ -8,8 +8,7 @@ process GATK4_SELECTVARIANTS { 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" input: - tuple val(meta), path(vcf), path(vcf_idx) - path (intervals_list) + tuple val(meta), path(vcf), path(vcf_idx), path (intervals_list) output: tuple val(meta), path("*.selectvariants.vcf.gz") , emit: vcf diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf index d2a58a55..b62a55a7 100644 --- a/modules/nf-core/bcftools/concat/main.nf +++ b/modules/nf-core/bcftools/concat/main.nf @@ -32,4 +32,15 @@ process BCFTOOLS_CONCAT { bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') END_VERSIONS """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 55c50c87..3bebb240 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -8,7 +8,7 @@ process FASTQC { 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: - tuple val(meta), path(reads, stageAs: "?/*") + tuple val(meta), path(reads) output: tuple val(meta), path("*.html"), emit: html @@ -22,8 +22,8 @@ process FASTQC { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - printf "%s\\n" $reads | while read f; do ln -s \$f ${prefix}_\$(basename \$f) ; done - fastqc $args --threads $task.cpus ${prefix}_* + printf "%s\\n" $reads | while read f; do [[ \$f =~ ^${prefix}.* ]] || ln -s \$f ${prefix}_\$f ; done + fastqc $args --threads $task.cpus ${prefix}* cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/gatk4/printreads/main.nf b/modules/nf-core/gatk4/printreads/main.nf new file mode 100644 index 00000000..c7562d9e --- /dev/null +++ b/modules/nf-core/gatk4/printreads/main.nf @@ -0,0 +1,64 @@ +process GATK4_PRINTREADS { + tag "$meta.id" + label 'process_single' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(input), path(index) + tuple val(meta2), path(fasta) + path (fai) + path (dict) + + output: + tuple val(meta), path("${prefix}.bam") , emit: bam, optional: true + tuple val(meta), path("${prefix}.cram"), emit: cram, optional: true + tuple val(meta), path("${prefix}.sam") , emit: sam, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK PrintReads] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + if ("${input}" == "${prefix}.${input.extension}") { + error("Output filename is the same as input filename. Please specify a different prefix.") + } + + """ + gatk --java-options "-Xmx${avail_mem}g" PrintReads \\ + $args \\ + --reference $fasta \\ + --input $input \\ + --read-index $index \\ + --output ${prefix}.${input.getExtension()} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.${input.getExtension()} + touch ${prefix}.${input.getExtension()} + touch ${prefix}.${input.getExtension()} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/gatk4/printreads/meta.yml b/modules/nf-core/gatk4/printreads/meta.yml new file mode 100644 index 00000000..cd48959f --- /dev/null +++ b/modules/nf-core/gatk4/printreads/meta.yml @@ -0,0 +1,76 @@ +name: "gatk4_printreads" +description: Print reads in the SAM/BAM/CRAM file +keywords: + - gatk4 + - bam + - cram + - sam + - printreads +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - index: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" + - meta2: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: reference fasta file + pattern: "*.{fa,fasta}" + - fai: + type: file + description: reference fasta index file + pattern: "*.{fai}" + - dict: + type: file + description: reference fasta dictionary file + pattern: "*.{dict}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - bam: + type: file + description: Sorted BAM file + pattern: "*.{bam}" + - cram: + type: file + description: Sorted CRAM file + pattern: "*.{cram}" + - sam: + type: file + description: Sorted SAM file + pattern: "*.{sam}" + +authors: + - "@ramprasadn" diff --git a/modules/nf-core/gatk4/selectvariants/main.nf b/modules/nf-core/gatk4/selectvariants/main.nf new file mode 100644 index 00000000..d05bff6f --- /dev/null +++ b/modules/nf-core/gatk4/selectvariants/main.nf @@ -0,0 +1,56 @@ +process GATK4_SELECTVARIANTS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(vcf), path(vcf_idx), path (intervals) + + output: + tuple val(meta), path("*.selectvariants.vcf.gz") , emit: vcf + tuple val(meta), path("*.selectvariants.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def interval = intervals ? "--intervals ${intervals}" : "" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK SelectVariants] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.toGiga() + } + """ + gatk --java-options "-Xmx${avail_mem}G" SelectVariants \\ + --variant $vcf \\ + --output ${prefix}.selectvariants.vcf.gz \\ + $interval \\ + --tmp-dir . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.selectvariants.vcf.gz + touch ${prefix}.selectvariants.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/gatk4/selectvariants/meta.yml b/modules/nf-core/gatk4/selectvariants/meta.yml new file mode 100644 index 00000000..46605d15 --- /dev/null +++ b/modules/nf-core/gatk4/selectvariants/meta.yml @@ -0,0 +1,60 @@ +name: gatk4_selectvariants +description: Select a subset of variants from a VCF file +keywords: + - gatk + - gatk4 + - selectvariants + - vcf +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360036362532-SelectVariants + tool_dev_url: https://github.com/broadinstitute/gatk + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - vcf: + type: list + description: VCF(.gz) file + pattern: "*.{vcf,vcf.gz}" + - vcf_idx: + type: list + description: VCF file index + pattern: "*.{idx,tbi}" + - intervals: + type: file + description: One or more genomic intervals over which to operate + pattern: ".intervals" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: Compressed VCF file + pattern: "*.selectvariants.vcf.gz" + - vcf_tbi: + type: list + description: VCF file index + pattern: "*.{idx,tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@mjcipriano" + - "@ramprasadn" diff --git a/modules/nf-core/gatk4/splitintervals/main.nf b/modules/nf-core/gatk4/splitintervals/main.nf index 5473ae42..c642b210 100644 --- a/modules/nf-core/gatk4/splitintervals/main.nf +++ b/modules/nf-core/gatk4/splitintervals/main.nf @@ -45,4 +45,17 @@ process GATK4_SPLITINTERVALS { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir ${prefix} + touch ${prefix}/0000-scattered.interval_list + touch ${prefix}/0001-scattered.interval_list + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/picard/addorreplacereadgroups/main.nf b/modules/nf-core/picard/addorreplacereadgroups/main.nf index f7f929de..a6debc91 100644 --- a/modules/nf-core/picard/addorreplacereadgroups/main.nf +++ b/modules/nf-core/picard/addorreplacereadgroups/main.nf @@ -12,6 +12,7 @@ process PICARD_ADDORREPLACEREADGROUPS { output: tuple val(meta), path("*.bam"), emit: bam + tuple val(meta), path("*.bai"), emit: bai, optional: true path "versions.yml" , emit: versions when: @@ -20,12 +21,6 @@ process PICARD_ADDORREPLACEREADGROUPS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def ID = task.ext.id ?: "id" - def LIBRARY= task.ext.library ?: "library" - def PLATFORM= task.ext.platform ?: "illumina" - def BARCODE= task.ext.barcode ?: "barcode" - def SAMPLE= task.ext.sample ?: "sample" - def INDEX= task.ext.index ?: "index" def avail_mem = 3 if (!task.memory) { log.info '[Picard AddOrReplaceReadGroups] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -38,17 +33,11 @@ process PICARD_ADDORREPLACEREADGROUPS { AddOrReplaceReadGroups \\ $args \\ --INPUT ${bam} \\ - --OUTPUT ${prefix}.bam \\ - --RGID ${ID} \\ - --RGLB ${LIBRARY} \\ - --RGPL ${PLATFORM} \\ - --RGPU ${BARCODE} \\ - --RGSM ${SAMPLE} \\ - --CREATE_INDEX true + --OUTPUT ${prefix}.bam cat <<-END_VERSIONS > versions.yml "${task.process}": - picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o -E '[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+') END_VERSIONS """ diff --git a/modules/nf-core/picard/addorreplacereadgroups/meta.yml b/modules/nf-core/picard/addorreplacereadgroups/meta.yml index e013bf4b..28f584c3 100644 --- a/modules/nf-core/picard/addorreplacereadgroups/meta.yml +++ b/modules/nf-core/picard/addorreplacereadgroups/meta.yml @@ -39,8 +39,14 @@ output: type: file description: Output BAM file pattern: "*.{bam}" + - bai: + type: file + description: BAM index file + pattern: "*.{bai}" authors: - "@sateeshperi" - "@mjcipriano" - "@hseabolt" + - "@cmatKhan" + - "@muffato" diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 4183ee16..a9183ebb 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -84,7 +84,7 @@ workflow ANNOTATE_SNVS { BCFTOOLS_VIEW.out.vcf.join(TABIX_BCFTOOLS.out.tbi).collect().set { ch_vcf_scatter_in } - GATK4_SELECTVARIANTS (ch_vcf_scatter_in, split_intervals) + GATK4_SELECTVARIANTS (ch_vcf_scatter_in.combine(split_intervals)) ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions) // From e3b0f3ec281becbb6721920203f350675dfb3b87 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Nov 2022 16:21:12 +0100 Subject: [PATCH 0822/1169] remove local and update paths --- modules/local/gatk4/printreads/main.nf | 56 ---------------- modules/local/gatk4/printreads/meta.yml | 64 ------------------- modules/local/gatk4/selectvariants/main.nf | 56 ---------------- modules/local/gatk4/selectvariants/meta.yml | 55 ---------------- subworkflows/local/annotate_snvs.nf | 2 +- .../mitochondria/convert_mt_bam_to_fastq.nf | 2 +- 6 files changed, 2 insertions(+), 233 deletions(-) delete mode 100644 modules/local/gatk4/printreads/main.nf delete mode 100644 modules/local/gatk4/printreads/meta.yml delete mode 100644 modules/local/gatk4/selectvariants/main.nf delete mode 100644 modules/local/gatk4/selectvariants/meta.yml diff --git a/modules/local/gatk4/printreads/main.nf b/modules/local/gatk4/printreads/main.nf deleted file mode 100644 index 25026cc8..00000000 --- a/modules/local/gatk4/printreads/main.nf +++ /dev/null @@ -1,56 +0,0 @@ -process GATK4_PRINTREADS { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" - - input: - tuple val(meta), path(bam), path(bai) - tuple val(meta2), path(fasta) - path (fai) - path (dict) - - output: - tuple val(meta), path("*.reads.bam"), emit: bam - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 - if (!task.memory) { - log.info '[GATK PrintReads] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - """ - gatk --java-options "-Xmx${avail_mem}g" PrintReads \\ - $args \\ - --reference $fasta \\ - --input $bam \\ - --read-index $bai \\ - --output ${prefix}.reads.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.reads.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/gatk4/printreads/meta.yml b/modules/local/gatk4/printreads/meta.yml deleted file mode 100644 index 79050411..00000000 --- a/modules/local/gatk4/printreads/meta.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: "gatk4_printreads" -description: Print reads in the SAM/BAM/CRAM file -keywords: - - printreads -tools: - - gatk4: - description: | - Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools - with a primary focus on variant discovery and genotyping. Its powerful processing engine - and high-performance computing features make it capable of taking on projects of any size. - homepage: https://gatk.broadinstitute.org/hc/en-us - documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s - doi: 10.1158/1538-7445.AM2017-3590 - licence: ["Apache-2.0"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" - - meta2: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fasta: - type: file - description: reference fasta file - pattern: "*.{fa,fasta}" - - fai: - type: file - description: reference fasta index file - pattern: "*.{fai}" - - dict: - type: file - description: reference fasta dictionary file - pattern: "*.{dict}" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - bam: - type: file - description: Sorted BAM/CRAM file - pattern: "*.{bam,cram}" - -authors: - - "@ramprasadn" diff --git a/modules/local/gatk4/selectvariants/main.nf b/modules/local/gatk4/selectvariants/main.nf deleted file mode 100644 index 348f2eb6..00000000 --- a/modules/local/gatk4/selectvariants/main.nf +++ /dev/null @@ -1,56 +0,0 @@ -process GATK4_SELECTVARIANTS { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" - - input: - tuple val(meta), path(vcf), path(vcf_idx), path (intervals_list) - - output: - tuple val(meta), path("*.selectvariants.vcf.gz") , emit: vcf - tuple val(meta), path("*.selectvariants.vcf.gz.tbi") , emit: tbi - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def interval = intervals_list ? "--intervals ${intervals_list}" : "" - def avail_mem = 3 - if (!task.memory) { - log.info '[GATK SelectVariants] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.toGiga() - } - """ - gatk --java-options "-Xmx${avail_mem}G" SelectVariants \\ - --variant $vcf \\ - --output ${prefix}.selectvariants.vcf.gz \\ - $interval \\ - --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.selectvariants.vcf.gz - touch ${prefix}.selectvariants.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/gatk4/selectvariants/meta.yml b/modules/local/gatk4/selectvariants/meta.yml deleted file mode 100644 index 381af249..00000000 --- a/modules/local/gatk4/selectvariants/meta.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: gatk4_selectvariants -description: Select a subset of variants from a VCF file -keywords: - - gatk - - gatk4 - - selectvariants - - vcf -tools: - - gatk4: - description: | - Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools - with a primary focus on variant discovery and genotyping. Its powerful processing engine - and high-performance computing features make it capable of taking on projects of any size. - homepage: https://gatk.broadinstitute.org/hc/en-us - documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360036362532-SelectVariants - tool_dev_url: https://github.com/broadinstitute/gatk - doi: 10.1158/1538-7445.AM2017-3590 - licence: ["Apache-2.0"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test'] - - vcf: - type: list - description: VCF(.gz) file - pattern: "*.{vcf,vcf.gz}" - - vcf_idx: - type: list - description: VCF file index - pattern: "*.{idx,tbi}" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: Compressed VCF file - pattern: "*.selectvariants.vcf.gz" - - vcf_tbi: - type: list - description: VCF file index - pattern: "*.{idx,tbi}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@mjcipriano" diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index a9183ebb..f03466c5 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -12,7 +12,7 @@ include { TABIX_BGZIPTABIX as TABIX_ROHCALL } from '../../modules/nf-core/tabi include { TABIX_BGZIPTABIX as TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' include { TABIX_BGZIPTABIX as TABIX_VEP } from '../../modules/nf-core/tabix/bgziptabix/main' include { TABIX_TABIX as TABIX_BCFTOOLS } from '../../modules/nf-core/tabix/tabix/main' -include { GATK4_SELECTVARIANTS } from '../../modules/local/gatk4/selectvariants/main' +include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariants/main' workflow ANNOTATE_SNVS { diff --git a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf index 19644b90..128b1e81 100644 --- a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf +++ b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf @@ -2,7 +2,7 @@ // Prepare bam files for MT allignment // -include { GATK4_PRINTREADS as GATK4_PRINTREADS_MT } from '../../../modules/local/gatk4/printreads/main' +include { GATK4_PRINTREADS as GATK4_PRINTREADS_MT } from '../../../modules/nf-core/gatk4/printreads/main' include { GATK4_REVERTSAM as GATK4_REVERTSAM_MT } from '../../../modules/nf-core/gatk4/revertsam/main' include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../../modules/nf-core/gatk4/samtofastq/main' From 79d2b8a1b8414f5cfe47a460a1f59db56dd519c6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Nov 2022 17:34:51 +0100 Subject: [PATCH 0823/1169] fix addorreplacegroups --- conf/modules.config | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 7bf44b06..bf411170 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -843,7 +843,14 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } - ext.args = '--VALIDATION_STRINGENCY LENIENT' + ext.args = {[ + '--VALIDATION_STRINGENCY LENIENT', + "-LB ${meta.id}", + "-PL ILLUMINA", + "-PU ${meta.id}", + "-SM ${meta.id}" + ].join(' ').trim() + } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_MARKDUPLICATES_MT' { From a91e77c04f805652f80436718919f027494174b1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:29:24 +0100 Subject: [PATCH 0824/1169] Revert "Merge branch 'dev' of github.com:nf-core/raredisease into feat/scatter_gather" This reverts commit d24ba32615de5893c34f60fa3eb5b64af2f89061, reversing changes made to 66752ece2bc835289808f495c09b3aed58e6260b. --- modules/local/gatk4/printreads/main.nf | 56 ++++++++++++++++++ modules/local/gatk4/printreads/meta.yml | 64 +++++++++++++++++++++ modules/local/gatk4/selectvariants/main.nf | 57 ++++++++++++++++++ modules/local/gatk4/selectvariants/meta.yml | 55 ++++++++++++++++++ subworkflows/local/analyse_MT.nf | 2 +- 5 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 modules/local/gatk4/printreads/main.nf create mode 100644 modules/local/gatk4/printreads/meta.yml create mode 100644 modules/local/gatk4/selectvariants/main.nf create mode 100644 modules/local/gatk4/selectvariants/meta.yml diff --git a/modules/local/gatk4/printreads/main.nf b/modules/local/gatk4/printreads/main.nf new file mode 100644 index 00000000..25026cc8 --- /dev/null +++ b/modules/local/gatk4/printreads/main.nf @@ -0,0 +1,56 @@ +process GATK4_PRINTREADS { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(bam), path(bai) + tuple val(meta2), path(fasta) + path (fai) + path (dict) + + output: + tuple val(meta), path("*.reads.bam"), emit: bam + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK PrintReads] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + gatk --java-options "-Xmx${avail_mem}g" PrintReads \\ + $args \\ + --reference $fasta \\ + --input $bam \\ + --read-index $bai \\ + --output ${prefix}.reads.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.reads.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/gatk4/printreads/meta.yml b/modules/local/gatk4/printreads/meta.yml new file mode 100644 index 00000000..79050411 --- /dev/null +++ b/modules/local/gatk4/printreads/meta.yml @@ -0,0 +1,64 @@ +name: "gatk4_printreads" +description: Print reads in the SAM/BAM/CRAM file +keywords: + - printreads +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" + - meta2: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: reference fasta file + pattern: "*.{fa,fasta}" + - fai: + type: file + description: reference fasta index file + pattern: "*.{fai}" + - dict: + type: file + description: reference fasta dictionary file + pattern: "*.{dict}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - bam: + type: file + description: Sorted BAM/CRAM file + pattern: "*.{bam,cram}" + +authors: + - "@ramprasadn" diff --git a/modules/local/gatk4/selectvariants/main.nf b/modules/local/gatk4/selectvariants/main.nf new file mode 100644 index 00000000..c4364ea4 --- /dev/null +++ b/modules/local/gatk4/selectvariants/main.nf @@ -0,0 +1,57 @@ +process GATK4_SELECTVARIANTS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + + input: + tuple val(meta), path(vcf), path(vcf_idx) + path (intervals_list) + + output: + tuple val(meta), path("*.selectvariants.vcf.gz") , emit: vcf + tuple val(meta), path("*.selectvariants.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def interval = intervals_list ? "--intervals ${intervals_list}" : "" + def avail_mem = 3 + if (!task.memory) { + log.info '[GATK SelectVariants] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.toGiga() + } + """ + gatk --java-options "-Xmx${avail_mem}G" SelectVariants \\ + --variant $vcf \\ + --output ${prefix}.selectvariants.vcf.gz \\ + $interval \\ + --tmp-dir . \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.selectvariants.vcf.gz + touch ${prefix}.selectvariants.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/gatk4/selectvariants/meta.yml b/modules/local/gatk4/selectvariants/meta.yml new file mode 100644 index 00000000..381af249 --- /dev/null +++ b/modules/local/gatk4/selectvariants/meta.yml @@ -0,0 +1,55 @@ +name: gatk4_selectvariants +description: Select a subset of variants from a VCF file +keywords: + - gatk + - gatk4 + - selectvariants + - vcf +tools: + - gatk4: + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360036362532-SelectVariants + tool_dev_url: https://github.com/broadinstitute/gatk + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - vcf: + type: list + description: VCF(.gz) file + pattern: "*.{vcf,vcf.gz}" + - vcf_idx: + type: list + description: VCF file index + pattern: "*.{idx,tbi}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: Compressed VCF file + pattern: "*.selectvariants.vcf.gz" + - vcf_tbi: + type: list + description: VCF file index + pattern: "*.{idx,tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@mjcipriano" diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index dadc4214..477949db 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -69,7 +69,7 @@ workflow ANALYSE_MT { MERGE_ANNOTATE_MT( ALIGN_AND_CALL_MT.out.vcf, PICARD_LIFTOVERVCF.out.vcf_lifted, - genome_fasta_no_meta, + genome_fasta, genome_dict, genome_fai, vep_genome, From a423578641d0565b4cfc69fa851fe4f50981e3cf Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:50:41 +0100 Subject: [PATCH 0825/1169] fix addorreplacerd --- modules.json | 2 +- modules/local/gatk4/printreads/main.nf | 56 ---------------- modules/local/gatk4/printreads/meta.yml | 64 ------------------- modules/local/gatk4/selectvariants/main.nf | 57 ----------------- modules/local/gatk4/selectvariants/meta.yml | 55 ---------------- .../picard/addorreplacereadgroups/main.nf | 17 ++++- .../picard/addorreplacereadgroups/meta.yml | 6 -- 7 files changed, 15 insertions(+), 242 deletions(-) delete mode 100644 modules/local/gatk4/printreads/main.nf delete mode 100644 modules/local/gatk4/printreads/meta.yml delete mode 100644 modules/local/gatk4/selectvariants/main.nf delete mode 100644 modules/local/gatk4/selectvariants/meta.yml diff --git a/modules.json b/modules.json index 21e7ac69..cf2998ec 100644 --- a/modules.json +++ b/modules.json @@ -175,7 +175,7 @@ }, "picard/addorreplacereadgroups": { "branch": "master", - "git_sha": "a50554f372baf3e079425e5d3ac4d09dc5ff8bc5" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, "picard/collecthsmetrics": { "branch": "master", diff --git a/modules/local/gatk4/printreads/main.nf b/modules/local/gatk4/printreads/main.nf deleted file mode 100644 index 25026cc8..00000000 --- a/modules/local/gatk4/printreads/main.nf +++ /dev/null @@ -1,56 +0,0 @@ -process GATK4_PRINTREADS { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" - - input: - tuple val(meta), path(bam), path(bai) - tuple val(meta2), path(fasta) - path (fai) - path (dict) - - output: - tuple val(meta), path("*.reads.bam"), emit: bam - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 - if (!task.memory) { - log.info '[GATK PrintReads] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - """ - gatk --java-options "-Xmx${avail_mem}g" PrintReads \\ - $args \\ - --reference $fasta \\ - --input $bam \\ - --read-index $bai \\ - --output ${prefix}.reads.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.reads.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/gatk4/printreads/meta.yml b/modules/local/gatk4/printreads/meta.yml deleted file mode 100644 index 79050411..00000000 --- a/modules/local/gatk4/printreads/meta.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: "gatk4_printreads" -description: Print reads in the SAM/BAM/CRAM file -keywords: - - printreads -tools: - - gatk4: - description: | - Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools - with a primary focus on variant discovery and genotyping. Its powerful processing engine - and high-performance computing features make it capable of taking on projects of any size. - homepage: https://gatk.broadinstitute.org/hc/en-us - documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s - doi: 10.1158/1538-7445.AM2017-3590 - licence: ["Apache-2.0"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" - - meta2: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fasta: - type: file - description: reference fasta file - pattern: "*.{fa,fasta}" - - fai: - type: file - description: reference fasta index file - pattern: "*.{fai}" - - dict: - type: file - description: reference fasta dictionary file - pattern: "*.{dict}" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - bam: - type: file - description: Sorted BAM/CRAM file - pattern: "*.{bam,cram}" - -authors: - - "@ramprasadn" diff --git a/modules/local/gatk4/selectvariants/main.nf b/modules/local/gatk4/selectvariants/main.nf deleted file mode 100644 index c4364ea4..00000000 --- a/modules/local/gatk4/selectvariants/main.nf +++ /dev/null @@ -1,57 +0,0 @@ -process GATK4_SELECTVARIANTS { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" - - input: - tuple val(meta), path(vcf), path(vcf_idx) - path (intervals_list) - - output: - tuple val(meta), path("*.selectvariants.vcf.gz") , emit: vcf - tuple val(meta), path("*.selectvariants.vcf.gz.tbi") , emit: tbi - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def interval = intervals_list ? "--intervals ${intervals_list}" : "" - def avail_mem = 3 - if (!task.memory) { - log.info '[GATK SelectVariants] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.toGiga() - } - """ - gatk --java-options "-Xmx${avail_mem}G" SelectVariants \\ - --variant $vcf \\ - --output ${prefix}.selectvariants.vcf.gz \\ - $interval \\ - --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.selectvariants.vcf.gz - touch ${prefix}.selectvariants.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/gatk4/selectvariants/meta.yml b/modules/local/gatk4/selectvariants/meta.yml deleted file mode 100644 index 381af249..00000000 --- a/modules/local/gatk4/selectvariants/meta.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: gatk4_selectvariants -description: Select a subset of variants from a VCF file -keywords: - - gatk - - gatk4 - - selectvariants - - vcf -tools: - - gatk4: - description: | - Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools - with a primary focus on variant discovery and genotyping. Its powerful processing engine - and high-performance computing features make it capable of taking on projects of any size. - homepage: https://gatk.broadinstitute.org/hc/en-us - documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360036362532-SelectVariants - tool_dev_url: https://github.com/broadinstitute/gatk - doi: 10.1158/1538-7445.AM2017-3590 - licence: ["Apache-2.0"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test'] - - vcf: - type: list - description: VCF(.gz) file - pattern: "*.{vcf,vcf.gz}" - - vcf_idx: - type: list - description: VCF file index - pattern: "*.{idx,tbi}" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: Compressed VCF file - pattern: "*.selectvariants.vcf.gz" - - vcf_tbi: - type: list - description: VCF file index - pattern: "*.{idx,tbi}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@mjcipriano" diff --git a/modules/nf-core/picard/addorreplacereadgroups/main.nf b/modules/nf-core/picard/addorreplacereadgroups/main.nf index a6debc91..f7f929de 100644 --- a/modules/nf-core/picard/addorreplacereadgroups/main.nf +++ b/modules/nf-core/picard/addorreplacereadgroups/main.nf @@ -12,7 +12,6 @@ process PICARD_ADDORREPLACEREADGROUPS { output: tuple val(meta), path("*.bam"), emit: bam - tuple val(meta), path("*.bai"), emit: bai, optional: true path "versions.yml" , emit: versions when: @@ -21,6 +20,12 @@ process PICARD_ADDORREPLACEREADGROUPS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def ID = task.ext.id ?: "id" + def LIBRARY= task.ext.library ?: "library" + def PLATFORM= task.ext.platform ?: "illumina" + def BARCODE= task.ext.barcode ?: "barcode" + def SAMPLE= task.ext.sample ?: "sample" + def INDEX= task.ext.index ?: "index" def avail_mem = 3 if (!task.memory) { log.info '[Picard AddOrReplaceReadGroups] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -33,11 +38,17 @@ process PICARD_ADDORREPLACEREADGROUPS { AddOrReplaceReadGroups \\ $args \\ --INPUT ${bam} \\ - --OUTPUT ${prefix}.bam + --OUTPUT ${prefix}.bam \\ + --RGID ${ID} \\ + --RGLB ${LIBRARY} \\ + --RGPL ${PLATFORM} \\ + --RGPU ${BARCODE} \\ + --RGSM ${SAMPLE} \\ + --CREATE_INDEX true cat <<-END_VERSIONS > versions.yml "${task.process}": - picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o -E '[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+') + picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ diff --git a/modules/nf-core/picard/addorreplacereadgroups/meta.yml b/modules/nf-core/picard/addorreplacereadgroups/meta.yml index 28f584c3..e013bf4b 100644 --- a/modules/nf-core/picard/addorreplacereadgroups/meta.yml +++ b/modules/nf-core/picard/addorreplacereadgroups/meta.yml @@ -39,14 +39,8 @@ output: type: file description: Output BAM file pattern: "*.{bam}" - - bai: - type: file - description: BAM index file - pattern: "*.{bai}" authors: - "@sateeshperi" - "@mjcipriano" - "@hseabolt" - - "@cmatKhan" - - "@muffato" From ced43f9e52bce4e7e497ca00b36ba37452ec9145 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:58:54 +0100 Subject: [PATCH 0826/1169] update conf --- conf/modules.config | 10 ++-------- subworkflows/local/analyse_MT.nf | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index bf411170..1393c6b6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -805,6 +805,7 @@ process { process { withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_PRINTREADS_MT' { + memory = 60.GB beforeScript = {"mkdir ./tmp"} ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } ext.args = [ @@ -843,14 +844,7 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } - ext.args = {[ - '--VALIDATION_STRINGENCY LENIENT', - "-LB ${meta.id}", - "-PL ILLUMINA", - "-PU ${meta.id}", - "-SM ${meta.id}" - ].join(' ').trim() - } + ext.args = '--VALIDATION_STRINGENCY LENIENT' } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_MARKDUPLICATES_MT' { diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 477949db..dadc4214 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -69,7 +69,7 @@ workflow ANALYSE_MT { MERGE_ANNOTATE_MT( ALIGN_AND_CALL_MT.out.vcf, PICARD_LIFTOVERVCF.out.vcf_lifted, - genome_fasta, + genome_fasta_no_meta, genome_dict, genome_fai, vep_genome, From ecc71a560fe6c48dad5138b06af31e1000f67433 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Nov 2022 19:03:37 +0100 Subject: [PATCH 0827/1169] revert fastqc --- modules.json | 2 +- modules/nf-core/fastqc/main.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index cf2998ec..3b61dfb1 100644 --- a/modules.json +++ b/modules.json @@ -75,7 +75,7 @@ }, "fastqc": { "branch": "master", - "git_sha": "3dd73937b084b547f9272bc901e0f120a7913fd8" + "git_sha": "f6a11408536fbee6cbea1f5977605011873de3ca" }, "gatk4/bedtointervallist": { "branch": "master", diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 3bebb240..55c50c87 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -8,7 +8,7 @@ process FASTQC { 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: - tuple val(meta), path(reads) + tuple val(meta), path(reads, stageAs: "?/*") output: tuple val(meta), path("*.html"), emit: html @@ -22,8 +22,8 @@ process FASTQC { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - printf "%s\\n" $reads | while read f; do [[ \$f =~ ^${prefix}.* ]] || ln -s \$f ${prefix}_\$f ; done - fastqc $args --threads $task.cpus ${prefix}* + printf "%s\\n" $reads | while read f; do ln -s \$f ${prefix}_\$(basename \$f) ; done + fastqc $args --threads $task.cpus ${prefix}_* cat <<-END_VERSIONS > versions.yml "${task.process}": From 4dfb487eea2449d7e21174af03f00edafba04e5a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 9 Nov 2022 19:18:21 +0100 Subject: [PATCH 0828/1169] rename aliases --- conf/modules.config | 1 - subworkflows/local/annotate_snvs.nf | 40 ++++++++++++++--------------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1393c6b6..7bf44b06 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -805,7 +805,6 @@ process { process { withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_PRINTREADS_MT' { - memory = 60.GB beforeScript = {"mkdir ./tmp"} ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } ext.args = [ diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index f03466c5..73f005e9 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -2,17 +2,17 @@ // A subworkflow to annotate snvs // -include { VCFANNO } from '../../modules/nf-core/vcfanno/main' -include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' -include { BCFTOOLS_ROH } from '../../modules/nf-core/bcftools/roh/main' -include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' -include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhocall/annotate/main' -include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' -include { TABIX_BGZIPTABIX as TABIX_ROHCALL } from '../../modules/nf-core/tabix/bgziptabix/main' -include { TABIX_BGZIPTABIX as TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' -include { TABIX_BGZIPTABIX as TABIX_VEP } from '../../modules/nf-core/tabix/bgziptabix/main' -include { TABIX_TABIX as TABIX_BCFTOOLS } from '../../modules/nf-core/tabix/tabix/main' -include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariants/main' +include { VCFANNO } from '../../modules/nf-core/vcfanno/main' +include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' +include { BCFTOOLS_ROH } from '../../modules/nf-core/bcftools/roh/main' +include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' +include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhocall/annotate/main' +include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' +include { TABIX_BGZIPTABIX as ZIP_TABIX_ROHCALL } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_BGZIPTABIX as ZIP_TABIX_VEP } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_TABIX as TABIX_BCFTOOLS } from '../../modules/nf-core/tabix/tabix/main' +include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariants/main' workflow ANNOTATE_SNVS { @@ -64,19 +64,19 @@ workflow ANNOTATE_SNVS { RHOCALL_ANNOTATE (vcf, ch_roh_rhocall, []) - TABIX_ROHCALL (RHOCALL_ANNOTATE.out.vcf) - ch_versions = ch_versions.mix(TABIX_ROHCALL.out.versions) + ZIP_TABIX_ROHCALL (RHOCALL_ANNOTATE.out.vcf) + ch_versions = ch_versions.mix(ZIP_TABIX_ROHCALL.out.versions) // // annotate vcfanno // - VCFANNO (TABIX_ROHCALL.out.gz_tbi, ch_toml, vcfanno_resource_dir) + VCFANNO (ZIP_TABIX_ROHCALL.out.gz_tbi, ch_toml, vcfanno_resource_dir) ch_versions = ch_versions.mix(VCFANNO.out.versions) - TABIX_VCFANNO (VCFANNO.out.vcf) - ch_versions = ch_versions.mix(TABIX_VCFANNO.out.versions) + ZIP_TABIX_VCFANNO (VCFANNO.out.vcf) + ch_versions = ch_versions.mix(ZIP_TABIX_VCFANNO.out.versions) - BCFTOOLS_VIEW(TABIX_VCFANNO.out.gz_tbi,[],[],[]) + BCFTOOLS_VIEW(ZIP_TABIX_VCFANNO.out.gz_tbi,[],[],[]) ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) TABIX_BCFTOOLS (BCFTOOLS_VIEW.out.vcf) @@ -100,10 +100,10 @@ workflow ANNOTATE_SNVS { ) ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) - TABIX_VEP (ENSEMBLVEP_SNV.out.vcf) - ch_versions = ch_versions.mix(TABIX_VEP.out.versions) + ZIP_TABIX_VEP (ENSEMBLVEP_SNV.out.vcf) + ch_versions = ch_versions.mix(ZIP_TABIX_VEP.out.versions) - TABIX_VEP.out.gz_tbi + ZIP_TABIX_VEP.out.gz_tbi .groupTuple() .map { meta, vcfs, tbis -> def sortedvcfs = vcfs.sort() From 0da17d91d4ab41f132e6ebaacae57f2c3a62a61b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 11 Nov 2022 01:06:46 +0100 Subject: [PATCH 0829/1169] review suggestions --- conf/modules.config | 10 ++++++---- subworkflows/local/annotate_snvs.nf | 7 ++++--- subworkflows/local/scatter_genome.nf | 5 +++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 7bf44b06..620ad944 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -272,9 +272,13 @@ process { // process { + withName: '.*SCATTER_GENOME:BUILD_BED' { + ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} + } + withName: '.*SCATTER_GENOME:GATK4_SPLITINTERVALS' { ext.args = { "--subdivision-mode BALANCING_WITHOUT_INTERVAL_SUBDIVISION --scatter-count 22" } - ext.when = { params.annotate_snv_switch } + ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} ext.prefix = { "${meta.id}_genome_intervals" } publishDir = [ enabled: params.save_reference, @@ -730,10 +734,8 @@ process { } withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { - cpus = 1 - memory = 60.GB ext.prefix = { "${meta.id}_${intervals_list.simpleName}" } - ext.when = { params.annotate_snv_switch } + ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} publishDir = [ enabled: params.save_reference, path: { "${params.outdir}/processed_references" }, diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 73f005e9..8f24e350 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -32,6 +32,7 @@ workflow ANNOTATE_SNVS { ch_versions = Channel.empty() ch_toml = Channel.fromPath(vcfanno_toml) ch_vcf_scatter_in = Channel.empty() + ch_vep_in = Channel.empty() // // annotate rhocall @@ -76,7 +77,7 @@ workflow ANNOTATE_SNVS { ZIP_TABIX_VCFANNO (VCFANNO.out.vcf) ch_versions = ch_versions.mix(ZIP_TABIX_VCFANNO.out.versions) - BCFTOOLS_VIEW(ZIP_TABIX_VCFANNO.out.gz_tbi,[],[],[]) + BCFTOOLS_VIEW(ZIP_TABIX_VCFANNO.out.gz_tbi,[],[],[]).vcf.set { ch_vep_in } ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) TABIX_BCFTOOLS (BCFTOOLS_VIEW.out.vcf) @@ -84,13 +85,13 @@ workflow ANNOTATE_SNVS { BCFTOOLS_VIEW.out.vcf.join(TABIX_BCFTOOLS.out.tbi).collect().set { ch_vcf_scatter_in } - GATK4_SELECTVARIANTS (ch_vcf_scatter_in.combine(split_intervals)) + GATK4_SELECTVARIANTS (ch_vcf_scatter_in.combine(split_intervals)).vcf.set { ch_vep_in } ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions) // // annotate vep // - ENSEMBLVEP_SNV(GATK4_SELECTVARIANTS.out.vcf, + ENSEMBLVEP_SNV(ch_vep_in, vep_genome, "homo_sapiens", vep_cache_version, diff --git a/subworkflows/local/scatter_genome.nf b/subworkflows/local/scatter_genome.nf index d60a04fc..2ae43b03 100644 --- a/subworkflows/local/scatter_genome.nf +++ b/subworkflows/local/scatter_genome.nf @@ -1,5 +1,10 @@ +// +// A subworkflow to create genome interval files necessary for bam/vcf scatter operations. +// + include { BUILD_BED } from '../../modules/local/create_bed_from_fai' include { GATK4_SPLITINTERVALS } from '../../modules/nf-core/gatk4/splitintervals/main' + workflow SCATTER_GENOME { take: From d737c0507f89ac2668845724ce6ba48b1c10aa3e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 14 Nov 2022 12:13:38 +0100 Subject: [PATCH 0830/1169] fix closure type error --- conf/modules.config | 55 +++++++++++++++---- .../local/mitochondria/merge_annotate_MT.nf | 2 + 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 620ad944..d971b2f9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -734,7 +734,7 @@ process { } withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { - ext.prefix = { "${meta.id}_${intervals_list.simpleName}" } + ext.prefix = { "${meta.id}_${intervals.simpleName}" } ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} publishDir = [ enabled: params.save_reference, @@ -763,8 +763,8 @@ process { ] } - withName: '.*ANNOTATE_SNVS:TABIX_VEP' { - ext.prefix = { "${input.simpleName}_vep" } + withName: '.*ANNOTATE_SNVS:ZIP_TABIX_VEP' { + ext.prefix = { "${input.simpleName}" } publishDir = [ path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, @@ -925,15 +925,31 @@ process { withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_MERGEVCFS_LIFT_UNLIFT_MT' { ext.prefix = { "${meta.id}_merged" } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_VARIANTFILTRATION_MT' { ext.prefix = { "${meta.id}_filt" } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:SPLIT_MULTIALLELICS_MT' { + ext.args = '--output-type z --multiallelics -both' + ext.prefix = { "${meta.id}_split" } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + publishDir = [ + enabled: false + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:REMOVE_DUPLICATES_MT' { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } publishDir = [ path: { "${params.outdir}/gatk4" }, mode: params.publish_dir_mode, @@ -941,6 +957,27 @@ process { ] } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT2' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:CHANGE_NAME_VCF_MT' { + ext.file_type = 'vcf.gz' + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:BCFTOOLS_MERGE_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HMTNOTE_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT3' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ENSEMBLVEP_MT' { ext.args = [ '--plugin LoFtool,vep_cache/LoFtool_scores.txt', @@ -953,23 +990,17 @@ process { '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl', '--uniprot' ].join(' ') + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } publishDir = [ path: { "${params.outdir}/mt_annotation" }, mode: params.publish_dir_mode, ] } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:SPLIT_MULTIALLELICS_MT' { - ext.args = '--output-type z --multiallelics -both' - ext.prefix = { "${meta.id}_split" } - publishDir = [ - enabled: false - ] + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HAPLOGREP2_CLASSIFY_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:CHANGE_NAME_VCF_MT' { - ext.file_type = 'vcf.gz' - } } process { diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 659b5f4e..f61b2724 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -62,11 +62,13 @@ workflow MERGE_ANNOTATE_MT { REMOVE_DUPLICATES_MT.out.vcf .collect{it[1]} + .ifEmpty([]) .toList() .set { file_list_vcf } TABIX_TABIX_MT2.out.tbi .collect{it[1]} + .ifEmpty([]) .toList() .set { file_list_tbi } From 5c6f81114ad1716fba78de6ca4b392a28e8797df Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 14 Nov 2022 17:08:47 +0100 Subject: [PATCH 0831/1169] fix default sample name issue --- conf/modules.config | 24 ++++++++++++++----- modules.json | 18 +++++++------- .../picard/addorreplacereadgroups/main.nf | 17 +++---------- .../picard/addorreplacereadgroups/meta.yml | 6 +++++ subworkflows/local/alignment/align_bwamem2.nf | 12 +++++----- 5 files changed, 42 insertions(+), 35 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index d971b2f9..ff169409 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -834,7 +834,7 @@ process { process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:BWAMEM2_MEM_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } - ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } + ext.args = { "-M -K 100000000 -R ${meta.read_group}" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MERGEBAMALIGNMENT_MT' { @@ -845,7 +845,13 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } - ext.args = '--VALIDATION_STRINGENCY LENIENT' + ext.args = { [ + "--VALIDATION_STRINGENCY LENIENT", + "--RGLB lib", + "--RGPL ILLUMINA", + "--RGPU barcode", + "--RGSM ${meta.id}" + ].join(' ' ).trim() } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_MARKDUPLICATES_MT' { @@ -876,7 +882,7 @@ process { process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } - ext.args = { "-M -K 100000000 -R \"@RG\\tID:${meta.id}\\tSM:${meta.sample}\\tLB:${meta.library}\\tPL:illumina\"" } + ext.args = { "-M -K 100000000 -R ${meta.read_group}" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MERGEBAMALIGNMENT_MT' { @@ -887,13 +893,19 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_ADDORREPLACEREADGROUPS_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } - ext.args = '--VALIDATION_STRINGENCY LENIENT' + ext.args = { [ + "--VALIDATION_STRINGENCY LENIENT", + "--RGLB lib", + "--RGPL ILLUMINA", + "--RGPU barcode", + "--RGSM ${meta.id}" + ].join(' ' ).trim() } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_MARKDUPLICATES_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' - ext.prefix = { "${meta.id}_markduplicates__shifted" } + ext.prefix = { "${meta.id}_markduplicates_shifted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SAMTOOLS_SORT_MT' { @@ -913,7 +925,7 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_FILTERMUTECTCALLS_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } - ext.prefix = { "${meta.id}_filtered__shifted" } + ext.prefix = { "${meta.id}_filtered_shifted" } } } diff --git a/modules.json b/modules.json index 3b61dfb1..91265bca 100644 --- a/modules.json +++ b/modules.json @@ -7,23 +7,23 @@ "nf-core": { "bcftools/concat": { "branch": "master", - "git_sha": "f60fe628e71a25cbbe303f02a01eff706f4bd87d" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" }, "bcftools/merge": { "branch": "master", - "git_sha": "d1147c1baa105d01e5e39bd668a101bb213f1c37" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" }, "bcftools/norm": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" }, "bcftools/roh": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" }, "bcftools/view": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" }, "bwa/index": { "branch": "master", @@ -35,7 +35,7 @@ }, "bwamem2/mem": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" }, "cat/cat": { "branch": "master", @@ -67,7 +67,7 @@ }, "deepvariant": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "6e58487f28429876b7cad237afbf4685e90c7bd4" }, "expansionhunter": { "branch": "master", @@ -75,7 +75,7 @@ }, "fastqc": { "branch": "master", - "git_sha": "f6a11408536fbee6cbea1f5977605011873de3ca" + "git_sha": "3dd73937b084b547f9272bc901e0f120a7913fd8" }, "gatk4/bedtointervallist": { "branch": "master", @@ -175,7 +175,7 @@ }, "picard/addorreplacereadgroups": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "a50554f372baf3e079425e5d3ac4d09dc5ff8bc5" }, "picard/collecthsmetrics": { "branch": "master", diff --git a/modules/nf-core/picard/addorreplacereadgroups/main.nf b/modules/nf-core/picard/addorreplacereadgroups/main.nf index f7f929de..a6debc91 100644 --- a/modules/nf-core/picard/addorreplacereadgroups/main.nf +++ b/modules/nf-core/picard/addorreplacereadgroups/main.nf @@ -12,6 +12,7 @@ process PICARD_ADDORREPLACEREADGROUPS { output: tuple val(meta), path("*.bam"), emit: bam + tuple val(meta), path("*.bai"), emit: bai, optional: true path "versions.yml" , emit: versions when: @@ -20,12 +21,6 @@ process PICARD_ADDORREPLACEREADGROUPS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def ID = task.ext.id ?: "id" - def LIBRARY= task.ext.library ?: "library" - def PLATFORM= task.ext.platform ?: "illumina" - def BARCODE= task.ext.barcode ?: "barcode" - def SAMPLE= task.ext.sample ?: "sample" - def INDEX= task.ext.index ?: "index" def avail_mem = 3 if (!task.memory) { log.info '[Picard AddOrReplaceReadGroups] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -38,17 +33,11 @@ process PICARD_ADDORREPLACEREADGROUPS { AddOrReplaceReadGroups \\ $args \\ --INPUT ${bam} \\ - --OUTPUT ${prefix}.bam \\ - --RGID ${ID} \\ - --RGLB ${LIBRARY} \\ - --RGPL ${PLATFORM} \\ - --RGPU ${BARCODE} \\ - --RGSM ${SAMPLE} \\ - --CREATE_INDEX true + --OUTPUT ${prefix}.bam cat <<-END_VERSIONS > versions.yml "${task.process}": - picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o -E '[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+') END_VERSIONS """ diff --git a/modules/nf-core/picard/addorreplacereadgroups/meta.yml b/modules/nf-core/picard/addorreplacereadgroups/meta.yml index e013bf4b..28f584c3 100644 --- a/modules/nf-core/picard/addorreplacereadgroups/meta.yml +++ b/modules/nf-core/picard/addorreplacereadgroups/meta.yml @@ -39,8 +39,14 @@ output: type: file description: Output BAM file pattern: "*.{bam}" + - bai: + type: file + description: BAM index file + pattern: "*.{bai}" authors: - "@sateeshperi" - "@mjcipriano" - "@hseabolt" + - "@cmatKhan" + - "@muffato" diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 9e53e49f..33d1e47a 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -34,12 +34,12 @@ workflow ALIGN_BWAMEM2 { // Merge multiple lane samples and index BWAMEM2_MEM.out.bam .map{ meta, bam -> - new_meta = meta.clone() // clone to avoid overriding the global meta - new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename - new_meta.read_group = [] // remove read group from cloned meta to get a single file per sample - [new_meta, bam]} // end the closure to return newly modified channel - .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] - .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list + new_meta = meta.clone() // clone to avoid overriding the global meta + new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename + new_meta.read_group = "\'@RG\\tID:"+ new_meta.id + "\\tPL:ILLUMINA\\tSM:"+new_meta.id+"\'" + [new_meta, bam]} // end the closure to return newly modified channel + .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] + .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list single: it[1].size() == 1 multiple: it[1].size() > 1 } From f928eb3ef57c46ab559ca5809d8074e7d81fbbcb Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 14 Nov 2022 18:02:57 +0100 Subject: [PATCH 0832/1169] update modules --- modules.json | 14 ++--- .../nf-core/picard/renamesampleinvcf/main.nf | 56 ------------------- .../nf-core/picard/renamesampleinvcf/meta.yml | 44 --------------- modules/nf-core/samtools/faidx/main.nf | 6 +- modules/nf-core/samtools/index/main.nf | 6 +- modules/nf-core/samtools/merge/main.nf | 6 +- modules/nf-core/samtools/sort/main.nf | 6 +- modules/nf-core/samtools/stats/main.nf | 6 +- .../local/mitochondria/align_and_call_MT.nf | 12 +--- 9 files changed, 22 insertions(+), 134 deletions(-) delete mode 100644 modules/nf-core/picard/renamesampleinvcf/main.nf delete mode 100644 modules/nf-core/picard/renamesampleinvcf/meta.yml diff --git a/modules.json b/modules.json index 91265bca..52e92c27 100644 --- a/modules.json +++ b/modules.json @@ -193,10 +193,6 @@ "branch": "master", "git_sha": "eca65aa4a5e2e192ac44d6962c8f9260f314ffb8" }, - "picard/renamesampleinvcf": { - "branch": "master", - "git_sha": "af53d9fcbc10982ff8fd1b87f9fec60b19eaba3d" - }, "picard/sortvcf": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" @@ -211,23 +207,23 @@ }, "samtools/faidx": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" }, "samtools/index": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" }, "samtools/merge": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" }, "samtools/sort": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" }, "samtools/stats": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" }, "stranger": { "branch": "master", diff --git a/modules/nf-core/picard/renamesampleinvcf/main.nf b/modules/nf-core/picard/renamesampleinvcf/main.nf deleted file mode 100644 index da492b0d..00000000 --- a/modules/nf-core/picard/renamesampleinvcf/main.nf +++ /dev/null @@ -1,56 +0,0 @@ - -process PICARD_RENAMESAMPLEINVCF { - tag "$meta.id" - label 'process_single' - - conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" - - input: - tuple val(meta), path(vcf) - - output: - tuple val(meta), path("*.vcf.gz"), emit: vcf - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def extended_args = args.contains("--NEW_SAMPLE_NAME") ? $args : "${args} --NEW_SAMPLE_NAME ${meta.id}" - def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 - if (!task.memory) { - log.info '[Picard RenameSampleInVcf] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - - """ - picard \\ - RenameSampleInVcf \\ - -Xmx${avail_mem}g \\ - --INPUT $vcf \\ - --OUTPUT ${prefix}_renam.vcf.gz \\ - $extended_args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$(picard RenameSampleInVcf --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) - END_VERSIONS - """ - - stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}_renam.vcf.gz - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$(picard RenameSampleInVcf --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) - END_VERSIONS - """ -} diff --git a/modules/nf-core/picard/renamesampleinvcf/meta.yml b/modules/nf-core/picard/renamesampleinvcf/meta.yml deleted file mode 100644 index 8f3ed6b4..00000000 --- a/modules/nf-core/picard/renamesampleinvcf/meta.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: "picard_renamesampleinvcf" -description: changes name of sample in the vcf file -keywords: - - picard - - picard/renamesampleinvcf -tools: - - "picard": - description: | - A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) - data and formats such as SAM/BAM/CRAM and VCF. - homepage: https://broadinstitute.github.io/picard/ - documentation: https://broadinstitute.github.io/picard/ - tool_dev_url: "https://github.com/broadinstitute/picard" - doi: "" - licence: "['MIT']" - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: VCF file - pattern: "*.{vcf,vcf.gz}" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - vcf: - type: file - description: VCF file - pattern: "*.{vcf,vcf.gz}" - -authors: - - "@Lucpen" diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index ef940db2..2830963e 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_FAIDX { tag "$fasta" label 'process_single' - conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : + 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index e04e63e8..8577dc9d 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : + 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" input: tuple val(meta), path(input) diff --git a/modules/nf-core/samtools/merge/main.nf b/modules/nf-core/samtools/merge/main.nf index 91f14116..89dd072a 100644 --- a/modules/nf-core/samtools/merge/main.nf +++ b/modules/nf-core/samtools/merge/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_MERGE { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : + 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" input: tuple val(meta), path(input_files, stageAs: "?/*") diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf index ab7f1cca..ac43e67a 100644 --- a/modules/nf-core/samtools/sort/main.nf +++ b/modules/nf-core/samtools/sort/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : + 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" input: tuple val(meta), path(bam) diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index 9b0c3867..5d2fd68a 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_STATS { tag "$meta.id" label 'process_single' - conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : + 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" input: tuple val(meta), path(input), path(input_index) diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 2857c64e..83c065ba 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -11,7 +11,6 @@ include { SAMTOOLS_SORT as SAMTOOLS_SORT_MT } fr include { HAPLOCHECK as HAPLOCHECK_MT } from '../../../modules/nf-core/haplocheck/main' include { GATK4_MUTECT2 as GATK4_MUTECT2_MT } from '../../../modules/nf-core/gatk4/mutect2/main' include { GATK4_FILTERMUTECTCALLS as GATK4_FILTERMUTECTCALLS_MT } from '../../../modules/nf-core/gatk4/filtermutectcalls/main' -include { PICARD_RENAMESAMPLEINVCF as PICARD_RENAMESAMPLEINVCF_MT } from '../../../modules/nf-core/picard/renamesampleinvcf/main' include { TABIX_TABIX as TABIX_TABIX_MT } from '../../../modules/nf-core/tabix/tabix/main' workflow ALIGN_AND_CALL_MT { @@ -77,17 +76,10 @@ workflow ALIGN_AND_CALL_MT { genome_dict ) ch_versions = ch_versions.mix(GATK4_FILTERMUTECTCALLS_MT.out.versions.first()) - // Replace within the vcf sample as a sample name with meta.id - PICARD_RENAMESAMPLEINVCF_MT(GATK4_FILTERMUTECTCALLS_MT.out.vcf) - ch_versions = ch_versions.mix(PICARD_RENAMESAMPLEINVCF_MT.out.versions.first()) - - TABIX_TABIX_MT(PICARD_RENAMESAMPLEINVCF_MT.out.vcf) - ch_versions = ch_versions.mix(TABIX_TABIX_MT.out.versions.first()) - emit: - vcf = PICARD_RENAMESAMPLEINVCF_MT.out.vcf - tbi = TABIX_TABIX_MT.out.tbi + vcf = GATK4_FILTERMUTECTCALLS_MT.out.vcf + tbi = GATK4_FILTERMUTECTCALLS_MT.out.tbi stats = GATK4_MUTECT2_MT.out.stats filt_sats = GATK4_FILTERMUTECTCALLS_MT.out.stats txt = HAPLOCHECK_MT.out.txt From 8b93d870251c89b6c6bf68b59cce7532f2e4263c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 14 Nov 2022 19:04:41 +0100 Subject: [PATCH 0833/1169] update modules 2 --- modules/nf-core/bcftools/concat/main.nf | 6 +++--- modules/nf-core/bcftools/merge/main.nf | 6 +++--- modules/nf-core/bcftools/norm/main.nf | 6 +++--- modules/nf-core/bcftools/roh/main.nf | 6 +++--- modules/nf-core/bcftools/view/main.nf | 6 +++--- modules/nf-core/bwamem2/mem/main.nf | 6 +++--- modules/nf-core/deepvariant/main.nf | 2 +- modules/nf-core/fastqc/main.nf | 6 +++--- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf index b62a55a7..f933dd13 100644 --- a/modules/nf-core/bcftools/concat/main.nf +++ b/modules/nf-core/bcftools/concat/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_CONCAT { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': - 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': + 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" input: tuple val(meta), path(vcfs), path(tbi) diff --git a/modules/nf-core/bcftools/merge/main.nf b/modules/nf-core/bcftools/merge/main.nf index 2c9d68fd..caf15d36 100644 --- a/modules/nf-core/bcftools/merge/main.nf +++ b/modules/nf-core/bcftools/merge/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_MERGE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': - 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': + 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" input: tuple val(meta), path(vcfs), path(tbis) diff --git a/modules/nf-core/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf index 96f306bc..a01b339b 100644 --- a/modules/nf-core/bcftools/norm/main.nf +++ b/modules/nf-core/bcftools/norm/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_NORM { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': - 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': + 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" input: tuple val(meta), path(vcf), path(tbi) diff --git a/modules/nf-core/bcftools/roh/main.nf b/modules/nf-core/bcftools/roh/main.nf index 83ac4e65..b3cad8ed 100644 --- a/modules/nf-core/bcftools/roh/main.nf +++ b/modules/nf-core/bcftools/roh/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_ROH { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': - 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': + 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" input: tuple val(meta), path(vcf), path(tbi) diff --git a/modules/nf-core/bcftools/view/main.nf b/modules/nf-core/bcftools/view/main.nf index 3df08a57..b0458ecd 100644 --- a/modules/nf-core/bcftools/view/main.nf +++ b/modules/nf-core/bcftools/view/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_VIEW { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.15.1--h0ea216a_0': - 'quay.io/biocontainers/bcftools:1.15.1--h0ea216a_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': + 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" input: tuple val(meta), path(vcf), path(index) diff --git a/modules/nf-core/bwamem2/mem/main.nf b/modules/nf-core/bwamem2/mem/main.nf index 08dc5dfb..f8bad4b9 100644 --- a/modules/nf-core/bwamem2/mem/main.nf +++ b/modules/nf-core/bwamem2/mem/main.nf @@ -2,10 +2,10 @@ process BWAMEM2_MEM { tag "$meta.id" label 'process_high' - conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.16.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:38aed4501da19db366dc7c8d52d31d94e760cfaf-0' : - 'quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:38aed4501da19db366dc7c8d52d31d94e760cfaf-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:2cdf6bf1e92acbeb9b2834b1c58754167173a410-0' : + 'quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:2cdf6bf1e92acbeb9b2834b1c58754167173a410-0' }" input: tuple val(meta), path(reads) diff --git a/modules/nf-core/deepvariant/main.nf b/modules/nf-core/deepvariant/main.nf index 344fdb03..de48d9c1 100644 --- a/modules/nf-core/deepvariant/main.nf +++ b/modules/nf-core/deepvariant/main.nf @@ -7,7 +7,7 @@ process DEEPVARIANT { exit 1, "Conda environments cannot be used with DeepVariant at the moment. Please use Docker or Singularity containers." } - container "google/deepvariant:1.3.0" + container "google/deepvariant:1.4.0" input: tuple val(meta), path(input), path(index), path(intervals) diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 55c50c87..3bebb240 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -8,7 +8,7 @@ process FASTQC { 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: - tuple val(meta), path(reads, stageAs: "?/*") + tuple val(meta), path(reads) output: tuple val(meta), path("*.html"), emit: html @@ -22,8 +22,8 @@ process FASTQC { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - printf "%s\\n" $reads | while read f; do ln -s \$f ${prefix}_\$(basename \$f) ; done - fastqc $args --threads $task.cpus ${prefix}_* + printf "%s\\n" $reads | while read f; do [[ \$f =~ ^${prefix}.* ]] || ln -s \$f ${prefix}_\$f ; done + fastqc $args --threads $task.cpus ${prefix}* cat <<-END_VERSIONS > versions.yml "${task.process}": From a3124e6b633eb01e109256d4e36c1e25f9329b51 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 14 Nov 2022 23:08:59 +0100 Subject: [PATCH 0834/1169] fix some lint warnings --- modules/local/change_name.nf | 12 ++++++++++++ modules/local/check_input_vcf.nf | 19 ++++++++++++++++++- modules/local/create_bed_from_fai.nf | 1 + modules/local/create_pedfile.nf | 19 ++++++++++++++++++- modules/local/get_chrom_sizes.nf | 1 + modules/local/samplesheet_check.nf | 1 + 6 files changed, 51 insertions(+), 2 deletions(-) diff --git a/modules/local/change_name.nf b/modules/local/change_name.nf index 6d1df51b..6770f8bc 100644 --- a/modules/local/change_name.nf +++ b/modules/local/change_name.nf @@ -1,6 +1,7 @@ process CHANGE_NAME { tag "$meta.id" label 'process_low' + label 'process_single' conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -12,6 +13,7 @@ process CHANGE_NAME { output: tuple val(meta), path( "*.${file_type}"), emit: file + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -25,6 +27,11 @@ process CHANGE_NAME { mv \\ $input_file \\ ${prefix}.${file_type} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + change_name: v1.0 + END_VERSIONS """ stub: @@ -33,5 +40,10 @@ process CHANGE_NAME { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.${file_type} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + change_name: v1.0 + END_VERSIONS """ } diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index 725197b3..64c0d940 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -1,5 +1,6 @@ process CHECK_INPUT_VCF { tag "check_vcf" + label 'process_single' conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -10,7 +11,8 @@ process CHECK_INPUT_VCF { path vcf output: - path '*.txt' , emit: txt + path '*.txt' , emit: txt + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -39,5 +41,20 @@ process CHECK_INPUT_VCF { else: print("Please compress %s using bgzip" %file_in) CODE + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + change_input_vcf: v1.0 + END_VERSIONS + """ + + stub: + """ + touch checked_vcfs.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + check_input_vcf: v1.0 + END_VERSIONS """ } diff --git a/modules/local/create_bed_from_fai.nf b/modules/local/create_bed_from_fai.nf index a4b13898..c097a00e 100644 --- a/modules/local/create_bed_from_fai.nf +++ b/modules/local/create_bed_from_fai.nf @@ -1,5 +1,6 @@ process BUILD_BED { tag "$meta.id" + label 'process_single' conda (params.enable_conda ? "anaconda::gawk=5.1.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/create_pedfile.nf b/modules/local/create_pedfile.nf index 6acae0d9..64d0d24c 100644 --- a/modules/local/create_pedfile.nf +++ b/modules/local/create_pedfile.nf @@ -1,5 +1,6 @@ process MAKE_PED { tag "make_ped" + label 'process_single' conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -10,7 +11,8 @@ process MAKE_PED { val(samples) output: - path '*.ped' , emit: ped + path '*.ped' , emit: ped + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -29,5 +31,20 @@ process MAKE_PED { } """ echo "$pedinfo" > family.ped + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + create_pedfile: v1.0 + END_VERSIONS + """ + + stub: + """ + touch family.ped + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + check_pedfile: v1.0 + END_VERSIONS """ } diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index d7a2ebf1..7a483ec2 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -1,5 +1,6 @@ process GET_CHROM_SIZES { tag "$fai" + label 'process_single' conda (params.enable_conda ? "conda-forge::coreutils=8.31" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index b114546c..06888cc2 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,5 +1,6 @@ process SAMPLESHEET_CHECK { tag "$samplesheet" + label 'process_single' conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? From c0e042ee76f100e58aba01a3892ae58e8e5a9d01 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 15 Nov 2022 19:59:31 +0100 Subject: [PATCH 0835/1169] fix ci error --- modules/local/check_input_vcf.nf | 4 ++-- subworkflows/local/mitochondria/merge_annotate_MT.nf | 5 ++++- subworkflows/local/preprocessing/prepare_vcf.nf | 3 ++- workflows/raredisease.nf | 1 + 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index 64c0d940..c56e25ed 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -11,7 +11,7 @@ process CHECK_INPUT_VCF { path vcf output: - path '*.txt' , emit: txt + path '*.csv' , emit: csv path "versions.yml" , emit: versions when: @@ -20,7 +20,7 @@ process CHECK_INPUT_VCF { script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ """ export INPUT_FILE=${vcf} - export OUTPUT_FILE="checked_vcfs.txt" + export OUTPUT_FILE="checked_vcfs.csv" python3 < def id = "${row.id}" @@ -30,6 +30,7 @@ workflow CHECK_VCF { return [['id':id],filepath] } .set { ch_vcfs_norm } + ch_versions = ch_versions.mix(CHECK_INPUT_VCF.out.versions) SPLIT_MULTIALLELICS_PV (ch_vcfs_norm.unprocessed, fasta) ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_PV.out.versions) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 96eef2d5..7d8dafed 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -175,6 +175,7 @@ workflow RAREDISEASE { // Generate pedigree file MAKE_PED (CHECK_INPUT.out.samples.toList()) + ch_versions = ch_versions.mix(MAKE_PED.out.versions) // Input QC FASTQC (CHECK_INPUT.out.reads) From d3f64318484641bb0833487d1238b56ad0aa6357 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 16 Nov 2022 13:22:49 +0100 Subject: [PATCH 0836/1169] vep cache version --- nextflow_schema.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index f6a0873b..9f091a22 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -462,11 +462,11 @@ "description": "Options used to facilitate the annotation of the variants.", "properties": { "vep_cache_version": { - "type": "string", - "default": "104", + "type": "integer", + "default": "107", "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", "fa_icon": "fas fa-book", - "enum": ["104", "105", "106", "107"] + "enum": [107] } } }, From 7295357faf4a95951742e3ca1ce95e2eba63a30b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 16 Nov 2022 13:31:23 +0100 Subject: [PATCH 0837/1169] update genome.config --- conf/genomes.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 5b11a860..c2558ee1 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -41,7 +41,7 @@ params { vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" vep_cache = "${params.local_genomes}/vep_cache" vep_filters = "${params.local_genomes}/gene_panels.bed" - vep_cache_version = '105' + vep_cache_version = '107' } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" @@ -74,7 +74,7 @@ params { vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" vep_cache = "${params.local_genomes}/vep_cache" vep_filters = "${params.local_genomes}/gene_panels.bed" - vep_cache_version = '105' + vep_cache_version = '107' } } } From 2106b57784613305345da1e9ce5cd4b2fcd2ecdf Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 18 Nov 2022 11:32:10 +0100 Subject: [PATCH 0838/1169] add platform parameter --- conf/modules.config | 2 +- nextflow.config | 1 + nextflow_schema.json | 7 +++++++ subworkflows/local/align.nf | 3 ++- subworkflows/local/alignment/align_bwamem2.nf | 15 +++++++++------ workflows/raredisease.nf | 3 ++- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ff169409..9c762723 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -896,7 +896,7 @@ process { ext.args = { [ "--VALIDATION_STRINGENCY LENIENT", "--RGLB lib", - "--RGPL ILLUMINA", + "--RGPL ${params.platform}", "--RGPU barcode", "--RGSM ${meta.id}" ].join(' ' ).trim() } diff --git a/nextflow.config b/nextflow.config index 97ca5bf7..189df701 100644 --- a/nextflow.config +++ b/nextflow.config @@ -24,6 +24,7 @@ params { annotate_snv_switch = true annotate_sv_switch = false gens_switch = false + platform = 'illumina' // Alignment aligner = 'bwamem2' diff --git a/nextflow_schema.json b/nextflow_schema.json index 9f091a22..54bb1213 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -375,6 +375,13 @@ "default": false, "description": "Specifies whether or not to run gens preprocessing subworkflow.", "fa_icon": "fas fa-book" + }, + "platform": { + "type": "string", + "default": "illumina", + "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", + "fa_icon": "fas fa-book", + "enum": ["illumina"] } } }, diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index b9e09eeb..8e3b8c5b 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -15,11 +15,12 @@ workflow ALIGN { index_bwamem2 // channel: [ /path/to/bwamem2/index/ ] known_dbsnp // channel: [ /path/to/known_dbsnp ] known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] + platform // string: params.platform main: ch_versions = Channel.empty() - ALIGN_BWAMEM2 ( reads_input, index_bwamem2, fasta, fai ) + ALIGN_BWAMEM2 ( reads_input, index_bwamem2, fasta, fai, platform ) ALIGN_SENTIEON ( reads_input, fasta, fai, index_bwa, known_dbsnp, known_dbsnp_tbi ) ch_marked_bam = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bam, ALIGN_SENTIEON.out.marked_bam) diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 33d1e47a..c5ae1386 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -16,6 +16,7 @@ workflow ALIGN_BWAMEM2 { index // channel: [ /path/to/bwamem2/index/ ] fasta // channel: [genome.fasta] fai // channel: [genome.fai] + platform // params.platform main: ch_versions = Channel.empty() @@ -34,17 +35,19 @@ workflow ALIGN_BWAMEM2 { // Merge multiple lane samples and index BWAMEM2_MEM.out.bam .map{ meta, bam -> - new_meta = meta.clone() // clone to avoid overriding the global meta - new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename - new_meta.read_group = "\'@RG\\tID:"+ new_meta.id + "\\tPL:ILLUMINA\\tSM:"+new_meta.id+"\'" - [new_meta, bam]} // end the closure to return newly modified channel - .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] - .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list + new_meta = meta.clone() // clone to avoid overriding the global meta + new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename + new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + platform + "\\tSM:" + new_meta.id + "\'" + [new_meta, bam]} // end the closure to return newly modified channel + .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] + .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list single: it[1].size() == 1 multiple: it[1].size() > 1 } .set{ bams } // create a new multi-channel named bams + bams.multiple.view() + bams.single.view() // If there are no samples to merge, skip the process SAMTOOLS_MERGE ( bams.multiple, fasta, fai ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 7d8dafed..8e055bb2 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -250,7 +250,8 @@ workflow RAREDISEASE { ch_bwa_index, ch_bwamem2_index, ch_known_dbsnp, - ch_known_dbsnp_tbi + ch_known_dbsnp_tbi, + params.platform ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) From 7df0dd98a7741e402fca8a82d6eeb690b0c3164b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 18 Nov 2022 11:32:45 +0100 Subject: [PATCH 0839/1169] remove view --- subworkflows/local/alignment/align_bwamem2.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index c5ae1386..77a64978 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -46,8 +46,6 @@ workflow ALIGN_BWAMEM2 { } .set{ bams } // create a new multi-channel named bams - bams.multiple.view() - bams.single.view() // If there are no samples to merge, skip the process SAMTOOLS_MERGE ( bams.multiple, fasta, fai ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) From a5cd28325ca2c4bf9141254ab2a855a7584450dd Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Nov 2022 03:03:46 +0100 Subject: [PATCH 0840/1169] fix collect version error --- modules/local/create_pedfile.nf | 27 +++++-------------- .../local/annotate_consequence_pli.nf | 2 ++ .../local/mitochondria/merge_annotate_MT.nf | 2 +- workflows/raredisease.nf | 4 +++ 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/modules/local/create_pedfile.nf b/modules/local/create_pedfile.nf index 64d0d24c..787222c9 100644 --- a/modules/local/create_pedfile.nf +++ b/modules/local/create_pedfile.nf @@ -17,34 +17,19 @@ process MAKE_PED { when: task.ext.when == null || task.ext.when - script: - def pedinfo = ['#family_id', 'sample_id', 'father', 'mother', 'sex', 'phenotype'].join('\t') + exec: + def pedfile = task.workDir.resolve('family.ped') + pedfile.text = ['#family_id', 'sample_id', 'father', 'mother', 'sex', 'phenotype'].join('\t') def samples_list = [] for(int i = 0; i family.ped - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - create_pedfile: v1.0 - END_VERSIONS - """ - - stub: - """ - touch family.ped - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - check_pedfile: v1.0 - END_VERSIONS - """ + def versionfile = task.workDir.resolve('versions.yml') + versionfile.text = '"' + task.process + '"' + '\n create_pedfile: 1.0\n' } diff --git a/subworkflows/local/annotate_consequence_pli.nf b/subworkflows/local/annotate_consequence_pli.nf index 24410abd..1913b1b6 100644 --- a/subworkflows/local/annotate_consequence_pli.nf +++ b/subworkflows/local/annotate_consequence_pli.nf @@ -20,6 +20,8 @@ workflow ANNOTATE_CSQ_PLI { ADD_MOST_SEVERE_PLI ( ADD_MOST_SEVERE_CSQ.out.vcf, ) + ch_versions = ch_versions.mix(ADD_MOST_SEVERE_CSQ.out.versions) + ch_versions = ch_versions.mix(ADD_MOST_SEVERE_PLI.out.versions) emit: vcf_ann = ADD_MOST_SEVERE_PLI.out.vcf diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 4d95abf5..5a0d4c2f 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -113,7 +113,7 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(ENSEMBLVEP_MT.out.versions) // Running haplogrep2 - TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf) + TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf_gz) HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8e055bb2..3823a86b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -336,6 +336,7 @@ workflow RAREDISEASE { ch_sv_annotate.vcf_ann, ch_variant_consequences ) + ch_versions = ch_versions.mix(ANN_CSQ_PLI_SV.out.versions) RANK_VARIANTS_SV ( ANN_CSQ_PLI_SV.out.vcf_ann, @@ -349,6 +350,7 @@ workflow RAREDISEASE { RANK_VARIANTS_SV.out.vcf, ch_vep_filters ) + ch_versions = ch_versions.mix(FILTER_VEP_SV.out.versions) } @@ -395,6 +397,7 @@ workflow RAREDISEASE { ch_snv_annotate.vcf_ann, ch_variant_consequences ) + ch_versions = ch_versions.mix(ANN_CSQ_PLI_SNV.out.versions) RANK_VARIANTS_SNV ( ANN_CSQ_PLI_SNV.out.vcf_ann, @@ -408,6 +411,7 @@ workflow RAREDISEASE { RANK_VARIANTS_SNV.out.vcf, ch_vep_filters ) + ch_versions = ch_versions.mix(FILTER_VEP_SNV.out.versions) } From 69dce9d2540a021b6916d9a4813f86953774ca23 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Nov 2022 03:05:44 +0100 Subject: [PATCH 0841/1169] update test config --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 74259f35..eb1936fe 100644 --- a/conf/test.config +++ b/conf/test.config @@ -40,6 +40,6 @@ params { mt_backchain_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' genome = 'GRCh38' - vep_cache_version = '105' + vep_cache_version = '107' } From 6b87f9243bd70e187ed4848288da184c2b2758b0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Nov 2022 03:08:52 +0100 Subject: [PATCH 0842/1169] update config --- conf/genomes.config | 4 ++-- conf/test.config | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index c2558ee1..9e456cfc 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -41,7 +41,7 @@ params { vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" vep_cache = "${params.local_genomes}/vep_cache" vep_filters = "${params.local_genomes}/gene_panels.bed" - vep_cache_version = '107' + vep_cache_version = 107 } 'GRCh38' { fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" @@ -74,7 +74,7 @@ params { vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" vep_cache = "${params.local_genomes}/vep_cache" vep_filters = "${params.local_genomes}/gene_panels.bed" - vep_cache_version = '107' + vep_cache_version = 107 } } } diff --git a/conf/test.config b/conf/test.config index eb1936fe..17834747 100644 --- a/conf/test.config +++ b/conf/test.config @@ -40,6 +40,6 @@ params { mt_backchain_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' genome = 'GRCh38' - vep_cache_version = '107' + vep_cache_version = 107 } From 653683d522fae5ad0b9980e75f02e82895b880e9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Nov 2022 03:25:23 +0100 Subject: [PATCH 0843/1169] fix ci error --- modules/local/create_pedfile.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/create_pedfile.nf b/modules/local/create_pedfile.nf index 787222c9..0ee1e96c 100644 --- a/modules/local/create_pedfile.nf +++ b/modules/local/create_pedfile.nf @@ -31,5 +31,5 @@ process MAKE_PED { } } def versionfile = task.workDir.resolve('versions.yml') - versionfile.text = '"' + task.process + '"' + '\n create_pedfile: 1.0\n' + versionfile.text = '"' + task.process + '":' + '\n create_pedfile: 1.0\n' } From 529826581c6161a97326f8573641def2a231a496 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 21 Nov 2022 17:03:53 +0100 Subject: [PATCH 0844/1169] unique versions --- subworkflows/local/alignment/align_bwamem2.nf | 9 ++++++--- subworkflows/local/alignment/align_sentieon.nf | 7 +++++-- subworkflows/local/analyse_MT.nf | 2 +- subworkflows/local/call_repeat_expansions.nf | 4 ++-- subworkflows/local/gens.nf | 6 +++--- subworkflows/local/mitochondria/merge_annotate_MT.nf | 4 ++-- subworkflows/local/qc_bam.nf | 11 ++++++----- .../local/variant_calling/call_snv_deepvariant.nf | 2 +- .../local/variant_calling/call_snv_sentieon.nf | 4 ++-- subworkflows/local/variant_calling/call_sv_tiddit.nf | 2 +- workflows/raredisease.nf | 2 +- 11 files changed, 30 insertions(+), 23 deletions(-) diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 77a64978..3bb0c5a2 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -23,14 +23,16 @@ workflow ALIGN_BWAMEM2 { // Map, sort, and index BWAMEM2_MEM ( reads_input, index, true ) - ch_versions = ch_versions.mix(BWAMEM2_MEM.out.versions) + ch_versions = ch_versions.mix(BWAMEM2_MEM.out.versions.first()) SAMTOOLS_INDEX_ALIGN ( BWAMEM2_MEM.out.bam ) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX_ALIGN.out.versions.first()) // Join the mapped bam + bai paths by their keys for stats // Get stats for each demultiplexed read pair. bam_sorted_indexed = BWAMEM2_MEM.out.bam.join(SAMTOOLS_INDEX_ALIGN.out.bai) SAMTOOLS_STATS ( bam_sorted_indexed, [] ) + ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions.first()) // Merge multiple lane samples and index BWAMEM2_MEM.out.bam @@ -49,12 +51,13 @@ workflow ALIGN_BWAMEM2 { // If there are no samples to merge, skip the process SAMTOOLS_MERGE ( bams.multiple, fasta, fai ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) - ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) + ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions.first()) // Marking duplicates MARKDUPLICATES ( prepared_bam , fasta, fai ) SAMTOOLS_INDEX_MARKDUP ( MARKDUPLICATES.out.bam ) - ch_versions = ch_versions.mix(MARKDUPLICATES.out.versions) + ch_versions = ch_versions.mix(MARKDUPLICATES.out.versions.first()) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MARKDUP.out.versions.first()) emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index c498958e..9f48c805 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -24,7 +24,7 @@ workflow ALIGN_SENTIEON { ch_bqsr_csv = Channel.empty() SENTIEON_BWAMEM ( reads_input, fasta, fai, index ) - ch_versions = ch_versions.mix(SENTIEON_BWAMEM.out.versions) + ch_versions = ch_versions.mix(SENTIEON_BWAMEM.out.versions.first()) SENTIEON_BWAMEM.out .bam @@ -32,9 +32,10 @@ workflow ALIGN_SENTIEON { .set { ch_bam_bai } SENTIEON_DATAMETRICS (ch_bam_bai, fasta, fai ) - ch_versions = ch_versions.mix(SENTIEON_DATAMETRICS.out.versions) + ch_versions = ch_versions.mix(SENTIEON_DATAMETRICS.out.versions.first()) SENTIEON_LOCUSCOLLECTOR ( ch_bam_bai ) + ch_versions = ch_versions.mix(SENTIEON_LOCUSCOLLECTOR.out.versions.first()) ch_bam_bai .join(SENTIEON_LOCUSCOLLECTOR.out.score) @@ -42,6 +43,7 @@ workflow ALIGN_SENTIEON { .set { ch_bam_bai_score } SENTIEON_DEDUP ( ch_bam_bai_score, fasta, fai ) + ch_versions = ch_versions.mix(SENTIEON_DEDUP.out.versions.first()) if (params.variant_caller == "sentieon") { SENTIEON_DEDUP.out.bam @@ -51,6 +53,7 @@ workflow ALIGN_SENTIEON { ch_bqsr_bam = SENTIEON_BQSR.out.bam ch_bqsr_bai = SENTIEON_BQSR.out.bai ch_bqsr_csv = SENTIEON_BQSR.out.recal_csv + ch_versions = ch_versions.mix(SENTIEON_BQSR.out.versions.first()) } emit: diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index dadc4214..1ae3259a 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -63,7 +63,7 @@ workflow ANALYSE_MT { genome_dict, shift_mt_backchain, genome_fasta_no_meta) - ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions) + ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions.first()) // STEP 3: MT MERGE AND ANNOTATE VARIANTS MERGE_ANNOTATE_MT( diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 4040a2e0..3c551168 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -15,10 +15,10 @@ workflow CALL_REPEAT_EXPANSIONS { ch_versions = Channel.empty() EXPANSIONHUNTER( bam, fasta, variant_catalog ) - ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions) + ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions.first()) STRANGER ( EXPANSIONHUNTER.out.vcf, variant_catalog ) - ch_versions = ch_versions.mix(STRANGER.out.versions) + ch_versions = ch_versions.mix(STRANGER.out.versions.first()) emit: vcf = STRANGER.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index f4dd6f3b..222600fb 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -22,13 +22,13 @@ workflow GENS { ch_versions = Channel.empty() COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) - ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions) + ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions.first()) DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) - ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions) + ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions.first()) GENS_GENERATE ( DENOISEREADCOUNTS.out.standardized_read_counts, vcf.map { meta, vcf -> vcf }, gnomad_pos ) - ch_versions = ch_versions.mix(GENS_GENERATE.out.versions) + ch_versions = ch_versions.mix(GENS_GENERATE.out.versions.first()) emit: gens_cov_bed_gz = GENS_GENERATE.out.cov diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 5a0d4c2f..15adaba5 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -50,7 +50,7 @@ workflow MERGE_ANNOTATE_MT { // Spliting multiallelic calls ch_in_split = GATK4_VARIANTFILTRATION_MT.out.vcf.join(GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]) SPLIT_MULTIALLELICS_MT (ch_in_split, genome_fasta) - ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_MT.out.versions) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_MT.out.versions.first()) TABIX_TABIX_MT(SPLIT_MULTIALLELICS_MT.out.vcf) ch_in_remdup = SPLIT_MULTIALLELICS_MT.out.vcf.join(TABIX_TABIX_MT.out.tbi) @@ -58,7 +58,7 @@ workflow MERGE_ANNOTATE_MT { // Removing duplicates and merging if there is more than one sample REMOVE_DUPLICATES_MT(ch_in_remdup, genome_fasta) TABIX_TABIX_MT2(REMOVE_DUPLICATES_MT.out.vcf) - ch_versions = ch_versions.mix(REMOVE_DUPLICATES_MT.out.versions) + ch_versions = ch_versions.mix(REMOVE_DUPLICATES_MT.out.versions.first()) REMOVE_DUPLICATES_MT.out.vcf .collect{it[1]} diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index e6ad575f..550ed3e8 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -25,26 +25,27 @@ workflow QC_BAM { // COLLECT MULTIPLE METRICS PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta, fai ) - ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions) + ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) // COLLECT HS METRICS PICARD_COLLECTHSMETRICS ( bam, fasta, fai, bait_intervals, target_intervals ) - ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions) + ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions.first()) // QUALIMAP BAMQC gff = [] QUALIMAP_BAMQC ( bam, gff ) - ch_versions = ch_versions.mix(QUALIMAP_BAMQC.out.versions) + ch_versions = ch_versions.mix(QUALIMAP_BAMQC.out.versions.first()) // TIDDIT COVERAGE TIDDIT_COV ( bam, [] ) // 2nd pos. arg is req. only for cram input UCSC_WIGTOBIGWIG ( TIDDIT_COV.out.wig, chrom_sizes ) - ch_versions = ch_versions.mix(TIDDIT_COV.out.versions) + ch_versions = ch_versions.mix(TIDDIT_COV.out.versions.first()) + ch_versions = ch_versions.mix(UCSC_WIGTOBIGWIG.out.versions.first()) // MOSDEPTH mosdepth_input_bams = bam.join(bai, by: [0]) MOSDEPTH (mosdepth_input_bams,[],[]) - ch_versions = ch_versions.mix(MOSDEPTH.out.versions) + ch_versions = ch_versions.mix(MOSDEPTH.out.versions.first()) emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] diff --git a/subworkflows/local/variant_calling/call_snv_deepvariant.nf b/subworkflows/local/variant_calling/call_snv_deepvariant.nf index a0757835..3fab61b6 100644 --- a/subworkflows/local/variant_calling/call_snv_deepvariant.nf +++ b/subworkflows/local/variant_calling/call_snv_deepvariant.nf @@ -28,7 +28,7 @@ workflow CALL_SNV_DEEPVARIANT { .collect{it[1]} .toList() .set { file_list } - ch_versions = ch_versions.mix(DEEPVARIANT.out.versions) + ch_versions = ch_versions.mix(DEEPVARIANT.out.versions.first()) case_info .combine(file_list) diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 52dac412..3c27e7c4 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -21,7 +21,7 @@ workflow CALL_SNV_SENTIEON { SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, call_interval, ml_model ) ch_vcf = SENTIEON_DNASCOPE.out.vcf ch_index = SENTIEON_DNASCOPE.out.vcf_index - ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions) + ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions.first()) if ( ml_model ) { @@ -30,7 +30,7 @@ workflow CALL_SNV_SENTIEON { SENTIEON_DNAMODELAPPLY ( ch_vcf_idx, fasta, fai, ml_model ) ch_vcf = SENTIEON_DNAMODELAPPLY.out.vcf ch_index = SENTIEON_DNAMODELAPPLY.out.vcf_index - ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions) + ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions.first()) } emit: diff --git a/subworkflows/local/variant_calling/call_sv_tiddit.nf b/subworkflows/local/variant_calling/call_sv_tiddit.nf index 53303239..99094f1c 100644 --- a/subworkflows/local/variant_calling/call_sv_tiddit.nf +++ b/subworkflows/local/variant_calling/call_sv_tiddit.nf @@ -14,7 +14,7 @@ workflow CALL_SV_TIDDIT { main: TIDDIT_SV ( bam, fasta, index ) - ch_versions = TIDDIT_SV.out.versions + ch_versions = TIDDIT_SV.out.versions.first() TIDDIT_SV.out .vcf diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3823a86b..1c1601e3 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -126,6 +126,7 @@ workflow RAREDISEASE { if (params.input) { ch_input = Channel.fromPath(params.input) CHECK_INPUT (ch_input) + ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) } else { exit 1, 'Input samplesheet not specified!' } @@ -179,7 +180,6 @@ workflow RAREDISEASE { // Input QC FASTQC (CHECK_INPUT.out.reads) - ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) ch_versions = ch_versions.mix(FASTQC.out.versions.first()) // Prepare references and indices. From d58b60db31b0b0530cbf28e6fbeaefbaa5cce9d9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 22 Nov 2022 16:20:52 +0100 Subject: [PATCH 0845/1169] update modules --- modules.json | 10 +++++----- modules/nf-core/genmod/annotate/main.nf | 4 ++-- modules/nf-core/genmod/compound/main.nf | 4 ++-- modules/nf-core/genmod/models/main.nf | 4 ++-- modules/nf-core/genmod/score/main.nf | 4 ++-- modules/nf-core/haplocheck/main.nf | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules.json b/modules.json index 52e92c27..5c871d01 100644 --- a/modules.json +++ b/modules.json @@ -131,19 +131,19 @@ }, "genmod/annotate": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" }, "genmod/compound": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" }, "genmod/models": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" }, "genmod/score": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" }, "glnexus": { "branch": "master", @@ -151,7 +151,7 @@ }, "haplocheck": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" }, "haplogrep2/classify": { "branch": "master", diff --git a/modules/nf-core/genmod/annotate/main.nf b/modules/nf-core/genmod/annotate/main.nf index b7ecd3fc..9ba2f612 100644 --- a/modules/nf-core/genmod/annotate/main.nf +++ b/modules/nf-core/genmod/annotate/main.nf @@ -29,7 +29,7 @@ process GENMOD_ANNOTATE { cat <<-END_VERSIONS > versions.yml "${task.process}": - genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' ) END_VERSIONS """ @@ -40,7 +40,7 @@ process GENMOD_ANNOTATE { cat <<-END_VERSIONS > versions.yml "${task.process}": - genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' ) END_VERSIONS """ } diff --git a/modules/nf-core/genmod/compound/main.nf b/modules/nf-core/genmod/compound/main.nf index 4bdff8df..e7d43fea 100644 --- a/modules/nf-core/genmod/compound/main.nf +++ b/modules/nf-core/genmod/compound/main.nf @@ -30,7 +30,7 @@ process GENMOD_COMPOUND { cat <<-END_VERSIONS > versions.yml "${task.process}": - genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' ) END_VERSIONS """ @@ -41,7 +41,7 @@ process GENMOD_COMPOUND { cat <<-END_VERSIONS > versions.yml "${task.process}": - genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' ) END_VERSIONS """ } diff --git a/modules/nf-core/genmod/models/main.nf b/modules/nf-core/genmod/models/main.nf index d786d269..8d73d745 100644 --- a/modules/nf-core/genmod/models/main.nf +++ b/modules/nf-core/genmod/models/main.nf @@ -36,7 +36,7 @@ process GENMOD_MODELS { cat <<-END_VERSIONS > versions.yml "${task.process}": - genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' ) END_VERSIONS """ @@ -47,7 +47,7 @@ process GENMOD_MODELS { cat <<-END_VERSIONS > versions.yml "${task.process}": - genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' ) END_VERSIONS """ } diff --git a/modules/nf-core/genmod/score/main.nf b/modules/nf-core/genmod/score/main.nf index 9b7bd009..e0a0277c 100644 --- a/modules/nf-core/genmod/score/main.nf +++ b/modules/nf-core/genmod/score/main.nf @@ -35,7 +35,7 @@ process GENMOD_SCORE { cat <<-END_VERSIONS > versions.yml "${task.process}": - genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' ) END_VERSIONS """ @@ -46,7 +46,7 @@ process GENMOD_SCORE { cat <<-END_VERSIONS > versions.yml "${task.process}": - genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' )) + genmod: \$(echo \$(genmod --version 2>&1) | sed 's/^.*genmod version: //' ) END_VERSIONS """ } diff --git a/modules/nf-core/haplocheck/main.nf b/modules/nf-core/haplocheck/main.nf index 08c1c76b..6e8541f6 100644 --- a/modules/nf-core/haplocheck/main.nf +++ b/modules/nf-core/haplocheck/main.nf @@ -26,7 +26,7 @@ process HAPLOCHECK { cat <<-END_VERSIONS > versions.yml "${task.process}": - haplocheck: \$(echo \$(haplocheck --version 2>&1) | cut -f 2 -d " " ) + haplocheck: \$(echo \$(haplocheck --version 2>&1) | sed 's/.*\\([0-9].[0-9].[0-9]\\).*/\\1/' ) END_VERSIONS """ @@ -38,7 +38,7 @@ process HAPLOCHECK { cat <<-END_VERSIONS > versions.yml "${task.process}": - haplocheck: \$(echo \$(haplocheck --version 2>&1) | cut -f 2 -d " " ) + haplocheck: \$(echo \$(haplocheck --version 2>&1) | sed 's/.*\\([0-9].[0-9].[0-9]\\).*/\\1/' ) END_VERSIONS """ } From dd60c460dd3a20956dd53fa4aa13ae76cd8eccc6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 22 Nov 2022 21:49:07 +0100 Subject: [PATCH 0846/1169] update versions --- subworkflows/local/annotate_snvs.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 8f24e350..4f1bfb6a 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -86,7 +86,7 @@ workflow ANNOTATE_SNVS { BCFTOOLS_VIEW.out.vcf.join(TABIX_BCFTOOLS.out.tbi).collect().set { ch_vcf_scatter_in } GATK4_SELECTVARIANTS (ch_vcf_scatter_in.combine(split_intervals)).vcf.set { ch_vep_in } - ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions) + ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions.first()) // // annotate vep @@ -99,10 +99,10 @@ workflow ANNOTATE_SNVS { fasta, [] ) - ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions) + ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions.first()) ZIP_TABIX_VEP (ENSEMBLVEP_SNV.out.vcf) - ch_versions = ch_versions.mix(ZIP_TABIX_VEP.out.versions) + ch_versions = ch_versions.mix(ZIP_TABIX_VEP.out.versions.first()) ZIP_TABIX_VEP.out.gz_tbi .groupTuple() From 75c6d42a065a5d38c1fc8b8948d6aff0c29096b3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 23 Nov 2022 01:48:14 +0100 Subject: [PATCH 0847/1169] sentieon merge --- modules/local/sentieon/bqsr.nf | 4 +- modules/local/sentieon/dnascope.nf | 4 +- modules/local/sentieon/readwriter.nf | 54 +++++++++++++++++++ subworkflows/local/align.nf | 2 +- .../local/alignment/align_sentieon.nf | 16 +++++- subworkflows/local/call_snv.nf | 2 +- 6 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 modules/local/sentieon/readwriter.nf diff --git a/modules/local/sentieon/bqsr.nf b/modules/local/sentieon/bqsr.nf index 75d7dbac..72ba06b4 100644 --- a/modules/local/sentieon/bqsr.nf +++ b/modules/local/sentieon/bqsr.nf @@ -9,8 +9,8 @@ process SENTIEON_BQSR { tuple val(meta), path(bam), path(bai) path fasta path fai - path known_dbsnp - path known_dbsnp_tbi + tuple val(meta2), path(known_dbsnp) + tuple val(meta3), path(known_dbsnp_tbi) output: tuple val(meta), path('*_recal.bam') , emit: bam diff --git a/modules/local/sentieon/dnascope.nf b/modules/local/sentieon/dnascope.nf index c4d7cf14..1d2d1ccc 100644 --- a/modules/local/sentieon/dnascope.nf +++ b/modules/local/sentieon/dnascope.nf @@ -7,8 +7,8 @@ process SENTIEON_DNASCOPE { tuple val(meta), path(bam), path(bai) path fasta path fai - path known_dbsnp - path known_dbsnp_tbi + tuple val(meta2), path(known_dbsnp) + tuple val(meta3), path(known_dbsnp_tbi) path call_interval path ml_model diff --git a/modules/local/sentieon/readwriter.nf b/modules/local/sentieon/readwriter.nf new file mode 100644 index 00000000..3eaf8590 --- /dev/null +++ b/modules/local/sentieon/readwriter.nf @@ -0,0 +1,54 @@ +process SENTIEON_READWRITER { + tag "$meta.id" + label 'process_medium' + label 'sentieon' + + secret 'SENTIEON_LICENSE_BASE64' + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path('*merged.bam') , emit: bam + tuple val(meta), path('*merged.bam.bai') , emit: bai + tuple val(meta), path('*merged.bam'), path('*merged.bam.bai') , emit: bam_bai + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def input = bam.sort().collect{"-i $it"}.join(' ') + def prefix = task.ext.prefix ?: "${meta.id}" + """ + if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then + echo "Initializing SENTIEON_LICENSE env variable" + source sentieon_init.sh SENTIEON_LICENSE_BASE64 + fi + + sentieon \\ + driver \\ + -t $task.cpus \\ + $input \\ + --algo ReadWriter \\ + ${prefix}_merged.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_merged.bam + touch ${prefix}_merged.bam.bai + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sentieon: \$(echo \$(sentieon driver --version 2>&1) | sed -e "s/sentieon-genomics-//g") + END_VERSIONS + """ +} diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 8e3b8c5b..b8f9adc8 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -21,7 +21,7 @@ workflow ALIGN { ch_versions = Channel.empty() ALIGN_BWAMEM2 ( reads_input, index_bwamem2, fasta, fai, platform ) - ALIGN_SENTIEON ( reads_input, fasta, fai, index_bwa, known_dbsnp, known_dbsnp_tbi ) + ALIGN_SENTIEON ( reads_input, fasta, fai, index_bwa, known_dbsnp, known_dbsnp_tbi, platform ) ch_marked_bam = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bam, ALIGN_SENTIEON.out.marked_bam) ch_marked_bai = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bai, ALIGN_SENTIEON.out.marked_bai) diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index c498958e..956b421d 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -7,6 +7,7 @@ include { SENTIEON_DATAMETRICS } from '../../../modules/local/sentieon/datame include { SENTIEON_LOCUSCOLLECTOR } from '../../../modules/local/sentieon/locuscollector' include { SENTIEON_DEDUP } from '../../../modules/local/sentieon/dedup' include { SENTIEON_BQSR } from '../../../modules/local/sentieon/bqsr' +include { SENTIEON_READWRITER } from '../../../modules/local/sentieon/readwriter' workflow ALIGN_SENTIEON { take: @@ -16,6 +17,7 @@ workflow ALIGN_SENTIEON { index // channel: [ /path/to/bwamem2/index/ ] known_dbsnp // path: params.known_dbsnp known_dbsnp_tbi // path: params.known_dbsnp + platform // value: params.platform main: ch_versions = Channel.empty() @@ -29,8 +31,20 @@ workflow ALIGN_SENTIEON { SENTIEON_BWAMEM.out .bam .join(SENTIEON_BWAMEM.out.bai) - .set { ch_bam_bai } + .map{ meta, bam, bai -> + new_meta = meta.clone() // clone to avoid overriding the global meta + new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename + new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + platform + "\\tSM:" + new_meta.id + "\'" + [new_meta, bam, bai]} // end the closure to return newly modified channel + .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] + .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list + single: it[1].size() == 1 + multiple: it[1].size() > 1 + } + .set{ merge_bams_in } + SENTIEON_READWRITER (merge_bams_in.multiple) + ch_bam_bai = merge_bams_in.single.mix(SENTIEON_READWRITER.out.bam_bai) SENTIEON_DATAMETRICS (ch_bam_bai, fasta, fai ) ch_versions = ch_versions.mix(SENTIEON_DATAMETRICS.out.versions) diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index a62662b9..096821d0 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -13,7 +13,7 @@ workflow CALL_SNV { fai // channel: [genome.fai] known_dbsnp // channel: [ /path/to/known_dbsnp ] known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] - call_interval // channel: [ /path/to/call_intervals ] + call_interval // channel: [ /path/to/call_intervals ] ml_model // channel: [ /path/to/ml_model ] case_info // channel: [ case_id ] From bae7a1886d7f1b8efdf76adde6e8a077e227d5d1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 23 Nov 2022 15:34:08 +0100 Subject: [PATCH 0848/1169] connect sentieon to annotation subworkflow --- conf/modules.config | 26 ++++++++++++++ subworkflows/local/call_snv.nf | 2 +- .../variant_calling/call_snv_sentieon.nf | 35 ++++++++++++++++--- 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9c762723..be2d2c96 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -421,6 +421,32 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SPLIT_MULTIALLELICS_SEN' { + ext.args = '--output-type z --multiallelics -both' + ext.prefix = { "${meta.id}_split" } + publishDir = [ + enabled: false + ] + } + + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:REMOVE_DUPLICATES_SEN' { + ext.args = '--output-type z --rm-dup none' + ext.prefix = { "${meta.id}_split_rmdup" } + publishDir = [ + path: { "${params.outdir}/sentieon_normvcf" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_SNV_DEEPVARIANT:TABIX_SEN' { + publishDir = [ + path: { "${params.outdir}/sentieon_normvcf" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } // diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index 096821d0..4a5a9227 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -27,7 +27,7 @@ workflow CALL_SNV { ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) } else if ( variant_caller == "sentieon" ) { - CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, call_interval, ml_model ) + CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, call_interval, ml_model, case_info ) ch_vcf = CALL_SNV_SENTIEON.out.vcf ch_tabix = CALL_SNV_SENTIEON.out.tabix ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 52dac412..567a0934 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -2,8 +2,12 @@ // A subworkflow to call SNVs by sentieon dnascope with a machine learning model. // -include { SENTIEON_DNASCOPE } from '../../../modules/local/sentieon/dnascope' -include { SENTIEON_DNAMODELAPPLY } from '../../../modules/local/sentieon/dnamodelapply' +include { SENTIEON_DNASCOPE } from '../../../modules/local/sentieon/dnascope' +include { SENTIEON_DNAMODELAPPLY } from '../../../modules/local/sentieon/dnamodelapply' +include { BCFTOOLS_MERGE } from '../../../modules/nf-core/bcftools/merge' +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_SEN } from '../../../modules/nf-core/bcftools/norm/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_SEN } from '../../../modules/nf-core/bcftools/norm/main' +include { TABIX_TABIX as TABIX_SEN } from '../../../modules/nf-core/tabix/tabix/main' workflow CALL_SNV_SENTIEON { take: @@ -14,6 +18,7 @@ workflow CALL_SNV_SENTIEON { dbsnp_index // path: params.known_dbsnp call_interval // path: params.call_interval ml_model // path: params.ml_model + case_info // channel: [ case_id ] main: ch_versions = Channel.empty() @@ -33,8 +38,30 @@ workflow CALL_SNV_SENTIEON { ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions) } + ch_vcf.join(ch_index) + .map { meta,vcf,tbi -> return [vcf,tbi] } + .set { ch_vcf_idx } + + case_info + .combine(ch_vcf_idx) + .groupTuple() + .set{ ch_vcf_idx_case } + + BCFTOOLS_MERGE(ch_vcf_idx_case,[],fasta,fai) + + ch_split_multi_in = BCFTOOLS_MERGE.out.merged_variants + .map{meta, bcf -> + return [meta, bcf, []]} + SPLIT_MULTIALLELICS_SEN(ch_split_multi_in, fasta) + + ch_remove_dup_in = SPLIT_MULTIALLELICS_SEN.out.vcf + .map{meta, vcf -> + return [meta, vcf, []]} + REMOVE_DUPLICATES_SEN(ch_remove_dup_in, fasta) + TABIX_SEN(REMOVE_DUPLICATES_SEN.out.vcf) + emit: - vcf = ch_vcf - tabix = ch_index + vcf = REMOVE_DUPLICATES_SEN.out.vcf + tabix = TABIX_SEN.out.tbi versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From d2daf5b86faebd12c36c7f2fd6076ceb14db8433 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 23 Nov 2022 15:46:46 +0100 Subject: [PATCH 0849/1169] fix CI --- subworkflows/local/variant_calling/call_snv_sentieon.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 567a0934..1f21f916 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -4,7 +4,7 @@ include { SENTIEON_DNASCOPE } from '../../../modules/local/sentieon/dnascope' include { SENTIEON_DNAMODELAPPLY } from '../../../modules/local/sentieon/dnamodelapply' -include { BCFTOOLS_MERGE } from '../../../modules/nf-core/bcftools/merge' +include { BCFTOOLS_MERGE } from '../../../modules/nf-core/bcftools/merge/main' include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_SEN } from '../../../modules/nf-core/bcftools/norm/main' include { BCFTOOLS_NORM as REMOVE_DUPLICATES_SEN } from '../../../modules/nf-core/bcftools/norm/main' include { TABIX_TABIX as TABIX_SEN } from '../../../modules/nf-core/tabix/tabix/main' From ab4978733069206218435a26c12e39b016783e06 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 23 Nov 2022 16:25:16 +0100 Subject: [PATCH 0850/1169] string to uppercase --- subworkflows/local/variant_calling/call_sv_manta.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/variant_calling/call_sv_manta.nf b/subworkflows/local/variant_calling/call_sv_manta.nf index 59e58ed7..6653aa4a 100644 --- a/subworkflows/local/variant_calling/call_sv_manta.nf +++ b/subworkflows/local/variant_calling/call_sv_manta.nf @@ -27,7 +27,7 @@ workflow CALL_SV_MANTA { return [bed_file, index]} .set { bed_input } - if (params.analysis_type == "WGS") { + if (params.analysis_type.toUpperCase() == "WGS" ) { case_info.combine(bam_file_list) .combine(bai_file_list) .map { it -> it + [ [], [] ] } From 6189e641adf0e9f503c2c58936ca661787330108 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 24 Nov 2022 00:47:35 +0100 Subject: [PATCH 0851/1169] add mt_contig_name_params --- conf/modules.config | 13 ++++++++++++- nextflow.config | 1 + nextflow_schema.json | 6 ++++++ subworkflows/local/call_snv.nf | 19 +++++++++++++------ 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9c762723..47cc6796 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -540,6 +540,17 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + + withName: '.*CALL_SNV:GATK4_SELECTVARIANTS' { + ext.args = "--exclude-intervals ${params.mt_contig_name}" + ext.prefix = { "${meta.id}_nomito" } + ext.when = { params.annotate_snv_switch } + publishDir = [ + path: { "${params.outdir}/glnexus/no_mito" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } // @@ -810,7 +821,7 @@ process { beforeScript = {"mkdir ./tmp"} ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } ext.args = [ - params.genome == "GRCh37" ? "-L MT" : "-L chrM", + "-L ${params.mt_contig_name}", "--read-filter MateOnSameContigOrNoMappedMateReadFilter", "--read-filter MateUnmappedAndUnmappedReadFilter" ].join(" ").trim() diff --git a/nextflow.config b/nextflow.config index 189df701..bcc8ef2c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -18,6 +18,7 @@ params { igenomes_ignore = false local_genomes = null save_reference = false + mt_contig_name = 'MT' // Main options analysis_type = 'wgs' diff --git a/nextflow_schema.json b/nextflow_schema.json index 54bb1213..f4688bc8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -127,6 +127,12 @@ "description": "Path to the index file for the gnomad tab file with allele frequencies.", "help_text": "Path to the index of gnomad tab file with CHR/START/REF,ALT/AF" }, + "mt_contig_name": { + "type": "string", + "format": "path", + "description": "Name of the mitochondrial contig in the reference fasta file", + "help_text": "Used to extract relevant information from the references to analyse mitochondria" + }, "mt_intervals": { "type": "string", "format": "path", diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index a62662b9..1541e940 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -4,6 +4,8 @@ include { CALL_SNV_DEEPVARIANT } from './variant_calling/call_snv_deepvariant' include { CALL_SNV_SENTIEON } from './variant_calling/call_snv_sentieon' +include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariants/main' + workflow CALL_SNV { take: @@ -18,22 +20,27 @@ workflow CALL_SNV { case_info // channel: [ case_id ] main: - ch_versions = Channel.empty() + ch_versions = Channel.empty() - if (variant_caller == "deepvariant") { + if (variant_caller == "deepvariant") { CALL_SNV_DEEPVARIANT ( input, fasta, fai, case_info ) ch_vcf = CALL_SNV_DEEPVARIANT.out.vcf ch_tabix = CALL_SNV_DEEPVARIANT.out.tabix ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) - } else if ( variant_caller == "sentieon" ) { + } else if ( variant_caller == "sentieon" ) { CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, call_interval, ml_model ) ch_vcf = CALL_SNV_SENTIEON.out.vcf ch_tabix = CALL_SNV_SENTIEON.out.tabix ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) - } else { - exit 1, 'Please provide a valid variant caller!' - } + } else { + exit 1, 'Please provide a valid variant caller!' + } + + ch_vcf.join(ch_tabix) + .map { meta, vcf, tbi -> return [meta, vcf, tbi, []]} + .set { ch_selvar_in} + GATK4_SELECTVARIANTS(ch_selvar_in) emit: vcf = ch_vcf From 283d6c3745852630ecf3942e5d38a5df983c9f13 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 24 Nov 2022 17:04:33 +0100 Subject: [PATCH 0852/1169] combine mt and snv --- conf/modules.config | 12 +++++++++++- subworkflows/local/annotate_snvs.nf | 13 +++++++++---- subworkflows/local/call_snv.nf | 6 +++--- workflows/raredisease.nf | 14 +++++++++++++- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 407f65a4..8091ba0e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -809,6 +809,16 @@ process { } } +// +// Merge mitochondrial and genomic vcfs +// + +process { + withName: 'RAREDISEASE:BCFTOOLS_CONCAT' { + ext.prefix = { "${meta.id}_mito_genome_merged" } + } +} + // // Score and rank SNVs // @@ -1032,7 +1042,7 @@ process { '--plugin LoFtool,vep_cache/LoFtool_scores.txt', '--distance 0', '--buffer_size 20000', - '--format vcf --max_sv_size 16600', + '--format vcf --vcf --max_sv_size 16600', '--appris --biotype --cache --canonical --ccds --compress_output bgzip', '--domains --exclude_predicted --force_overwrite', '--hgvs --humdiv --no_progress --numbers', diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 8f24e350..5d6e455a 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -11,7 +11,8 @@ include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/en include { TABIX_BGZIPTABIX as ZIP_TABIX_ROHCALL } from '../../modules/nf-core/tabix/bgziptabix/main' include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' include { TABIX_BGZIPTABIX as ZIP_TABIX_VEP } from '../../modules/nf-core/tabix/bgziptabix/main' -include { TABIX_TABIX as TABIX_BCFTOOLS } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_BCFTOOLS_CONCAT } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_BCFTOOLS_VIEW } from '../../modules/nf-core/tabix/tabix/main' include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariants/main' workflow ANNOTATE_SNVS { @@ -80,10 +81,10 @@ workflow ANNOTATE_SNVS { BCFTOOLS_VIEW(ZIP_TABIX_VCFANNO.out.gz_tbi,[],[],[]).vcf.set { ch_vep_in } ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) - TABIX_BCFTOOLS (BCFTOOLS_VIEW.out.vcf) - ch_versions = ch_versions.mix(TABIX_BCFTOOLS.out.versions) + TABIX_BCFTOOLS_VIEW (BCFTOOLS_VIEW.out.vcf) + ch_versions = ch_versions.mix(TABIX_BCFTOOLS_VIEW.out.versions) - BCFTOOLS_VIEW.out.vcf.join(TABIX_BCFTOOLS.out.tbi).collect().set { ch_vcf_scatter_in } + BCFTOOLS_VIEW.out.vcf.join(TABIX_BCFTOOLS_VIEW.out.tbi).collect().set { ch_vcf_scatter_in } GATK4_SELECTVARIANTS (ch_vcf_scatter_in.combine(split_intervals)).vcf.set { ch_vep_in } ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions) @@ -116,7 +117,11 @@ workflow ANNOTATE_SNVS { BCFTOOLS_CONCAT (ch_vep_ann) ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) + TABIX_BCFTOOLS_CONCAT (BCFTOOLS_CONCAT.out.vcf) + ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) + emit: vcf_ann = BCFTOOLS_CONCAT.out.vcf + tbi = TABIX_BCFTOOLS_CONCAT.out.tbi versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index a5cc69f9..61d9c1c4 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -39,11 +39,11 @@ workflow CALL_SNV { ch_vcf.join(ch_tabix) .map { meta, vcf, tbi -> return [meta, vcf, tbi, []]} - .set { ch_selvar_in} + .set { ch_selvar_in } GATK4_SELECTVARIANTS(ch_selvar_in) emit: - vcf = ch_vcf - tabix = ch_tabix + vcf = GATK4_SELECTVARIANTS.out.vcf + tabix = GATK4_SELECTVARIANTS.out.tbi versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 3823a86b..a12021b6 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -80,6 +80,7 @@ include { MAKE_PED } from '../modules/local/create_ // MODULE: Installed directly from nf-core/modules // +include { BCFTOOLS_CONCAT } from '../modules/nf-core/bcftools/concat/main' include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' include { FASTQC } from '../modules/nf-core/fastqc/main' include { MULTIQC } from '../modules/nf-core/multiqc/main' @@ -393,8 +394,19 @@ workflow RAREDISEASE { ).set {ch_snv_annotate} ch_versions = ch_versions.mix(ch_snv_annotate.versions) + ch_snv_annotate.tbi + .concat(ANALYSE_MT.out.tbi) + .groupTuple() + .set { ch_merged_tbi } + ch_snv_annotate.vcf_ann + .concat(ANALYSE_MT.out.vcf) + .groupTuple() + .set { ch_merged_vcf } + + ch_merged_vcf.join(ch_merged_tbi).set {ch_concat_in} + BCFTOOLS_CONCAT (ch_concat_in) ANN_CSQ_PLI_SNV ( - ch_snv_annotate.vcf_ann, + BCFTOOLS_CONCAT.out.vcf, ch_variant_consequences ) ch_versions = ch_versions.mix(ANN_CSQ_PLI_SNV.out.versions) From 886eae05169b4559597fbb2fdcb31e935e949016 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 25 Nov 2022 14:14:09 +0100 Subject: [PATCH 0853/1169] Replaced bed by interval list files --- assets/1-22XYMT_grch37.interval_list | 112 + assets/Y_grch37.interval_list | 88 + ...hr1-chr22chrXchrYchrM_grch38.interval_list | 3392 +++++++++++++++++ assets/chrY_grch38.interval_list | 3368 ++++++++++++++++ 4 files changed, 6960 insertions(+) create mode 100644 assets/1-22XYMT_grch37.interval_list create mode 100644 assets/Y_grch37.interval_list create mode 100644 assets/chr1-chr22chrXchrYchrM_grch38.interval_list create mode 100644 assets/chrY_grch38.interval_list diff --git a/assets/1-22XYMT_grch37.interval_list b/assets/1-22XYMT_grch37.interval_list new file mode 100644 index 00000000..7c884dd6 --- /dev/null +++ b/assets/1-22XYMT_grch37.interval_list @@ -0,0 +1,112 @@ +@HD VN:1.5 SO:coordinate +@SQ SN:1 LN:249250621 M5:1b22b98cdeb4a9304cb5d48026a85128 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:2 LN:243199373 M5:a0d9851da00400dec1098a9255ac712e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:3 LN:198022430 M5:fdfd811849cc2fadebc929bb925902e5 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:4 LN:191154276 M5:23dccd106897542ad87d2765d28a19a1 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:5 LN:180915260 M5:0740173db9ffd264d728f32784845cd7 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:6 LN:171115067 M5:1d3a93a248d92a729ee764823acbbc6b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:7 LN:159138663 M5:618366e953d6aaad97dbe4777c29375e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:8 LN:146364022 M5:96f514a9929e410c6651697bded59aec UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:9 LN:141213431 M5:3e273117f15e0a400f01055d9f393768 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:10 LN:135534747 M5:988c28e000e84c26d552359af1ea2e1d UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:11 LN:135006516 M5:98c59049a2df285c76ffb1c6db8f8b96 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:12 LN:133851895 M5:51851ac0e1a115847ad36449b0015864 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:13 LN:115169878 M5:283f8d7892baa81b510a015719ca7b0b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:14 LN:107349540 M5:98f3cae32b2a2e9524bc19813927542e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:15 LN:102531392 M5:e5645a794a8238215b2cd77acb95a078 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:16 LN:90354753 M5:fc9b1a7b42b97a864f56b348b06095e6 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:17 LN:81195210 M5:351f64d4f4f9ddd45b35336ad97aa6de UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:18 LN:78077248 M5:b15d4b2d29dde9d3e4f93d1d0f2cbc9c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:19 LN:59128983 M5:1aacd71f30db8e561810913e0b72636d UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:20 LN:63025520 M5:0dec9660ec1efaaf33281c0d5ea2560f UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:21 LN:48129895 M5:2979a6085bfe28e3ad6f552f361ed74d UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:22 LN:51304566 M5:a718acaa6135fdca8357d5bfe94211dd UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:X LN:155270560 M5:7e0e2e580297b7764e31dbc80c2540dd UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:Y LN:59373566 M5:1fa3474750af0948bdf97d5a0ee52e51 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:MT LN:16569 M5:c68f52674c9fb33aef52dcf399755519 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000207.1 LN:4262 M5:f3814841f1939d3ca19072d9e89f3fd7 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000226.1 LN:15008 M5:1c1b2cd1fccbc0a99b6a447fa24d1504 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000229.1 LN:19913 M5:d0f40ec87de311d8e715b52e4c7062e1 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000231.1 LN:27386 M5:ba8882ce3a1efa2080e5d29b956568a4 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000210.1 LN:27682 M5:851106a74238044126131ce2a8e5847c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000239.1 LN:33824 M5:99795f15702caec4fa1c4e15f8a29c07 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000235.1 LN:34474 M5:118a25ca210cfbcdfb6c2ebb249f9680 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000201.1 LN:36148 M5:dfb7e7ec60ffdcb85cb359ea28454ee9 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000247.1 LN:36422 M5:7de00226bb7df1c57276ca6baabafd15 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000245.1 LN:36651 M5:89bc61960f37d94abf0df2d481ada0ec UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000197.1 LN:37175 M5:6f5efdd36643a9b8c8ccad6f2f1edc7b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000203.1 LN:37498 M5:96358c325fe0e70bee73436e8bb14dbd UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000246.1 LN:38154 M5:e4afcd31912af9d9c2546acf1cb23af2 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000249.1 LN:38502 M5:1d78abec37c15fe29a275eb08d5af236 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000196.1 LN:38914 M5:d92206d1bb4c3b4019c43c0875c06dc0 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000248.1 LN:39786 M5:5a8e43bec9be36c7b49c84d585107776 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000244.1 LN:39929 M5:0996b4475f353ca98bacb756ac479140 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000238.1 LN:39939 M5:131b1efc3270cc838686b54e7c34b17b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000202.1 LN:40103 M5:06cbf126247d89664a4faebad130fe9c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000234.1 LN:40531 M5:93f998536b61a56fd0ff47322a911d4b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000232.1 LN:40652 M5:3e06b6741061ad93a8587531307057d8 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000206.1 LN:41001 M5:43f69e423533e948bfae5ce1d45bd3f1 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000240.1 LN:41933 M5:445a86173da9f237d7bcf41c6cb8cc62 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000236.1 LN:41934 M5:fdcd739913efa1fdc64b6c0cd7016779 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000241.1 LN:42152 M5:ef4258cdc5a45c206cea8fc3e1d858cf UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000243.1 LN:43341 M5:cc34279a7e353136741c9fce79bc4396 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000242.1 LN:43523 M5:2f8694fc47576bc81b5fe9e7de0ba49e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000230.1 LN:43691 M5:b4eb71ee878d3706246b7c1dbef69299 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000237.1 LN:45867 M5:e0c82e7751df73f4f6d0ed30cdc853c0 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000233.1 LN:45941 M5:7fed60298a8d62ff808b74b6ce820001 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000204.1 LN:81310 M5:efc49c871536fa8d79cb0a06fa739722 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000198.1 LN:90085 M5:868e7784040da90d900d2d1b667a1383 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000208.1 LN:92689 M5:aa81be49bf3fe63a79bdc6a6f279abf6 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000191.1 LN:106433 M5:d75b436f50a8214ee9c2a51d30b2c2cc UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000227.1 LN:128374 M5:a4aead23f8053f2655e468bcc6ecdceb UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000228.1 LN:129120 M5:c5a17c97e2c1a0b6a9cc5a6b064b714f UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000214.1 LN:137718 M5:46c2032c37f2ed899eb41c0473319a69 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000221.1 LN:155397 M5:3238fb74ea87ae857f9c7508d315babb UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000209.1 LN:159169 M5:f40598e2a5a6b26e84a3775e0d1e2c81 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000218.1 LN:161147 M5:1d708b54644c26c7e01c2dad5426d38c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000220.1 LN:161802 M5:fc35de963c57bf7648429e6454f1c9db UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000213.1 LN:164239 M5:9d424fdcc98866650b58f004080a992a UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000211.1 LN:166566 M5:7daaa45c66b288847b9b32b964e623d3 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000199.1 LN:169874 M5:569af3b73522fab4b40995ae4944e78e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000217.1 LN:172149 M5:6d243e18dea1945fb7f2517615b8f52e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000216.1 LN:172294 M5:642a232d91c486ac339263820aef7fe0 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000215.1 LN:172545 M5:5eb3b418480ae67a997957c909375a73 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000205.1 LN:174588 M5:d22441398d99caf673e9afb9a1908ec5 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000219.1 LN:179198 M5:f977edd13bac459cb2ed4a5457dba1b3 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000224.1 LN:179693 M5:d5b2fc04f6b41b212a4198a07f450e20 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000223.1 LN:180455 M5:399dfa03bf32022ab52a846f7ca35b30 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000195.1 LN:182896 M5:5d9ec007868d517e73543b005ba48535 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000212.1 LN:186858 M5:563531689f3dbd691331fd6c5730a88b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000222.1 LN:186861 M5:6fe9abac455169f50470f5a6b01d0f59 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000200.1 LN:187035 M5:75e4c8d17cd4addf3917d1703cacaf25 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000193.1 LN:189789 M5:dbb6e8ece0b5de29da56601613007c2a UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000194.1 LN:191469 M5:6ac8f815bf8e845bb3031b73f812c012 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000225.1 LN:211173 M5:63945c3e6962f28ffd469719a747e73c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000192.1 LN:547496 M5:325ba9e808f669dfeee210fdd7b470ac UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:NC_007605 LN:171823 M5:6743bd63b3ff2b5b8985d8933c53290a UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:hs37d5 LN:35477943 M5:5b6a4b3a81a2d3c134b7d14bf6ad39f1 UR:grch37_homo_sapiens_-d5-.fasta +1 1 249250621 + . +2 1 243199373 + . +3 1 198022430 + . +4 1 191154276 + . +5 1 180915260 + . +6 1 171115067 + . +7 1 159138663 + . +8 1 146364022 + . +9 1 141213431 + . +10 1 135534747 + . +11 1 135006516 + . +12 1 133851895 + . +13 1 115169878 + . +14 1 107349540 + . +15 1 102531392 + . +16 1 90354753 + . +17 1 81195210 + . +18 1 78077248 + . +19 1 59128983 + . +20 1 63025520 + . +21 1 48129895 + . +22 1 51304566 + . +X 1 155270560 + . +Y 1 59373566 + . +MT 1 16569 + . diff --git a/assets/Y_grch37.interval_list b/assets/Y_grch37.interval_list new file mode 100644 index 00000000..f0aefb8e --- /dev/null +++ b/assets/Y_grch37.interval_list @@ -0,0 +1,88 @@ +@HD VN:1.5 SO:coordinate +@SQ SN:1 LN:249250621 M5:1b22b98cdeb4a9304cb5d48026a85128 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:2 LN:243199373 M5:a0d9851da00400dec1098a9255ac712e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:3 LN:198022430 M5:fdfd811849cc2fadebc929bb925902e5 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:4 LN:191154276 M5:23dccd106897542ad87d2765d28a19a1 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:5 LN:180915260 M5:0740173db9ffd264d728f32784845cd7 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:6 LN:171115067 M5:1d3a93a248d92a729ee764823acbbc6b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:7 LN:159138663 M5:618366e953d6aaad97dbe4777c29375e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:8 LN:146364022 M5:96f514a9929e410c6651697bded59aec UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:9 LN:141213431 M5:3e273117f15e0a400f01055d9f393768 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:10 LN:135534747 M5:988c28e000e84c26d552359af1ea2e1d UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:11 LN:135006516 M5:98c59049a2df285c76ffb1c6db8f8b96 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:12 LN:133851895 M5:51851ac0e1a115847ad36449b0015864 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:13 LN:115169878 M5:283f8d7892baa81b510a015719ca7b0b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:14 LN:107349540 M5:98f3cae32b2a2e9524bc19813927542e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:15 LN:102531392 M5:e5645a794a8238215b2cd77acb95a078 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:16 LN:90354753 M5:fc9b1a7b42b97a864f56b348b06095e6 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:17 LN:81195210 M5:351f64d4f4f9ddd45b35336ad97aa6de UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:18 LN:78077248 M5:b15d4b2d29dde9d3e4f93d1d0f2cbc9c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:19 LN:59128983 M5:1aacd71f30db8e561810913e0b72636d UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:20 LN:63025520 M5:0dec9660ec1efaaf33281c0d5ea2560f UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:21 LN:48129895 M5:2979a6085bfe28e3ad6f552f361ed74d UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:22 LN:51304566 M5:a718acaa6135fdca8357d5bfe94211dd UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:X LN:155270560 M5:7e0e2e580297b7764e31dbc80c2540dd UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:Y LN:59373566 M5:1fa3474750af0948bdf97d5a0ee52e51 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:MT LN:16569 M5:c68f52674c9fb33aef52dcf399755519 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000207.1 LN:4262 M5:f3814841f1939d3ca19072d9e89f3fd7 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000226.1 LN:15008 M5:1c1b2cd1fccbc0a99b6a447fa24d1504 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000229.1 LN:19913 M5:d0f40ec87de311d8e715b52e4c7062e1 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000231.1 LN:27386 M5:ba8882ce3a1efa2080e5d29b956568a4 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000210.1 LN:27682 M5:851106a74238044126131ce2a8e5847c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000239.1 LN:33824 M5:99795f15702caec4fa1c4e15f8a29c07 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000235.1 LN:34474 M5:118a25ca210cfbcdfb6c2ebb249f9680 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000201.1 LN:36148 M5:dfb7e7ec60ffdcb85cb359ea28454ee9 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000247.1 LN:36422 M5:7de00226bb7df1c57276ca6baabafd15 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000245.1 LN:36651 M5:89bc61960f37d94abf0df2d481ada0ec UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000197.1 LN:37175 M5:6f5efdd36643a9b8c8ccad6f2f1edc7b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000203.1 LN:37498 M5:96358c325fe0e70bee73436e8bb14dbd UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000246.1 LN:38154 M5:e4afcd31912af9d9c2546acf1cb23af2 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000249.1 LN:38502 M5:1d78abec37c15fe29a275eb08d5af236 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000196.1 LN:38914 M5:d92206d1bb4c3b4019c43c0875c06dc0 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000248.1 LN:39786 M5:5a8e43bec9be36c7b49c84d585107776 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000244.1 LN:39929 M5:0996b4475f353ca98bacb756ac479140 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000238.1 LN:39939 M5:131b1efc3270cc838686b54e7c34b17b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000202.1 LN:40103 M5:06cbf126247d89664a4faebad130fe9c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000234.1 LN:40531 M5:93f998536b61a56fd0ff47322a911d4b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000232.1 LN:40652 M5:3e06b6741061ad93a8587531307057d8 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000206.1 LN:41001 M5:43f69e423533e948bfae5ce1d45bd3f1 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000240.1 LN:41933 M5:445a86173da9f237d7bcf41c6cb8cc62 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000236.1 LN:41934 M5:fdcd739913efa1fdc64b6c0cd7016779 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000241.1 LN:42152 M5:ef4258cdc5a45c206cea8fc3e1d858cf UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000243.1 LN:43341 M5:cc34279a7e353136741c9fce79bc4396 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000242.1 LN:43523 M5:2f8694fc47576bc81b5fe9e7de0ba49e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000230.1 LN:43691 M5:b4eb71ee878d3706246b7c1dbef69299 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000237.1 LN:45867 M5:e0c82e7751df73f4f6d0ed30cdc853c0 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000233.1 LN:45941 M5:7fed60298a8d62ff808b74b6ce820001 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000204.1 LN:81310 M5:efc49c871536fa8d79cb0a06fa739722 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000198.1 LN:90085 M5:868e7784040da90d900d2d1b667a1383 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000208.1 LN:92689 M5:aa81be49bf3fe63a79bdc6a6f279abf6 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000191.1 LN:106433 M5:d75b436f50a8214ee9c2a51d30b2c2cc UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000227.1 LN:128374 M5:a4aead23f8053f2655e468bcc6ecdceb UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000228.1 LN:129120 M5:c5a17c97e2c1a0b6a9cc5a6b064b714f UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000214.1 LN:137718 M5:46c2032c37f2ed899eb41c0473319a69 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000221.1 LN:155397 M5:3238fb74ea87ae857f9c7508d315babb UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000209.1 LN:159169 M5:f40598e2a5a6b26e84a3775e0d1e2c81 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000218.1 LN:161147 M5:1d708b54644c26c7e01c2dad5426d38c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000220.1 LN:161802 M5:fc35de963c57bf7648429e6454f1c9db UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000213.1 LN:164239 M5:9d424fdcc98866650b58f004080a992a UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000211.1 LN:166566 M5:7daaa45c66b288847b9b32b964e623d3 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000199.1 LN:169874 M5:569af3b73522fab4b40995ae4944e78e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000217.1 LN:172149 M5:6d243e18dea1945fb7f2517615b8f52e UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000216.1 LN:172294 M5:642a232d91c486ac339263820aef7fe0 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000215.1 LN:172545 M5:5eb3b418480ae67a997957c909375a73 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000205.1 LN:174588 M5:d22441398d99caf673e9afb9a1908ec5 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000219.1 LN:179198 M5:f977edd13bac459cb2ed4a5457dba1b3 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000224.1 LN:179693 M5:d5b2fc04f6b41b212a4198a07f450e20 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000223.1 LN:180455 M5:399dfa03bf32022ab52a846f7ca35b30 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000195.1 LN:182896 M5:5d9ec007868d517e73543b005ba48535 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000212.1 LN:186858 M5:563531689f3dbd691331fd6c5730a88b UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000222.1 LN:186861 M5:6fe9abac455169f50470f5a6b01d0f59 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000200.1 LN:187035 M5:75e4c8d17cd4addf3917d1703cacaf25 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000193.1 LN:189789 M5:dbb6e8ece0b5de29da56601613007c2a UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000194.1 LN:191469 M5:6ac8f815bf8e845bb3031b73f812c012 UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000225.1 LN:211173 M5:63945c3e6962f28ffd469719a747e73c UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:GL000192.1 LN:547496 M5:325ba9e808f669dfeee210fdd7b470ac UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:NC_007605 LN:171823 M5:6743bd63b3ff2b5b8985d8933c53290a UR:grch37_homo_sapiens_-d5-.fasta +@SQ SN:hs37d5 LN:35477943 M5:5b6a4b3a81a2d3c134b7d14bf6ad39f1 UR:grch37_homo_sapiens_-d5-.fasta +Y 1 59373566 + . diff --git a/assets/chr1-chr22chrXchrYchrM_grch38.interval_list b/assets/chr1-chr22chrXchrYchrM_grch38.interval_list new file mode 100644 index 00000000..ab631387 --- /dev/null +++ b/assets/chr1-chr22chrXchrYchrM_grch38.interval_list @@ -0,0 +1,3392 @@ +@HD VN:1.5 SO:coordinate +@SQ SN:chr1 LN:248956422 M5:6aef897c3d6ff0c78aff06ac189178dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2 LN:242193529 M5:f98db672eb0993dcfdabafe2a882905c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3 LN:198295559 M5:76635a41ea913a405ded820447d067b0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4 LN:190214555 M5:3210fecf1eb92d5489da4346b3fddc6e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5 LN:181538259 M5:a811b3dc9fe66af729dc0dddf7fa4f13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6 LN:170805979 M5:5691468a67c7e7a7b5f2a3a683792c29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7 LN:159345973 M5:cc044cc2256a1141212660fb07b6171e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8 LN:145138636 M5:c67955b5f7815a9a1edfaa15893d3616 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9 LN:138394717 M5:6c198acf68b5af7b9d676dfdd531b5de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10 LN:133797422 M5:c0eeee7acfdaf31b770a509bdaa6e51a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11 LN:135086622 M5:1511375dc2dd1b633af8cf439ae90cec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12 LN:133275309 M5:96e414eace405d8c27a6d35ba19df56f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13 LN:114364328 M5:a5437debe2ef9c9ef8f3ea2874ae1d82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14 LN:107043718 M5:e0f0eecc3bcab6178c62b6211565c807 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15 LN:101991189 M5:f036bd11158407596ca6bf3581454706 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16 LN:90338345 M5:db2d37c8b7d019caaf2dd64ba3a6f33a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17 LN:83257441 M5:f9a0fb01553adb183568e3eb9d8626db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18 LN:80373285 M5:11eeaa801f6b0e2e36a1138616b8ee9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19 LN:58617616 M5:85f9f4fc152c58cb7913c06d6b98573a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20 LN:64444167 M5:b18e6c531b0bd70e949a7fc20859cb01 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21 LN:46709983 M5:974dc7aec0b755b19f031418fdedf293 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22 LN:50818468 M5:ac37ec46683600f808cdd41eac1d55cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrX LN:156040895 M5:2b3a55ff7f58eb308420c8a9b11cac50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrY LN:57227415 M5:ce3e31103314a704255f3cd90369ecce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrM LN:16569 M5:c68f52674c9fb33aef52dcf399755519 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270706v1_random LN:175055 M5:62def1a794b3e18192863d187af956e6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270707v1_random LN:32032 M5:78135804eb15220565483b7cdd02f3be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270708v1_random LN:127682 M5:1e95e047b98ed92148dd84d6c037158c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270709v1_random LN:66860 M5:4e2db2933ea96aee8dab54af60ecb37d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270710v1_random LN:40176 M5:9949f776680c6214512ee738ac5da289 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270711v1_random LN:42210 M5:af383f98cf4492c1f1c4e750c26cbb40 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270712v1_random LN:176043 M5:c38a0fecae6a1838a405406f724d6838 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270713v1_random LN:40745 M5:cb78d48cc0adbc58822a1c6fe89e3569 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270714v1_random LN:41717 M5:42f7a452b8b769d051ad738ee9f00631 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270715v1_random LN:161471 M5:b65a8af1d7bbb7f3c77eea85423452bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270716v1_random LN:153799 M5:2828e63b8edc5e845bf48e75fbad2926 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_GL000221v1_random LN:155397 M5:3238fb74ea87ae857f9c7508d315babb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_GL000008v2_random LN:209709 M5:a999388c587908f80406444cebe80ba3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL000208v1_random LN:92689 M5:aa81be49bf3fe63a79bdc6a6f279abf6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270717v1_random LN:40062 M5:796773a1ee67c988b4de887addbed9e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270718v1_random LN:38054 M5:b0c463c8efa8d64442b48e936368dad5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270719v1_random LN:176845 M5:cd5e932cfc4c74d05bb64e2126873a3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270720v1_random LN:39050 M5:8c2683400a4aeeb40abff96652b9b127 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270721v1_random LN:100316 M5:9654b5d3f36845bb9d19a6dbd15d2f22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_GL000009v2_random LN:201709 M5:862f555045546733591ff7ab15bcecbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_GL000225v1_random LN:211173 M5:63945c3e6962f28ffd469719a747e73c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270722v1_random LN:194050 M5:51f46c9093929e6edc3b4dfd50d803fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_GL000194v1_random LN:191469 M5:6ac8f815bf8e845bb3031b73f812c012 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270723v1_random LN:38115 M5:74a4b480675592095fb0c577c515b5df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270724v1_random LN:39555 M5:c3fcb15dddf45f91ef7d94e2623ce13b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270725v1_random LN:172810 M5:edc6402e58396b90b8738a5e37bf773d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270726v1_random LN:43739 M5:fbe54a3197e2b469ccb2f4b161cfbe86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270727v1_random LN:448248 M5:84fe18a7bf03f3b7fc76cbac8eb583f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270728v1_random LN:1872759 M5:369ff74cf36683b3066a2ca929d9c40d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL000205v2_random LN:185591 M5:458e71cd53dd1df4083dc7983a6c82c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270729v1_random LN:280839 M5:2756f6ee4f5780acce31e995443508b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270730v1_random LN:112551 M5:48f98ede8e28a06d241ab2e946c15e07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270731v1_random LN:150754 M5:8176d9a20401e8d9f01b7ca8b51d9c08 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270732v1_random LN:41543 M5:d837bab5e416450df6e1038ae6cd0817 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270733v1_random LN:179772 M5:f1fa05d48bb0c1f87237a28b66f0be0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270734v1_random LN:165050 M5:1d17410ae2569c758e6dd51616412d32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270735v1_random LN:42811 M5:eb6b07b73dd9a47252098ed3d9fb78b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270736v1_random LN:181920 M5:2ff189f33cfa52f321accddf648c5616 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270737v1_random LN:103838 M5:2ea8bc113a8193d1d700b584b2c5f42a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270738v1_random LN:99375 M5:854ec525c7b6a79e7268f515b6a9877c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270739v1_random LN:73985 M5:760fbd73515fedcc9f37737c4a722d6a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrY_KI270740v1_random LN:37240 M5:69e42252aead509bf56f1ea6fda91405 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270302v1 LN:2274 M5:ee6dff38036f7d03478c70717643196e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270304v1 LN:2165 M5:9423c1b46a48aa6331a77ab5c702ac9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270303v1 LN:1942 M5:2cb746c78e0faa11e628603a4bc9bd58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270305v1 LN:1472 M5:f9acea3395b6992cf3418b6689b98cf9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270322v1 LN:21476 M5:7d459255d1c54369e3b64e719061a5a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270320v1 LN:4416 M5:d898b9c5a0118e76481bf5695272959e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270310v1 LN:1201 M5:af6cb123af7007793bac06485a2a20e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270316v1 LN:1444 M5:6adde7a9fe7bd6918f12d0f0924aa8ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270315v1 LN:2276 M5:ecc43e822dc011fae1fcfd9981c46e9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270312v1 LN:998 M5:26499f2fe4c65621fd8f4ecafbad31d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270311v1 LN:12399 M5:59594f9012d8ce21ed5d1119c051a2ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270317v1 LN:37690 M5:cd4b1fda800f6ec9ea8001994dbf6499 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270412v1 LN:1179 M5:7bb9612f733fb7f098be79499d46350c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270411v1 LN:2646 M5:fc240322d91d43c04f349cc58fda3eca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270414v1 LN:2489 M5:753e02ef3b1c590e0e3376ad2ebb5836 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270419v1 LN:1029 M5:58455e7a788f0dc82034d1fb109f6f5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270418v1 LN:2145 M5:1537ec12b9c58d137a2d4cb9db896bbc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270420v1 LN:2321 M5:bac954a897539c91982a7e3985a49910 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270424v1 LN:2140 M5:747c8f94f34d5de4ad289bc604708210 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270417v1 LN:2043 M5:cd26758fda713f9c96e51d541f50c2d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270422v1 LN:1445 M5:3fce80eb4c0554376b591699031feb56 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270423v1 LN:981 M5:bdf5a85c001731dccfb150db2bfe58ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270425v1 LN:1884 M5:665a46879bbb48294b0cfa87b61e71f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270429v1 LN:1361 M5:ee8962dbef9396884f649e566b78bf06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270442v1 LN:392061 M5:796289c4cda40e358991f9e672490015 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270466v1 LN:1233 M5:530b7033716a5d72dd544213c513fd12 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270465v1 LN:1774 M5:bb1b2323414425c46531b3c3d22ae00d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270467v1 LN:3920 M5:db34e0dc109a4afd499b5ec6aaae9754 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270435v1 LN:92983 M5:1655c75415b9c29e143a815f44286d05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270438v1 LN:112505 M5:e765271939b854dd6826aa764e930c87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270468v1 LN:4055 M5:0a603090f06108ed7aff75df0767b822 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270510v1 LN:2415 M5:cd7348b3b5d9d0dfef6aed2af75ce920 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270509v1 LN:2318 M5:1cdeb8c823d839e1d1735b5bc9a14856 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270518v1 LN:2186 M5:3fd898b62ca859f50fb8b83e7706352b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270508v1 LN:1951 M5:7d42a358d472b9cbdfdf30c8742473d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270516v1 LN:1300 M5:1cbaaafbbf016906a5bf5886f5a0ecb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270512v1 LN:22689 M5:ba1021c82d1230af856f59079e2f71b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270519v1 LN:138126 M5:8d754e9c9afd904fba0a2cd577fcc9a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270522v1 LN:5674 M5:070b4678e22501029c2e3297115216bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270511v1 LN:8127 M5:907ca34a4a2a6673632ebaf513a4c1a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270515v1 LN:6361 M5:dd7527ee8e0bdb0a43ca0b2a5456c8c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270507v1 LN:5353 M5:311894d0a815eb07c5cac49da851cb4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270517v1 LN:3253 M5:913440c38d95c618617ca69bb9296170 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270529v1 LN:1899 M5:4caf890f2586daab8e4b2e2db904f05f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270528v1 LN:2983 M5:d75c9235f0b8c449fc4352997c56b086 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270530v1 LN:2168 M5:04549369e1197c626669a10164613635 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270539v1 LN:993 M5:19e3a982e67eafef39c5a3e4163f1e17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270538v1 LN:91309 M5:d60b72221cc7af871f2c757577e4c92a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270544v1 LN:1202 M5:e62a14b14467cdf48b5a236c66918f0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270548v1 LN:1599 M5:866b0db8e9cf66208c2c064bd09ce0a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270583v1 LN:1400 M5:b127e2e6dbe358ff192b271b8c6ee690 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270587v1 LN:2969 M5:36be47659719f47b95caa51744aa8f70 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270580v1 LN:1553 M5:1df30dae0f605811d927dcea58e729fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270581v1 LN:7046 M5:9f26945f9f9b3f865c9ebe953cbbc1a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270579v1 LN:31033 M5:fe62fb1964002717cc1b034630e89b1f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270589v1 LN:44474 M5:211c215414693fe0a2399cf82e707e03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270590v1 LN:4685 M5:e8a57f147561b361091791b9010cd28b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270584v1 LN:4513 M5:d93636c9d54abd013cfc0d4c01334032 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270582v1 LN:6504 M5:6fd9804a7478d2e28160fe9f017689cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270588v1 LN:6158 M5:37ffa850e69b342a8f8979bd3ffc77d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270593v1 LN:3041 M5:f4a5bfa203e9e81acb640b18fb11e78e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270591v1 LN:5796 M5:d6af509d69835c9ac25a30086e5a4051 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270330v1 LN:1652 M5:c2c590706a339007b00c59e0b8937e78 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270329v1 LN:1040 M5:f023f927ae84c5cc48dc4dce11ba90f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270334v1 LN:1368 M5:53afe12d1371f250a3d1de655345d374 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270333v1 LN:2699 M5:57baf650c47bba9b3a8b7c6d0fb55ad6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270335v1 LN:1048 M5:eb27188639503b524d2659a23b8262ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270338v1 LN:1428 M5:301ef75a6b2996d745eb3464bd352b57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270340v1 LN:1428 M5:56b462bac20d385cdfcde0155fe4c3a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270336v1 LN:1026 M5:69ad2d85d870c8b0269434581e86e30e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270337v1 LN:1121 M5:16fc8d71a2662a6cfec7bdeec3d810c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270363v1 LN:1803 M5:6edd17a912f391022edbc192d49f2489 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270364v1 LN:2855 M5:6ff66a8e589ca27d93b5bac0e5b13a87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270362v1 LN:3530 M5:bc82401ffd9a5ae711fa0ea34da8d2f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270366v1 LN:8320 M5:44a0b65b7ba6bcff37eca202e7d966ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270378v1 LN:1048 M5:fc13bda7dbd914c92fb7e49489d1350f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270379v1 LN:1045 M5:3218bef25946cd95de585dfc7750f63b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270389v1 LN:1298 M5:2c9b08c57c27e714d4d5259fd91b6983 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270390v1 LN:2387 M5:7a64d89ea14990c16d20f4d6e7283e10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270387v1 LN:1537 M5:22a12462264340c25e912b8485cdfa91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270395v1 LN:1143 M5:7c03ca4756c1620f318fb189214388d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270396v1 LN:1880 M5:9069bed3c2efe7cc87227d619ad5816f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270388v1 LN:1216 M5:76f9f3315fa4b831e93c36cd88196480 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270394v1 LN:970 M5:d5171e863a3d8f832f0559235987b1e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270386v1 LN:1788 M5:b9b1baaa7abf206f6b70cf31654172db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270391v1 LN:1484 M5:1fa5cf03b3eac0f1b4a64948fd09de53 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270383v1 LN:1750 M5:694d75683e4a9554bcc1291edbcaee43 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270393v1 LN:1308 M5:3724e1d70677d6b5c4bcf17fd40da111 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270384v1 LN:1658 M5:b06e44ea15d0a57618d6ca7d2e6ac5d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270392v1 LN:971 M5:59b3ca8de65fb171683f8a06d3b4bf0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270381v1 LN:1930 M5:2a9297cfd3b3807195ab9ad07e775d99 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270385v1 LN:990 M5:112a8b1df94ef0498a0bfe2d2ea5cc23 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270382v1 LN:4215 M5:e7085cdcee6ad62f359744e13d3209fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270376v1 LN:1136 M5:59e8fc80b78d62325082334b43dffdba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270374v1 LN:2656 M5:dbc92c9a92e558946e58b4909ec95dd5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270372v1 LN:1650 M5:53a9d5e8fd28bce5da5efcfd9114dbf2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270373v1 LN:1451 M5:b174fe53be245a840cd6324e39b88ced AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270375v1 LN:2378 M5:d678250c97e9b94aa390fa46e70a6d83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270371v1 LN:2805 M5:a0af3d778dfeb7963e8e6d84c0c54fba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270448v1 LN:7992 M5:0f40827c265cb813b6e723da6c9b926b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270521v1 LN:7642 M5:af5bef7cefec7bd7efa729ac6c5be088 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000195v1 LN:182896 M5:5d9ec007868d517e73543b005ba48535 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000219v1 LN:179198 M5:f977edd13bac459cb2ed4a5457dba1b3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000220v1 LN:161802 M5:fc35de963c57bf7648429e6454f1c9db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000224v1 LN:179693 M5:d5b2fc04f6b41b212a4198a07f450e20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270741v1 LN:157432 M5:86eaea8a15a3950e37442eaaa5c9dc92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000226v1 LN:15008 M5:1c1b2cd1fccbc0a99b6a447fa24d1504 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000213v1 LN:164239 M5:9d424fdcc98866650b58f004080a992a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270743v1 LN:210658 M5:3b62d9d3100f530d509e4efebd98502c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270744v1 LN:168472 M5:e90aee46b947ff8c32291a6843fde3f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270745v1 LN:41891 M5:1386fe3de6f82956f2124e19353ff9c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270746v1 LN:66486 M5:c470486a0a858e14aa21d7866f83cc17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270747v1 LN:198735 M5:62375d812ece679c9fd2f3d08d4e22a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270748v1 LN:93321 M5:4f6c6ab005c852a4352aa33e7cc88ded AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270749v1 LN:158759 M5:c899a7b4e911d371283f3f4058ca08b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270750v1 LN:148850 M5:c022ba92f244b7dc54ea90c4eef4d554 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270751v1 LN:150742 M5:1b758bbdee0e9ca882058d916cba9d29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270752v1 LN:27745 M5:e0880631848337bd58559d9b1519da63 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270753v1 LN:62944 M5:25075fb2a1ecada67c0eb2f1fe0c7ec9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270754v1 LN:40191 M5:fe9e16233cecbc244f06f3acff3d03b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270755v1 LN:36723 M5:4a7da6a658955bd787af8add3ccb5751 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270756v1 LN:79590 M5:2996b120a5a5e15dab6555f0bf92e374 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270757v1 LN:71251 M5:174c73b60b41d8a1ef0fbaa4b3bdf0d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000214v1 LN:137718 M5:46c2032c37f2ed899eb41c0473319a69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270742v1 LN:186739 M5:2f31c013a4a8301deb8ab7ed1ca1cd99 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000216v2 LN:176608 M5:725009a7e3f5b78752b68afa922c090c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000218v1 LN:161147 M5:1d708b54644c26c7e01c2dad5426d38c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270762v1_alt LN:354444 M5:b0397179e5a92bb7a3300b68e45a9f72 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270766v1_alt LN:256271 M5:e3f36479d0e07abbd0d47babdc76e19d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270760v1_alt LN:109528 M5:f2ea4b127c54df13f53a2b2b5a358087 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270765v1_alt LN:185285 M5:628b663499df4f5de7dbdd56943bdb6e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_GL383518v1_alt LN:182439 M5:978987018f1a910273ebcc387e038de8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_GL383519v1_alt LN:110268 M5:349e96f115f829409bd1087b5fb684ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_GL383520v2_alt LN:366580 M5:52e97087cc76c9fd73d4815c1e379ee0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270764v1_alt LN:50258 M5:36d9e8a04906213f8c1d4cf81fc4f83f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270763v1_alt LN:911658 M5:2f651e42b9fd434c2310be375fe8645e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270759v1_alt LN:425601 M5:8477794d60329af9bd00cd9277981a59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270761v1_alt LN:165834 M5:3909a76846aa6ed534ba6be66a60cc81 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270770v1_alt LN:136240 M5:38181b04426519779c84cf9a8927cf00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270773v1_alt LN:70887 M5:aa8b8ec2dd7776e643699db29ac85d74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270774v1_alt LN:223625 M5:a6d8be44258a4b8e3b55ffaccbd3b444 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270769v1_alt LN:120616 M5:537f266cfc0ba05dfb532658fb592eb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_GL383521v1_alt LN:143390 M5:8c6f0a214ddbfbd52be574a566e4b21a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270772v1_alt LN:133041 M5:7cc5209d7e796e90bd024204c04a9b7f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270775v1_alt LN:138019 M5:79c3c0ad56276d3eff8cb747b57973a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270771v1_alt LN:110395 M5:3739c7d552cfc62c495704f4f2d61330 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270768v1_alt LN:110099 M5:5f6d54708a2fd0e4592319c2c91850a7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_GL582966v2_alt LN:96131 M5:485c442c93fe19514153702f0c84d952 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_GL383522v1_alt LN:123821 M5:df3e809f9a87f792218db18db51f6ad4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270776v1_alt LN:174166 M5:87fe3336a33a4aa9c04ff7991aa78a11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270767v1_alt LN:161578 M5:160c7bb94aa35c1d61c27aadf1727862 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_JH636055v2_alt LN:173151 M5:42f48ed9d46aded55795ef64e4713d55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270783v1_alt LN:109187 M5:3a60aafd707904d4da9c1c090a7cf0ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270780v1_alt LN:224108 M5:2c050e6aeecf29b54469dea8c5631057 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_GL383526v1_alt LN:180671 M5:620913159e2fbd4e931ac120e3c584c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270777v1_alt LN:173649 M5:9673b29322cf16da2d295778229c1772 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270778v1_alt LN:248252 M5:f0053d7b401730af8c34cd7d20dd0a91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270781v1_alt LN:113034 M5:c94ff451868540e0399bf62acb24e1dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270779v1_alt LN:205312 M5:3eec883e9656d4c4d96ea1e6d3c118ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270782v1_alt LN:162429 M5:ceaa7d4ca7d4b80ba9a8d9e48223de2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270784v1_alt LN:184404 M5:35980922a4773cefc710c08134d16772 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270790v1_alt LN:220246 M5:07cf7caef89c4677af575c370a1ebbb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_GL383528v1_alt LN:376187 M5:2948653361f974fbed3e26a4dfbf332c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270787v1_alt LN:111943 M5:e315d4f96ad548f1af1935d97f2af9df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_GL000257v2_alt LN:586476 M5:03c6c36060cd6c9f9b4fd0b096ff40e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270788v1_alt LN:158965 M5:463baeb6369579e0d387371989492dc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_GL383527v1_alt LN:164536 M5:6d728406957c5c7fb158dbdb7efef2b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270785v1_alt LN:119912 M5:4932c3e044a1e3731cd4de290f6492b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270789v1_alt LN:205944 M5:3c9ef00afbe249de4934eeac37d64233 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270786v1_alt LN:244096 M5:107c6b17f17b5d24936663fe8e70cd2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270793v1_alt LN:126136 M5:0c6c632ce75031c86e3054c34d3b9b49 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270792v1_alt LN:179043 M5:3677eaca510b7e7c5f30ec8382a09d24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270791v1_alt LN:195710 M5:3a62433e49995583fc44e640241a60bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL383532v1_alt LN:82728 M5:eb61b6b3f9374b05ce68ae4a393cf5ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL949742v1_alt LN:226852 M5:20d5046bbd2a21729fdd64fa94bdd5a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270794v1_alt LN:164558 M5:9808234a2843375d92d4c34e262373b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL339449v2_alt LN:1612928 M5:1b6fa375fdf382778e6645d822d12254 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL383530v1_alt LN:101241 M5:adcb4048e465b6b949990853e436a136 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270796v1_alt LN:172708 M5:6b125232b8842fafd4179203620fa2be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL383531v1_alt LN:173459 M5:9161d10779b02fa44b841136ef9e499c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270795v1_alt LN:131892 M5:6670fafb8f6ceb4f46392f3178f29666 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000250v2_alt LN:4672374 M5:740358c10fbb870c86a7e44226bbdb3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270800v1_alt LN:175808 M5:3ed7e87ce250a8466359176e96d6a6a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270799v1_alt LN:152148 M5:80fd907ae0e4d20ad13960cb92ab6d45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL383533v1_alt LN:124736 M5:7d1a65603558094937299ff10e8714af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270801v1_alt LN:870480 M5:bd0c66e2085cf16906ebc6b130862bd6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270802v1_alt LN:75005 M5:c66357c9b0909ee32c75286796602ce3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KB021644v2_alt LN:185823 M5:332d693d4f2026747d670e52836694ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270797v1_alt LN:197536 M5:2b76b3d07dc4cb2992e7125c19e32594 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270798v1_alt LN:271782 M5:7f074e537d58c543d116ce2c45bb0966 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270804v1_alt LN:157952 M5:9babd3431c32811769c782703f7b8c3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270809v1_alt LN:209586 M5:26d14130d09dc093446dd31e8f0be76c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270806v1_alt LN:158166 M5:b55d6ad642408486735aede89d70c0c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_GL383534v2_alt LN:119183 M5:c6ff49147dedce02366d6ade10580611 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270803v1_alt LN:1111570 M5:986e63220694b8c91bad1d6d990f6c83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270808v1_alt LN:271455 M5:52ce11809c32fe22003c5039e407d3e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270807v1_alt LN:126434 M5:4da184771ac6a8644e6df506bbd8a35e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270805v1_alt LN:209988 M5:d3a95141230a470a930f685fbce90a04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270818v1_alt LN:145606 M5:5f8af0060f092d941cbe9d873ccc1d41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270812v1_alt LN:282736 M5:93b572cdabe748641570fa2ed3391222 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270811v1_alt LN:292436 M5:dacc0b0ef9fae890a1741dca03ba7d5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270821v1_alt LN:985506 M5:bbdee492e8852d313be96b6340fbfb1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270813v1_alt LN:300230 M5:c91599edb1c553cf527c7f3ba754bb20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270822v1_alt LN:624492 M5:2cd6749ad4385747595c0b41440cb41d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270814v1_alt LN:141812 M5:84d9d4bbbac92a40b13809e501ff92fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270810v1_alt LN:374415 M5:369545bbf4f206fd1175a84da12b38fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270819v1_alt LN:133535 M5:29d6d49a19ae259feb012f492ab83ce0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270820v1_alt LN:36640 M5:d3b4609d5f29708fc33023259e4b775a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270817v1_alt LN:158983 M5:d6e6a3ac3c2f5afe16c2cfb2e813b30c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270816v1_alt LN:305841 M5:60bb5379ab4d817058300ef606b9fee6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270815v1_alt LN:132244 M5:8be72bf872ff1edfc3f43cd9b7d0b9b3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_GL383539v1_alt LN:162988 M5:12406aad3f3da31bda9c21a1aa0e16b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_GL383540v1_alt LN:71551 M5:23aea04f46682e2a2be1a5ff3934a9fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_GL383541v1_alt LN:171286 M5:0c787911df2449cbba8609bebf897ecb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_GL383542v1_alt LN:60032 M5:12a3180640a49f33c960eb12ca61a6c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270823v1_alt LN:439082 M5:ad4baa1567e313eda0aad427008e10cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10_GL383545v1_alt LN:179254 M5:c27dc6fea378fecf178a44682257c25e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10_KI270824v1_alt LN:181496 M5:af40e32c32de290cfe497a110ff3bdfa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10_GL383546v1_alt LN:309802 M5:ed6fb45e0a25c31903cbb0f78d9d487e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10_KI270825v1_alt LN:188315 M5:3119d196965ee9cae7aeda77131076f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270832v1_alt LN:210133 M5:2b63a3f97e490e807587639807d26293 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270830v1_alt LN:177092 M5:dbe0c94a39d4a91469ffa6e509b3f191 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270831v1_alt LN:296895 M5:b0f755388212c03651b6fdc7531c3fd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270829v1_alt LN:204059 M5:6bc1308e442a1662ae27952f126b7c01 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_GL383547v1_alt LN:154407 M5:7b556f03729e304a286c8d7ef0f0c10e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_JH159136v1_alt LN:200998 M5:8ac9fb9d942dba38bfd30f8d767f4bba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_JH159137v1_alt LN:191409 M5:b293c854ddcbc316cb1d449bca46fbb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270827v1_alt LN:67707 M5:86017dee76a03e3dc3c8833018101fae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270826v1_alt LN:186169 M5:a903d85efe5aa37dac36160bddeeac87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL877875v1_alt LN:167313 M5:3dd30a7638c3a3c518fc15571546b1be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL877876v1_alt LN:408271 M5:5c3a364520bf7ed46894abdce8f6e032 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270837v1_alt LN:40090 M5:e749a70a94624f09e134600d122c130d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383549v1_alt LN:120804 M5:60a7c1711d7f23fd7311a7e4f96896f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270835v1_alt LN:238139 M5:b163c6fa013f6cb75b01088689f1a67f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383550v2_alt LN:169178 M5:d61d9a153c3fd556b48e1c511a6145e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383552v1_alt LN:138655 M5:c28f12c6ee0dec4cc6995766a710960c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383553v2_alt LN:152874 M5:89b111e38005345de92036b249ab6080 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270834v1_alt LN:119498 M5:3ad1c94c00299533f6acd33ea2f04df1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383551v1_alt LN:184319 M5:d96719c32333013a51c4d6d3261f984f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270833v1_alt LN:76061 M5:8c9988aa66d02708e3e57663902fc664 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270836v1_alt LN:56134 M5:28a69648439a2c02d46750eee929b20d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270840v1_alt LN:191684 M5:d90a653d7ac3171c8fb762d0012249f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270839v1_alt LN:180306 M5:b97ea581776626ac41b69f851a85a456 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270843v1_alt LN:103832 M5:563c8412eb284fc5321af590a4c9ab9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270841v1_alt LN:169134 M5:6ac8a99077817e6bc9be36327b8aa18e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270838v1_alt LN:306913 M5:baf90eafb4ed6330cb151c1d5538f721 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270842v1_alt LN:37287 M5:231dd4484df464129d3120986fe2af73 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270844v1_alt LN:322166 M5:b64acbff6218bd210676141e4e678a82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270847v1_alt LN:1511111 M5:9d380ae26e2edb178ef0121021f7a7ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270845v1_alt LN:180703 M5:51b3fa9f43d11aeb91b3debb33496d22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270846v1_alt LN:1351393 M5:1ee28b84d30d13e03341b382995b05bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270852v1_alt LN:478999 M5:5104fe22193b4bd04166ecb401beb06a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270851v1_alt LN:263054 M5:64217994ed61c2feb5412ecc5a7a37b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270848v1_alt LN:327382 M5:d61e4262335c4884ad97dc5d73782870 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_GL383554v1_alt LN:296527 M5:4a3d54bda53308ca941d6d0e794b05cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270849v1_alt LN:244917 M5:7966604eef1b897ee97e8dce9e79b18e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_GL383555v2_alt LN:388773 M5:c904b1792869ae0565acbbdc19b9522f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270850v1_alt LN:430880 M5:5371d98deea30e91051e3efd20016b76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270854v1_alt LN:134193 M5:0e126949f4b012d27f55aed5f1c4ca84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270856v1_alt LN:63982 M5:515d2b9de600d584473c20bea079f34c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270855v1_alt LN:232857 M5:436afa974458133c013b037d4a2dc1c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270853v1_alt LN:2659700 M5:5e28daf08ffeafb037b6e97ba3c959e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_GL383556v1_alt LN:192462 M5:bed6a2667e8452a176e93e921e0c21f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_GL383557v1_alt LN:89672 M5:0989118882ce9c38635e2809e5bf71c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL383563v3_alt LN:375691 M5:fcd64ac83b2ebb57f50931c9d6fc0a31 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270862v1_alt LN:391357 M5:f2efc8dc887a8c0101053fa14491e07f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270861v1_alt LN:196688 M5:808750bf9b346e0a731a1bffac75a01e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270857v1_alt LN:2877074 M5:f5ca1bb91881efefa473c983f9519561 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_JH159146v1_alt LN:278131 M5:384b5b32f0ea2cfd15ac268a2ce07909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_JH159147v1_alt LN:70345 M5:4bf63957bfa1ecdbbab483d4c0ce6682 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL383564v2_alt LN:133151 M5:fc2eb07543a6ecb0a27d9fa12cd91cfc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL000258v2_alt LN:1821992 M5:8bd6071029f2dbc5ab9d2d912bf5c953 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL383565v1_alt LN:223995 M5:063358c8e7f81361b959efab7b3f15cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270858v1_alt LN:235827 M5:69fbdc82c5ef837f574d0b3c8b9c647f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270859v1_alt LN:108763 M5:8d28bd3b1a63fa9a945051f28e087668 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL383566v1_alt LN:90219 M5:a0f25165c6537c9861cc1231f710e99f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270860v1_alt LN:178921 M5:91e560df1ad6c58e7e1739178b8c7209 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_KI270864v1_alt LN:111737 M5:04e6ca7eabe96be35a18eb4c0675071d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383567v1_alt LN:289831 M5:d9015dd9a0916a98ed8ab99fd3cdd012 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383570v1_alt LN:164789 M5:08366c03855961f13b1d5e65920ccf74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383571v1_alt LN:198278 M5:40015159c7da8f06875bb558587e3f07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383568v1_alt LN:104552 M5:e9aba11d18125a2bce2b1e5915e9a904 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383569v1_alt LN:167950 M5:8d13c3e7cbb2b7e1a3225c5a54fe8f44 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383572v1_alt LN:159547 M5:8fc7aaa775b43df3d77c9782a140a981 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_KI270863v1_alt LN:167999 M5:2e691a3fc5108cc7decde377ef398fde AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270868v1_alt LN:61734 M5:2dfd26bf8f217b858edc062be1846db5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270865v1_alt LN:52969 M5:b95ce15823c60ab83ec7a984f3dc9ebc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL383573v1_alt LN:385657 M5:5404455aab275489bc8e6c9fb3ead5cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL383575v2_alt LN:170222 M5:dd8730d9d33765ff135fcfadb8810280 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL383576v1_alt LN:188024 M5:8d4496a682182f8273a2fad665fcf4a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL383574v1_alt LN:155864 M5:0386df1d3476e6649f919195cc072fc7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270866v1_alt LN:43156 M5:d205b57d55e89546400e0f1e230a8a53 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270867v1_alt LN:233762 M5:3d8464a9e183031ea70e0e12fa231163 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949746v1_alt LN:987716 M5:d76e635e75bc038782fb3d0c195d33fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20_GL383577v2_alt LN:128386 M5:f00c218d09df83c8b515a6b5591fe30c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20_KI270869v1_alt LN:118774 M5:2b8065d3bdbac6664d7f35c25d049113 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20_KI270871v1_alt LN:58661 M5:29e7c064fe54ab6b7fd8accb0363821b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20_KI270870v1_alt LN:183433 M5:779f6fd5220eddc54631e80b94bb905a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_GL383578v2_alt LN:63917 M5:d512f47a48fc477e7232d3b46f2bda86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_KI270874v1_alt LN:166743 M5:45c435343bfd1d94c4ff17689faf507d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_KI270873v1_alt LN:143900 M5:22bc49cad0dda4ec9d79ffd619be94d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_GL383579v2_alt LN:201197 M5:631f76952802048256225746f1a14a89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_GL383580v2_alt LN:74653 M5:b0cfe93a0987bda7488445b3c37b2516 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_GL383581v2_alt LN:116689 M5:1c9b893acb0fb6a6d9ff1915ce9004ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_KI270872v1_alt LN:82692 M5:e8daa648582ccb498c469d4f6dcf4140 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270875v1_alt LN:259914 M5:8a27dfcd4c4ae0239e3207b9994d8331 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270878v1_alt LN:186262 M5:07e6bd13f82b45996b0165c0a2c0ebb2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270879v1_alt LN:304135 M5:9fb8076a6ca93af66b2878d5cf07ebb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270876v1_alt LN:263666 M5:507bafbc0e637e7e5854acab4d2b7de7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270877v1_alt LN:101331 M5:b6724c024308122f0d19c875771d571e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_GL383583v2_alt LN:96924 M5:03ed78804fcfe33fb202c22d20e1ed05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_GL383582v2_alt LN:162811 M5:1919a95f3ea48fde56ba925295086028 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrX_KI270880v1_alt LN:284869 M5:e4ed2d1ef2ee71f00075ed9537aab284 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrX_KI270881v1_alt LN:144206 M5:6370851c900248567c9bc5bee75089ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270882v1_alt LN:248807 M5:9a4ca55b5d44458dc5a1682ac6483738 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270883v1_alt LN:170399 M5:79916aa2c6a7669500b59ddd7b4eccec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270884v1_alt LN:157053 M5:28517f9e5682de5e74b42ba7c84a9d41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270885v1_alt LN:171027 M5:b5fc4688af8411394923dbcf6a85b85d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270886v1_alt LN:204239 M5:fae7fb0677c513b24e8027969233140f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270887v1_alt LN:209512 M5:3c672b8b13188d46ed1ea6806fdc9662 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270888v1_alt LN:155532 M5:325a22a47ae227dda0c8704cf4725601 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270889v1_alt LN:170698 M5:680f4977d9743df71085eacbff34769b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270890v1_alt LN:184499 M5:8862bbaae8fc895769859a6e89d19601 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270891v1_alt LN:170680 M5:0b1dd9ea37a3772563fb7298ad1f3857 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270892v1_alt LN:162212 M5:24ba517f0feae1b6a95e1c65c21282be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270894v1_alt LN:214158 M5:0bfafe4b4a536ed3e5b77a89408d7534 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270893v1_alt LN:161218 M5:d701ebc3d24a0056dc6b9418ba4e15c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270895v1_alt LN:162896 M5:4d08672ade726bd914e62a36d734da0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270896v1_alt LN:378547 M5:751a447059436d9d5987f8417b2e2bd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270897v1_alt LN:1144418 M5:5a8582c4943187c1a842801cf17d3706 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270898v1_alt LN:130957 M5:9919f71320ac92b1abb42e2aedea84ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000251v2_alt LN:4795265 M5:e51d466e4a702acf3c9c5ffdc1ee0c51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270899v1_alt LN:190869 M5:b42d6c28bfd9049414fb9d2617528db4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270901v1_alt LN:136959 M5:3d60ee1215e273e0c0267ad063614015 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270900v1_alt LN:318687 M5:80404f3147bd316898e6b5281f32c073 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270902v1_alt LN:106711 M5:f100803823a7cde3694698028e4c515c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270903v1_alt LN:214625 M5:5ce11ce469afc974c3024b30033dc5d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270904v1_alt LN:572349 M5:6d8ebe7fb3dd3be62e34a1d2982e6f46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270906v1_alt LN:196384 M5:eb8157203f051ef7cfcab1f4647f22c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270905v1_alt LN:5161414 M5:31c97360f2a53ab92bd8d6db1b1a410d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270907v1_alt LN:137721 M5:f5a65eb09de3017536d1b7c0b2237fbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270910v1_alt LN:157099 M5:4eef5dbfe56e13c810780221b0f6426d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270909v1_alt LN:325800 M5:6a46afe4c5e257b556f25c37a09fc024 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_JH159148v1_alt LN:88070 M5:bd147af8e713f365ff05352eb8a4508f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270908v1_alt LN:1423190 M5:ef3f9ebebe7ad9f9690daedeae8a74f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_KI270912v1_alt LN:174061 M5:3a8acbc0c5c751ccad11263a608715fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_KI270911v1_alt LN:157710 M5:930ee72eaddcaf1355220cd39539c326 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949747v2_alt LN:729520 M5:10169e6e86933b2bf74797be020fc857 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KB663609v1_alt LN:74013 M5:54abe159678a84e88ceb2d5271027628 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrX_KI270913v1_alt LN:274009 M5:a4d4a5e5b5da1e65f007116b2797a4f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270914v1_alt LN:205194 M5:086e17b28e2ac14e602c5dae2c358364 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270915v1_alt LN:170665 M5:a5c43ab0e4289f3951e65fd57419782a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270916v1_alt LN:184516 M5:45199873c7617fab0ba00e85a43ddbeb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270917v1_alt LN:190932 M5:1595cb5d2e776d8a505a06db45ea2c04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270918v1_alt LN:123111 M5:e79cb3af945f28de17d744bf24cde080 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270919v1_alt LN:170701 M5:a25ce4a282c7ead76bb2468a9a56d082 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270920v1_alt LN:198005 M5:009fb96b4ee6d64732dac95a1f380f41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270921v1_alt LN:282224 M5:4e9f360581e618964d379d67e3b51f90 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270922v1_alt LN:187935 M5:7b6dc564b92bed8df5de2c1fa8de0986 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270923v1_alt LN:189352 M5:5b0339dbf41b0301512639781d44d546 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270924v1_alt LN:166540 M5:944759f109cad94523d1f3918ac0b382 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270925v1_alt LN:555799 M5:08b3f5ff9beac37e3bbc50767cf3b43b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000252v2_alt LN:4604811 M5:0c2ee784f397289b1713ad133fd93d39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270926v1_alt LN:229282 M5:58a00f9d6216734f0bf36a0f2294c246 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270927v1_alt LN:218612 M5:159fb3a622d456897c41d93f4627d169 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949748v2_alt LN:1064304 M5:21fd288470eea03e7424729134f472f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270928v1_alt LN:176103 M5:efcf7ce77388977478ffe2757b8f8430 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270929v1_alt LN:186203 M5:9f8d51d9c1ec4887cd55a1d0d8e61469 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270930v1_alt LN:200773 M5:2c5abf84ad91658f7262dff7ade3e7b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270931v1_alt LN:170148 M5:36b9336df72c820b6efa95567a5aaf28 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270932v1_alt LN:215732 M5:4a92a470a7851edf0c238a74814dece5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270933v1_alt LN:170537 M5:413442cc380f0bb8f15b33bc25149af1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL000209v2_alt LN:177381 M5:0e7a0f548f1f770b4272be1bd8b018fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270934v1_alt LN:163458 M5:43c32fd3aae0eee20305d3d735e7bbb4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000253v2_alt LN:4677643 M5:a5cdd062ee0d61ea6b3c5166e79b472e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949749v2_alt LN:1091841 M5:cf8641cadcdb22174c55a5d9d5c46036 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270935v1_alt LN:197351 M5:8175b26fd25c1671efd5af96e8b44835 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000254v2_alt LN:4827813 M5:ad357767de6beef959952d39200522ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949750v2_alt LN:1066390 M5:c48b453696107dc7105bce3857e1cbc6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270936v1_alt LN:164170 M5:64f7f27938eb4c80140f34e3d2aed483 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000255v2_alt LN:4606388 M5:bceeb4190283066a6d0891562b41d164 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949751v2_alt LN:1002683 M5:1615d0a6f8a5ff11274ba2e00b9487a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270937v1_alt LN:165607 M5:39b5207a79f67fb863be3b2a5bed0963 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000256v2_alt LN:4929269 M5:a80b1b3c21ac7e7b7acf75178ae3d83c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949752v1_alt LN:987100 M5:7d007a35ff02e56325881c68bb17b565 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270758v1_alt LN:76752 M5:9d0d4a56d72f18d39c7a1094deb177a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949753v2_alt LN:796479 M5:19162055ca3e800f14797b6cd37c1d4c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270938v1_alt LN:1066800 M5:9363b56f7b34fb35ab3400b1093f431a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrEBV LN:171823 M5:6743bd63b3ff2b5b8985d8933c53290a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707606v1_decoy LN:2200 M5:20c768ac79ca38077e5012ee0e5f8333 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707607v1_decoy LN:3033 M5:444cb839a910d9af9b5c5f013cb31063 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707608v1_decoy LN:3112 M5:bc263c9aacc51dabcb0ac4987c416a0a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707609v1_decoy LN:1642 M5:ec7a95a8f6e3d63152c0b1f46601e2ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707610v1_decoy LN:1393 M5:441a56ef62eccbc2ec6d0384fe40367e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707611v1_decoy LN:1103 M5:a5378db83cbffb5f31da4a549152cf80 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707612v1_decoy LN:1039 M5:4ac166fdb188d87a64b59e346fc040cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707613v1_decoy LN:1619 M5:af5b7705364129a1fdf718e223e8dfb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707614v1_decoy LN:3122 M5:67860fb1c59453dbaf2bc21834f76ff1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707615v1_decoy LN:1934 M5:e8773170190290d21bf5c7bac36c73ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707616v1_decoy LN:3111 M5:9792c2376ee383fa1d0763ff6b391fd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707617v1_decoy LN:2545 M5:7d9f68ca65f2e9029ef8c2d352b6068d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707618v1_decoy LN:2295 M5:dfec4823eafc51fe89a1c8a61a7861a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707619v1_decoy LN:1551 M5:f0f821c64e2f1339f4452cfabcd1a247 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707620v1_decoy LN:2046 M5:9e54f11658064725f046e3ffc7f5166e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707621v1_decoy LN:1222 M5:4053fd7005d4e430ff32b9b0c9dda52d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707622v1_decoy LN:1535 M5:393bc14f66f0af8c20fdd93b1a3dc78c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707623v1_decoy LN:3784 M5:5da25a3d7060acf52ce5d2084d8922cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707624v1_decoy LN:1329 M5:18daae4566bfb62823b548ab88fa894a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707625v1_decoy LN:1238 M5:8a05b8842f52e87406e28162b8fa7249 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707626v1_decoy LN:5623 M5:e6705349b3e2839fcd382596f831045d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707627v1_decoy LN:5821 M5:cafc12fed95e40d4c1b441ad93f0493a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707628v1_decoy LN:2960 M5:1e0a770fe11a74301ab4535bd9be16c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707629v1_decoy LN:1848 M5:5288216fe388c6966e89e6f8a3a5118e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707630v1_decoy LN:2315 M5:1cab33f8538d939c751e2b2d9b01957a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707631v1_decoy LN:1945 M5:099f236a02fe8e80d7f135727589bce1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707632v1_decoy LN:1424 M5:a2e305f020577c5f7806c411f995402c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707633v1_decoy LN:1274 M5:967deda0c966a0bcd27c6e047e18e7f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707634v1_decoy LN:1007 M5:093928d5a51ad63c286ec229982828ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707635v1_decoy LN:1414 M5:270f3e796a1b7c345e83762fa735bfe1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707636v1_decoy LN:1725 M5:f00ca03da369b2dcf101bda70773022b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707637v1_decoy LN:5354 M5:ecf9ac0af0f7009b8b4e5fa639e7fc97 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707638v1_decoy LN:2189 M5:5a928a8e7ad5ec7808ae7dbcc7ba72d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707639v1_decoy LN:1294 M5:692623b127f6621794d92bfc65f198f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707640v1_decoy LN:1831 M5:23d5c8473f768ca2c6a3eed843fc2cf2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707641v1_decoy LN:1647 M5:09778e8253cf377911db86530bec54a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707642v1_decoy LN:2943 M5:6759f7bb4098b6eb0ec14f5c63369661 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707643v1_decoy LN:2857 M5:a6d7044f6c244253ec1e142bbb35d859 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707644v1_decoy LN:1030 M5:e3e8c02e17ebf79c0e90ce41a16ccedb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707645v1_decoy LN:1070 M5:26882fb498a5b281266a48f82726a7c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707646v1_decoy LN:1735 M5:b120aeee1c12ed6986a9743badfcc505 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707647v1_decoy LN:1982 M5:d1d012b49d3cb20db627f6dd65326217 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707648v1_decoy LN:1564 M5:a4fae6ab9f74c3f1b2c0f8352e9a3519 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707649v1_decoy LN:1775 M5:4bcea8af13f18547fe066845bdc1c120 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707650v1_decoy LN:1540 M5:b4256e83f91ba0174562138c3b466a45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707651v1_decoy LN:2013 M5:f7d9c80ab1716aee1a2237dce70b768a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707652v1_decoy LN:1176 M5:4af9bb8c4125407fb9f03e5fc7798528 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707653v1_decoy LN:1890 M5:854efc081d295baa5a1efa0fe1f9bb3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707654v1_decoy LN:3644 M5:5c90649c1bc38e0b333381ac593252bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707655v1_decoy LN:2785 M5:407de1fa7cb87b88317888d98ea56599 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707656v1_decoy LN:1017 M5:f521affa49ef813fea48a8f5b1fa8e13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707657v1_decoy LN:1068 M5:478f244a134bc02c1c51f63009626864 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707658v1_decoy LN:1007 M5:f4ce5e4a861ab83037e05e271e74497b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707659v1_decoy LN:2605 M5:5c8b18731c2eeda273e0caaf2e878654 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707660v1_decoy LN:8410 M5:b581d341cdf7f17875e60e3da33c398b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707661v1_decoy LN:5534 M5:fd57c53936fe1011e42fc08ef3ff65c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707662v1_decoy LN:2173 M5:5ca2d18676a26044b213465e1e6ac206 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707663v1_decoy LN:1065 M5:07cb60b1a2ff813eed23c7cc4128baa7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707664v1_decoy LN:8683 M5:ac12df9c6d81003f812323327f937147 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707665v1_decoy LN:2670 M5:366d796fda2fe9f8baadd88deddf9dca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707666v1_decoy LN:2420 M5:b5c696c469b2e831e8a5e8e87c6813e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707667v1_decoy LN:2189 M5:1f055f8a1a1f8c356b45cfcbd6db6713 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707668v1_decoy LN:2093 M5:839cff5bd33068228bd1031bf8be9a64 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707669v1_decoy LN:1184 M5:ad69f6deb582834c638527c565c4de2e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707670v1_decoy LN:1205 M5:aa9070a191ece87a421285b5be2e8b68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707671v1_decoy LN:2786 M5:28c96decb9c1d76b9a76b1ee75e2421d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707672v1_decoy LN:2794 M5:4d547ee98d0678f832df5c46f91604aa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707673v1_decoy LN:19544 M5:2d2080522d0d729d94c7d73eda00c62a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707674v1_decoy LN:2848 M5:9182728e5875ee5cfba2c524c997fcbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707675v1_decoy LN:10556 M5:021a0164c68fd77f51bead9e2c4e9cea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707676v1_decoy LN:9066 M5:c8c71f6c1f2612fed812e69c737ca6ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707677v1_decoy LN:7267 M5:0e929202e653306730239e7dbea8a861 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707678v1_decoy LN:2462 M5:21e3c2e28a7980351470a14a0d48160c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707679v1_decoy LN:1774 M5:9f0f7ecdb5b097f83aab97fff76127d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707680v1_decoy LN:1297 M5:3eab486a1f41712d26b8c251ad9dbff1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707681v1_decoy LN:4379 M5:04aec18ad103fe46337c6643d0eaca0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707682v1_decoy LN:4208 M5:b413a0a980c7752db350c74c5f97937b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707683v1_decoy LN:4068 M5:80a8f28af2c872b62345c85f6217dea7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707684v1_decoy LN:2940 M5:774582f989e0cda16927addcf0ece955 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707685v1_decoy LN:3938 M5:cd0020e224ec3edc01ecdfd648f4099d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707686v1_decoy LN:2072 M5:879ef8f0e126b3f557a0170b71459c6e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707687v1_decoy LN:1136 M5:69aff37696b0d4542e56fcf9ad9af43c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707688v1_decoy LN:4248 M5:d301756f721c9141f1216e52fa4003da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707689v1_decoy LN:5823 M5:f29516cc0ba82ac48516c65b100b2255 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707690v1_decoy LN:3715 M5:a154584ab9547c044251e469591cfd94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707691v1_decoy LN:4885 M5:ab7f60b71af56c68e4a0f56174c90e4e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707692v1_decoy LN:4813 M5:e8f5365670fcf6e3612d2e77ba943aaf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707693v1_decoy LN:2899 M5:3cf4cd0669a4fc846ef0aa0aac7cb739 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707694v1_decoy LN:1228 M5:38a9e18c0e3208c8b593dc4fdf118a9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707695v1_decoy LN:3119 M5:ba7aa2faa9f2fad7ad94f0acd152e6f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707696v1_decoy LN:3828 M5:4b39179f8d3eefee8f4865bf6d11dd9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707697v1_decoy LN:1186 M5:0b3eecab59c656d96325f01e70a906c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707698v1_decoy LN:1908 M5:708018246fdce7d4b8f47502bfdbc3a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707699v1_decoy LN:2795 M5:001979586db1b719cca6d3dc0e50e71c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707700v1_decoy LN:3703 M5:5c692cc6be5262461fdbba8574e6ff40 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707701v1_decoy LN:6722 M5:378424a19c93bf19eb0f565cba923eb1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707702v1_decoy LN:6466 M5:1b5a6efaa31d7974dffe73fc4bb88349 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707703v1_decoy LN:2235 M5:c045d23c4c9497849b45c45423f705ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707704v1_decoy LN:2871 M5:b44844f0650f1953d042b7b0c9740cb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707705v1_decoy LN:4632 M5:6c1d769d4a84500b2eefafe1cf460164 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707706v1_decoy LN:4225 M5:d37d4a4d41be60f45aa967ecac1a0c5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707707v1_decoy LN:4339 M5:ffcd631ed0bf56e54cd72ed51c70fa3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707708v1_decoy LN:2305 M5:6ebdd668b564460303637164213d0dff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707709v1_decoy LN:3273 M5:3531b30c5833b2f37585aeabefeafe36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707710v1_decoy LN:5701 M5:943eba7b0fd71418d0ef4ab2bdcc3f14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707711v1_decoy LN:4154 M5:8e6daf77c80fc9e8710c6732e9d72918 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707712v1_decoy LN:1243 M5:65e4a30840d6420ebc8b7681d38ae431 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707713v1_decoy LN:1308 M5:d9aafcd2c4b12f82a113eb5418d120ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707714v1_decoy LN:2922 M5:4904d632dac614c608b8b7e3478dc3f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707715v1_decoy LN:3044 M5:15707c34a9803e1349a621fef2605913 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707716v1_decoy LN:2888 M5:68339f161a66b364c5e9ffed664272f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707717v1_decoy LN:1742 M5:1fd1325fe768dfe31d9199ee60b60206 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707718v1_decoy LN:4969 M5:454864584e92f6e195416ac9f9a8ee38 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707719v1_decoy LN:3270 M5:10feb2ed6ea7480290058dfc77385541 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707720v1_decoy LN:6028 M5:ab8f184e44faa3d93d59d9e3beba3acc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707721v1_decoy LN:1105 M5:97e3e0ba281c40270062097594c95b2c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707722v1_decoy LN:2884 M5:983f9666298bffa6bb3bc09593f83ab7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707723v1_decoy LN:1124 M5:d1d03191a7579c36409ca1686af957c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707724v1_decoy LN:1454 M5:648298f5e7a06c49b911d520d02036f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707725v1_decoy LN:2565 M5:507d9e32ff14b42ffc67abc3e66f8420 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707726v1_decoy LN:2149 M5:2cc36819133158e39f0ec48e7cadeb08 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707727v1_decoy LN:2630 M5:2ce79b6f499673a5546b3b608cc6d262 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707728v1_decoy LN:14625 M5:5c193cc3e52b61477ff6efd7d6bf1168 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707729v1_decoy LN:7431 M5:a6530e653f0ed096c60f6d44f83a5ac3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707730v1_decoy LN:5776 M5:8131fcdd109e0c725a9cd0f4dc240efa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707731v1_decoy LN:4820 M5:e86dbde0af3f5ba60b0ca212f4e51b75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707732v1_decoy LN:1227 M5:326c77e23881e6196b8441b3a96fc1d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707733v1_decoy LN:7503 M5:c633c411b0c6959cc08d71120f604c30 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707734v1_decoy LN:9652 M5:97472a33b38a6285aadc3ea8e200a0c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707735v1_decoy LN:1091 M5:8eb7237ab5103bf046f0b4fd8956e506 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707736v1_decoy LN:2467 M5:90141a455f60c4f02dc064d0200707c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707737v1_decoy LN:1270 M5:40c2e03cacd0e24267f2f495997de86f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707738v1_decoy LN:4365 M5:5a1da2ab0c8d8ec4e368ecdcb314a951 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707739v1_decoy LN:4284 M5:62bdd88183d94495bcb948a7c17e045c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707740v1_decoy LN:10282 M5:d20046e860cc9e220ba67181d6317b0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707741v1_decoy LN:5601 M5:8eedf1585943eb4a63b18a14c9d60e08 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707742v1_decoy LN:4758 M5:453aaa1ccce2e7bcd76462fc6fb82810 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707743v1_decoy LN:1624 M5:6b23b3de3fd00f6eae35fa84c9f0a1f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707744v1_decoy LN:4024 M5:a5fc63b6fa7d72420c481475f1a9b25b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707745v1_decoy LN:1276 M5:1aa689253b47a87a0497755453cc3064 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707746v1_decoy LN:5083 M5:4df51fadbde93b81c9ce73ae34ad299d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707747v1_decoy LN:2075 M5:b020b9e14b2329811d8020661a1b223b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707748v1_decoy LN:3553 M5:3aae97b73e2f50aa215741927751caf2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707749v1_decoy LN:7010 M5:5f573deb341bf1ebc60148d185f3863b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707750v1_decoy LN:4718 M5:c90f362bf73d35d5b7ecc0df55b8e7f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707751v1_decoy LN:3546 M5:0a4232c675b33b2779a9f54185a01bf8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707752v1_decoy LN:2873 M5:dffaf05b9fdcf311b6631694c9a7f721 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707753v1_decoy LN:2144 M5:f62da5d7fb084c6276e9144911369e38 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707754v1_decoy LN:2243 M5:c01ba9f403c104a17c7a56c2e246402b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707755v1_decoy LN:5343 M5:fc0967e1b54e87ee9e6649ee9e135bfd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707756v1_decoy LN:4877 M5:7cddadbee2311357be0a6cbc21b7c3ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707757v1_decoy LN:3034 M5:8bbd8d0206582bdd7ff0d98834c11701 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707758v1_decoy LN:2826 M5:d1fe878facfdb974e00aa366bf3f6574 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707759v1_decoy LN:1221 M5:f538752a6b30c7db1def6888006fdf82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707760v1_decoy LN:1169 M5:45388eebdbbcd5727ecb94a69d2b09dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707761v1_decoy LN:2319 M5:880e2410158ce2b1647e1b9d4e80632e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707762v1_decoy LN:3450 M5:1a94da832f9b0b1e2cf7e642869d2b68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707763v1_decoy LN:2674 M5:98597e188d3ba588151f6808ded88a91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707764v1_decoy LN:3912 M5:5b188ee33158e7afbe044f110d28e434 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707765v1_decoy LN:6020 M5:487d6332ace17c42a8f64aa9adf10de4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707766v1_decoy LN:2303 M5:05f988a4a7180849c6c81602c29279eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707767v1_decoy LN:2552 M5:4f8579ec6353f301ef8362afb14c9e1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707768v1_decoy LN:3656 M5:dd57001db92b45e0677136beb49e978d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707769v1_decoy LN:1591 M5:cae5200b9ceb32d63e9183210ec694c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707770v1_decoy LN:1209 M5:fde0c42984e1da0ba9aada4b168c4913 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707771v1_decoy LN:3176 M5:e48eeb05bf1913704ee94aad24e95e39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707772v1_decoy LN:8915 M5:e41a1182f28ef302e03876ec46b7ba76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707773v1_decoy LN:4902 M5:61cb73463b0096ce7f34215a0e9c7d2b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707774v1_decoy LN:3324 M5:d0d739ef87156a3f1b0083d560547169 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707775v1_decoy LN:5997 M5:b23670b667f938d11721f9239ce46676 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707776v1_decoy LN:2618 M5:51e373cda128d4d44cf38c8c0057966c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707777v1_decoy LN:10311 M5:c35ba91babc524c1b3270599ece90957 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707778v1_decoy LN:2440 M5:f3bed9c00d53e9777a38a27156dd1659 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707779v1_decoy LN:12444 M5:bf5be5d1c5a27ad4ae37d468d9bf5990 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707780v1_decoy LN:5691 M5:2813badf81db953a968eb7d49bc2882f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707781v1_decoy LN:2717 M5:0a1557b49527e901599bd44d72da8e1b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707782v1_decoy LN:5277 M5:4061182ba5da9755a2a25e68a304ac01 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707783v1_decoy LN:4373 M5:3eef41e80ceccdcb21b9dba8a2cbca5a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707784v1_decoy LN:3224 M5:ef2e57d4220e2cf9680eb6cb27022a8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707785v1_decoy LN:2631 M5:3ae2eacb39d96c2b69c8036fa48550e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707786v1_decoy LN:5385 M5:cba39df25869787d7270324f4c2e11be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707787v1_decoy LN:3678 M5:ee5041cbefd1339ffe625fe56a2ad8fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707788v1_decoy LN:1412 M5:cd5878fb701bca2a77f7f0479ada562a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707789v1_decoy LN:1443 M5:098268af4ad1b71ed7dbf4648ea026a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707790v1_decoy LN:1098 M5:437c3cf69fd5e7568ba6cd5302f1b0e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707791v1_decoy LN:3240 M5:b4243a9c38158ab50bf873d91a699467 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707792v1_decoy LN:1915 M5:44e6058f98843778f5708a68a650bd10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707793v1_decoy LN:4667 M5:1664dafd7db46e3d2e9257978a3c0282 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707794v1_decoy LN:7219 M5:69855847368a4c0722753f3097f73427 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707795v1_decoy LN:3277 M5:21882b529bd5fd85dd805de6c51c1d58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707796v1_decoy LN:3473 M5:386834c5cf2dacec8dc5f75898909eb2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707797v1_decoy LN:4243 M5:4d8a0b4dee134f88bc4604b841d38ec4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707798v1_decoy LN:17599 M5:6ab64c474c333b7a8e0aaf72d39306a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707799v1_decoy LN:5095 M5:f1c458ebccd70c843cec05e23921bbf6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707800v1_decoy LN:2237 M5:0feef89c01eacd296069717f5c7a7c71 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707801v1_decoy LN:2901 M5:27662470b962dfea212da33f14909142 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707802v1_decoy LN:2666 M5:1eb4be22c4e6d37a91facfb3025520b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707803v1_decoy LN:5336 M5:db6d33944d47e02a8df7cda94a1e996c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707804v1_decoy LN:4383 M5:bd1e2dc89c9dd82b43d3787afc9abe47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707805v1_decoy LN:5446 M5:4103eb12b8c3ebec9cd8fe2f49b6d1e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707806v1_decoy LN:6252 M5:9218b0dc97e8ccb069eba3e9d676a995 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707807v1_decoy LN:4616 M5:4d717a57114c8f1b9b4ffb96edcd6615 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707808v1_decoy LN:3021 M5:eaaf056266a70e2a7be4db848d68672d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707809v1_decoy LN:3667 M5:4c8c58d51417cec07e970c76f7b280d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707810v1_decoy LN:4563 M5:4bd16dfab458c175a83a781d1b602d8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707811v1_decoy LN:1120 M5:f63cbec018752a7584fd25ba859e6807 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707812v1_decoy LN:3845 M5:47464e332307f876b9138d74f8726752 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707813v1_decoy LN:2272 M5:c5516af17e36a2e09f21f2f4120377e6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707814v1_decoy LN:4764 M5:5d190274f9c28c4642fe1f75b5e3c9f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707815v1_decoy LN:5410 M5:c87029fcb5e0f94edf755e7b6b18f89e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707816v1_decoy LN:7150 M5:e2a7085047a795f4ee89232573d43df7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707817v1_decoy LN:1762 M5:2bf3e07e17fb50802f7da42c78322860 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707818v1_decoy LN:1207 M5:db2fca33bf9e3730c72e754f7e536e79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707819v1_decoy LN:1331 M5:b96ffe2a3a7a75977f2286d021069bc7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707820v1_decoy LN:8307 M5:89d9580408ce4fde62950344c2daa448 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707821v1_decoy LN:2276 M5:2a9fffb25e3ccf46680306388d4c2e6a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707822v1_decoy LN:2575 M5:8e5278c0a004efc105d35744a6aed334 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707823v1_decoy LN:3970 M5:ef86294088659e3b6c564f7a2c94abd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707824v1_decoy LN:1352 M5:af1ddf1aad7bb03a0c72d325e8e9a52c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707825v1_decoy LN:3040 M5:673e8681ea9b0fe7b4b74a011c7780e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707826v1_decoy LN:2070 M5:83ff186bce877c493f356e110486b13a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707827v1_decoy LN:2913 M5:156af338c90535ad8ddbebc3cc2b8e06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707828v1_decoy LN:2389 M5:dec17b4db1503252e0d25e88839aef19 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707829v1_decoy LN:1835 M5:495cf270e534859f024d452fa5714a83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707830v1_decoy LN:4807 M5:9d8e879d40a82477b244fe7baf4f1603 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707831v1_decoy LN:2201 M5:661353dc86a8b62e524ea43ee3f39c6e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707832v1_decoy LN:1265 M5:e33ce5ec06d99813aca09515f057e64e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707833v1_decoy LN:1961 M5:93e5f197aa47e632cdc4f4f9a06504c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707834v1_decoy LN:1064 M5:28a2c878efec380df24a5544738eda91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707835v1_decoy LN:1932 M5:bf3bff12edc1fb4331c341b1b2044e32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707836v1_decoy LN:3213 M5:d47bed4a51e112b3d415b77d354290ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707837v1_decoy LN:1178 M5:2a4f6a9f9df49215bb56bfbe5d6e1990 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707838v1_decoy LN:2926 M5:5f28eba962c1026228afdff4fad6ade4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707839v1_decoy LN:1038 M5:b42a95db827e89510d3dcdeac5fba1c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707840v1_decoy LN:3298 M5:54dc58ad6f4d92475e298f41206a1118 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707841v1_decoy LN:8992 M5:176684391390b0afaccaac0eecdb9560 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707842v1_decoy LN:6698 M5:b309273a9a78c30bcd5a5573742fd06e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707843v1_decoy LN:4880 M5:3ad4a232fe303ab7c09600c91b6c406b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707844v1_decoy LN:1766 M5:85cb4f0b6ab4d7dcec41ef37ca81ead2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707845v1_decoy LN:3532 M5:fa5f7bc4de1539f23d5610c26d69ed49 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707846v1_decoy LN:2297 M5:2bda3374523a39aa9c8766059468392e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707847v1_decoy LN:1234 M5:23e58f01c32ab1539dc5738c36b70940 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707848v1_decoy LN:1205 M5:c9b75dbdb9a2d4ee4648ed7fb537fb0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707849v1_decoy LN:2790 M5:20b3eef55d3dad7a5dbcd68268dad36c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707850v1_decoy LN:2006 M5:67d720cd69f97ad773cdcb3ccde8d47e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707851v1_decoy LN:4593 M5:7c836d280ec9794d222476d02e21b416 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707852v1_decoy LN:1579 M5:ab4542b394c8e1133f8eba10d896cb44 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707853v1_decoy LN:9597 M5:9d6b74ff3ae40b1134f4b1f1eabe16ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707854v1_decoy LN:10451 M5:ec7353db2ae0657678d29512a5b78b59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707855v1_decoy LN:3219 M5:b522f004eb3c1bdf17fe74e82e23ff88 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707856v1_decoy LN:2300 M5:7a18b1dc033c5a406a5f752e8a7d5a6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707857v1_decoy LN:5985 M5:28c60286011df7faa5b7167d8dc7a5f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707858v1_decoy LN:2959 M5:682104fe067bc0a5e18763b5d0eae010 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707859v1_decoy LN:1340 M5:3b47b99a35fcc0a437518350a37c97c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707860v1_decoy LN:3148 M5:cc961e4253553c5534e478b629b89930 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707861v1_decoy LN:2242 M5:beedf4d2ae00fca7cc2cd7e9d4ce6012 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707862v1_decoy LN:16513 M5:968c6df8aaaaa1015e74f591e4722ed5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707863v1_decoy LN:7821 M5:9c8e1c87e1b58622c67edbf732b7ce9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707864v1_decoy LN:2159 M5:37c9ce7cb170bed17a0deb982f64fefc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707865v1_decoy LN:2114 M5:8b637137aa5f04b43be61da029e5f818 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707866v1_decoy LN:4109 M5:1d5a765b813cd25ff873c52ca2b47f05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707867v1_decoy LN:1544 M5:c2744b7344993ebcf11d21cb098cace1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707868v1_decoy LN:1005 M5:241518a7a0343d82a0d99b1dc00e5d79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707869v1_decoy LN:8632 M5:010737c4caab4d5e629753ad40bee3bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707870v1_decoy LN:1012 M5:88b3e83459db1925338cff6156325503 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707871v1_decoy LN:4728 M5:dcab24555bd79f11062bd6e856a1db4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707872v1_decoy LN:2165 M5:aff31850364e11f37ba76baa5b7164d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707873v1_decoy LN:7591 M5:b034989a9fb62216a2547cd1206f4185 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707874v1_decoy LN:5202 M5:1e514f0c86c918e80fa4b29c206cb8cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707875v1_decoy LN:4241 M5:da66844cc4d4846716264b16f77233a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707876v1_decoy LN:4131 M5:60562638c91c3b3655e2ab9544600425 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707877v1_decoy LN:2272 M5:d672677153fa65839a94ae64d9284d49 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707878v1_decoy LN:2085 M5:d1bc85197aa7215a4b0248a74c19b399 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707879v1_decoy LN:4346 M5:1999b7a1b498a212e212e60377adb20d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707880v1_decoy LN:1208 M5:ea9da47963d703e465aaff5693250f76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707881v1_decoy LN:4543 M5:e84492cd2aa22936e00b280fcaca8212 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707882v1_decoy LN:2772 M5:bed5000e1788ade3ad5a8541cf1c1671 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707883v1_decoy LN:2490 M5:3d040ea1d7a17b15bf44f59b8e66c98c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707884v1_decoy LN:4568 M5:bd5a8cfffb4d5bab0900b4fa1fbf9390 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707885v1_decoy LN:1776 M5:f0f2b210ad8e779eec5a4ba478c83ef7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707886v1_decoy LN:2699 M5:91fad31e963c9f7821cf37705e55f40e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707887v1_decoy LN:3534 M5:f6d25106c5942148df4207ebc4a60371 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707888v1_decoy LN:2424 M5:4857413cb43abc01f2f0c2d56e196332 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707889v1_decoy LN:1747 M5:e1946468f8d77d4ac72dd72fe8ce04f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707890v1_decoy LN:1088 M5:698423687f8bc007b40065a2658b7360 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707891v1_decoy LN:1143 M5:3dbbd76127230ad72adb348524c250da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707892v1_decoy LN:2530 M5:8909228bbdb37a62a906447c5b24616a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707893v1_decoy LN:8049 M5:a4e81d020fe37025f26c26aa8241f26d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707894v1_decoy LN:1366 M5:69423d07e5d284b7ad365c144aec6f4e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707895v1_decoy LN:4284 M5:da455b511b9da89b4527ee045c5fe231 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707896v1_decoy LN:33125 M5:10522217e43c9d9228b02fc14c418df3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707897v1_decoy LN:2137 M5:962521d05f6b98894c65d3669ba66008 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707898v1_decoy LN:3840 M5:561d50151a7132f385be0617165bcecb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707899v1_decoy LN:3087 M5:46cc4f61d95475ad4c963e9bfeb206fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707900v1_decoy LN:2041 M5:cea01cf71468a810b970138149139764 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707901v1_decoy LN:3344 M5:ef03bb9d9f28ee51bfc7291ee41812e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707902v1_decoy LN:2921 M5:dcc9f313bc6e72cc000ac62e62e975f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707903v1_decoy LN:6581 M5:6346aa1b0e3055e121b9cdccb04a53fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707904v1_decoy LN:3968 M5:ed15d6545609df15a0758922f36c9f87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707905v1_decoy LN:2339 M5:af66f6d8d03e1c43cef4284aef73ed96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707906v1_decoy LN:1243 M5:bec4227b2724132e7ac912e4532bcf8d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707907v1_decoy LN:7776 M5:a9e8cc852787e0a7dea34bd16fd28b35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707908v1_decoy LN:19837 M5:63f4cfca34f0fcd66c826ccc8c6d6cbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707909v1_decoy LN:1737 M5:0eb45f3727a363ec209755519593220a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707910v1_decoy LN:1098 M5:bda7161c475d6f7bae40ce030d70fe87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707911v1_decoy LN:1893 M5:80bef2e1b21000a202a974145a551fe4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707912v1_decoy LN:1281 M5:96d1e0d5628111d9566a6da789c6204b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707913v1_decoy LN:1527 M5:ad42dca85dd0540c9229a86997665245 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707914v1_decoy LN:2055 M5:c7f0324e70cef84566fa5453dcb23f5d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707915v1_decoy LN:2527 M5:f7d3cdbc2f96d05bc8ff741d46f2f687 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707916v1_decoy LN:3275 M5:d9702219a1b8982c63cc1d6238368ab2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707917v1_decoy LN:1265 M5:6df0a4af8c86a2528464f45af7cbaccf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707918v1_decoy LN:2623 M5:5c6afdd9afcdaae5399f684978746b65 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707919v1_decoy LN:4850 M5:aed47145c2269b8c33a71652002e351f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707920v1_decoy LN:3584 M5:47dcd6ad41f139cfd6b9a02581cad11c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707921v1_decoy LN:2561 M5:33902e088970543e1715ee99abdcf7b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707922v1_decoy LN:3041 M5:313f5e86963d937b91534f4895c3a590 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707923v1_decoy LN:1409 M5:6af5cfeb86bc84ecdcfb91e994b4bdbb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707924v1_decoy LN:4596 M5:3415bc1f3a762bb7077c328b9e9e723c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707925v1_decoy LN:11555 M5:10cf29455a308a0380471d6bce16f4a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707926v1_decoy LN:1266 M5:ed2740c08c55e9dbdd3cf9db469d0df6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707927v1_decoy LN:1079 M5:7d006b7ffa2791321663578e50f456f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707928v1_decoy LN:1087 M5:e6a75cbd458016b1643e76ecc570d33a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707929v1_decoy LN:1226 M5:21256ce4fdadc803045a9b8f60dfe16b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707930v1_decoy LN:1131 M5:2f7c4c54c98b465c14120d32e5d60362 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707931v1_decoy LN:1199 M5:68471da27aefc5565f37a51052c09c8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707932v1_decoy LN:1084 M5:ff5f2aa407bb1f0573a4d815fb69f917 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707933v1_decoy LN:2038 M5:1b9a682cbf0c31fe8f29a4aa0bbef274 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707934v1_decoy LN:1070 M5:f8c939429a099c8eaead4319b5ecd2b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707935v1_decoy LN:1312 M5:00ead3e9dd86f6d5e7d499e285b509b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707936v1_decoy LN:4031 M5:9175dddf96d1e576065b2465c6e2b567 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707937v1_decoy LN:7445 M5:f83991a23f7bca6045f72a0bf34ecf13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707938v1_decoy LN:1770 M5:d7487b3fc5cbe693cdcd5ef883b5f00d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707939v1_decoy LN:5600 M5:5fc39cbf76db7d0c1d56123a313a22c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707940v1_decoy LN:1882 M5:f239e0af7db0be33b82e8e4dc2405165 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707941v1_decoy LN:1170 M5:e7c47b0be4905c7dcf70b8659a334abb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707942v1_decoy LN:1300 M5:1beccd3ea3988863bad1b7614a1db1e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707943v1_decoy LN:5325 M5:54c4ba54e1ad9eebc7832dfb6cf778fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707944v1_decoy LN:2043 M5:669c152c4b3e10d1f61d5afb2cf22bcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707945v1_decoy LN:1072 M5:d9416b21be3f6603426526a22e7e558e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707946v1_decoy LN:2463 M5:ce498b9d34e1447317c0d5d27aa0f911 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707947v1_decoy LN:1010 M5:4183a38dcef3c56b79dcf7eae090e37f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707948v1_decoy LN:1432 M5:c261bf235424d74a7b1d8624bb8d6ec2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707949v1_decoy LN:1162 M5:26aeb5ffbd148e35fa48fee69317843f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707950v1_decoy LN:1095 M5:2c795c49d9b77f2b5c0ef5c97e76ae46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707951v1_decoy LN:1118 M5:a0c0ea97493f7c511c5b0af1e8913e92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707952v1_decoy LN:1383 M5:fcc78a7bf9b47bb52730911e285ad0f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707953v1_decoy LN:2289 M5:ba3eede08e65f36da588370a142cc02a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707954v1_decoy LN:1648 M5:de71b9c9ca48f28bc0c9d13c5139ce68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707955v1_decoy LN:2203 M5:4c9964a811b62ea018169d81ba474499 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707956v1_decoy LN:3270 M5:316a59db52a456d6aa5e140e1b1c8794 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707957v1_decoy LN:11499 M5:cd3bb1a0e33bc1aafb51df407fcf16df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707958v1_decoy LN:2474 M5:5909618b2a56c4db15b017bfff248a13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707959v1_decoy LN:2294 M5:bfd4a30a41e5e647cba935da2e8a63de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707960v1_decoy LN:1238 M5:8025797164ec304ff940e4ad94643c70 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707961v1_decoy LN:3410 M5:02a40e206c78446d368b6001622aa540 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707962v1_decoy LN:1523 M5:7f11ba71c0814d0ca2b3839d55de672d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707963v1_decoy LN:62955 M5:d620b771cabe5b2cc4b943ffa6d69a68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707964v1_decoy LN:6282 M5:fc00ea543316aed78deefeac0eaf8727 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707965v1_decoy LN:3836 M5:97e94c098f92403b805a0a60f9475542 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707966v1_decoy LN:6486 M5:a977897a46254d42ed9a60e6ed5d9d20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707967v1_decoy LN:15368 M5:220b351d87053eb9b844bc6e6e5182a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707968v1_decoy LN:9572 M5:060b9bb36bc05042b371bfbfc6618e3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707969v1_decoy LN:6413 M5:b25e652840d89c9eef74c04703958f9f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707970v1_decoy LN:4104 M5:d103bed226a1a7b95d98a8d61e39f70d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707971v1_decoy LN:12943 M5:8a88d2df497490f21c8c2b796544f699 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707972v1_decoy LN:4650 M5:93e792bf92036380920f5d06321cafe3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707973v1_decoy LN:3080 M5:127f70f3cf2cf09e8c7a399c471acf75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707974v1_decoy LN:3134 M5:a0447f79285905c6b9f2202fdb83f838 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707975v1_decoy LN:6211 M5:931aa6a0b0412241d93c942acba0c103 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707976v1_decoy LN:1126 M5:c068c96f088fa2ef7cfe6a805c22121a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707977v1_decoy LN:1101 M5:e86b95e84b7662e5e6e509be83db4b41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707978v1_decoy LN:1101 M5:d46f001c034076f4a3687b647a980623 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707979v1_decoy LN:2648 M5:fe4d1437f61ce0406d36a071f4e7293a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707980v1_decoy LN:2973 M5:9c4cb203ab1d6a54a7ed36d116c60853 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707981v1_decoy LN:2520 M5:3ccf197ae78ce07e23eef5e3c31fb576 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707982v1_decoy LN:2318 M5:6e5cf7df1252379ee351fb2386bcc144 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707983v1_decoy LN:2606 M5:64cc9674054ed4f7cdf0701da89de296 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707984v1_decoy LN:2205 M5:e5814756cacf0c02827237dcd24155a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707985v1_decoy LN:2929 M5:6a2895e9dda391590b1db42aea33e330 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707986v1_decoy LN:3869 M5:9640cfef88fffced10f0edaf20dbda2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707987v1_decoy LN:1117 M5:60f8230f4e335416aa92256695cbcf46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707988v1_decoy LN:2960 M5:b0447a959fdacb8b553c3684184cf036 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707989v1_decoy LN:1009 M5:75d4d43433fa532ce2da4a724ee25c42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707990v1_decoy LN:4048 M5:f0720d93745203f7d155f219ab83b618 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707991v1_decoy LN:2193 M5:fede10b713c7d561d4872feb26040c3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707992v1_decoy LN:1830 M5:1bac13a3ad2592a344e18bf8de117574 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000001v1_decoy LN:25139 M5:9b27ee6060931ae7d17e451b7739e547 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000002v1_decoy LN:18532 M5:9955447b0a6444031f1d68c821fcea22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000003v1_decoy LN:15240 M5:b635cbc1fc3962e93bc1427bc678396e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000004v1_decoy LN:13739 M5:7fa6d2a124f7c9bfeb030b859269f78f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000005v1_decoy LN:11297 M5:44c68451b1d90987e31184e887a24455 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000006v1_decoy LN:10074 M5:ddeeb2059f6f27dee5330cb501a11446 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000007v1_decoy LN:9891 M5:30b47b3ef6b82a46ccfec6573b0c6c10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000008v1_decoy LN:9774 M5:f0bed43412c69b6db572994c9d5d9cd4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000009v1_decoy LN:9727 M5:0cab8d3c0896fb15383dc8aaef1a1f9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000010v1_decoy LN:9358 M5:aba5595273a0e4398df3a8323523d10c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000011v1_decoy LN:8920 M5:fc623f57c6ad9441d3750c0f51722a0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000012v1_decoy LN:8479 M5:6dca96b0605fddf041e27a9f4beed770 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000013v1_decoy LN:8312 M5:f34a4b1860ec9fbd1acc736a3a174193 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000014v1_decoy LN:8261 M5:6deaa38e9033c12ed1ad7f62191a3e04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000015v1_decoy LN:8131 M5:c3df1d07395395fb96b81e27ef3dcf61 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000016v1_decoy LN:8051 M5:f732550392ca9c30b42b4c6acd5d9263 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000017v1_decoy LN:7832 M5:03557dc0d8d0509da30549dc16031c51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000018v1_decoy LN:7710 M5:942aca2604695877a0a642916aafd2b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000019v1_decoy LN:7702 M5:c6c2453adbb040df0ea58395995ebae1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000020v1_decoy LN:7479 M5:5b348e642370fdd96c7f2a306318869e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000021v1_decoy LN:7368 M5:0693c472fdc0225c133374a15973bec3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000022v1_decoy LN:7162 M5:6629bbc8b7d3fa10074025773e597c29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000023v1_decoy LN:7065 M5:6b413d9f61a68a7ce1ea620aebb3be6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000024v1_decoy LN:7019 M5:14f555be268a0666a71794d0515cd6d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000025v1_decoy LN:6997 M5:470d24c11b0ea5dbd4329912231aba50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000026v1_decoy LN:6994 M5:1a45d626e4f7add376267b1e77bcc942 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000027v1_decoy LN:6979 M5:6890d5c807ceff3e680405d80c19b990 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000028v1_decoy LN:6797 M5:6cde21bfadb3f954f76aba8775f5b89f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000029v1_decoy LN:6525 M5:091fdeaa7841b60f964f1a9cedc12bd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000030v1_decoy LN:6246 M5:7c23df0bfe1cc7d18d52be126f396cca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000031v1_decoy LN:5926 M5:5555324457dbc04a20ac656a15cce856 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000032v1_decoy LN:5914 M5:67d2d8955ebee73fe7f8f3764e4158f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000033v1_decoy LN:5898 M5:de8113c2b1586e776f28207cd56cec1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000034v1_decoy LN:5879 M5:1c6aa8f142642d8cf57f4f7029a20061 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000035v1_decoy LN:5834 M5:29c393ec5d6804ee5dc06b435ffc02f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000036v1_decoy LN:5743 M5:2f131c59606d7cb8cf6c6c495ce84aa4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000037v1_decoy LN:5577 M5:20bd1281fc32355adf567b4e0ff160a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000038v1_decoy LN:5413 M5:3d2ed60178406278eb02030b7c0cc328 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000039v1_decoy LN:5250 M5:62ebce054cc44d5c32625c44fa1e5ff5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000040v1_decoy LN:5246 M5:7cf464d2ec26fa4cea2bfd25f995969c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000041v1_decoy LN:5118 M5:ad3a1c8041863a52b7fa6d6d56ce0d3b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000042v1_decoy LN:5058 M5:bce45aec79ec4861d8442ec3d738761b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000043v1_decoy LN:4959 M5:f653839b5c54df56a1a2fdd7ceb42db8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000044v1_decoy LN:4853 M5:3505d16e35e056be0892167f5a564661 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000045v1_decoy LN:4828 M5:d43e63bb33a6cb65d5cdd1ca31e94c19 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000046v1_decoy LN:4819 M5:db9c73fa0d581cecaf0175aab4a0fc7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000047v1_decoy LN:4809 M5:1b157b5c5c208470638b188e23b55a59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000048v1_decoy LN:4710 M5:ad9552980f4f1bf74b72740d14d2f5ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000049v1_decoy LN:4680 M5:5bb4ddca04b26e3afd0bf218f2947a7e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000050v1_decoy LN:4645 M5:6a821c450a9bcf89dfccaa62d46212cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000051v1_decoy LN:4514 M5:bab340cdaa58e6d32ad1138612c84e07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000052v1_decoy LN:4439 M5:3cd292c1df3855202250324272a95b5b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000053v1_decoy LN:4416 M5:73c9659871560313e754f9363053d56c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000054v1_decoy LN:4409 M5:8ab5d2ce8c35201fa585fdf6f4ae670c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000055v1_decoy LN:4392 M5:e2b0cc1cca4b7ed60f85199816696690 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000056v1_decoy LN:4359 M5:ad16965c23d8e07c823a47e9b098f162 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000057v1_decoy LN:4319 M5:3bfb10064835da4e9caf7e8deb1857f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000058v1_decoy LN:4290 M5:947253137780def5c1c0db12039bdeca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000059v1_decoy LN:4242 M5:2a6de19fbea3d44dbf76c71f1778b47e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000060v1_decoy LN:4228 M5:8b1e73bd29fd4c77bb54fb586721b1a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000061v1_decoy LN:4222 M5:8576a97cd4f61cd6455b423f14eaed92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000062v1_decoy LN:4216 M5:d885db4b883ae34dd53ed184783c2144 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000063v1_decoy LN:4210 M5:1bfa5c8aecb62137e83c3274991deceb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000064v1_decoy LN:4206 M5:48398977c32247e425a6a85f97026636 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000065v1_decoy LN:4102 M5:f7d638a8f28d1c9842128b1225325947 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000066v1_decoy LN:4101 M5:78254b10a1884b61ecbfc72be3ad38d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000067v1_decoy LN:4083 M5:19683f0eb0d378e403a918d10931eb76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000068v1_decoy LN:3967 M5:2519be1b425e386f50cf02ec88f8f903 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000069v1_decoy LN:3955 M5:7c186eab354093fe3b26a9e757407fca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000070v1_decoy LN:3945 M5:4cf91327091051082a0ff114dd170f21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000071v1_decoy LN:3930 M5:d97123bfd4ea271ec354c170d89d80d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000072v1_decoy LN:3929 M5:147eecc4607f1ae7fd1dff1c0f98ca25 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000073v1_decoy LN:3924 M5:84bdf303142b233c179ecef62ab58b07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000074v1_decoy LN:3919 M5:648c37f3fa6e7d658440858761213e7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000075v1_decoy LN:3908 M5:36f5d13bc1a3b72a21c0a4b68148d469 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000076v1_decoy LN:3892 M5:052f146ade5330135e5381db9c779f75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000077v1_decoy LN:3890 M5:22c368b726169405e1f364115fc2356a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000078v1_decoy LN:3859 M5:85a6fde3123e4ae2ef854e83b790e55d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000079v1_decoy LN:3846 M5:21dfcbee386bf64a6e7639d212fe4ba0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000080v1_decoy LN:3835 M5:7f8ace0d7314cec254a8ff5addedb0f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000081v1_decoy LN:3830 M5:d40bb66c2d194acad4d612db8d34e1b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000082v1_decoy LN:3828 M5:c6c7826a848a366317f63f5db5dabe87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000083v1_decoy LN:3825 M5:632e853a99e258e0ae002c0c03aa7caa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000084v1_decoy LN:3821 M5:67720b3ea8a4c3be301aa0519627e306 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000085v1_decoy LN:3809 M5:8ee2faad62aedf582f3c33635df47f84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000086v1_decoy LN:3801 M5:dbd8292192827196a4c3d545bfb9b67c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000087v1_decoy LN:3799 M5:15066eea555ea13dca8b28620db8ae45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000088v1_decoy LN:3737 M5:83437130e836bac50aba2aa79fa9d80c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000089v1_decoy LN:3701 M5:16d790e451ef2c33018834904a04c177 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000090v1_decoy LN:3698 M5:4045cd2ec9d306542cc3804aab489587 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000091v1_decoy LN:3692 M5:3a1e6d05d94debffbe6070b59627d610 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000092v1_decoy LN:3686 M5:f2bcad40026ed9d729d9c31034159300 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000093v1_decoy LN:3677 M5:50536f98dd2e44e8a77c5f9d289ad87c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000094v1_decoy LN:3664 M5:65fd750160fcf7b7944c8e015e46a443 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000095v1_decoy LN:3613 M5:3257e4358f19507804bfac363c932664 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000096v1_decoy LN:3611 M5:d10add8e30105013e264b6feede833e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000097v1_decoy LN:3606 M5:c78427ed0c2856bbf8131bd73e54c3f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000098v1_decoy LN:3584 M5:81a78209d26627e698602af1848e2b03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000099v1_decoy LN:3581 M5:90e3913247adb7b30059e051bbcefe4c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000100v1_decoy LN:3543 M5:3dd50a694f9e6011fc694fab191cb759 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000101v1_decoy LN:3528 M5:0eefcbd5209d0d32ccf640f76a69f676 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000102v1_decoy LN:3527 M5:0bc37681f399eec3b3b7dcbf22498b37 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000103v1_decoy LN:3496 M5:c04b909a1562f77654eceacd0b8a935f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000104v1_decoy LN:3493 M5:fb84ec004fe99371b9b2d74bfb8570ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000105v1_decoy LN:3484 M5:e07ccdf102c986c26b2bda46045943b2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000106v1_decoy LN:3435 M5:4be97b9bc8d65dffe17f17ef9f801240 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000107v1_decoy LN:3391 M5:0878850e674ca72172a37319b9321acb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000108v1_decoy LN:3374 M5:5b7dd688c7eafb7b418766bdab494a84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000109v1_decoy LN:3371 M5:fb407b611c6eab3bb1609123cbeb47c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000110v1_decoy LN:3361 M5:4851563bcd9e0f7af3768f20f33bb22a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000111v1_decoy LN:3351 M5:24701a0d266ed39e5bfd3757bbfa218e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000112v1_decoy LN:3340 M5:d10fcebc376b84a0e301d97eff284137 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000113v1_decoy LN:3320 M5:05f2acb99e398b98f272d297727f28d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000114v1_decoy LN:3282 M5:d20adc7c458920890e8c1c56717c60b3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000115v1_decoy LN:3278 M5:9baab7452d6c49d97acd68acc83ab547 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000116v1_decoy LN:3260 M5:b2b6112ec6f9d22a7842f78e37d6a3b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000117v1_decoy LN:3258 M5:edb413acc1f07788b1a55b647c56997c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000118v1_decoy LN:3253 M5:1143d3e269aa80abfae249b7c653814c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000119v1_decoy LN:3247 M5:8d905fa140b8fded3a9560d24a32cfe9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000120v1_decoy LN:3230 M5:8c96125639143835c0e5b29884855e8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000121v1_decoy LN:3224 M5:6314311a75a1832245fb87dd86655de8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000122v1_decoy LN:3216 M5:80770770768ebb238cb4572d674e1579 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000123v1_decoy LN:3212 M5:63a4964026424edcd64a0e174de5c51a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000124v1_decoy LN:3194 M5:c68922465f39c47a5ebcf4767811e41e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000125v1_decoy LN:3189 M5:9e4ae67a2bea0ce8335cfb82e125cc2c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000126v1_decoy LN:3177 M5:94806d6a47b3781ed8e5004a2c577255 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000127v1_decoy LN:3176 M5:419d834659cd952516de6d9dcae8c3b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000128v1_decoy LN:3173 M5:050df236c1fa3a63c31f33b73308c168 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000129v1_decoy LN:3170 M5:61f6339992ffab5d3091b4a3b3baead8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000130v1_decoy LN:3166 M5:1fc75a1345ce98d6f25ba4d916b5d7f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000131v1_decoy LN:3163 M5:c262387ff17ca2ee56fb368575275676 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000132v1_decoy LN:3143 M5:790557e383cdc852732e3da2c6b6c615 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000133v1_decoy LN:3137 M5:ea2bf77f700236081cf8eb7aa0d9a909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000134v1_decoy LN:3116 M5:a8ae3ccc9f17c0f0edcacc5079219d51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000135v1_decoy LN:3106 M5:89002d8689e45952391a7984d69df23d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000136v1_decoy LN:3093 M5:2dc162e245d6ff81936bc650004ec8cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000137v1_decoy LN:3079 M5:38068261005ed014603a09dac9438db7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000138v1_decoy LN:3053 M5:bb3a8eab3c8ea2aa961e65ec5e1d91da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000139v1_decoy LN:3051 M5:87d0e9b49ecda7ba160f80012ca40de3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000140v1_decoy LN:3015 M5:303ba1d7f1155342056b491810358e6b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000141v1_decoy LN:3012 M5:c7a07f27a9874d99e33c27c2a2280cd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000142v1_decoy LN:3009 M5:d88319790f0a837a02a625cfdb6c1971 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000143v1_decoy LN:2997 M5:2b912adb843e4f2d90726c884ca7ab4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000144v1_decoy LN:2997 M5:f6bf68bca6151666f29be31cb16f1c0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000145v1_decoy LN:2983 M5:3473d9484854e710526e0c7ccc80b5bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000146v1_decoy LN:2979 M5:90d61da24b116c2bacb63747666a326b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000147v1_decoy LN:2967 M5:c84a0386ea78dc84323f55723fc42ef1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000148v1_decoy LN:2967 M5:a2b48635d63117baec9f7dbeae644928 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000149v1_decoy LN:2966 M5:0b15201439291bf53043abb6dcdab743 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000150v1_decoy LN:2954 M5:f36be073b0668fe6c56206c0a9bcf742 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000151v1_decoy LN:2952 M5:0aa12dea5cdf7b9dea2d56a71e233dab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000152v1_decoy LN:2934 M5:70eafae03cdb824f956cc77cc9b342ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000153v1_decoy LN:2918 M5:d7711561e6c2a87e3771c3ce9e28ffaa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000154v1_decoy LN:2895 M5:b40089d10ae6fb3b2a90a260a6469229 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000155v1_decoy LN:2887 M5:9be2679cff5e171c42de84446d6fedfa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000156v1_decoy LN:2879 M5:100d6fd294d6998c7928887ba353f441 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000157v1_decoy LN:2878 M5:e081c58ad4b64da9af95ca27932e7ebb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000158v1_decoy LN:2872 M5:0469343a7677dac01c66bf219aa0611d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000159v1_decoy LN:2868 M5:fbc27037c78cd3b3982d7f792147d4ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000160v1_decoy LN:2866 M5:33497edef237132c3e3efe7304d5a685 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000161v1_decoy LN:2865 M5:65371a3805dd2779f5807f1849df8a2f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000162v1_decoy LN:2864 M5:7e9448d377e58534ce56c68cd97278d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000163v1_decoy LN:2859 M5:93dbbd6f23a68673abfe169d241204a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000164v1_decoy LN:2854 M5:c468c0f380889b274a988802cc95f8ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000165v1_decoy LN:2830 M5:bb1fb10e20767215b036dbad18b92018 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000166v1_decoy LN:2828 M5:9f9279b092a64e7648f91091e5112414 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000167v1_decoy LN:2824 M5:774c1242a9fec9c39b231e3a4244c48f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000168v1_decoy LN:2819 M5:5e794be8f02e6190282545c4a587a131 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000169v1_decoy LN:2813 M5:f7e3bb8a09ce56ebcb9638b710cd2ce3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000170v1_decoy LN:2809 M5:8fb1846cc5b62db20428a2bf2bfaded5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000171v1_decoy LN:2802 M5:9bd40f006580d92c066ff544ddc22d8d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000172v1_decoy LN:2791 M5:5f91fa423cf6ea436c30cddd27d2f7b2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000173v1_decoy LN:2783 M5:698dd6fdb96a0f8653015f1bf3406d29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000174v1_decoy LN:2778 M5:3aae745709a336cef318bd095be7bf93 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000175v1_decoy LN:2777 M5:14ba8c26038f60c5a103e430e7fba5e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000176v1_decoy LN:2770 M5:467d903833c580a48fa311a7a15c61c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000177v1_decoy LN:2769 M5:beb768213f5d753b7f6a857687fb1c9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000178v1_decoy LN:2767 M5:2d998199f83204c294ff1e618648e88a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000179v1_decoy LN:2763 M5:9244414120396c3b53b847abfd80bc74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000180v1_decoy LN:2745 M5:8657cb328a0d649107216245ce042ff3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000181v1_decoy LN:2742 M5:9a35552497474ad6e9b35b843c759b60 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000182v1_decoy LN:2736 M5:4fdea3271d6795c56d47fc6d54f11972 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000183v1_decoy LN:2729 M5:5da3445ac176ed7cca1131267e6dfb95 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000184v1_decoy LN:2726 M5:9cc9d79dd54416be6fc2b500d4ca8223 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000185v1_decoy LN:2719 M5:8d898d7f057764e7d11b7121f8cfb366 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000186v1_decoy LN:2715 M5:0bd839a4a62fe7568bf02c2bdf660047 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000187v1_decoy LN:2708 M5:0bcff7297c716264bc76813a0516ad12 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000188v1_decoy LN:2704 M5:0ceefe5f0373922aa642a3180f917c9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000189v1_decoy LN:2692 M5:a1ed1d3ee4d5cc17aae0d9d0fa0775b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000190v1_decoy LN:2691 M5:43df7d9d35f2d15ff844b2f4564338dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000191v1_decoy LN:2690 M5:b7809dc0c98369b8235b36dfbd7e2ae3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000192v1_decoy LN:2687 M5:a61002b74d916bbe06d09eb62cdb9144 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000193v1_decoy LN:2677 M5:02cb7169934dce464116e8644638b22d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000194v1_decoy LN:2668 M5:0e691a59ae468d427df06bdb2e34e315 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000195v1_decoy LN:2668 M5:4e1222dfcb9ce80e3a7544e3af791e70 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000196v1_decoy LN:2663 M5:5e4092300f7a24534a4fc2afe6c68b5f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000197v1_decoy LN:2655 M5:8bf68a2085f6903253894b5ac2be0d10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000198v1_decoy LN:2644 M5:035eac523101444b286c852a129bb0f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000199v1_decoy LN:2642 M5:518ada0e1f2b63c0a99a0154b584120d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000200v1_decoy LN:2632 M5:40870ec46cc59053e01def95871a68eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000201v1_decoy LN:2632 M5:af03b437e04ad5f5cc86e2a67adee8ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000202v1_decoy LN:2628 M5:fa043c52050897ca77e0b475bc77776f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000203v1_decoy LN:2623 M5:0761598e68213207c0d256d5e7e1bcbb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000204v1_decoy LN:2622 M5:502e3af12800de14f86b2cfd3de9bd2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000205v1_decoy LN:2619 M5:74fb4a710fd8bb14104c1cbde54ee247 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000206v1_decoy LN:2605 M5:73c6a5d1feb99a88b122655b4dcdd742 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000207v1_decoy LN:2603 M5:2d1e488c4ee483df72211d2762b1b7cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000208v1_decoy LN:2601 M5:c72de668308e8c098888b96b543703d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000209v1_decoy LN:2598 M5:33dd6c20ea4712d7d3b200db8f026cbf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000210v1_decoy LN:2597 M5:cd6c72af3776b51a1619b01b5eff8bc8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000211v1_decoy LN:2596 M5:40ba1e4b99e2625ec5a5cc4038fa9a06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000212v1_decoy LN:2594 M5:fe8d3058e4af4e6063be2c2f955b2bfb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000213v1_decoy LN:2586 M5:2ae32263b19fd8541852cb566f82be30 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000214v1_decoy LN:2585 M5:873a6619e50330ccdcebeb56cf56b70a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000215v1_decoy LN:2583 M5:13d7b02826997cd3db01ccfc712000ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000216v1_decoy LN:2578 M5:f891eed2ad267879c435cbc346ebfaec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000217v1_decoy LN:2569 M5:17baf081bd68afecee4fb26591fb7d44 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000218v1_decoy LN:2569 M5:b543771b65b36e55866a9191f68deb0e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000219v1_decoy LN:2551 M5:cd59a6042156743484b01e429d67dcb9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000220v1_decoy LN:2548 M5:822737a44cc33c2db164829922cdb96a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000221v1_decoy LN:2548 M5:cfc1c1a98c1e72f1193cf3bdbd7d6e22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000222v1_decoy LN:2546 M5:4b897ac33360cfc5dda50c492edd5264 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000223v1_decoy LN:2545 M5:3e5f015ea4c3e8e3f4aa413fc8e33ff7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000224v1_decoy LN:2534 M5:8a161ea48715e813fd05aa43c1e4524a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000225v1_decoy LN:2533 M5:fb3804f1f8c9b481a5684e24912cdb2e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000226v1_decoy LN:2522 M5:4a6ae65ea92c112f656b5d39d76a7741 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000227v1_decoy LN:2522 M5:4b56d4e6c02a6e93eace0b35a8e81178 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000228v1_decoy LN:2515 M5:38e333d2fbaeea1196ff289ff007b136 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000229v1_decoy LN:2513 M5:6948ea45d0167313b03bb520dece25ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000230v1_decoy LN:2507 M5:ae1256f74ac53ab9f03548cd40e2fe8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000231v1_decoy LN:2504 M5:615e1e7e5b15386539deb06dd4e70457 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000232v1_decoy LN:2497 M5:2601507db41c0111c04735355c122721 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000233v1_decoy LN:2471 M5:204b14540e382d6178cbf75d805ad164 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000234v1_decoy LN:2465 M5:8bf3deb57ae47354c0f07b477420f838 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000235v1_decoy LN:2464 M5:ef6b06a889077e9b0c4ae3b5eeaf21cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000236v1_decoy LN:2459 M5:cf22036ebb20e5c07502642f1d926f55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000237v1_decoy LN:2457 M5:64a6bc4d08e4f9e0d6ba8cce58b7f505 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000238v1_decoy LN:2450 M5:e83868519a491203921eb9f7286a5e98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000239v1_decoy LN:2435 M5:8292756d8d376c15256d12d69951d1ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000240v1_decoy LN:2434 M5:e850a25d74b1a7564101247ce3b1fb7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000241v1_decoy LN:2432 M5:b0696db696f0e45c6909f75d3f17ab87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000242v1_decoy LN:2427 M5:4a78bf09eb53eaefba5d6406f424579a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000243v1_decoy LN:2421 M5:6751a1f3f80e5a43badc5b9a986fa49a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000244v1_decoy LN:2420 M5:b8c086bba1ed8bc4eb0ea05e7031664e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000245v1_decoy LN:2414 M5:4ae74a7c8879b7eadc4ff52f6c247436 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000246v1_decoy LN:2404 M5:cd50b4acbe112fb299328b26c243aad7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000247v1_decoy LN:2403 M5:0a7f0ec7ad3711a0173947d4768d9193 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000248v1_decoy LN:2402 M5:cf164664d17746b996c1b51b7a1b2d1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000249v1_decoy LN:2397 M5:d5f7a437c859d40100bf3a757b38ea7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000250v1_decoy LN:2395 M5:fdf94cbe463685fab85e81430541c656 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000251v1_decoy LN:2394 M5:9e100dfb362640d77d73adb06f63c206 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000252v1_decoy LN:2388 M5:0f0f93cc335a9faecc119d22738a778e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000253v1_decoy LN:2382 M5:af0841d63c2d4ca67c11f8e2f0c0b42b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000254v1_decoy LN:2381 M5:948e4e6ebbce9d82413e86c3c96d684f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000255v1_decoy LN:2380 M5:46be4a58c4b132b788bd04a3c51f0108 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000256v1_decoy LN:2368 M5:722aeea650c487dc132f37322a5b5eb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000257v1_decoy LN:2364 M5:44995a3c81d834bd8bbceda57ee73d51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000258v1_decoy LN:2363 M5:a71f07406eabc3a412250ac21c446ba3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000259v1_decoy LN:2348 M5:99b15b0bac8cbd7497c5ca04a721c657 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000260v1_decoy LN:2339 M5:0768f34e39c5c97c1639fd42b72fec1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000261v1_decoy LN:2335 M5:974a3d6e7628eaf95db035d99f046379 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000262v1_decoy LN:2332 M5:9a0e708d8a88bfa96a75e98604a273b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000263v1_decoy LN:2331 M5:60412161b03d0c2f2ce5659369ee368e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000264v1_decoy LN:2330 M5:5593063ebd79eae9ac5a5a5ba9095b7e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000265v1_decoy LN:2323 M5:6042dc9c77f44643d41e68ea0cda385f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000266v1_decoy LN:2319 M5:ba867aa03d1617be8f801a89c1530937 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000267v1_decoy LN:2314 M5:a29f663eddf36e84b6cb6faff0f62309 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000268v1_decoy LN:2308 M5:659c8649b3dbe0dd672045a5ed7fa3b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000269v1_decoy LN:2306 M5:e10dadf09b67626744c1c39c1fea5fe4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000270v1_decoy LN:2296 M5:81f921a9ec2bd029889721432b22d4d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000271v1_decoy LN:2287 M5:095a5e8a3ae51b66207f518822bf71a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000272v1_decoy LN:2279 M5:47fde7cc81a14c0c6be4ccbfa3312015 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000273v1_decoy LN:2276 M5:35e9863bbef84bef6634eb206bc66c15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000274v1_decoy LN:2273 M5:9e8590286f229ad55bf921bb4d7236f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000275v1_decoy LN:2262 M5:f184b3c6054e080672a50e932da0aafe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000276v1_decoy LN:2254 M5:06e878f736f352fe167cc033f030b492 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000277v1_decoy LN:2252 M5:af9e9099df9fd3abe01d3ab305c9d65b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000278v1_decoy LN:2245 M5:8f7d8cb82a282dc326d4bd286895492d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000279v1_decoy LN:2239 M5:ae67f16bc2c56baec5093246804b3df5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000280v1_decoy LN:2223 M5:bffd2399ce899d9fa674d826311500f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000281v1_decoy LN:2220 M5:926bf451304bc000be7146acb11c393e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000282v1_decoy LN:2218 M5:adcddfbd560a42060c45d80c751787c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000283v1_decoy LN:2215 M5:706580b59cf8322b639309fc6110d094 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000284v1_decoy LN:2213 M5:7145c3c0ac2cc197f7d0fc0fb18d6c1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000285v1_decoy LN:2203 M5:0c6c215de5d00669ece9d0d461b7b5c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000286v1_decoy LN:2200 M5:a724f88e94788f5e1738a038d67d8d7b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000287v1_decoy LN:2197 M5:fd0cdd36334762ca58e7b82b6ebf802d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000288v1_decoy LN:2194 M5:441ebd8ba7d0673bebf054e6ce9b405e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000289v1_decoy LN:2183 M5:df57267be3acda36409e42dd3c0da306 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000290v1_decoy LN:2179 M5:8bc6beaec162ccebf341b6c46ebaf3fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000291v1_decoy LN:2177 M5:d0d5b33e946654d9b23402cef3f10822 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000292v1_decoy LN:2177 M5:bc189c463b5d9bae5c71afa304910390 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000293v1_decoy LN:2177 M5:c74d19e91cd80fb55bc91184bdc0eac4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000294v1_decoy LN:2168 M5:c828de6bd73d4226b924cbe268ab5d35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000295v1_decoy LN:2160 M5:33980619d2c675019c4fb26681973f1f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000296v1_decoy LN:2155 M5:40e793695b37b027d9d893448ad20eac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000297v1_decoy LN:2144 M5:55b3946760e337f7fa9358993879d5d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000298v1_decoy LN:2143 M5:5c8fe70b46ce7d299039403820af18c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000299v1_decoy LN:2136 M5:7a28362f930fcd9a245cc239750dd1d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000300v1_decoy LN:2134 M5:285c47826e725f4442c18898156ac4fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000301v1_decoy LN:2129 M5:b4ad7d61b3d8b5b5f03100792231b056 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000302v1_decoy LN:2128 M5:a6fd1741e7a81251829a88549717a433 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000303v1_decoy LN:2125 M5:c95f162916242e94c057ec50e3f666e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000304v1_decoy LN:2125 M5:cf878bbb13f4cb8f6ad2f6134d4152f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000305v1_decoy LN:2122 M5:ffc29d2524335853c556eac4b936ac47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000306v1_decoy LN:2111 M5:13ad53d0306dcdc84cfbe5af890ffa7f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000307v1_decoy LN:2106 M5:2705f017f46d301002f0ccf08933080c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000308v1_decoy LN:2094 M5:dc17db769fee486df656f8334528abba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000309v1_decoy LN:2093 M5:61b8e15e0c011168970bf67fa28a893c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000310v1_decoy LN:2088 M5:4a0f2b01b92451953bcb14f94874625a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000311v1_decoy LN:2086 M5:560b32a4aa380573107a95fe8344fcbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000312v1_decoy LN:2086 M5:f4a368ddba66f5647c78853a2080c7e1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000313v1_decoy LN:2084 M5:90b16478fad5417ff33d03ed3cdb9897 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000314v1_decoy LN:2080 M5:eb02520ddd2b898796bf56257623ff11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000315v1_decoy LN:2079 M5:214af8bfae249648407394750763140c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000316v1_decoy LN:2076 M5:b2439d0b325e4cd30b1869e8e17005f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000317v1_decoy LN:2071 M5:d8e3a93de5b5c8fa58e8785c44e165f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000318v1_decoy LN:2066 M5:03ab659ca0a3d031ed57f5b71c40b7bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000319v1_decoy LN:2061 M5:b7df3a4252d3ed398842dacc1ef5119d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000320v1_decoy LN:2055 M5:3225edb2d4dc98b7b0cfd91afeacdba1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000321v1_decoy LN:2053 M5:d0f66764a23cc8c03b6e0b1b8dcd2aec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000322v1_decoy LN:2040 M5:a53241c8700359fdfc69eff381d88829 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000323v1_decoy LN:2036 M5:8b83d6b87f9d9045336bfe2d4f2d638f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000324v1_decoy LN:2035 M5:641af824694766c85122b263dc1b3649 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000325v1_decoy LN:2034 M5:7f2f9c9fa94f3acab772792c44b4c167 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000326v1_decoy LN:2032 M5:1f32623318d9221ee867209755a538bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000327v1_decoy LN:2029 M5:053ea4692acbe04aa98a6f331417531f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000328v1_decoy LN:2025 M5:930554d67c2f289a7f2bbcce35c88e75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000329v1_decoy LN:2021 M5:b3cda19a888b02b135de2538d4a74936 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000330v1_decoy LN:2018 M5:abfba957d4a6107fa109f1dd5a572de9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000331v1_decoy LN:2015 M5:0ccdc46d98d147f9b6bb6808f723d28c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000332v1_decoy LN:2009 M5:634f88805091cb15be16b1af5e720775 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000333v1_decoy LN:2007 M5:957b5291471bee32d4771292a611cfa9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000334v1_decoy LN:2005 M5:6d2a28c1dcd5377a19f5768b3fa75ad2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000335v1_decoy LN:2003 M5:7fcaa8fce3cf7cda00a42df29b938b6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000336v1_decoy LN:2001 M5:e28b02249a274e4b98551241e243fcbc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000337v1_decoy LN:2001 M5:4718723746d62e7eed277db09d01884a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000338v1_decoy LN:2000 M5:7071be152f29ebf4ec4cfede2d44d70a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000339v1_decoy LN:1996 M5:21924fac8b9023e37be232641581d24c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000340v1_decoy LN:1992 M5:462035d8f8260ac9d68132b5ac63ceea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000341v1_decoy LN:1985 M5:80c971eec06361d4428c1c731da5d2eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000342v1_decoy LN:1981 M5:6f5d885e4d0a0476e309c004c8d7116c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000343v1_decoy LN:1977 M5:07b50b0be202b0e56fae3ff7b729fcf1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000344v1_decoy LN:1971 M5:ec1eccee490917513ffa0844c16cd648 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000345v1_decoy LN:1968 M5:a44124ee81131e9ba181e4d57343b933 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000346v1_decoy LN:1962 M5:a46b7187d8afab3b6711d2b57dbb649e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000347v1_decoy LN:1961 M5:391b9551b7df1ea41abd51c70c6391ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000348v1_decoy LN:1960 M5:2272602c288691975c385900ff1871d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000349v1_decoy LN:1960 M5:92f15826c95eeb01e4b619c7b646a17a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000350v1_decoy LN:1954 M5:98742b24ea14c25494dc15620ed8d346 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000351v1_decoy LN:1952 M5:5d5e3c8f90d84b8f2e912de53d0250a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000352v1_decoy LN:1947 M5:f5e22c20cf8f7956480ff337ad36be24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000353v1_decoy LN:1944 M5:cd921451a9fcf4ec5d06cb74cee21605 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000354v1_decoy LN:1943 M5:eba8670102e02d674c11f1779a39338e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000355v1_decoy LN:1941 M5:79a20867ab6678a0eb6a1bddd2d467f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000356v1_decoy LN:1937 M5:e17159dcd1117f3bb92bebb710740ba2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000357v1_decoy LN:1934 M5:9266a855ef31e94c5f77d277055f2125 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000358v1_decoy LN:1929 M5:11b07e8db80b814bbcd4814bebafc177 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000359v1_decoy LN:1924 M5:e9df9c6169849c4d69eb8a286f274eab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000360v1_decoy LN:1924 M5:5152172dba1a32a5529708855c21201b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000361v1_decoy LN:1923 M5:22f23fe69e62cdfb4304b679a6916bad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000362v1_decoy LN:1921 M5:b5eaf4b290ab9cf157680d65e640a5a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000363v1_decoy LN:1918 M5:9dedcf6b3a849e4c681f05753c2597d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000364v1_decoy LN:1915 M5:a1c06309d5103a00f8c5cf1847f58856 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000365v1_decoy LN:1915 M5:7a8b1fa154de78062577f95bcbf9cd7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000366v1_decoy LN:1914 M5:6db99643422d9ef62392ced193881137 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000367v1_decoy LN:1912 M5:61c61bda79ca84060bd63c678715b83c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000368v1_decoy LN:1910 M5:64edcf78348cea32c4e946329efd3ff9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000369v1_decoy LN:1907 M5:9266a29087762dab9b2c3f0065838122 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000370v1_decoy LN:1904 M5:f753bc41e46a7b0a9a9c63055a0553fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000371v1_decoy LN:1897 M5:df2a02d92f1a99000001bd1979b387b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000372v1_decoy LN:1891 M5:1664892a75f937da1e68f5c28f0be6f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000373v1_decoy LN:1890 M5:ad597d36bffdf82ff75f444e98be4928 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000374v1_decoy LN:1888 M5:570f07c26f0d742b21502cff22b7d2cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000375v1_decoy LN:1888 M5:a85dc5b82df805bdd2ee38b94de6133c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000376v1_decoy LN:1885 M5:d5cfea6c2a90821c0bac19bb1b81c97b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000377v1_decoy LN:1881 M5:cdcde92ccd92dd4531ee3ccae640577b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000378v1_decoy LN:1879 M5:fa3996c5e3cb86b5904ad5ab423f06ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000379v1_decoy LN:1877 M5:4659566201687f420c913a424ff09d62 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000380v1_decoy LN:1876 M5:e619de3bcb3f53147ec25a74324350be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000381v1_decoy LN:1876 M5:7d297256bbb1ec6cdc08e447670e69d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000382v1_decoy LN:1874 M5:bd4b0fff3b0f9b3c27bc270d80d2d91f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000383v1_decoy LN:1872 M5:d337922792c71f4bb3ec1c522519d7cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000384v1_decoy LN:1869 M5:95a4dae294e133dca09afd04559a3d82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000385v1_decoy LN:1866 M5:38b2fbf522a772de9e5971e2c248d773 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000386v1_decoy LN:1865 M5:a2b125ab6d06ffdfbfde0a2899a63d38 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000387v1_decoy LN:1865 M5:eeb193e267c0aad102b5a8c55b899094 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000388v1_decoy LN:1865 M5:a21001e6acebfcf03c2f187db59bca58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000389v1_decoy LN:1862 M5:e1aa83bd329fed4cea1a31c2b26605cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000390v1_decoy LN:1862 M5:e80fe8b2857e4e57c40cff1a604ca905 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000391v1_decoy LN:1859 M5:e85c5d8da9312ccb56a4ecb47e7cb397 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000392v1_decoy LN:1856 M5:d1448f2aeede93e71be4fa57f641c1ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000393v1_decoy LN:1856 M5:dcbc9c61d537f450dd4fae3b11f71d19 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000394v1_decoy LN:1854 M5:a427d47a812c6fe6c9d26190b4b83f7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000395v1_decoy LN:1850 M5:876c26621463a5218a5953d9be4d0810 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000396v1_decoy LN:1849 M5:4797d275b03add54ab91c5b8c318a7e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000397v1_decoy LN:1849 M5:707d492cfa678968ded0e2306392504a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000398v1_decoy LN:1847 M5:06eb26d8459f3e43735ded45aa07a2e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000399v1_decoy LN:1839 M5:1ec1c61f264cc1ec9596dab78ea77adc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000400v1_decoy LN:1834 M5:c268a5b922576efd86cb97619df6fb55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000401v1_decoy LN:1821 M5:37647f03de6c012f655cbffbfbe570b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000402v1_decoy LN:1815 M5:edf2017fafb77c03c7f392ec8489ffae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000403v1_decoy LN:1811 M5:60131480b353a90b21d6a47f52a7d1eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000404v1_decoy LN:1808 M5:b4009abb588476a2593dd27cef872705 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000405v1_decoy LN:1808 M5:ef9e792232f15cf2b18c4d4a7ce99253 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000406v1_decoy LN:1807 M5:09de8b5234448cff4c1e3defd30ee794 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000407v1_decoy LN:1807 M5:212f6e4df329ece3ab38c483cdf02535 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000408v1_decoy LN:1802 M5:291bcca126e0b971eaa6fde409109815 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000409v1_decoy LN:1801 M5:12ba0451f91998e31fd25003c892102b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000410v1_decoy LN:1800 M5:d47cda8c33b62a63e40f02664d4811d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000411v1_decoy LN:1795 M5:7f941c23c25bebc1937eae96aa5e98d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000412v1_decoy LN:1794 M5:1354d0a5f0d586b01f493802f991dd7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000413v1_decoy LN:1792 M5:7b03b07cb1cf327205fb693d3ace8a42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000414v1_decoy LN:1788 M5:36d568b75f9e3cf031e037043ac02384 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000415v1_decoy LN:1786 M5:393fd0366a1270f611866e1fb5af3cc1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000416v1_decoy LN:1782 M5:2652e35a4315660b304c6b7522e5f7d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000417v1_decoy LN:1782 M5:c7c0bd282280cb9eb969940cc3b68acf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000418v1_decoy LN:1781 M5:5a9a78f89d320fbabd4693bd232704a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000419v1_decoy LN:1781 M5:75304d27b61d40a759bd36190202926a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000420v1_decoy LN:1779 M5:95cf227ee90e6dced27e307b52d240fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000421v1_decoy LN:1777 M5:c1fd358a71fe269cee210b27840c272e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000422v1_decoy LN:1764 M5:5db13804da88f18750e478f6682b83a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000423v1_decoy LN:1762 M5:bcf551251490bd2c7ab5a99232bbbcf0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000424v1_decoy LN:1755 M5:c8de78702f0a0471f26cfe586a8d9263 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000425v1_decoy LN:1749 M5:9c843f2e59ba4aeed3517c0aa36ed8c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000426v1_decoy LN:1747 M5:431f95d76dc16b369e6765e38ae92ee1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000427v1_decoy LN:1746 M5:1641a71638dd63211280e6bef22e6a4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000428v1_decoy LN:1745 M5:98de780057460a078034b25725bad406 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000429v1_decoy LN:1744 M5:16ceb3de9929ccc268d4aeacb8f20439 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000430v1_decoy LN:1742 M5:6c61a88798f9fe78567c879793385c29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000431v1_decoy LN:1740 M5:e2ecdbd050ed1413eb2a07f7d9ebc8c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000432v1_decoy LN:1740 M5:7f1d544cca143be6dd353cf3efb80028 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000433v1_decoy LN:1736 M5:18493fcfd6ea161acd237867aa7337cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000434v1_decoy LN:1735 M5:afe0292acad0a1460fbad00971606090 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000435v1_decoy LN:1732 M5:5bba5da58b43755bdc14ab286a8a5cee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000436v1_decoy LN:1732 M5:680818b10726c68c5917f48456528d0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000437v1_decoy LN:1730 M5:836c13c8ad60355227f91a1b5308ea33 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000438v1_decoy LN:1727 M5:f5fb0c58f9b4fa60b1eeccee56f0cd56 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000439v1_decoy LN:1722 M5:9a47086cf6334392302ea1713fb68c57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000440v1_decoy LN:1718 M5:dcc0114d2cbd5f165da52b4610aeb6b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000441v1_decoy LN:1716 M5:59cfde6a838acc68c55e5a781f1308fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000442v1_decoy LN:1710 M5:cf384ae5b546344ace5aa4d662c6ac0a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000443v1_decoy LN:1708 M5:4df6e9cabebe481359ac95881b277f74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000444v1_decoy LN:1707 M5:971971b7547432d52662e516989b1596 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000445v1_decoy LN:1706 M5:9c926b3b414cdf578a7af119dc3d32bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000446v1_decoy LN:1705 M5:91d17f22298838daf727563421004b33 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000447v1_decoy LN:1704 M5:64c4b3b7b16fb06e268d70c576c18be7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000448v1_decoy LN:1699 M5:e50192f7290b158ee82f04623e78180f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000449v1_decoy LN:1698 M5:938f5fb6e35906afc6601c756e85684e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000450v1_decoy LN:1697 M5:670cd517d0cef208acfe5f83f4f08e40 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000451v1_decoy LN:1697 M5:29b287f217fd519ac38852bf9f3b89cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000452v1_decoy LN:1695 M5:42ba5d9b4331876409b5509b694d32f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000453v1_decoy LN:1695 M5:a98d7b845be68d05f42b70b19d87ecbf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000454v1_decoy LN:1693 M5:bda60eb625bdf4d5f8b0cb6ccb975c1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000455v1_decoy LN:1687 M5:27bc09a272621c3414cbe34cd809347d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000456v1_decoy LN:1686 M5:6f0aa7beab754a13ff566057d0641ae0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000457v1_decoy LN:1680 M5:8cba844ac8cc6321dba7652815bbd94d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000458v1_decoy LN:1679 M5:e2f908a05a86ddbda11acd668b7487e6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000459v1_decoy LN:1679 M5:5a0c260602a6ab3fa76f49157966cf4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000460v1_decoy LN:1678 M5:54a34fdfb08cb07c1f51c8be679c6339 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000461v1_decoy LN:1674 M5:ced48cb3354e7f24d532fefc85a96319 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000462v1_decoy LN:1674 M5:4467091f25a983fc0f7d9d88bd351993 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000463v1_decoy LN:1671 M5:7cbbe8ba7b64b120b467c953851a7eb4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000464v1_decoy LN:1669 M5:a3cdd6c546af035a3c9830a67c0bb056 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000465v1_decoy LN:1665 M5:1e245fa1bc113bab6305d0fc3cad2112 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000466v1_decoy LN:1663 M5:b1a1b5888971729811d7fcf9b06665e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000467v1_decoy LN:1657 M5:8a989e9803993317d80157778c71da54 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000468v1_decoy LN:1653 M5:bc73c770766d2b8deb017d234f5d7387 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000469v1_decoy LN:1652 M5:9559e20eaa71db947eb9645779c2c2e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000470v1_decoy LN:1650 M5:60a6f98d6f706aa9554c7b6ed3de2716 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000471v1_decoy LN:1649 M5:ce3eddf63b3aea572dd8e0b762b90829 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000472v1_decoy LN:1649 M5:aeab25a6fcaf97cdcb319dff1550df0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000473v1_decoy LN:1640 M5:7a4f3084ac2ed72ea4f5e60260c77948 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000474v1_decoy LN:1638 M5:5c4753a4d69db9ff02e858c8ddbb8911 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000475v1_decoy LN:1636 M5:8970166c6ade7a2f8106159d5ee5c857 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000476v1_decoy LN:1632 M5:67037d44662f2487a2e39e76ea3fef94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000477v1_decoy LN:1631 M5:3455484eacb9d4eaa7ed63b96b087c85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000478v1_decoy LN:1630 M5:c20fcc553e42922058f9f0e839f527ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000479v1_decoy LN:1627 M5:cf02dff4c16e81e47d1cc5ffdbf1b4ae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000480v1_decoy LN:1624 M5:93392bdc58b6376d5da876bae65be9e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000481v1_decoy LN:1617 M5:e8add50c6a06030a1dca84968a89d4b2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000482v1_decoy LN:1616 M5:6d496ad94b5cd40c72f5362e446e22c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000483v1_decoy LN:1615 M5:bcc4bc611bdb483f2f925df072d50a41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000484v1_decoy LN:1611 M5:19f0a56814e718041b51733abc55a44c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000485v1_decoy LN:1611 M5:771186a23da9b9c2081773c5a6d73812 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000486v1_decoy LN:1606 M5:f6dc33d2578fb0ce6a560d5ee7b9b5cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000487v1_decoy LN:1605 M5:440c7d94624635647d771ce7f3833416 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000488v1_decoy LN:1605 M5:7e6682db43f2445cfc3b18ddecb786c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000489v1_decoy LN:1600 M5:1b3265b9aa7cae61d843ae0b09e2f3a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000490v1_decoy LN:1598 M5:8ef2cd8ef0749e5d753b552c1f2fc3d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000491v1_decoy LN:1598 M5:9bfcb4215c94e812ae4ead4fc804a63f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000492v1_decoy LN:1597 M5:8c06a1c635581dd76469e431bda358b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000493v1_decoy LN:1596 M5:9880ad7b13fdc3af8d8c81e3adf8ba43 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000494v1_decoy LN:1595 M5:ec1ac1310cc7d4432ced7724829cbdba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000495v1_decoy LN:1592 M5:f2d436516525e67ce3aa61ec5273dcb5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000496v1_decoy LN:1589 M5:201a121b6775880be8593d2a9cef12cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000497v1_decoy LN:1585 M5:491aed38b1a89a77be7b2d1d30bd4fa4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000498v1_decoy LN:1579 M5:2e63f3a1cf01e023c443b4478459db64 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000499v1_decoy LN:1578 M5:f9223dc0eaf125b8226c386bbca18647 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000500v1_decoy LN:1577 M5:3c9bc60202ddedaa3894d11a96f5429b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000501v1_decoy LN:1577 M5:c367b54edc2b83cb15946ac3c975ccfd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000502v1_decoy LN:1577 M5:d7d24f1188f1d67db7215729a5c5b8d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000503v1_decoy LN:1576 M5:229d2aa7ab158e9b4bad158972029e55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000504v1_decoy LN:1575 M5:c8f35742cdde94078de3c3d84c130c42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000505v1_decoy LN:1574 M5:d0367db77d5a6bff49f54d4acd3d01e1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000506v1_decoy LN:1572 M5:06b66d904a7902fb764a3e661b9c8bea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000507v1_decoy LN:1571 M5:e3187302e0771a467d4e7d2b31669e7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000508v1_decoy LN:1563 M5:78aa7cd4461790084af50b1b80e1838b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000509v1_decoy LN:1561 M5:abcdf15d561b447b0bdedb366fb77d72 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000510v1_decoy LN:1561 M5:f9a7e72f7e382fa59a1d2c0c4d6edc53 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000511v1_decoy LN:1560 M5:bbfe4f1e02f2fdcc9d20e65e8d3da35d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000512v1_decoy LN:1560 M5:538f38f8d5e6495a85b6bfecf487ecc6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000513v1_decoy LN:1554 M5:8ae2f8b5f30a6c1762de005819965ec7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000514v1_decoy LN:1552 M5:392885482ea57d0e3f1311c3be95c89b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000515v1_decoy LN:1548 M5:1310bfff4743d36d7f8153b6663f2249 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000516v1_decoy LN:1546 M5:629769b2550c48e2a73115da95946951 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000517v1_decoy LN:1541 M5:76f0c1d1779803feb107f253ea555df7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000518v1_decoy LN:1536 M5:686a5b0fc214ac36df8da7605ffae4ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000519v1_decoy LN:1533 M5:e2bf8fa01d69d0ec7c7e1f6d040912c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000520v1_decoy LN:1532 M5:0c23895ba0df7ad7ea8f2b58313a0cdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000521v1_decoy LN:1532 M5:c9515245780a66ef482674755d38c592 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000522v1_decoy LN:1530 M5:5caa4ec6f260d2f960770b368909d78c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000523v1_decoy LN:1527 M5:b05daa30b4f2c9167aac9fde662de4c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000524v1_decoy LN:1526 M5:cfcd1e358a225fc7c2354b1bad52cccc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000525v1_decoy LN:1524 M5:08ec33c06085eb399a1e56f43d1d222e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000526v1_decoy LN:1523 M5:74f16c21c5a2372050d2f61595d52eea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000527v1_decoy LN:1523 M5:e7cf8c07771c8fa37bf4b6fbca555113 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000528v1_decoy LN:1522 M5:8f754d63b65c3c7a1e9a1ad5e439d2d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000529v1_decoy LN:1522 M5:51530101930cfdb66060d0686c4fed16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000530v1_decoy LN:1519 M5:dced229b77a1ea722aed13b4eb4e5b79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000531v1_decoy LN:1513 M5:dc49162a2d904001541bef4c7f7cd54f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000532v1_decoy LN:1508 M5:c183c701388b1a11f3cbf31ba2d84f41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000533v1_decoy LN:1508 M5:0d9b9c8ca5a3b58a13369e0a097f25cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000534v1_decoy LN:1505 M5:4e806d8438bd8512d22e24a026640d66 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000535v1_decoy LN:1503 M5:0b9c580f3d47c52b031cb00b9741c1a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000536v1_decoy LN:1496 M5:ebce7ee144631f93b7001740bff968ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000537v1_decoy LN:1491 M5:191de45ffda752707ef5b22c780675b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000538v1_decoy LN:1490 M5:2b8af44ac46088badbdffea0c0c3d368 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000539v1_decoy LN:1490 M5:378e070f5556e26fd1e89f1f21e2c35a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000540v1_decoy LN:1487 M5:7c84677ee13bffaac6c5c623f317619f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000541v1_decoy LN:1486 M5:501226e799037a04ea73a3be5bde460b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000542v1_decoy LN:1485 M5:8ec76a3f62b296d50ccff9ce4a9aa072 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000543v1_decoy LN:1484 M5:34e4860b41e4db3fe4ec16fdba4cb85a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000544v1_decoy LN:1483 M5:ca6b3496195a36f5f1a5a1de26bd9655 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000545v1_decoy LN:1479 M5:902f04a9f4b960cef80039434d00e63f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000546v1_decoy LN:1479 M5:16692f78928924e255aeb5b72a97ab21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000547v1_decoy LN:1476 M5:e765f1919b45a51913ed7d2f4c9a7491 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000548v1_decoy LN:1475 M5:fa46ec2fd14b9d99852d4d30568593ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000549v1_decoy LN:1472 M5:d03e8e717a38f0178037af0ca86aafb4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000550v1_decoy LN:1469 M5:8ee65cdf657a82a381d7cb6caa4f3f5d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000551v1_decoy LN:1468 M5:bc6f74a7c8ffab037e3eab5ea88037a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000552v1_decoy LN:1467 M5:7d64a0f8c6675f07e9dec9b70a0afdd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000553v1_decoy LN:1465 M5:2e3b43fdc0d1784a2518dfe255384519 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000554v1_decoy LN:1464 M5:df762923ca57a0113032d663d3c97bea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000555v1_decoy LN:1463 M5:11aada1e695fe5177d9540b02a2d432b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000556v1_decoy LN:1463 M5:d3ab1903d41ac470157b0c4d4ed61933 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000557v1_decoy LN:1459 M5:bbadf4ad4f9a1ee8da95612868cfb018 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000558v1_decoy LN:1459 M5:bcd6dabc3d1399c379f3adf1cdeae332 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000559v1_decoy LN:1458 M5:1781d0b5245fdca60eb63e40b293194d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000560v1_decoy LN:1458 M5:46a7c1c5c2e823abe406cf459179bfde AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000561v1_decoy LN:1454 M5:a7a571b77c5a922ca842288fc6734696 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000562v1_decoy LN:1449 M5:cc0f411395c55cc332ad0889e75eca80 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000563v1_decoy LN:1449 M5:184e7321ea1fcdc47df967c7c5d879f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000564v1_decoy LN:1448 M5:9cc22c1be7f706f6789fc994e46ddc95 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000565v1_decoy LN:1446 M5:2be7af38d4e11bbf45397add5e8b29bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000566v1_decoy LN:1442 M5:7badb67269751abbac8f46b5704299b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000567v1_decoy LN:1441 M5:ee8162f4c41a8b15758b34b01d87e2d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000568v1_decoy LN:1440 M5:d4b0ebe0d4c6d4d270b5a5b7d1a5d7ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000569v1_decoy LN:1439 M5:ec8779a6ca200bbe41de6dd3630da10e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000570v1_decoy LN:1437 M5:3d29e003ab19ba610718173d23d26b37 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000571v1_decoy LN:1436 M5:a7261a67e8f0dd3de7bb37e12ed74c3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000572v1_decoy LN:1429 M5:d9b8501a054b0ba4229f7ae1e74bf2c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000573v1_decoy LN:1429 M5:ddc6caafb94fef7d6209cdff64795226 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000574v1_decoy LN:1427 M5:9aca197fbaf212c69feea234780489a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000575v1_decoy LN:1426 M5:1e4c043b8c89e6c193c519db2531e6b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000576v1_decoy LN:1425 M5:846748418b1797e21e540d92fd794495 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000577v1_decoy LN:1424 M5:4fd0c37d4a586150a9301f2009c5c1e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000578v1_decoy LN:1424 M5:54ac14d019ced5f6bfe22948074afa9e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000579v1_decoy LN:1423 M5:3fdf802f805e746ac56f30d6d1a68708 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000580v1_decoy LN:1423 M5:7237c88f6ea636176c0287d0432a9732 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000581v1_decoy LN:1423 M5:e9eaf98ae51879086e24b98bea88df0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000582v1_decoy LN:1414 M5:34272cd5beb57237fb7a193f798cc2d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000583v1_decoy LN:1414 M5:9060d1ca5fe447374bc2a1e69f4e3224 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000584v1_decoy LN:1413 M5:3298b158d1b1f933a0e2a292a1529e10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000585v1_decoy LN:1413 M5:59c1a460224d4414afdea6e15bd8b2e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000586v1_decoy LN:1410 M5:64228ed4ae27b3994019d9e0038f55a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000587v1_decoy LN:1409 M5:4d845a6ec097602753d860feddf23e58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000588v1_decoy LN:1409 M5:a000b425fd931ce6015497afb22efd88 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000589v1_decoy LN:1406 M5:0c059afc9f69018ba9da0b23aa8b9b75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000590v1_decoy LN:1405 M5:0c586f3eb4883fc1918171f471f5e5f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000591v1_decoy LN:1405 M5:cd72088875313abb75d2a891e35b7d4d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000592v1_decoy LN:1404 M5:abf874737ff5cfa8f718112f32beb985 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000593v1_decoy LN:1404 M5:eb8f0a5cc692b80655ef58e2547a4cec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000594v1_decoy LN:1402 M5:6ee2ff095b70b42cd9c9b4e0efabca4c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000595v1_decoy LN:1402 M5:f4d8da8a43b238c8e0646f5f0b52f89c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000596v1_decoy LN:1402 M5:8c7872a37fea0f290dc1bc82d975b894 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000597v1_decoy LN:1402 M5:d0d9fdcbf88b68b1dec6f806c72fed32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000598v1_decoy LN:1400 M5:6634e5294042b88996256c18dfedb84d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000599v1_decoy LN:1398 M5:fd8634e8ef145e4987e4520f150aa3f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000600v1_decoy LN:1396 M5:25350d57a6af0ff5c2c4c9c49b44ce71 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000601v1_decoy LN:1395 M5:6aedeed255c7942bf7499cf1627f8cbb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000602v1_decoy LN:1394 M5:535e79d7dc446b1c3d57759eee6e4f79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000603v1_decoy LN:1393 M5:300693e040f4152f622506cde18980f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000604v1_decoy LN:1391 M5:8a946b3527d782026e0dc90559017170 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000605v1_decoy LN:1389 M5:7a9e96381bae2eb52e9e340616f3d40f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000606v1_decoy LN:1389 M5:b6ee1b27e065ac10608cc2a75f23b552 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000607v1_decoy LN:1388 M5:ff5370f5970d37597e705a08fca533b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000608v1_decoy LN:1387 M5:445d8c03bad3cc26e6adeb0047d18078 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000609v1_decoy LN:1384 M5:e885e52d68b2de3b4a858205e3e642ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000610v1_decoy LN:1381 M5:56708189f55fba9d8406fbd9eee51424 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000611v1_decoy LN:1381 M5:c7791c86ba8e059389aaa3919f1ed24b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000612v1_decoy LN:1379 M5:040a6029ad56ae20245dd1757c313f19 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000613v1_decoy LN:1377 M5:cc1f3e1b6fbcf7cf33ba399c84ff0fd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000614v1_decoy LN:1376 M5:73782073ee88b30e5184f8c58b162395 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000615v1_decoy LN:1376 M5:b49adf2ce996df0a067aa5afccc4d593 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000616v1_decoy LN:1375 M5:ebef890f7fb5122bf631a5489d6d46a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000617v1_decoy LN:1374 M5:d165c7fd94b756243531a20cd030e7f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000618v1_decoy LN:1372 M5:99bb1f26eea260757df2246652e20ce0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000619v1_decoy LN:1371 M5:fdc45233952efe3a4444e4fc118e9bd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000620v1_decoy LN:1370 M5:023468d3dca8b3726de68eb85c7d2301 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000621v1_decoy LN:1370 M5:fb5072d4c89ac94df7141cacd9701034 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000622v1_decoy LN:1366 M5:5aee91a1f323fd56c65017a1878fae17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000623v1_decoy LN:1363 M5:6b6ecc4a02c37b540c86cd51299d13da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000624v1_decoy LN:1360 M5:06cd979553eb7045f14feac8e6f2e2bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000625v1_decoy LN:1356 M5:d4cf98566c01e8715f3f2d3883ee0960 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000626v1_decoy LN:1355 M5:1dfb4921c6f707d06505f67e59849603 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000627v1_decoy LN:1355 M5:0d374e2ae6601c90f80dad8772daeec6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000628v1_decoy LN:1352 M5:474bb6fe17aa82dbe052602181e2c342 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000629v1_decoy LN:1345 M5:be38a1cda1a6e1ae5e323c69f41169ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000630v1_decoy LN:1344 M5:5f167804d39afced5ca6f11bdfc4e79e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000631v1_decoy LN:1344 M5:a8c1265cc335c37e42363c32f7004283 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000632v1_decoy LN:1342 M5:7aad5f98492b8fca78e060b6be39462a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000633v1_decoy LN:1342 M5:f3ffd07c1b2dd961b6182008cc89dca9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000634v1_decoy LN:1336 M5:64e80f53b6b20fe69e1f570c4bf46bdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000635v1_decoy LN:1334 M5:49441fe73d5a6c1424175db5c183d5f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000636v1_decoy LN:1334 M5:7d75d91acde1b12b627eec4355428b3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000637v1_decoy LN:1333 M5:e4ece619ebb5ab86de6fab33b38d5481 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000638v1_decoy LN:1332 M5:7135701f246e43df19f5aba147d6ffe4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000639v1_decoy LN:1328 M5:fbb7b0f582ebca6f3cef730730d1ba0a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000640v1_decoy LN:1328 M5:62be463086e26b1df7d57735080ccdad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000641v1_decoy LN:1328 M5:14eb9b729a7e8e201661d1337b6c986d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000642v1_decoy LN:1327 M5:7758f1665792870c0c087b3c3dfa6f6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000643v1_decoy LN:1325 M5:4e1088e1aa76be60fab929e87bddd522 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000644v1_decoy LN:1322 M5:af3b1f03c49d83adafa3d8f2d6874c24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000645v1_decoy LN:1320 M5:446dcf62ddc2538c64ec6aa731ea150b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000646v1_decoy LN:1319 M5:56748fdfa4712830c7af4c68f4759228 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000647v1_decoy LN:1318 M5:8eaa0a6e0ed839c74aab55d260c6fc46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000648v1_decoy LN:1315 M5:56712d4e2ff952bae0ab0ddd610f253d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000649v1_decoy LN:1314 M5:d3e12fcc460574d688e5bae5d2442b1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000650v1_decoy LN:1313 M5:b547545a4b0358b765cecfc76a24f5c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000651v1_decoy LN:1313 M5:6b644257e459efb9331cbf248eb360a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000652v1_decoy LN:1312 M5:49650bf9d34993f3734ff8be22a21d8c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000653v1_decoy LN:1310 M5:a4ce42eeaf93dc12fd2c1d548ecb8ec1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000654v1_decoy LN:1309 M5:b6aa3601c472a96642590f2556fd60f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000655v1_decoy LN:1309 M5:86d4783a9574d129cdf2d96b81899a69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000656v1_decoy LN:1307 M5:f7f361b3f660b392044fad24ffae29fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000657v1_decoy LN:1307 M5:754ff5c46ace6aa00b6225c1395948bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000658v1_decoy LN:1305 M5:93cb281ea84aef36a85cb9950604dd0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000659v1_decoy LN:1304 M5:12d269dc2ce62735236ae94e1f20075b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000660v1_decoy LN:1303 M5:48fbe06e5f32a0378e9bb9f94280b087 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000661v1_decoy LN:1302 M5:21449d3d68824fc9c13706be068c9b2d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000662v1_decoy LN:1302 M5:8b61707178e6e8435c171f9af9103412 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000663v1_decoy LN:1301 M5:00401a0950f66bdb8079810e7cd7ea17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000664v1_decoy LN:1301 M5:da9b6adf8123090f1132c9b33c3aa8e1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000665v1_decoy LN:1300 M5:a6e3addcf5e77b6d35b918c3d4b07184 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000666v1_decoy LN:1299 M5:74108c185dba89f41809a3192d33baec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000667v1_decoy LN:1297 M5:4aa3c2f67ac1c8f495575e8560808f7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000668v1_decoy LN:1295 M5:c0e3f662ea9b92faded08da52ec79ba1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000669v1_decoy LN:1294 M5:acb9567104820929d7f17199b614c243 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000670v1_decoy LN:1293 M5:d58180a24710ca20cd90857426fba9cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000671v1_decoy LN:1291 M5:0021de79f69c7e6f7be872209251d8a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000672v1_decoy LN:1291 M5:ec57c06e1967b151af9716613687bf06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000673v1_decoy LN:1289 M5:9e48e5eb17a1e58951e1b652dd9f44d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000674v1_decoy LN:1288 M5:93d19765c9dd00919c6cfa7d93347c46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000675v1_decoy LN:1288 M5:71235a1d58334d223edcaa90fefacfdd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000676v1_decoy LN:1287 M5:a76f2f42317a6ab2cb892a72174adb45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000677v1_decoy LN:1287 M5:f334340b46a994fa73de757843dce680 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000678v1_decoy LN:1287 M5:e2d24061f1801ed1293ec0b863363b3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000679v1_decoy LN:1286 M5:23647de37c2ff39cd67aaef8a5580814 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000680v1_decoy LN:1283 M5:1dbcdc4ac713f81604583fa6b6106bb4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000681v1_decoy LN:1281 M5:bb3d85c707984bea66a348264a710aa3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000682v1_decoy LN:1277 M5:5c2e53fdc0f5cd26c68ab66f14416b3b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000683v1_decoy LN:1274 M5:f1d20984b2bcf2b2b0e005c54fff514a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000684v1_decoy LN:1270 M5:0e776546d49756c788dae25d1787fb00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000685v1_decoy LN:1267 M5:e52038740e15a18dd9b464342630faed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000686v1_decoy LN:1266 M5:9b437657983b2138524382ca0130b93b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000687v1_decoy LN:1260 M5:0a5f065c6de74f1ae3424582269c48da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000688v1_decoy LN:1259 M5:78788ef8ba3807f9a105d4a9a55a3c65 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000689v1_decoy LN:1258 M5:4860c125f57848f7afe40d583f7477ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000690v1_decoy LN:1258 M5:2713e855b2f8f1734239f0523b6200ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000691v1_decoy LN:1258 M5:619c058b99f936b291f949550793c9f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000692v1_decoy LN:1256 M5:c21ff94783721fb59f3db81a80c1e0d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000693v1_decoy LN:1255 M5:8c83cfffa25879e35ab28858fa33d70a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000694v1_decoy LN:1254 M5:b0caa977dfdfb73b5e1a58b423ff4a8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000695v1_decoy LN:1254 M5:e2dd86e353ba1cebb9ee6ed4e35b54f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000696v1_decoy LN:1253 M5:5036e5442498d2a7fdb0f573f258cd60 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000697v1_decoy LN:1250 M5:a082ce0af37351135354a3448f4e1e21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000698v1_decoy LN:1249 M5:d47b3d78169ea825e882ac16b3117146 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000699v1_decoy LN:1248 M5:208d107183937e7c221f38693342e39d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000700v1_decoy LN:1248 M5:0f92b053b9f7b2d596ce45e73486fe32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000701v1_decoy LN:1247 M5:38be4b2a0f1e5aa9c09b662eee046034 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000702v1_decoy LN:1242 M5:05cde0965d9330b1048d4d3c3d3d700c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000703v1_decoy LN:1242 M5:0861806c0301513ad259fe070d39e0dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000704v1_decoy LN:1241 M5:364bee56428db3836e130cf7a18b713d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000705v1_decoy LN:1241 M5:854cf124e49f41012ddbad98fa6676d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000706v1_decoy LN:1241 M5:1f8ca7e72524d4e37948801d7b5a8afe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000707v1_decoy LN:1239 M5:f24cb34121b984ca68855edd34574629 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000708v1_decoy LN:1238 M5:d209df786f3b1d1ad941874631548588 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000709v1_decoy LN:1237 M5:b4a98205bda995826a33cefc257ca695 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000710v1_decoy LN:1236 M5:e889a8feacb30e59ab4f4b36b7d9c1e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000711v1_decoy LN:1235 M5:1d00a257b98ad31640bb5ba492b84179 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000712v1_decoy LN:1234 M5:33721b9972767397365deed771dbf073 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000713v1_decoy LN:1234 M5:036d24e0ed6b0b50f1cfbd3f587c4cc2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000714v1_decoy LN:1234 M5:a7ddd63607d708a84ae2b88906989e89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000715v1_decoy LN:1233 M5:9eac1d4d910f6c899ce66d778f2f1151 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000716v1_decoy LN:1232 M5:0b8643f1a24c79b3ecdd1a67db0cc86a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000717v1_decoy LN:1232 M5:c5a5a989ac7252d8392936662ea77847 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000718v1_decoy LN:1231 M5:ac3030bfebae64338eb50915e6c8bd90 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000719v1_decoy LN:1230 M5:57901862b298a5add08f5cca114254dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000720v1_decoy LN:1228 M5:425fcf156dc340ca958e76e678b5b1e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000721v1_decoy LN:1227 M5:8202dba5ecf55e01c2eaa23654a65b28 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000722v1_decoy LN:1227 M5:84410313c42ed3e74a0db6afd68aea27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000723v1_decoy LN:1226 M5:abbfddc0795df55c6e15788256752132 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000724v1_decoy LN:1224 M5:a62c3a744a6da312ddb499103c0e5dd1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000725v1_decoy LN:1224 M5:8de8180c87074519ebeedefce23a5bd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000726v1_decoy LN:1220 M5:f04fd8bfac48f74f1ba90d5f1730840b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000727v1_decoy LN:1220 M5:f0dfe089c3f7b049c98dc63e934ff352 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000728v1_decoy LN:1219 M5:e7c7be67e8022eceeb1748e1bc896244 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000729v1_decoy LN:1217 M5:d54b84b201adc65a8f6c321c0a9b82b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000730v1_decoy LN:1216 M5:2a49da07788e874c277958962ecb0df3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000731v1_decoy LN:1215 M5:c382bd37421a81163d88288a6f7cde1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000732v1_decoy LN:1214 M5:2987b50923434c160ee2c370f1a0665f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000733v1_decoy LN:1214 M5:2cef32c11c190dec442c6760ce3b95d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000734v1_decoy LN:1214 M5:3320cf99748892c60e02c948326286eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000735v1_decoy LN:1213 M5:ed1d21ad71609ae43a9b6bcebb49639f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000736v1_decoy LN:1212 M5:b586f3157d6a08d059ff88c2a8b09110 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000737v1_decoy LN:1209 M5:7ba7bce4d6531a5524c73a86b5bedbb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000738v1_decoy LN:1208 M5:04bd45b790033b8311ed85dea3015e01 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000739v1_decoy LN:1207 M5:347ce8f1f6a746892189ab8494e8aaa8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000740v1_decoy LN:1207 M5:707de4a5497ea34c4e4f0bc0c85de3fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000741v1_decoy LN:1207 M5:be1fcf2149a75c654ccdcd7bdf0f6fbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000742v1_decoy LN:1206 M5:4e1effd0109053a328e58366f9f97082 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000743v1_decoy LN:1206 M5:9f9dfe453260eb10828d18745f7f5dcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000744v1_decoy LN:1205 M5:855e900b59e0654686ce1a3d9955d650 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000745v1_decoy LN:1205 M5:137e80b53681aa0957f4489dc3bebca5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000746v1_decoy LN:1204 M5:d5ccfc0afa0a8ffeb39566a3edbd5831 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000747v1_decoy LN:1204 M5:2d8e3051fce1f6364064a61a1015f902 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000748v1_decoy LN:1204 M5:4ae1aece0937c17d93e0b54aab43444f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000749v1_decoy LN:1203 M5:108a33f55fef0274c3265bbadc509de9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000750v1_decoy LN:1201 M5:6ca12ea72ce31843c3a72b1519b0f252 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000751v1_decoy LN:1201 M5:85e6c0c98d00cefe52487084168379f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000752v1_decoy LN:1200 M5:6db13990bde5be0862c8524915fea770 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000753v1_decoy LN:1200 M5:e2708863bd36e41c2e8ea5a6b3ec5110 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000754v1_decoy LN:1199 M5:beae786e8598f79032fc8c16208aeb00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000755v1_decoy LN:1198 M5:0a56caad49417b3587e394dcf70fb6f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000756v1_decoy LN:1197 M5:7f43dc6c55686b78a0ca14bb83eaf8c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000757v1_decoy LN:1196 M5:ed9e0446d6bb51755db408158805d507 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000758v1_decoy LN:1195 M5:cbb14c85e5696a49ce697e346634e422 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000759v1_decoy LN:1194 M5:af5aad17aff7705f0fd96e58a32a59d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000760v1_decoy LN:1194 M5:b1a7eab6e2cc0e62933274443fed0a24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000761v1_decoy LN:1191 M5:23fae8306c0b4a5bf7d0941294736058 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000762v1_decoy LN:1189 M5:5b7ba9e9888da831b0aa4565b412bcc6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000763v1_decoy LN:1186 M5:b39edd9fdfea3b1d9644fa805f33a2b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000764v1_decoy LN:1186 M5:ad284b4b4daf92a4456309e77375468a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000765v1_decoy LN:1184 M5:98516b9021a46bcc79d7386ac6dc34c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000766v1_decoy LN:1183 M5:64d3e55e37f2e86e15c96ef1d879bba1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000767v1_decoy LN:1183 M5:bb4656c8fbc2436252c45a1da9ec9583 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000768v1_decoy LN:1182 M5:fef2856f46d2c7724e666eafdd402ebc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000769v1_decoy LN:1181 M5:987931dd2bf6bac95e341d207f146623 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000770v1_decoy LN:1181 M5:eac4c9bfba221a54e6f9e50cbda276fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000771v1_decoy LN:1181 M5:cf5eee43e4ec7820ecca7ad7864f52ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000772v1_decoy LN:1181 M5:0b58fd78215049a25bf9904c8d82de05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000773v1_decoy LN:1179 M5:bbff47313bf9094c388338d41292f0da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000774v1_decoy LN:1178 M5:0e47d0853364f93c33da6738f79bd494 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000775v1_decoy LN:1178 M5:f12f849bba7e72b4f1f60d7aad6a21a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000776v1_decoy LN:1177 M5:1b10327e63ec134bcc76d1d55f9e78d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000777v1_decoy LN:1177 M5:c87caf65afb409c1775c034ed6b2c791 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000778v1_decoy LN:1171 M5:d25c5de51ec9619b03cce2f95298e8a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000779v1_decoy LN:1171 M5:3e4f5e7a0753a3239b3bc0d49eeaf461 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000780v1_decoy LN:1171 M5:b988438edbb2bbad2f8c1dd32c116f59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000781v1_decoy LN:1170 M5:41b5e67b7143e5bf81dbb61b81a230a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000782v1_decoy LN:1170 M5:ac3de3666d0730b5fb7f44a84f9c4d1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000783v1_decoy LN:1167 M5:7187d1e3ed138db9f1610a9c4dbefeb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000784v1_decoy LN:1167 M5:a1f7192900c80cfabbb39df8dc8d3c48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000785v1_decoy LN:1167 M5:80ff0c82d9a5bc156c3c0bf340bd68ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000786v1_decoy LN:1165 M5:688f5bf8eb90c874eda7108fcf283889 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000787v1_decoy LN:1165 M5:f768117d9e7c2526c123ea228e2cafe9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000788v1_decoy LN:1162 M5:039765c983a107557b8c3ec0a025e44c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000789v1_decoy LN:1157 M5:220dbbeab5a5d61415cdfde9f50b5766 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000790v1_decoy LN:1156 M5:23d66ea0a7a7d160c9413d93f5ad0162 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000791v1_decoy LN:1156 M5:5cb979a509d0b6052c6e0a55be36cc00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000792v1_decoy LN:1154 M5:b0ee554cec6a7fca1a6556932643d8a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000793v1_decoy LN:1154 M5:0370a3a0105a0683cbd802403418f170 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000794v1_decoy LN:1151 M5:8e0e1ffe5b02de8878bd4d564bb6323c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000795v1_decoy LN:1151 M5:7bd0473f38ad03caa52a001a9fbb7354 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000796v1_decoy LN:1150 M5:5a37e3660ee2c75c170b2b5b40e9fb6b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000797v1_decoy LN:1150 M5:490b01f6455790bd5df9ffc337520f37 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000798v1_decoy LN:1147 M5:20582882471f3bed3cd0120b82323ac3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000799v1_decoy LN:1147 M5:0e5917e383190727d973a070137a2fbc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000800v1_decoy LN:1146 M5:4bd3ad205dd76c8fb5e52879cad2ae96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000801v1_decoy LN:1144 M5:b97e8d5a835434eb2a718b9e61b8108e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000802v1_decoy LN:1144 M5:2df1004e75f2e124d3578d82432b9495 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000803v1_decoy LN:1143 M5:f38f2b568b969edfffe4cb768ffbf1f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000804v1_decoy LN:1142 M5:9aab8eca5e4d310eded1b7375ddc7cf6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000805v1_decoy LN:1141 M5:9d60d12e15605e5bdc4e95d5507c5fbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000806v1_decoy LN:1141 M5:ed137b8aa6491c9545e9486d7412e617 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000807v1_decoy LN:1140 M5:153c981d613562052e1fb0b115c4534f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000808v1_decoy LN:1138 M5:0338a9928d761051eb989aba5a478df1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000809v1_decoy LN:1134 M5:58756cfdfe491443b22624377976b379 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000810v1_decoy LN:1134 M5:684bc9fdb4e26e632a8183d8802beedf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000811v1_decoy LN:1132 M5:cbe47496e2df2406ca4e66332ba1ec10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000812v1_decoy LN:1131 M5:4408dcacff9d3e25b64da0a9935a7bc3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000813v1_decoy LN:1131 M5:58cc2832c5530babe80d72360b82afcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000814v1_decoy LN:1130 M5:c537aaab4d2fffc792fff332ba26df17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000815v1_decoy LN:1127 M5:c10ad449537826ed9790a8e7a91cc9f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000816v1_decoy LN:1126 M5:43067a55481ed1a3a07a02ad65eaa2df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000817v1_decoy LN:1124 M5:68a35e6dd8db1522069b2a5cee954207 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000818v1_decoy LN:1122 M5:488cfcbe81f47dcfda704c5c28ebbe03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000819v1_decoy LN:1122 M5:de91661f937117bf675c5f21a54ab668 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000820v1_decoy LN:1121 M5:5e6a5620500506981d3ab73624f63d9e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000821v1_decoy LN:1119 M5:fb748af1360cb775a390f0e931dd02b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000822v1_decoy LN:1119 M5:6b4f3cf5f29db2ef1bddb02c5828ce30 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000823v1_decoy LN:1119 M5:90f491e70c191edb78a37852f165ac39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000824v1_decoy LN:1119 M5:53358ae1c3833697bd5f0eb0f8ac79d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000825v1_decoy LN:1118 M5:e36d0f228ae617024efb91c918776dbc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000826v1_decoy LN:1116 M5:28d254c1b706d0bf3b10df07746930cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000827v1_decoy LN:1116 M5:08d17cf8bbbea61863d1111ebec35b21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000828v1_decoy LN:1115 M5:6ab6da5d7d22274a6ed522846b55ebc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000829v1_decoy LN:1115 M5:798a4b9e0b964f40d8c23e5cc3336db7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000830v1_decoy LN:1115 M5:9cbd8613556330a85d27a64185ea84cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000831v1_decoy LN:1114 M5:83cc1a5967022f8e841c81fe75d58ffd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000832v1_decoy LN:1113 M5:01c1108b447f8fc1ac66a83a185cf320 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000833v1_decoy LN:1113 M5:7f89f5d60ad86ff56b75b22948d678c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000834v1_decoy LN:1110 M5:5a70b2a58e433469ccb66822189128d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000835v1_decoy LN:1110 M5:1e38e29d6d62fd249bf64655d6f81862 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000836v1_decoy LN:1109 M5:96a1d9adc17f059b56e67cfb6937a345 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000837v1_decoy LN:1108 M5:45ea81c798eb106c5436246caa66b2ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000838v1_decoy LN:1107 M5:1814f68b7f841bfe03b315aa32382c00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000839v1_decoy LN:1107 M5:48441754ca4953c7e3a4a0c8d47ee1e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000840v1_decoy LN:1107 M5:7f28434a41e01b99a0d611c226b8dae7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000841v1_decoy LN:1107 M5:d18ae976cb8e092b2164fb5cf8e96c57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000842v1_decoy LN:1106 M5:7d6bf428559a5a4c3e493b755ebe5524 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000843v1_decoy LN:1103 M5:c32717ad22315f9c16c5ec2cc21c930d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000844v1_decoy LN:1103 M5:a1754553d128a5a63a67e63de2fd3738 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000845v1_decoy LN:1103 M5:39f91ddc96023a6c28b74bce8ab2612c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000846v1_decoy LN:1100 M5:82964c295c4313b285a6149d3c1566a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000847v1_decoy LN:1099 M5:b6ad0bd8376da6c84aad8cf5fe7bc6d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000848v1_decoy LN:1098 M5:e14ec564d8038b588e7bbcc8b2ec0a9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000849v1_decoy LN:1097 M5:7307c9a55c6540dd0e2d41858ae31cbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000850v1_decoy LN:1096 M5:a2998a406a8123e41e824e2ede54ed2b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000851v1_decoy LN:1096 M5:e62b4e85fecea83baffc447a08ca6785 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000852v1_decoy LN:1094 M5:6e5c8b4b68744e944eab55ecb8fb5844 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000853v1_decoy LN:1093 M5:24331159404d19f94c9138da50577e51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000854v1_decoy LN:1090 M5:2929cff1249a75eefb4cfffd96d62464 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000855v1_decoy LN:1088 M5:fbb037cbafc5f686b9ab73e07f0ffcfe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000856v1_decoy LN:1087 M5:211034f9737003efb857df7e977d5277 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000857v1_decoy LN:1086 M5:368e68935f97965228ac78bb2aae203c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000858v1_decoy LN:1085 M5:ce2ac36f0b0097282b1bff60c135f74e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000859v1_decoy LN:1084 M5:3418f70e7ae002b97228bff0e077080b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000860v1_decoy LN:1084 M5:b8e4715e539923de16e145b5eac6191e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000861v1_decoy LN:1084 M5:fc5500f691a93bcad35796e610743159 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000862v1_decoy LN:1084 M5:e59c0bee43efc00f925e98deafcb1339 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000863v1_decoy LN:1083 M5:3f45413c28190577d1c4837a73d4a27a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000864v1_decoy LN:1083 M5:5e5b283ed71b787f5a90e2a85cae8fcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000865v1_decoy LN:1082 M5:50f12f0b974f354351bb88c197b21126 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000866v1_decoy LN:1082 M5:d678f152fcc7e46daafe921a0a41337d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000867v1_decoy LN:1081 M5:b861e354b7da07ac9ff8f421b6caf341 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000868v1_decoy LN:1081 M5:0eb25de463e630b62cb8c32bb42f6ad5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000869v1_decoy LN:1079 M5:47743f7eabd8f065bf223bf5327dc730 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000870v1_decoy LN:1076 M5:43ee859a8e75e455f0f1bdbfb155b6c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000871v1_decoy LN:1074 M5:8de0f0af578c623d46ac53461a51a3cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000872v1_decoy LN:1073 M5:788f48af377f20246f7f9a21e90b0e0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000873v1_decoy LN:1073 M5:45c2f5e2b5413134f6030f49be58ba4f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000874v1_decoy LN:1071 M5:86a4e6ad2956475caac9b348e6e7f8b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000875v1_decoy LN:1069 M5:22ee1b95d0dcca48ee2f77ec8135e0d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000876v1_decoy LN:1067 M5:3f76ce94efafe5dd1634e6d51aa6d1d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000877v1_decoy LN:1067 M5:5bc259606f224eb610c64d5e5d55321b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000878v1_decoy LN:1067 M5:9449555579bbe1f92046e6c9b1d6eb4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000879v1_decoy LN:1066 M5:2777151312e10fd89af514515090fcca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000880v1_decoy LN:1065 M5:ae8283b9a8386e65951be3f19e3b7006 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000881v1_decoy LN:1065 M5:79e7ca97d9a943a065f8d902b9b01244 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000882v1_decoy LN:1065 M5:0991862c1ee6015ab6ba1008ec3ff69d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000883v1_decoy LN:1065 M5:d68bf7942659eebe8f4973154fd1da22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000884v1_decoy LN:1065 M5:dd08ea8e4c5ee4d1f942b2dce2296cbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000885v1_decoy LN:1064 M5:a5179394ece1fe9e2392cac1241bcacf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000886v1_decoy LN:1064 M5:5ad23055bdc140edb211af99bf7d76e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000887v1_decoy LN:1064 M5:5fb9770dcbf52d1a7f41c9d235a9ceeb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000888v1_decoy LN:1063 M5:68844d1f612bcae36302b17758f78e86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000889v1_decoy LN:1062 M5:844d181d05473e9b6d06b5defabf50d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000890v1_decoy LN:1062 M5:224848a8b0947ecc656065423b7862ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000891v1_decoy LN:1062 M5:de33c1fe76fea17846a96ea7bc9e91f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000892v1_decoy LN:1061 M5:919160e2c6fec7a7c92d823d76b66027 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000893v1_decoy LN:1060 M5:f79c0acfc167625b085df24f5058e8f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000894v1_decoy LN:1057 M5:6cae16f687b6453bea4343f3a72ea5d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000895v1_decoy LN:1057 M5:7b95591d319231c96c2db2ab196e568c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000896v1_decoy LN:1056 M5:59477a60f18aa435be9cd8e8cb8958fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000897v1_decoy LN:1055 M5:ef9e2ac86b6dc21510af5a157ffdd9a7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000898v1_decoy LN:1055 M5:8a426cfbaa95d3a4ff9de0b8cc401ed0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000899v1_decoy LN:1055 M5:071ea5ccf103c1e5bc64476b69297cae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000900v1_decoy LN:1055 M5:a0183c0c525e9830c2487ba397d48984 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000901v1_decoy LN:1054 M5:fbc0b340afbabfc63b03b8ec4caf77ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000902v1_decoy LN:1051 M5:5f5a077b53495abe7fc001c49c8b9306 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000903v1_decoy LN:1050 M5:69420a1791c126a89681a6620ca82d48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000904v1_decoy LN:1050 M5:9c4f6e5286d911f86ede7780174ee24a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000905v1_decoy LN:1049 M5:0940c85e47df41bd6052ec8f8ca76da3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000906v1_decoy LN:1048 M5:d1bb56cbbe04f366cb8b9e00e16c0292 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000907v1_decoy LN:1047 M5:b1bfe8c8a961d7d57914f4d7c4244100 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000908v1_decoy LN:1046 M5:e48424ce325e8f78e32af41d56e93243 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000909v1_decoy LN:1046 M5:2b08cbae6f429b208c980cf721fc1a43 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000910v1_decoy LN:1046 M5:43dfe59c93ea059ca8557bb58d0d3e39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000911v1_decoy LN:1045 M5:4a62b434c567f91554aba4fe9d29bee5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000912v1_decoy LN:1045 M5:9dda9f1dca0f324d3ec28a2f95399b6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000913v1_decoy LN:1045 M5:f7d06c828a959e093ca5c4fefcaed79d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000914v1_decoy LN:1044 M5:9565e8a0c6d2b4911f44a2dec3319fec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000915v1_decoy LN:1042 M5:63910bd693964213823ca9ff1e270883 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000916v1_decoy LN:1041 M5:9350358a6726a178c8e3c5c038a58b5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000917v1_decoy LN:1039 M5:1c73f73eb55cd6290be7beede9ad10f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000918v1_decoy LN:1039 M5:95035075514c5d5ad7852ba2c1b2b649 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000919v1_decoy LN:1038 M5:f8b064906cddf6b316b6aee040120925 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000920v1_decoy LN:1036 M5:510d0277b9afc44d0f3a07b3327a111d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000921v1_decoy LN:1036 M5:d7a9e2e36d916e57d735f657035a9829 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000922v1_decoy LN:1035 M5:318ac9befd9a2449cae3c371dec8e628 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000923v1_decoy LN:1035 M5:6af821ff48f6593ccd322ce697bdc253 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000924v1_decoy LN:1033 M5:bdd1f96a69f748c2a2fc4b21e31c2f06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000925v1_decoy LN:1032 M5:5b23ae1b5786a5a5eadc92b69bd836c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000926v1_decoy LN:1031 M5:b06aa5a4fb487a467429373242a18923 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000927v1_decoy LN:1031 M5:6fd21c6cec0c8086aa77d26c6d200aeb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000928v1_decoy LN:1031 M5:196c591c8593f2c090224ae6cec80358 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000929v1_decoy LN:1027 M5:b7eb33328daf9d0ae316619a61384cec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000930v1_decoy LN:1027 M5:a1112db1101bde90d172ceb0b455adc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000931v1_decoy LN:1026 M5:42be32c5547cde39b2ccc77ac8e41c3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000932v1_decoy LN:1026 M5:62f5a154eeb5e3613de4f255efe75565 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000933v1_decoy LN:1024 M5:69e6c66e0db5f669e7762df739c9bba6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000934v1_decoy LN:1024 M5:f2b5de034be298d37051f37061d1748a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000935v1_decoy LN:1022 M5:d81ab37920ea303d70fec80162569190 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000936v1_decoy LN:1022 M5:08f1fd0b0e3cb4204a68c0bd7c5c57a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000937v1_decoy LN:1021 M5:4c13817a5ba74eee0c03aada914a0243 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000938v1_decoy LN:1020 M5:e4ef90447f68425ac775770584c2ac6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000939v1_decoy LN:1019 M5:d7d108b06883f65ce1ec9f6a55b4842e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000940v1_decoy LN:1018 M5:3e1e177644a21aa70ff44fba9753313c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000941v1_decoy LN:1018 M5:6bff6cc8151a99c46a864ea703c2f8b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000942v1_decoy LN:1018 M5:e7f0466b453823ed7d075d4a2ede4a7b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000943v1_decoy LN:1016 M5:3d62e68db3dcf0e169c55174dcbd79c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000944v1_decoy LN:1010 M5:7b808bb60e41db8c1149f10d7bd5465e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000945v1_decoy LN:1010 M5:8f606e0943101b0656668a2ae35e055f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000946v1_decoy LN:1009 M5:5af16ec72873d3cf402dd411e1bbaafa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000947v1_decoy LN:1008 M5:ccfac7e6bd5f5a5fb98e773922be5b3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000948v1_decoy LN:1007 M5:d5e4ec92647dc97d7ca5c479effc5698 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000949v1_decoy LN:1006 M5:53c640d8a27c49f44643fa6cff64c7bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000950v1_decoy LN:1005 M5:4f20464a0e34b4c139f58567dac67a9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000951v1_decoy LN:1005 M5:47b4982ddfd84f1b626e9ea7b0859169 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000952v1_decoy LN:1004 M5:77403eb0765e6a6422307122ee3a0544 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000953v1_decoy LN:1004 M5:74caf00415bd1b5764ea6082c0945b27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000954v1_decoy LN:1003 M5:811dd1c7e02a779772cb0adcd330822d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000955v1_decoy LN:1003 M5:b217fa3505a5024cd26ddcf42d514a4d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000956v1_decoy LN:1003 M5:c90b2e71160e8f5cd6d23a740a17841b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000957v1_decoy LN:1003 M5:3bf126803f3335d9227e753cb43060dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000958v1_decoy LN:1002 M5:3904df1efaf5438d8e060141cf4dd6a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000959v1_decoy LN:1002 M5:ab5ef802456142b25705723663909e35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000960v1_decoy LN:1000 M5:ff514a3d2ae42b584daf88b9a9a8751d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000961v1_decoy LN:1000 M5:eb02c1a37ede0d1a737a6c8c984eb06e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000962v1_decoy LN:8358 M5:567a758298b590bb1f4a159d81b84283 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000963v1_decoy LN:7932 M5:fd0a26e270577d3a6cc4cb9256e21cc2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000964v1_decoy LN:6846 M5:4fd9f0f9e88fcd125702c11dfc2c4efc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000965v1_decoy LN:4591 M5:31483ec110747cfcac4dc1e36e8758ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000966v1_decoy LN:4041 M5:f4f7ba029902c50fa77ed2b9966eb1a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000967v1_decoy LN:3841 M5:00a9379bf89f4556f66988ab0193b4c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000968v1_decoy LN:3754 M5:bb2217ed56094a266a3fb1b82e6c6a23 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000969v1_decoy LN:3743 M5:5332a570edd08ee710cafaec398e0156 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000970v1_decoy LN:3702 M5:2b25e772f95c73582eacc01e9a048d9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000971v1_decoy LN:3625 M5:44cc5ae081c41e1c77f2043b88c70e0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000972v1_decoy LN:3529 M5:9c1927ed8f09b5ddff51f2f25450a4a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000973v1_decoy LN:3508 M5:04e36a548c184b404c00b7841ba45394 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000974v1_decoy LN:3359 M5:43e1fbfc042ef8b79879bd53c3b27521 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000975v1_decoy LN:3320 M5:4c9cce705cc18e643a96d433b0f0d80d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000976v1_decoy LN:3231 M5:090a5929ce6079dacc5408a9a7212f91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000977v1_decoy LN:3220 M5:b353222bd8f3e04b305911608d5b8b16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000978v1_decoy LN:3212 M5:d21eaa3001500aa078c0457aa0ecb160 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000979v1_decoy LN:3192 M5:87ce752d8b9611f39e6371d84b00dd68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000980v1_decoy LN:3092 M5:51fba58b7e482359134618d7115ef0b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000981v1_decoy LN:3087 M5:86e1c20fe0c0fc2ee5a4627c9dc91dde AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000982v1_decoy LN:3048 M5:0f4f9a676207d67aa7b835ec767daa3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000983v1_decoy LN:3005 M5:8cf60855c69aaa947ecffc2d85f7b836 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000984v1_decoy LN:3004 M5:1fe6d0e0f45dd1c103c83d965f4d065f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000985v1_decoy LN:2959 M5:5734404ace148ab496a0589c177d68d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000986v1_decoy LN:2934 M5:6091b4163a2558a3b376861ba46e49b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000987v1_decoy LN:2933 M5:867d88d0d6a7b4576b5f40df8aee32a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000988v1_decoy LN:2827 M5:fc01429a43e70e9f45d2e9b183f1cbb5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000989v1_decoy LN:2794 M5:8c97ce716667af6e7bf7b16598a2d1a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000990v1_decoy LN:2749 M5:460d8510eb2de1d5521b6303183eca65 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000991v1_decoy LN:2745 M5:bcb193217c039f3d327b106f7bbb1eb2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000992v1_decoy LN:2733 M5:38d3109378fc051e0d6d30c9c768c361 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000993v1_decoy LN:2698 M5:7909dcbf170e075fd5ae77f2de6658bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000994v1_decoy LN:2665 M5:90d637dd87631542f98b8a2fb31e45d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000995v1_decoy LN:2634 M5:a5125437bf818a2f4ece1a2cb7ad4e5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000996v1_decoy LN:2492 M5:82de7c0346b508963d47eaef107ba2ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000997v1_decoy LN:2489 M5:904eab4180cdf8accc4e926f65892e16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000998v1_decoy LN:2468 M5:5a16ed756cd3e8451225c0c89c299ac3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000999v1_decoy LN:2414 M5:a7f82c5206197f2b60bf6e21e8406ff1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001000v1_decoy LN:2395 M5:fa87a3decbc163bd5c4be47f26ce4c72 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001001v1_decoy LN:2356 M5:c1764faa777d0cb7e6d10ff41a7f4d46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001002v1_decoy LN:2339 M5:a71335121d2395b90f88701d0d395b28 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001003v1_decoy LN:2310 M5:e7727f2a6ea39391478a70b270b9a4c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001004v1_decoy LN:2288 M5:27c3653c8e9470329db519a7e855887b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001005v1_decoy LN:2285 M5:07a062d63e1175496ade57cb4924ac86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001006v1_decoy LN:2269 M5:da22a2b66c30d77f9c75ac5543b82df4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001007v1_decoy LN:2253 M5:521007d0a98d89311d4fef1f850e5c3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001008v1_decoy LN:2203 M5:efd830cbd9f13d6f2e59621b80df1cc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001009v1_decoy LN:2176 M5:35223579474d332cd9c25530d391cb37 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001010v1_decoy LN:2159 M5:c6451a9867c60bb9414b9f531733227b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001011v1_decoy LN:2155 M5:c9a15197997fcc229a4ba16daaef7ab9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001012v1_decoy LN:2149 M5:8fc79f00adb9b9876fc0c760212279a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001013v1_decoy LN:2129 M5:e0053f5c6a91ee7561e587740719a89a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001014v1_decoy LN:2116 M5:c4594c9954ddda6bf892d1221deb1f5a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001015v1_decoy LN:2113 M5:a604e6df460c882c18dd0b761e7da09a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001016v1_decoy LN:2098 M5:1e7f643633169955a530300b89b41499 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001017v1_decoy LN:2066 M5:95e88f3c4f847fe97ff528408aee9885 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001018v1_decoy LN:2066 M5:50eb710c12d63d96710eead27936dbd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001019v1_decoy LN:2059 M5:80e50b65d76c95f06a65b213d6e22e3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001020v1_decoy LN:2047 M5:1e5494b45601a7dacb84814da24724db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001021v1_decoy LN:2040 M5:0fd285ea19d36ac7fbfeb49f98d0e3fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001022v1_decoy LN:2030 M5:4d3b39f0ab2f0f051d917cc94faeae9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001023v1_decoy LN:2024 M5:a4cef27d7ccd380794cbff4dd6eb41e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001024v1_decoy LN:2001 M5:e6821e55e6dbf96dd5ab53b59be17ce5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001025v1_decoy LN:1992 M5:dda157c4b492e3c1a4e277e1dab4aa7e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001026v1_decoy LN:1981 M5:4166a173f0411e5579f9d3ed8aacd959 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001027v1_decoy LN:1979 M5:88e1e86ee00ad030c8e1f25e49ad569a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001028v1_decoy LN:1957 M5:26727871d8918ce12f1e7fa8f5914c7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001029v1_decoy LN:1953 M5:9b38c1ef5a1efb5065c9f3dc102ff199 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001030v1_decoy LN:1944 M5:85264a3258514a27228a82bcec9ea08d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001031v1_decoy LN:1936 M5:a7347a7344187fa04690bfdffc33512e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001032v1_decoy LN:1932 M5:4030d4f8fc378be7ab110a327a3a7f7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001033v1_decoy LN:1882 M5:ca4279d8b8d3f3b766ec81b34c402aa0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001034v1_decoy LN:1878 M5:e5d3efe3296f7f5ffb2193bd5be2aead AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001035v1_decoy LN:1870 M5:1c898a94d86446ff18aeae6c9836d2cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001036v1_decoy LN:1821 M5:8f2121509d8a9d3e95e78ceeaca8db95 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001037v1_decoy LN:1813 M5:1111c9f5ecffa495ea2a9408094b8fb6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001038v1_decoy LN:1809 M5:0ef16d8e23134785f99146b8b3cada3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001039v1_decoy LN:1804 M5:11e7f4e8d60fef86d7fbefca0fabf5df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001040v1_decoy LN:1797 M5:42437cf6fa6210fd9b127e7487d14e4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001041v1_decoy LN:1791 M5:1b98bd8020f173b5205948481dd39658 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001042v1_decoy LN:1781 M5:7460d29d17ba264f4358d5876a383fac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001043v1_decoy LN:1766 M5:1599e276d124e4a9aa2f66a6300f8a3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001044v1_decoy LN:1764 M5:fba6f4c5474d22767649a8328d8f3670 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001045v1_decoy LN:1743 M5:8b83d468225e1a45cb1846dc726f2562 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001046v1_decoy LN:1741 M5:8adc2f7bd9e61fde6e9824026c0a2430 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001047v1_decoy LN:1709 M5:7363ff9bc2e506ad5041f70fc083e7fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001048v1_decoy LN:1706 M5:ef2492257bbf08783a4db0aecad49550 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001049v1_decoy LN:1701 M5:9c322f81502c32f0c8f405ee752a4f44 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001050v1_decoy LN:1689 M5:5fe371c4096ae41150f76981d68dacd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001051v1_decoy LN:1646 M5:ed85a7af0713ab3b3bcdf61bafeedea5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001052v1_decoy LN:1641 M5:97b84c347da74fc7614b6363ba4f28e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001053v1_decoy LN:1639 M5:dc79cb73595caf151cffe0be4286ce1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001054v1_decoy LN:1636 M5:221da4dd1119306af9f8fa1bc567f6fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001055v1_decoy LN:1632 M5:6f572e5698e138bf1e7b1edba75588f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001056v1_decoy LN:1629 M5:fd6f43c6fc2542ce63298bdd465a38a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001057v1_decoy LN:1623 M5:4a44475e85813d0b54e2afdd3aa8315b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001058v1_decoy LN:1622 M5:d30e3342b06bd2428d574ef50226a9b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001059v1_decoy LN:1622 M5:0e6aaefcfab75455e8f59e751c8d44a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001060v1_decoy LN:1619 M5:e91e56fee1ae99144354eba8e5ec571c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001061v1_decoy LN:1606 M5:e266b715eded02faa272225186a213dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001062v1_decoy LN:1593 M5:74d3a9f8a38387de10a759100154372c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001063v1_decoy LN:1592 M5:efcf64c62b2233135f5794d7b9e2f4cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001064v1_decoy LN:1558 M5:bbc8fdfa71746e3e396e745a1fc9d63d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001065v1_decoy LN:1545 M5:fc836522e323b4779fcc5b16f2d28505 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001066v1_decoy LN:1542 M5:6fe808dc84087dc7d8418eced9744173 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001067v1_decoy LN:1540 M5:9c582e02bbde278105b2764116a44ef6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001068v1_decoy LN:1529 M5:9f25be63cbf7cc5da1d1bc6fe23db799 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001069v1_decoy LN:1518 M5:772df05b40eabe6b084af8cac402aef4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001070v1_decoy LN:1515 M5:bda033712d93ab6c918ec5b0fa58f343 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001071v1_decoy LN:1513 M5:faf46f2a8ea7b8d1d0282aaf9e10141b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001072v1_decoy LN:1507 M5:12e6bce1a4e70c91a764227eafe6d229 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001073v1_decoy LN:1504 M5:c757ce71d69487d184714bb6bf879036 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001074v1_decoy LN:1499 M5:d6645febc4c0e7fef261124c74ecff8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001075v1_decoy LN:1495 M5:adf3668dcf991b59a38c281c3d7b5647 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001076v1_decoy LN:1495 M5:2edd8f2a644a90e4ca21826bb31402dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001077v1_decoy LN:1492 M5:3dc6cc3ffd2a9b7966ca3e8ea12dc81f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001078v1_decoy LN:1492 M5:308ce742886a73a84ab8cb90370451ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001079v1_decoy LN:1489 M5:39d5f26be15da228d1d38b408e0a392c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001080v1_decoy LN:1485 M5:2a52bf85b6a45c79c92a6c6027abf122 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001081v1_decoy LN:1483 M5:d22840c21eb279736a5a8262ec8a66b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001082v1_decoy LN:1473 M5:d6b57113fdeadd16b92fed725a02d12d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001083v1_decoy LN:1470 M5:5b5ff1a6c8fff55ac6ebd1d9bda4fd80 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001084v1_decoy LN:1463 M5:80030f88512ee394cc4e9a81b032e17a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001085v1_decoy LN:1460 M5:2587132a077227d0b8742ec9439f95b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001086v1_decoy LN:1458 M5:5366ad05ba9fe3bdfbc51dee8759c348 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001087v1_decoy LN:1456 M5:1d39f2ea075eca983ca23f12efc47f22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001088v1_decoy LN:1453 M5:020a82dc938b6e53e904f477268c7d5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001089v1_decoy LN:1443 M5:541cab251db4f8356953dfc20e8cb327 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001090v1_decoy LN:1441 M5:a563ca647fc20b65ba7baf52e3eb4648 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001091v1_decoy LN:1426 M5:d096cb367c98d6804b4a1b205054c9ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001092v1_decoy LN:1425 M5:4c1a5daffb2303c754e4383ec3bff31f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001093v1_decoy LN:1418 M5:5305c46f4221a62f8001b24ced994801 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001094v1_decoy LN:1413 M5:8d8667fd137515e7c5d31b0b942a7525 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001095v1_decoy LN:1413 M5:e38f0eb475fa6f2aee1b51ea785af3f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001096v1_decoy LN:1412 M5:88ee82e753efc8d4fbd5f1e02ddff9e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001097v1_decoy LN:1407 M5:732666474ada2d4fe1316edd249b2f5d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001098v1_decoy LN:1406 M5:f63dbabd25745821024183fe0082257b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001099v1_decoy LN:1396 M5:0102bc3c8078cc16bddfa125f005370a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001100v1_decoy LN:1390 M5:181bb8fe5095e667506c66e213f3b51d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001101v1_decoy LN:1382 M5:545aae1204533fcf75e6c622471d3061 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001102v1_decoy LN:1376 M5:a69102cf73d82bc4298048ee7eb0aa85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001103v1_decoy LN:1375 M5:61f67b4a0c7573bf583ae5a051e7aaf3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001104v1_decoy LN:1371 M5:4b33e5f1a51a79cdc62fd070cf874f91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001105v1_decoy LN:1367 M5:4286f9ebcff872815a9246b3a2596781 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001106v1_decoy LN:1364 M5:9a3f9b88cf1926d9c75b673647ff46c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001107v1_decoy LN:1356 M5:b54b34217f1c3efb1ba9d4477a0f2045 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001108v1_decoy LN:1355 M5:c49fb7670582bf2f81413071056f61ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001109v1_decoy LN:1352 M5:32abeff50bcab272795c72f7b7edd46e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001110v1_decoy LN:1350 M5:9660451ad55da2148a00b49a126176d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001111v1_decoy LN:1346 M5:c6722a471b0e8cb1384d59ff72cc732a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001112v1_decoy LN:1345 M5:6ffb665540f55661d5ccf40795cebd35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001113v1_decoy LN:1340 M5:e0ba11f5404075a40b0072d19c2bced2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001114v1_decoy LN:1330 M5:ccb7f39ff649bf360b5b4186cf18c01f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001115v1_decoy LN:1329 M5:c52f3a9196ca3b03d2a02680f15419e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001116v1_decoy LN:1324 M5:f07d0c07c8951023331599b2df20380d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001117v1_decoy LN:1316 M5:8195f619c45e8d571a25264aa6e7a65c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001118v1_decoy LN:1307 M5:49f9986c45cac526b89e5520a9baa4dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001119v1_decoy LN:1304 M5:fdbf4160ba84788b20bd855b64cea30f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001120v1_decoy LN:1304 M5:edc34fe61ae9a3b15bc5a4ad8d291271 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001121v1_decoy LN:1303 M5:6aea0ad92108bcebca7f7886b75bf9b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001122v1_decoy LN:1301 M5:ccf0d28aa2b30e1d8e7ef2eafe01e849 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001123v1_decoy LN:1300 M5:8bce51ab0470cf3f210d3b25582c2297 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001124v1_decoy LN:1297 M5:01e9ba63de5b8b6e1a07efb0b1179f20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001125v1_decoy LN:1296 M5:dd2148d2b631c1a7e61a18155b56698f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001126v1_decoy LN:1290 M5:9e7639e4c222198ef6503cc2e1c7577d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001127v1_decoy LN:1284 M5:1ed6768a3d0449e96d3939d08102f424 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001128v1_decoy LN:1282 M5:a8d94de0900b31bf20f7c16fa5eb29c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001129v1_decoy LN:1281 M5:30eded62211ca354db518348aab06f6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001130v1_decoy LN:1280 M5:35b60389b57134465f6d190d5955cf46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001131v1_decoy LN:1279 M5:448c65a5e874d8959bde564141823daa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001132v1_decoy LN:1272 M5:aeacf07664f294565febc34b1f8f640b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001133v1_decoy LN:1267 M5:df7730fbbc24afefb2749741f708f001 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001134v1_decoy LN:1267 M5:eb717a13171c7390c1c2e91a50473c32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001135v1_decoy LN:1266 M5:76896544c6b4b9c8bc2be23ce31fbe4f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001136v1_decoy LN:1264 M5:f3195b89752559a8a693e50e17a9d0c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001137v1_decoy LN:1264 M5:73ff474a35189bec700ddd7f25a140a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001138v1_decoy LN:1264 M5:b090d99b3c28f2a84a801018d5843220 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001139v1_decoy LN:1263 M5:a0baed3aa07a676a4fded91fd8edca4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001140v1_decoy LN:1249 M5:0e81abee1c989a0f1ceebfa48b5eacee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001141v1_decoy LN:1240 M5:ddced69f19f82a08186fb39c0354eff3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001142v1_decoy LN:1239 M5:43ea2140da380099332cf0cb0490293d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001143v1_decoy LN:1235 M5:fe6e8b59583fb141e7b203df304e688e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001144v1_decoy LN:1235 M5:7051b4e9e0386119d27af1cbe5a2c633 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001145v1_decoy LN:1233 M5:703871732eddddd1c5ade422c3a7e105 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001146v1_decoy LN:1232 M5:a281258df9fd861e7ca6bdb869fd27d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001147v1_decoy LN:1230 M5:d0939ee2b936624fd9dc5f0bb2a0cff5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001148v1_decoy LN:1226 M5:21f414046e47b5e9c13d47b9b073c6cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001149v1_decoy LN:1223 M5:6e73b42728119fe2041f6c920248ed9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001150v1_decoy LN:1214 M5:44865e67b99f28cb3bf0d5d89d259a99 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001151v1_decoy LN:1213 M5:062e3bbeb41213d0e68f944e1911f058 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001152v1_decoy LN:1211 M5:75ee5d3d8230d6db22a735709fd78e40 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001153v1_decoy LN:1209 M5:8ea8e29581777bdb7e7e2435b43a9123 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001154v1_decoy LN:1202 M5:5e4321979f4ad7f0e0630deaf3292360 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001155v1_decoy LN:1199 M5:de05fbc3c15237ca2c8d5c37f3f66dad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001156v1_decoy LN:1197 M5:81532092e3b56c94488f88b7b40525f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001157v1_decoy LN:1193 M5:ebc3be993ac1b9ab8acddc283066d160 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001158v1_decoy LN:1191 M5:9bb2ea3006a7f808a16cf62efac3d39c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001159v1_decoy LN:1187 M5:c5586dfb4606cba7d04c9bdb9b970ca3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001160v1_decoy LN:1186 M5:8ac59cbe50a76ddb4315fa75de02a202 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001161v1_decoy LN:1184 M5:1acac09b845dc4ff431c33916e819c87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001162v1_decoy LN:1184 M5:b3d7d809b498912a66c53542f6164aa9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001163v1_decoy LN:1182 M5:a06ad4e450a32bf31e43fa9794e6c635 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001164v1_decoy LN:1179 M5:2fa76b3fa2caedda0d3aa46b0071fd03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001165v1_decoy LN:1173 M5:ba3aca12cb0c76e77a2ab28a3366cc21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001166v1_decoy LN:1169 M5:7eaa353b323f8eadf6cafe90fce641bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001167v1_decoy LN:1167 M5:61d674b4fcb995535cf94aa7ee127946 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001168v1_decoy LN:1166 M5:38aa98ae17ee349012bee80c9828adfe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001169v1_decoy LN:1165 M5:bbd8f8056d59712fd77f6bbaddca57b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001170v1_decoy LN:1164 M5:807bdf141f9ae4103c56e43d949f531e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001171v1_decoy LN:1163 M5:cd8efaef0aa61647e740aa2b0e22ecd4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001172v1_decoy LN:1158 M5:3e53721e66305f3f2b4da98d998268d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001173v1_decoy LN:1158 M5:8ba71ae4bcbf61a48eabeee68296f62e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001174v1_decoy LN:1157 M5:b99ae11f6934e857cb9399ae6c41824f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001175v1_decoy LN:1157 M5:bbc9020c1846bb053b237d5b0478531d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001176v1_decoy LN:1157 M5:52700c360bd82baf97d7bc5fd70a9825 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001177v1_decoy LN:1155 M5:8e366717b85c08e01d0acc612724c6b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001178v1_decoy LN:1154 M5:53cfcde178b82cf94450e6ecc610ef24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001179v1_decoy LN:1149 M5:857f173eae9d86a6ed33b462c9607c5e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001180v1_decoy LN:1148 M5:ea231418525b44371f390a8a2a11af78 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001181v1_decoy LN:1148 M5:5a71efd43a930d44ebcb3574bb9cc031 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001182v1_decoy LN:1146 M5:c8f128dd7893d4ec3036e468d8bd6522 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001183v1_decoy LN:1144 M5:3cc0de0dd79e700a3369cf024230bc41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001184v1_decoy LN:1140 M5:fe4503df1d12b851a419140fa4b4173f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001185v1_decoy LN:1136 M5:224b91af2e2925de5d844cccabcf05ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001186v1_decoy LN:1134 M5:cfbd851609b789f2899a3be61d9127c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001187v1_decoy LN:1133 M5:463b232f53f888f5d3bf049f131ebba1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001188v1_decoy LN:1129 M5:1e9b1998943db973b5af6f8d3f8cc934 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001189v1_decoy LN:1127 M5:e780622b257020939988b4785d91218a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001190v1_decoy LN:1127 M5:7efc9fb11679f19ad35fe9371a9dbb1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001191v1_decoy LN:1118 M5:911cf50162dfce9f1bec2ae5f5ffcd74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001192v1_decoy LN:1110 M5:e8f80a36c02331c337e0b327ff8faf9f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001193v1_decoy LN:1104 M5:807ca6abca6229d97d8e363a0d01228f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001194v1_decoy LN:1104 M5:0f010a7025fef93df6efa5c5bf5a0f20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001195v1_decoy LN:1101 M5:1c2dc8ff99f4cc1ff11ad3d16b9f272a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001196v1_decoy LN:1098 M5:cb8ee97689963848f0ab08fab52ac3a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001197v1_decoy LN:1096 M5:0724eae831018e8ab18798c02eaa4f1a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001198v1_decoy LN:1094 M5:fefb3d4308c57ce507d9c50c88eaae9f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001199v1_decoy LN:1091 M5:a86fb31cc351320639079ba611824352 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001200v1_decoy LN:1089 M5:b75ffa24b8714c207a1d8de82e0812f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001201v1_decoy LN:1086 M5:0fcd8b558e0ab2ccf0b0d8bc3db23d07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001202v1_decoy LN:1085 M5:9e3b81bef0ba768284fd5cdc7b7ccf13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001203v1_decoy LN:1084 M5:35268d23224ae41608aa13bd7fdc7fdd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001204v1_decoy LN:1083 M5:a74077cc79c0fe324530f49b263b3307 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001205v1_decoy LN:1083 M5:cc88bb09f7a6ad37d5d5bf95400fc329 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001206v1_decoy LN:1079 M5:35f5a907b81ef8dbf77ec725790583dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001207v1_decoy LN:1076 M5:de787959b71e3c620c8ef7e41f6bf5b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001208v1_decoy LN:1069 M5:062313b0d5e67fee9d60100c7938397d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001209v1_decoy LN:1068 M5:93480c74c7540c0e7af8c2576e2b9dac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001210v1_decoy LN:1067 M5:8f8b744585f712f3e0f83707464cf886 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001211v1_decoy LN:1067 M5:929d9dd00e1ad8454c70511ea362a4e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001212v1_decoy LN:1067 M5:24aa3c508b845b2b1048334ce78332c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001213v1_decoy LN:1063 M5:29f3cd44f918aff7d3164e28bfddb98c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001214v1_decoy LN:1062 M5:12f432068dd357613e770c93cafe0452 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001215v1_decoy LN:1059 M5:47cb3f694ffe2d6ce654ed3b6cb5e3f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001216v1_decoy LN:1058 M5:f49ebea87cb9479f2d50f484c3217850 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001217v1_decoy LN:1058 M5:4828d8055dbb4bfe4f703bb55a2ba1f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001218v1_decoy LN:1055 M5:6feebb18b6b36dd7c31078b901101e23 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001219v1_decoy LN:1054 M5:bbd43557ef56c3c1b056aa213470e130 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001220v1_decoy LN:1054 M5:135c9383230d02f4fa50cd9ef42c51d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001221v1_decoy LN:1053 M5:bf3402855155585fef154c6f26c2f42f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001222v1_decoy LN:1053 M5:55f5597ffafbca066600c886b78932ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001223v1_decoy LN:1052 M5:777b4dde14fe0e0c5aff39ba12f25d7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001224v1_decoy LN:1051 M5:f46bdaf70049d1b5dcdcf4d9bb8bb616 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001225v1_decoy LN:1049 M5:a1ecf64987c3a271019ca2bcf6dfb797 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001226v1_decoy LN:1047 M5:c2548a36b128c6216d1689299d9bc6e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001227v1_decoy LN:1044 M5:57aaa99e04236628ee2e2c48688a28e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001228v1_decoy LN:1043 M5:8ab15ca1a985afa87ec7a9cf048505ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001229v1_decoy LN:1043 M5:ad851f750b29642813387f1b00a09791 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001230v1_decoy LN:1042 M5:794f6bbb5ddfaa81ad10c9f97e460d93 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001231v1_decoy LN:1042 M5:a88fd0ab44445757ce49b2886b3483dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001232v1_decoy LN:1041 M5:16cfe1e6b786b55e14e1c23b0010abd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001233v1_decoy LN:1040 M5:03f3627a2f7242721c8ba740808d67d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001234v1_decoy LN:1039 M5:2bd140282d454fa86b3d845400c68456 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001235v1_decoy LN:1038 M5:44928251b94a7ba7b6d78cfdc7b74903 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001236v1_decoy LN:1037 M5:0021932312a252327115aef207a22260 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001237v1_decoy LN:1037 M5:7ff32784d45f4a2b9d90d895152d8586 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001238v1_decoy LN:1035 M5:cafb9e327ae844419f531cc74ad34c2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001239v1_decoy LN:1027 M5:87b6d1b7895e0e98849ddb847f85e535 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001240v1_decoy LN:1021 M5:9f34ec8f23890b5c5ec129f3aa55fb28 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001241v1_decoy LN:1021 M5:52f88af4a5a6b8a7171df7143c99cec1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001242v1_decoy LN:1019 M5:093ab05e7ea2f698daf568af4a5f9314 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001243v1_decoy LN:1019 M5:322f96479243e771eb980526832e662f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001244v1_decoy LN:1016 M5:cf6212ddc0a137e657fec0764722dcad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001245v1_decoy LN:1014 M5:21eab5ad8f971f8753d0aee1004c1335 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001246v1_decoy LN:1013 M5:3c7ad60ac9394211fb081912b61e0f03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001247v1_decoy LN:1009 M5:09f86dc178eeb4ecffafd9734a2afd5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001248v1_decoy LN:1008 M5:43929eb34efd2bbaf9f730d06a1e4799 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001249v1_decoy LN:1007 M5:494ad809a7d99f4147c2398821be92a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001250v1_decoy LN:1004 M5:589a72200353f7537edc3a9acccfe913 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001251v1_decoy LN:1004 M5:183d62e7208aff9604bbbf27702052f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001252v1_decoy LN:1003 M5:8f62a1d759dfd3a68b63b88c50e5fa85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001253v1_decoy LN:1001 M5:0bae6492e6a77abd67b50475fa94a80d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001254v1_decoy LN:1000 M5:6c3e8a079341eb05dd337a0413754070 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001255v1_decoy LN:1000 M5:39444bfd408b4e184afe6e0476041965 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001256v1_decoy LN:1000 M5:44d266b549830722a7a161606171afd9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001257v1_decoy LN:17929 M5:329d6c2a67aaff331fd020d0c9627310 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001258v1_decoy LN:9749 M5:446c5fb7d2e7af681df8773fae61fb27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001259v1_decoy LN:8053 M5:83998e69640a5925a4a86054bce5f2ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001260v1_decoy LN:7826 M5:30c34924be761a9b459c27c08f1f85e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001261v1_decoy LN:7768 M5:32d54ea636150f497c9484a714b37b8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001262v1_decoy LN:5691 M5:ed6cb5bb44a3cfa13f40e14e70bd5fda AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001263v1_decoy LN:5444 M5:40da5cd1840a6368532eaf7e9e4dbe8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001264v1_decoy LN:5077 M5:ea25764cf81ce3030520b86de80c9758 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001265v1_decoy LN:4990 M5:be003e2c8206a15f2159483f284c898a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001266v1_decoy LN:4545 M5:f2f37f70dde8161d632cee33ff5ba435 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001267v1_decoy LN:4544 M5:2b0987b0fb64b16ed454eaff1b74be84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001268v1_decoy LN:4202 M5:78643a9f481cc635295ad076fe1e82bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001269v1_decoy LN:4195 M5:eb3537b9b9d637c74f1d3b43e5fd06c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001270v1_decoy LN:3807 M5:dc3d4eca4636d838ee52fe920bbffbfe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001271v1_decoy LN:3741 M5:dc2e137e3cac9a5093030c34fa68c2ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001272v1_decoy LN:3699 M5:db44a6f6dcd56edde16009cdfc186ccb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001273v1_decoy LN:3640 M5:5bda6902f082f2b4a6823836d5d0b48c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001274v1_decoy LN:3531 M5:2740aeab0828fa2d4f2789d353a40b8c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001275v1_decoy LN:3455 M5:03cdb0fa6bc0f56dc7266334229fca85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001276v1_decoy LN:3411 M5:2127857d57a589d739a30316547e9447 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001277v1_decoy LN:3387 M5:6b2e8c2f953822e034c233e94c710473 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001278v1_decoy LN:3358 M5:61be95906f76f332c029bcaaca590c79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001279v1_decoy LN:3285 M5:3c9976ca87f24507e195746c96cd0b4f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001280v1_decoy LN:3273 M5:8e25e50d38f8fb4cbe34cb3c83f14fc5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001281v1_decoy LN:3262 M5:c1e6634aa95f817084fc1e1eced2abad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001282v1_decoy LN:3259 M5:eded84ead1eb3b92edb6b77f27f8c4f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001283v1_decoy LN:3222 M5:08c79b1d017ddd4136c42b4cb8c16e5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001284v1_decoy LN:3127 M5:78f9666a13abcf03877f434199528e58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001285v1_decoy LN:3110 M5:19e028e80d77e35d088ea23eb52c9f68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001286v1_decoy LN:3104 M5:7f7ac2759ee408d0324f4841b60eb208 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001287v1_decoy LN:3071 M5:cea9d8679bb3eacfb8b04f6ebbf1d4da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001288v1_decoy LN:3063 M5:52b2d8ce5acdb6c47cd5cf7924b1bc24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001289v1_decoy LN:3059 M5:8f356c7dd57f009b249e5147f708ff1a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001290v1_decoy LN:2990 M5:5ef88696d7bd42f40685d222c13e3750 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001291v1_decoy LN:2986 M5:5e39db2cc6d246fa9083dae9ffacda96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001292v1_decoy LN:2928 M5:09a5226cdb11c4ba418a8bdf844de126 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001293v1_decoy LN:2922 M5:0b5455a2f20844d83c853abef966cffa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001294v1_decoy LN:2875 M5:82e9fdbdba365f9449c25c473beabbcd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001295v1_decoy LN:2859 M5:f0957c602b216d5ed18be6c38733aaf1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001296v1_decoy LN:2850 M5:183158b1e867bb90712701171e344b1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001297v1_decoy LN:2813 M5:cad265dba180a6379fe3ff72f3874c51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001298v1_decoy LN:2785 M5:b2dea38e300ff000f19f2ed7c17637ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001299v1_decoy LN:2736 M5:75d2dcbfc2388d15030e0f3414952222 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001300v1_decoy LN:2688 M5:0a109d9d73d2f16494f280419a294b45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001301v1_decoy LN:2658 M5:3d83558c586ec81407c8717d1bcf07f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001302v1_decoy LN:2643 M5:c91faf6dba1b10dadf69cfb999d96386 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001303v1_decoy LN:2618 M5:10b7e187737a04307d41acec7960dffe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001304v1_decoy LN:2605 M5:3385ffd5cef2e207dd33adbc369436c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001305v1_decoy LN:2583 M5:4906d3167051868d21d54e95faccf81d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001306v1_decoy LN:2534 M5:b315ca81b05ca7fa9b615787a3b18066 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001307v1_decoy LN:2512 M5:fa1111a29692e4566683516ee2cb9829 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001308v1_decoy LN:2500 M5:51a81bda9467ea2f1691f1136a69d3a7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001309v1_decoy LN:2481 M5:66e34aaf92c2486bd4c11db6543995e6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001310v1_decoy LN:2478 M5:c4ac4ca4a4312da763c265a008380d31 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001311v1_decoy LN:2473 M5:464b136e01802236f8fcd38d3f548eb8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001312v1_decoy LN:2467 M5:b4c84cee8bcb72c5b5260d702510937f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001313v1_decoy LN:2442 M5:9d63b837b16220bf689f455bdc1d96c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001314v1_decoy LN:2430 M5:56acbbe636fd49946581fc122c6688d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001315v1_decoy LN:2417 M5:8082a8e6410572af77ebb845f8c1df94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001316v1_decoy LN:2408 M5:9a55c9ad04d332fd58a9914422f7d836 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001317v1_decoy LN:2395 M5:c6c6115fb6941b48dc5a0abc409f5eac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001318v1_decoy LN:2352 M5:755f704f0ecbfcbbfd31d8f375c83c5b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001319v1_decoy LN:2337 M5:666a5906da91f80774c953543fb9c2c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001320v1_decoy LN:2322 M5:0f19d9949679348751b92e237ed27888 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001321v1_decoy LN:2307 M5:439c6600d966bee934ed52a2139c4687 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001322v1_decoy LN:2306 M5:27db03ab4ca9e14af33b697876aaa754 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001323v1_decoy LN:2292 M5:5fe69547ba8f4b03aaa8e71c2608fe14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001324v1_decoy LN:2271 M5:69ed4113a87f0c964d9f7515adb0dfeb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001325v1_decoy LN:2265 M5:78e3664d88395ed413c3de96d0b6aa0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001326v1_decoy LN:2260 M5:ccac0591cbfd65e9a8d51f8e05d34f2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001327v1_decoy LN:2240 M5:bc9efb2dbf8706ae63a9da56f74a5940 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001328v1_decoy LN:2238 M5:a0265d5b1e9532d8f124c363fe675206 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001329v1_decoy LN:2228 M5:422f2cb811b961c3513bb155a4a0fed0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001330v1_decoy LN:2215 M5:0d7e0facbdb02ac5cbe36bcb3f1683a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001331v1_decoy LN:2205 M5:8aeb5e1e49ad042e60fd97cbe3bd36b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001332v1_decoy LN:2191 M5:bc35b989cffe895e99e6a2fc45b7f65e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001333v1_decoy LN:2191 M5:b1ccfad8f6bde8d9d40c0b7199e30cc5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001334v1_decoy LN:2190 M5:0ae32cfb78573ddb9929745e2e7a0313 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001335v1_decoy LN:2184 M5:08a18a9ad801c228f5de34b35b58ce5f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001336v1_decoy LN:2166 M5:95badad6f81c843868ebb07d1f2d7911 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001337v1_decoy LN:2165 M5:e10a87e41dccb3ec25e99df332d5a560 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001338v1_decoy LN:2162 M5:7973da1851b09e72b47bf83450c468dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001339v1_decoy LN:2146 M5:e8939fd820d746a8792b356c04e54cce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001340v1_decoy LN:2116 M5:b67c09bdf1ed2f6a0ddd972711b36104 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001341v1_decoy LN:2112 M5:90340b9fb118df304042bb73e83ec202 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001342v1_decoy LN:2108 M5:465277293cdb0bf1897d5a17e266d354 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001343v1_decoy LN:2106 M5:ddc350523aba6f1c4b90f820904cd233 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001344v1_decoy LN:2106 M5:8c726624d2d1347ec079d4a89d25759e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001345v1_decoy LN:2106 M5:4b1887bbf69131a205c5cc1a4303c860 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001346v1_decoy LN:2097 M5:6dc99a12532b35dedef60dc2cfae35b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001347v1_decoy LN:2081 M5:12316554f4811e33853508ac262465d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001348v1_decoy LN:2058 M5:b1935843fbea95bed6588d9d700d9936 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001349v1_decoy LN:2055 M5:b013f57c784235eb32f6871dd01e5e13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001350v1_decoy LN:2054 M5:c6835412045762a4c54200ada23f30b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001351v1_decoy LN:2037 M5:50c1358c2b24fd59d5a286bbaa57818b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001352v1_decoy LN:2032 M5:45ee3ea9d4de3859645f9b51f0ca2c67 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001353v1_decoy LN:2032 M5:924e5cc3295232068cf32022f5f7e779 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001354v1_decoy LN:2020 M5:70660abb35fad19ab75c06b301d4163a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001355v1_decoy LN:2018 M5:9126be7c6d2612a65885a2fec496e2a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001356v1_decoy LN:2014 M5:847a7ff01c6682c63ad35fae4dd6f947 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001357v1_decoy LN:2001 M5:71668bc6a710ff919fd32549ee63f1f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001358v1_decoy LN:2001 M5:3288f97535eb71395eaf3b088578bc3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001359v1_decoy LN:1991 M5:b29d731dd150421c4e201d1adc92bd3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001360v1_decoy LN:1990 M5:7e91b8bc1cf2c754f8af12a28921575f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001361v1_decoy LN:1983 M5:71f21061b64aff6e62b116e9384a099a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001362v1_decoy LN:1981 M5:87dba9523601c5cfc29630be31297114 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001363v1_decoy LN:1981 M5:2a3b4956ecd118211708b9d7c428818f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001364v1_decoy LN:1979 M5:eb8501b5022cd696a32a2bff2acbbb3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001365v1_decoy LN:1963 M5:87a0635cbf78d7359208e0d29a3b9596 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001366v1_decoy LN:1932 M5:42a66b3579061c6333cfeec8e7bc7b0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001367v1_decoy LN:1929 M5:95db3317d465876b900ca9167ec31b73 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001368v1_decoy LN:1881 M5:31fb7324b8669148c367ef667ff3c928 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001369v1_decoy LN:1874 M5:bb9c6a2d6ec56835ea520c45a854e8eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001370v1_decoy LN:1849 M5:8f83bc8528784a67dd64f10d89331d81 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001371v1_decoy LN:1849 M5:aadeed33b6077b0febbd1f61c186805c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001372v1_decoy LN:1833 M5:155c69774a39a66871981c66bb0f0535 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001373v1_decoy LN:1832 M5:2677f37d4424e092deaaf6c2371defb9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001374v1_decoy LN:1826 M5:4dbca21467f25692d20f062b08c3238d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001375v1_decoy LN:1814 M5:208039e11c53bf03a11d83b417fe5920 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001376v1_decoy LN:1814 M5:8ef785587310c1f2d2226b740e7e4553 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001377v1_decoy LN:1791 M5:ab8270aa2cc7626669c77a954b338953 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001378v1_decoy LN:1789 M5:3ac762e7071f807dda31f5513d9624cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001379v1_decoy LN:1786 M5:9149be02831b6a76a57da93d45460920 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001380v1_decoy LN:1778 M5:a17c5b0d2e1771a62091b6705cfbf5a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001381v1_decoy LN:1776 M5:2ebb9adddc8d21f56ed91c6fbc97cfe1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001382v1_decoy LN:1762 M5:686009ce9e6490069ba0845173cf2c16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001383v1_decoy LN:1758 M5:34dc7958ca4e0be1690c80cce1f048de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001384v1_decoy LN:1757 M5:af98ed1ffd7c4a0166ed1d3bb789d039 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001385v1_decoy LN:1754 M5:80b9896356b85bbe70c7ed49afb616a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001386v1_decoy LN:1752 M5:a7c233ed3f050d44d75a9138231b5384 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001387v1_decoy LN:1751 M5:6e2fe9e7a9951deedb4a39fd837721a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001388v1_decoy LN:1749 M5:5d5cf3896254f422f70ace465b0f820d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001389v1_decoy LN:1738 M5:f8265cae7fb03630effc0fede6811b3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001390v1_decoy LN:1729 M5:48fe4b417655ad69a29770ec6e412fdb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001391v1_decoy LN:1726 M5:01bbe99249b489660daa17fa9f958d10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001392v1_decoy LN:1716 M5:bd9a3ab49b9960e88c2490efe5d8c749 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001393v1_decoy LN:1712 M5:f05c2bfa07a617b06e6a8ebc4efc5022 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001394v1_decoy LN:1711 M5:0f06abd7c321228fa763fb3815140af5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001395v1_decoy LN:1703 M5:09b91ffc2209fd9adc0e0fbac86de4bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001396v1_decoy LN:1702 M5:ff652624b7319ee60f8946d8f751cf16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001397v1_decoy LN:1699 M5:2a71713d93ad2a6a8edc736ddc02907d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001398v1_decoy LN:1686 M5:3bfbf7d5273c5ec692b1907c7c3ff2d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001399v1_decoy LN:1684 M5:6d040733a43c01650e5c098e00d46a62 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001400v1_decoy LN:1680 M5:c353280f0d833806daec83385e95e393 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001401v1_decoy LN:1678 M5:c2edb1379f817a8378d4eb089dcdfc0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001402v1_decoy LN:1678 M5:740b37d2e6785fc699776f93cc872e86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001403v1_decoy LN:1677 M5:6d4b39914847504188d3b9feaf3348fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001404v1_decoy LN:1676 M5:31845da6d4ed6000f50d5122bdef15cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001405v1_decoy LN:1672 M5:0630c8622e65da828a153d66ab29b298 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001406v1_decoy LN:1669 M5:e7d237d72fb65c19aac7bcaca3d86d95 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001407v1_decoy LN:1668 M5:86c9c0f792de2f54f69278df5e3246cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001408v1_decoy LN:1663 M5:481fc7b87114d19302cdde760018a39c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001409v1_decoy LN:1660 M5:ca249c982b9bc0cae8d02ae5a7e497cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001410v1_decoy LN:1660 M5:9a4adc64cf2fd32db34af21df269bfe0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001411v1_decoy LN:1658 M5:9e0ca112ba9edd83dd02ee0a1b977682 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001412v1_decoy LN:1656 M5:30ba767a8335a19ffbb875f109afcac3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001413v1_decoy LN:1656 M5:e77633b957a375847ad25f9b01d08580 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001414v1_decoy LN:1652 M5:33a7cad76ee390036b7d61b167e2b351 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001415v1_decoy LN:1647 M5:904ad5deeeb540a10728c9fabf9e5909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001416v1_decoy LN:1645 M5:378193508f34a25cf912974a4c531bb2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001417v1_decoy LN:1641 M5:fe667f1d920a30b730d27903d4de3610 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001418v1_decoy LN:1638 M5:dd1f1f8b342e987caf5e43ffa4b193ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001419v1_decoy LN:1633 M5:775a347b6935f9e170d809222897833a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001420v1_decoy LN:1626 M5:44b1b569182bce231346586fe77f0651 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001421v1_decoy LN:1614 M5:04a70773f36888dde7766a58c3a92de1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001422v1_decoy LN:1612 M5:0f0f7a8906ae3367b908acc806579e87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001423v1_decoy LN:1605 M5:345b541ac9d588f32be39d15d00f6305 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001424v1_decoy LN:1603 M5:dd25e42a5806fade892f5be6c5517133 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001425v1_decoy LN:1599 M5:42c61caf5957d89e892870d7abb0086a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001426v1_decoy LN:1589 M5:ff1c151f692dba0e79005392390f2639 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001427v1_decoy LN:1588 M5:d409b0b1699f38489ac9b78c9e547b12 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001428v1_decoy LN:1585 M5:549a7c1ad8b79d31a311204a8ce078c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001429v1_decoy LN:1584 M5:21ac82f5d3944ac17a667861fe4eb50c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001430v1_decoy LN:1584 M5:d717e9b20496c0e3cf6f096572904e94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001431v1_decoy LN:1580 M5:4cef86e6f0c85a15667ecccf0ec2e509 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001432v1_decoy LN:1572 M5:83a76ba3b28ab176a0fe0c3932129c1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001433v1_decoy LN:1570 M5:eefbc920c0c274a05ccd03672089bd6a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001434v1_decoy LN:1569 M5:e84f6544b2757c3d68e8333237c05b9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001435v1_decoy LN:1568 M5:085a737d9ac2ce5ad615c127373713e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001436v1_decoy LN:1567 M5:d0cc61096796d51c565e73784c3df91e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001437v1_decoy LN:1565 M5:963645d93472e0f55f70cf30e5541dcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001438v1_decoy LN:1559 M5:6cd647a043602392b10b564ef25b9bfa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001439v1_decoy LN:1559 M5:41e3d96f1e4d9a77d4314fb0c550ddc8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001440v1_decoy LN:1556 M5:f95112abd208efc5ebe4d5529e2537a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001441v1_decoy LN:1554 M5:ff55b1b730eb936e0ffca09b8fff9a89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001442v1_decoy LN:1549 M5:df38873f39fd89b3782d53eb4bd35345 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001443v1_decoy LN:1542 M5:66b6405dd4c7537d3119eeb1dfa81795 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001444v1_decoy LN:1541 M5:ce00bd7a73eab91b6d81729240662ea1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001445v1_decoy LN:1538 M5:96e6001e127eea7213d8378afb6f24d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001446v1_decoy LN:1537 M5:4a49340b952f5a6e1fbcfbe271cbee49 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001447v1_decoy LN:1535 M5:9d30511ff7644e5e501c629d82f97441 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001448v1_decoy LN:1530 M5:ed3d23f4c537a88a36a4a6964bf2d332 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001449v1_decoy LN:1528 M5:e2f85fa47e8361a098aacb0ddfe058e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001450v1_decoy LN:1522 M5:525443cf312658767f3ffb263b1ab40a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001451v1_decoy LN:1514 M5:d378e3b3268d04ee2ed255d9b671404b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001452v1_decoy LN:1509 M5:434a0e69d1dfb2f439fd8c4c6efee812 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001453v1_decoy LN:1507 M5:1c60f6588a6a6fdf49ba74bd4d8844ae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001454v1_decoy LN:1500 M5:4a8517743aa87c3edd4556e876facf8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001455v1_decoy LN:1499 M5:3787c00e3019dc0bd4b019ac8bd677e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001456v1_decoy LN:1499 M5:93e8bbddc43d5e902eaac3b1569c191d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001457v1_decoy LN:1497 M5:cedf6613fedd7bcfb6cf4822d6133393 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001458v1_decoy LN:1496 M5:c6421744963f5f5ef7d06349345f8c11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001459v1_decoy LN:1488 M5:c3d6f0be5c1768c3f4ab357b40330c07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001460v1_decoy LN:1486 M5:cfa272f94abe2b6ea6b8fff9bc2743a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001461v1_decoy LN:1485 M5:73b05431178ff099c7143b2c3310a8d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001462v1_decoy LN:1481 M5:815cd718fd3524c82596f553bc50c030 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001463v1_decoy LN:1479 M5:3be54176b83f28ddb8402da62d8368c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001464v1_decoy LN:1472 M5:a3d5a1d61c0377010cab585d8f86782b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001465v1_decoy LN:1472 M5:54ed54ed3b16b9482b8bb7a42358e3f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001466v1_decoy LN:1470 M5:957a8cadb7ce3ea0f910acb49b0d28f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001467v1_decoy LN:1466 M5:5f1e18ba047f8e50f57be2e0ec9d7ee0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001468v1_decoy LN:1465 M5:1371b580bc13e98f593106d0c6cc7055 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001469v1_decoy LN:1461 M5:a1e27c8891fb421149591b6254008534 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001470v1_decoy LN:1458 M5:0a299df79227b0b8f9d01b64c1091040 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001471v1_decoy LN:1457 M5:fb81cfbfe3dcf83480d1566dbfb35cdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001472v1_decoy LN:1448 M5:5ccf4c226bbe31dec446e5f2cfb754aa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001473v1_decoy LN:1447 M5:d4e733a5240b77f6521178683ef92f11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001474v1_decoy LN:1444 M5:266aac36179cb1faca5c4a0102fc8ace AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001475v1_decoy LN:1443 M5:6153fa9f83b2dca77912302a435e6783 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001476v1_decoy LN:1443 M5:eadd62062090a328419de772556bec04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001477v1_decoy LN:1438 M5:808b663863cc7b8062a075d60a932ee0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001478v1_decoy LN:1432 M5:3d320a29f829d8b30da651831563b8fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001479v1_decoy LN:1430 M5:d406932c6d2e5cda5d40bd5282612ec8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001480v1_decoy LN:1430 M5:1b514b0604012b9c3bf96dc729d5b570 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001481v1_decoy LN:1429 M5:bba1c32000bf8515723b23e91e3d73d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001482v1_decoy LN:1429 M5:469a525eaccd114705d3876e6497d24c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001483v1_decoy LN:1429 M5:1cab4c8d35aa87cfadcc67327c0cde05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001484v1_decoy LN:1426 M5:7f0b3e31f88382eb1a9d667b4fa5ae8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001485v1_decoy LN:1426 M5:600029364a5faff2a6121c791c26f3b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001486v1_decoy LN:1420 M5:bd2635b8f37ae8d36555126a2efda82f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001487v1_decoy LN:1416 M5:1feda0b1dfda8eb29e804bb83d191350 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001488v1_decoy LN:1416 M5:381713228fbc436ef15eb3fc5ce95526 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001489v1_decoy LN:1415 M5:c7b5a3592ce2955180a8bf93340ce7a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001490v1_decoy LN:1415 M5:8a9071712ed09640282279375c1aab9e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001491v1_decoy LN:1414 M5:ad3849a6c284e0371da519c83c3efd56 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001492v1_decoy LN:1413 M5:1897ebbd3ccc3ed5dfd33e64df6cee2e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001493v1_decoy LN:1410 M5:bbae6ade32694ea4d23d50d382e589ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001494v1_decoy LN:1405 M5:60eac2719276e2c8aed1dd8879086460 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001495v1_decoy LN:1402 M5:560d0b9e5abc45feb134351a94cda358 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001496v1_decoy LN:1398 M5:c87eb09186b0ed776438697cefe49c34 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001497v1_decoy LN:1397 M5:17bdfaf46a6963ba97861fcb9ff9d4ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001498v1_decoy LN:1395 M5:14942812a5a15869999430aa17472a47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001499v1_decoy LN:1392 M5:14d8c0e42dbe62d45491f288a844c263 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001500v1_decoy LN:1388 M5:3535c9f286c4bc12e2fdab3ebd0e4cbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001501v1_decoy LN:1386 M5:3ed31b85ef3e34d8e053031462c9cc64 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001502v1_decoy LN:1382 M5:370ef584d4cfe29bba430512c01c2d92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001503v1_decoy LN:1381 M5:0d6317f9e8c37b0d588aaf5c404621d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001504v1_decoy LN:1379 M5:15b371e04aee1e2cd7a2c3ad778615cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001505v1_decoy LN:1376 M5:9e5d443eae0beb889e93d9fec1df500f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001506v1_decoy LN:1374 M5:19e75c42356ec21ffffd6ead1147246d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001507v1_decoy LN:1374 M5:d047841fe73e626cbad1d1a075cc1179 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001508v1_decoy LN:1373 M5:9af5c2bfca12c6e109d87d15a001f382 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001509v1_decoy LN:1373 M5:26c1cdc503f21321bdbbf7184681fd57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001510v1_decoy LN:1372 M5:c08f8502b7b9423df1c4988d25d4e1e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001511v1_decoy LN:1370 M5:51b5c0febc1d93a3ae056b562f29febe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001512v1_decoy LN:1367 M5:84cb97f5fa89889026682a6ddb4e17ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001513v1_decoy LN:1365 M5:9b35f302f4d7104621ee94c9466fcf05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001514v1_decoy LN:1364 M5:d26988a458e184ce67dfdf1494cce818 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001515v1_decoy LN:1361 M5:2be502a9c104f048b5faab19bf6b0c94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001516v1_decoy LN:1361 M5:a66a14b66c130258ed0f9a2e60b977a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001517v1_decoy LN:1355 M5:f8520c48ea6b728718603ce85ba18832 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001518v1_decoy LN:1355 M5:d16784b4fc04cab4570de94e9753760e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001519v1_decoy LN:1354 M5:226153c1ffcb6ca5cb3a64d124c3b9fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001520v1_decoy LN:1353 M5:36898b58e8fec2ff86a3db37bffcfe2d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001521v1_decoy LN:1349 M5:919f3dc576e969ebb845489e155befd1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001522v1_decoy LN:1345 M5:e1f3dc21c137a83319e95d8cd641953b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001523v1_decoy LN:1344 M5:c7cc4c4587e7e5f69d3afcaca3f62ef6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001524v1_decoy LN:1343 M5:12b492bc7285ab647a13d8ac1efecc61 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001525v1_decoy LN:1338 M5:8d831cbc5a7d72f9a5c05360b502005d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001526v1_decoy LN:1338 M5:89ce2ba0c1414088ff5f502a0908059f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001527v1_decoy LN:1338 M5:ed5c2d0150ddb784f059ca25eb3b32c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001528v1_decoy LN:1336 M5:1dbe3107f4bae73b01853e98084f8f47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001529v1_decoy LN:1333 M5:1d1e9eb7e4182425f8718dc456a8e9bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001530v1_decoy LN:1333 M5:d77e50f1375e757aefd872040ee290b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001531v1_decoy LN:1332 M5:93546f6ce6b44646b5a2d20190054dcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001532v1_decoy LN:1324 M5:bcb215dd97bfb4682fe3d17f99605c5f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001533v1_decoy LN:1323 M5:0c68586edd47761d55b6a127af21b958 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001534v1_decoy LN:1323 M5:8290481e03f0efd3da641df90d6a09f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001535v1_decoy LN:1320 M5:06b5a586c070a38af486a0ae25dac08e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001536v1_decoy LN:1320 M5:aa7f4ccf5b8955783f201e89c6b8b61b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001537v1_decoy LN:1317 M5:5f5c4304240e41a75cdf79d590705a7b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001538v1_decoy LN:1316 M5:2b2e47e474a04b2c5d7538dee74a4520 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001539v1_decoy LN:1304 M5:70b1f3865cf28cf8c3cb6ca89e299e75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001540v1_decoy LN:1304 M5:801a2a35c0eb1ddde4f339fae91bdd02 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001541v1_decoy LN:1303 M5:0013745a3b7f3937b3f0d58b8fb8b96d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001542v1_decoy LN:1302 M5:2e708be5a88bc87556f10487d43af5f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001543v1_decoy LN:1301 M5:9b421120b8e61665a80c2202f9742b11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001544v1_decoy LN:1300 M5:7b6b985d4c9b335dde3369fc8ae75a4f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001545v1_decoy LN:1298 M5:c2c9f5a874990de1d53e53efca362cd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001546v1_decoy LN:1297 M5:8849c9f185b5ae8ed6d60d3b99c6591c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001547v1_decoy LN:1295 M5:134596128a40e4a4c8f40d310152fe2f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001548v1_decoy LN:1284 M5:c943fc593d7c12a3edad870f24db083c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001549v1_decoy LN:1283 M5:de6680db4756a0d685d2f2405be073be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001550v1_decoy LN:1283 M5:a86669f9a78babae5db999b036d712b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001551v1_decoy LN:1279 M5:48d3b7e152913253a1c7749be4542da0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001552v1_decoy LN:1278 M5:6f732db21b1679f66b34145d0d179a57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001553v1_decoy LN:1271 M5:18a0c55016d63414e1a7c9a868d2167b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001554v1_decoy LN:1271 M5:fbb66e8da3ee67360e823061c517c47b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001555v1_decoy LN:1268 M5:668bc50dfcee6830bfd6b8b193cf9aab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001556v1_decoy LN:1264 M5:512e1b52aa8bc91a79e98a21f48fd69a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001557v1_decoy LN:1263 M5:a280a5ddd14400e7a21e262dacba0878 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001558v1_decoy LN:1262 M5:074796c17da27a3ae23b3ab43837eff9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001559v1_decoy LN:1261 M5:f75ff3300dbd75160e935cd46e4511c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001560v1_decoy LN:1260 M5:67884b5403ffc61f67795ef0fcc3b616 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001561v1_decoy LN:1259 M5:778ef716a17f44127ce4648ca3d01437 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001562v1_decoy LN:1259 M5:79561487702e7f87d4c1babb97cbf910 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001563v1_decoy LN:1258 M5:05c2d3d1fe5c9569c6f982e7978b0d6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001564v1_decoy LN:1256 M5:443af4844c7fe05604fbf14d61807faf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001565v1_decoy LN:1253 M5:3ab1b0cbc9dfe5e1b97cc5bbee6ba5d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001566v1_decoy LN:1248 M5:6ca9712ce96adea0a2a178a885e6c403 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001567v1_decoy LN:1248 M5:a9815826b47ba4c29bb0b6f427c91f9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001568v1_decoy LN:1246 M5:847154b1d516e188b5d8b9b6932658a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001569v1_decoy LN:1246 M5:cc8ad8f95e7d72b075ce88fc9fd93560 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001570v1_decoy LN:1244 M5:3df737516c175d1baf5cb57874761a06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001571v1_decoy LN:1238 M5:350c62d6852c839c79bb94399823a7c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001572v1_decoy LN:1238 M5:cf4520e99994e5810535b8e92f1f4764 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001573v1_decoy LN:1236 M5:27e61fe700513169fa02b0a6b9224fb6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001574v1_decoy LN:1234 M5:6af09c7c1feeb50a156ab599d39314f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001575v1_decoy LN:1234 M5:1b1c2b7e28c781322697a77df6b717c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001576v1_decoy LN:1231 M5:24168a14a8a7b0626a75964a5ffa4c06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001577v1_decoy LN:1231 M5:7b5c30f4c44dc17f05a6022490a1b06b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001578v1_decoy LN:1230 M5:7dd3d8aa3ad6ae0467cbb5729a65b7fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001579v1_decoy LN:1230 M5:9838f95ca9d84335f580003e43e0e909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001580v1_decoy LN:1228 M5:40d2f9b81666f0aeaadf3b60d6f00326 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001581v1_decoy LN:1227 M5:b603baea2a6d239b5a0e0482be39ebae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001582v1_decoy LN:1222 M5:592ec40093cfd07fe7ae22531e7ff948 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001583v1_decoy LN:1222 M5:45d2796dafa85ef3ebb8d378ab5c4fe2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001584v1_decoy LN:1221 M5:7171fedcff845d9bf0eed62d8de65582 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001585v1_decoy LN:1221 M5:1919b7c47b361c4925ba7f89f672c639 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001586v1_decoy LN:1220 M5:9b6bee47fab2e16188e112fd219cb63b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001587v1_decoy LN:1218 M5:403153f244f25427f95b761c7e7643f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001588v1_decoy LN:1218 M5:4bdec42af039130bb647f35a1587442e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001589v1_decoy LN:1216 M5:5eb119c85dbdbac20fd9b54ca19e3bb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001590v1_decoy LN:1216 M5:30be84f72824c6a73cb46db0880fca34 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001591v1_decoy LN:1212 M5:a3990c8502d89fd44d2744a7c3b5ec27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001592v1_decoy LN:1210 M5:812ecd7a45c18a1ca8e07d380fa9c7fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001593v1_decoy LN:1209 M5:f3658490a61b9678c62147607e15dd39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001594v1_decoy LN:1208 M5:6ad7956bf60e17b114d96c186021ba22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001595v1_decoy LN:1208 M5:07b45f43574a98e35df01f1b02658afa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001596v1_decoy LN:1206 M5:7ad1a707f9ee83f188f836b84f0ee5de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001597v1_decoy LN:1205 M5:c5fe9e310df6cae87f2d597153392ce3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001598v1_decoy LN:1205 M5:3253a26afa899ec2cde4d0fe80a95557 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001599v1_decoy LN:1202 M5:7eba2ca9a5450bf7c6febae054f41555 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001600v1_decoy LN:1200 M5:00f180d0f4f2be5d3a79232ebf1f4150 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001601v1_decoy LN:1199 M5:06c81b1f3014d187114393c990dbb3d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001602v1_decoy LN:1198 M5:04ad661ad55cf80b26d65b537fa28426 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001603v1_decoy LN:1198 M5:10cec3a4b27c1a9e83dba32c764db1a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001604v1_decoy LN:1198 M5:ca938a555284768f7de4aa5bc45030af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001605v1_decoy LN:1195 M5:6352f3ee72fc500fb234cefdc58d230c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001606v1_decoy LN:1194 M5:7761a04b81c344864c4196c9fa348529 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001607v1_decoy LN:1191 M5:6f495eb0c24a06b146428c8e15145289 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001608v1_decoy LN:1189 M5:7cdef7e7fe5039c26f91054002844a08 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001609v1_decoy LN:1188 M5:8fb25530ab0d6cc405ed3820a00a19b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001610v1_decoy LN:1180 M5:baa36ab5e7d359dcf38de58e0578aa06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001611v1_decoy LN:1180 M5:fbf128a1dc1f9852e12d0f7cc819e220 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001612v1_decoy LN:1179 M5:cb72123adfc2996fb4f8c8023e656377 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001613v1_decoy LN:1172 M5:9a828a68ee9904074c07ecb9b4a66d85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001614v1_decoy LN:1168 M5:47f21c445bb5e0f2901a60313a4b54fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001615v1_decoy LN:1166 M5:6640bdaa008c2b633f8732710aea42e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001616v1_decoy LN:1157 M5:548cacc169d84926fc794c75c8fe890a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001617v1_decoy LN:1156 M5:ed240ec48dfc49536a05c15b0cf84b32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001618v1_decoy LN:1156 M5:4cf17295af5ac519eeb5b60d65d8d630 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001619v1_decoy LN:1155 M5:7535ed3093386510b39164d7d8c0e75d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001620v1_decoy LN:1154 M5:942a2c1ebc2dcdc44aca71c7998704e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001621v1_decoy LN:1154 M5:172266936a16cb96c0fa51a30de2f617 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001622v1_decoy LN:1149 M5:904c6976a4151582f6e20888f8882b1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001623v1_decoy LN:1143 M5:e146ce9a62548893f8042eb31c9eb73a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001624v1_decoy LN:1143 M5:226937ae596ef9af068232903d42c1f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001625v1_decoy LN:1140 M5:9f8924f0407c98c271d938a89ce0651a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001626v1_decoy LN:1137 M5:e6dc97de94f6ebca61e2afaa11081a24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001627v1_decoy LN:1135 M5:ddc4671e6fc9af479ecc987b65228b89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001628v1_decoy LN:1135 M5:156395c17267dbc279afab948e04d7eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001629v1_decoy LN:1135 M5:b51c39a7e5a4d0f3a185dfe0405d28be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001630v1_decoy LN:1127 M5:eee6cec0d44e913c8909412bdc06fa14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001631v1_decoy LN:1127 M5:e614e251417f03894a86d226643c44b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001632v1_decoy LN:1126 M5:e3d6bcc05df478652842790b2163c80e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001633v1_decoy LN:1123 M5:62a0c3d0311f689e83c69aca70ff1d7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001634v1_decoy LN:1123 M5:4c25a0253e0d7c0aa032a2af4dc159a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001635v1_decoy LN:1123 M5:77f17c8bda201de22cb683529469d159 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001636v1_decoy LN:1122 M5:4716e9809cd6983cc872a801adcfcc46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001637v1_decoy LN:1122 M5:e854813fe411b829feb5122630115359 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001638v1_decoy LN:1121 M5:9ee360ada2996f37f05bc35f51af2274 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001639v1_decoy LN:1121 M5:e9eacf65a91b75a7484d73c0960d1f14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001640v1_decoy LN:1119 M5:115a5a8bf67d2676b18db1fa2cf1fb41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001641v1_decoy LN:1119 M5:8c12171780de61fb413546e612810679 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001642v1_decoy LN:1119 M5:d36511233c4008330a6ea48f39a48c8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001643v1_decoy LN:1118 M5:49d64211fa0e9269ff0335c106fadf0a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001644v1_decoy LN:1115 M5:d3b2472895f28b7fa60956f7b18c525d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001645v1_decoy LN:1106 M5:14d31945977d0566bc15d63216affa59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001646v1_decoy LN:1106 M5:954d5725f47430e77ac7a65db6252cb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001647v1_decoy LN:1104 M5:afc20c7775696bfe6b465aa9d8d5a2cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001648v1_decoy LN:1102 M5:1a699dde289aa62b55f6ac11bb7947e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001649v1_decoy LN:1101 M5:97d8bdd4c01947f81c47b798baa7b71e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001650v1_decoy LN:1098 M5:81be16ab671a23dae662d52a90f53d45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001651v1_decoy LN:1098 M5:849d2fca45af7dd15c549778da256bd5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001652v1_decoy LN:1096 M5:85135079f59c18f32cab3330238996f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001653v1_decoy LN:1096 M5:eeee606c5ce1877c2c17f3c35cee97c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001654v1_decoy LN:1095 M5:a67b439018f9500bd22116207fa78bb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001655v1_decoy LN:1093 M5:45193d6dc28c575afe0a816a04981a13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001656v1_decoy LN:1090 M5:9e9a3deb3fbb62096e9267cf17b4538e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001657v1_decoy LN:1089 M5:2fcd006deec28bc7b3e2ed1c81f6bd69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001658v1_decoy LN:1087 M5:b5ff50152c9932bd5f5c8f6d8f085250 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001659v1_decoy LN:1087 M5:8dc8692a004984e174cae1a798c308ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001660v1_decoy LN:1085 M5:a26ef2777b049efc475e9f983166c858 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001661v1_decoy LN:1085 M5:1d1b538881461819bddec7da548477d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001662v1_decoy LN:1085 M5:a02c26203237d3ab0fdeec3b2226e415 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001663v1_decoy LN:1083 M5:97595ecd8251d05c23a9a1f24c4fc331 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001664v1_decoy LN:1080 M5:bb065f6218181f056b36deb6d5ea3fcf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001665v1_decoy LN:1080 M5:242177401fdbd05a55373745dd7678ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001666v1_decoy LN:1079 M5:aee38ae173783e327db2c83e4636269b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001667v1_decoy LN:1079 M5:eb281bc766d87e3e887aff0c1f473bb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001668v1_decoy LN:1079 M5:b15b982e045772eb4fae4cf61eff32f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001669v1_decoy LN:1075 M5:a0fe4aa8f27e7528a49b7fc241413bcd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001670v1_decoy LN:1074 M5:5a9ee12d6200281af569684e9eb6c44d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001671v1_decoy LN:1073 M5:58e3e1c01c24005c1bf6ecc4081328af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001672v1_decoy LN:1070 M5:6b4eaaed019b55c1445f856fa75748c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001673v1_decoy LN:1068 M5:962507e31477075a1ec295c7f3e4f370 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001674v1_decoy LN:1067 M5:246916ebbed387cdb53894261342b334 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001675v1_decoy LN:1066 M5:45ef97be51801b68eddaf9d903c6569e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001676v1_decoy LN:1066 M5:a1e2a77d7c51fc62c3f1261d96788416 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001677v1_decoy LN:1066 M5:a72df1625ec9a3676769041db2b5db74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001678v1_decoy LN:1063 M5:63c3ca073be59c038fca2ce8cf57b58f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001679v1_decoy LN:1063 M5:3b4176334e519bf0fc0ea90b5c450256 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001680v1_decoy LN:1063 M5:e0c561be692e2103d216fec5f81a004f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001681v1_decoy LN:1062 M5:a87bd7c0b225c0db2cc82df0e92fd34d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001682v1_decoy LN:1058 M5:bd1fa296d60d2c1447479727889fd06d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001683v1_decoy LN:1056 M5:ec709ad9663274dc4b8d9c95637e6231 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001684v1_decoy LN:1052 M5:4c92b0e2cf0179f74e829358fdd4fd7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001685v1_decoy LN:1051 M5:d301a97b1b34b2cbcd690824430ef873 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001686v1_decoy LN:1051 M5:bbc47709fbd21b2776773a149cc0338a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001687v1_decoy LN:1050 M5:a01a1af5e1a2b7e924af29af696e561c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001688v1_decoy LN:1048 M5:71b188e0ec08d62bcf1e70c1ad5dece1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001689v1_decoy LN:1046 M5:6a0e08e5268e2e656a415ba75e6fd9bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001690v1_decoy LN:1046 M5:59e6b5101b057b8b61117d4e775da1a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001691v1_decoy LN:1045 M5:f09e7737756f026981c00c9f4e4a0fcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001692v1_decoy LN:1043 M5:90cc154008842d098dcd3bfcb288fad9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001693v1_decoy LN:1038 M5:760fd011482ffc7b2972fff26ede08ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001694v1_decoy LN:1036 M5:403a116827eda12cce96c83a442432ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001695v1_decoy LN:1035 M5:aa903a22959e0e71bf9b65e184c98664 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001696v1_decoy LN:1035 M5:c7b013db629c9e53bcc9e5ef6b45ea86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001697v1_decoy LN:1035 M5:b124dac1b39002796762805b01e70939 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001698v1_decoy LN:1033 M5:973b579d06cff1e48883e0c933a40ace AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001699v1_decoy LN:1032 M5:d91e5694037129aa77037d5c631b2c89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001700v1_decoy LN:1031 M5:26f0a1a25d70795beec266b79ee9872a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001701v1_decoy LN:1026 M5:d895a2e531136b85f91cae9c41bac3eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001702v1_decoy LN:1026 M5:eeaed2987f143706ea90f593db2ee43c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001703v1_decoy LN:1026 M5:201ae22e581315eb83bf1b2a90a376ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001704v1_decoy LN:1023 M5:676723aca3cbe94f5e6fa6e3e677382e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001705v1_decoy LN:1022 M5:079f24ae7a37258e2dcd3e45c2a82dc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001706v1_decoy LN:1020 M5:0c6c76de07c4a66f7b7c1625990fe97c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001707v1_decoy LN:1020 M5:23b7cef7e53c021320be37e395337a6b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001708v1_decoy LN:1020 M5:442bbaf4d63d7243f581f2a4f3c8713e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001709v1_decoy LN:1019 M5:ead84759fc3d0742886397aa847a8c43 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001710v1_decoy LN:1018 M5:30842e0e30b9626a2db87c8abee99c69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001711v1_decoy LN:1018 M5:85cd9b0b4ac27a135417acad1b49f347 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001712v1_decoy LN:1017 M5:cf02f8f140f6cabc6edaa85f110e6a45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001713v1_decoy LN:1015 M5:a1b077bd6e18faf0ce248051997e87b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001714v1_decoy LN:1015 M5:c108897419126d2b77335084625f756f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001715v1_decoy LN:1015 M5:887e1695f416731637dc46a35b2a9548 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001716v1_decoy LN:1014 M5:f4c888663c13ab55190b9228c5b46bb8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001717v1_decoy LN:1014 M5:be3c4d0d37c5c1c8c88889dede5ba4b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001718v1_decoy LN:1013 M5:2d3c3dfc692750b9b4c716debe8451a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001719v1_decoy LN:1013 M5:c1212f7ba1d00f6f6553fc075e858e42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001720v1_decoy LN:1013 M5:6e854869ecc63cf6e45e7f0fc6eeb9c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001721v1_decoy LN:1012 M5:05b1945756fa1adf0d4547bcd12f01ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001722v1_decoy LN:1011 M5:0ef4eb4aa59e9725d43ed27a2f67d8d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001723v1_decoy LN:1011 M5:b4080ef5ca76b971d7eea5438484ce22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001724v1_decoy LN:1009 M5:34953db0af28061b89bb32262121af7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001725v1_decoy LN:1008 M5:b05c20cc6394423a0e1aef1bac72d0b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001726v1_decoy LN:1008 M5:f2301601e3a88c6be9c38500a9d29685 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001727v1_decoy LN:1007 M5:2ff7ac77e3568eeb2e7772e932dfa819 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001728v1_decoy LN:1007 M5:04fd5dc748b4e7815316b0cccea3cba0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001729v1_decoy LN:1007 M5:957456ba0e3f879860817f3ae6bfca78 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001730v1_decoy LN:1006 M5:8381668c661d255ffbd7498d663acff2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001731v1_decoy LN:1005 M5:92a03e55b43fc40c9c010df225cc650c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001732v1_decoy LN:1003 M5:bc99a37cda9c755b77763c0873a3435d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001733v1_decoy LN:1001 M5:6a123c9c76f9d1c0a35ba3666f861ddd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001734v1_decoy LN:1000 M5:31048d43d8cae8a2c51fe5fcfbfa2462 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001735v1_decoy LN:19311 M5:110c68ef04650368b85e76c55d599fcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001736v1_decoy LN:11713 M5:392799b68e6e2c6e288f07bc44a3a6b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001737v1_decoy LN:11263 M5:091c74a89bf6767adbc92c7cfd9ab6bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001738v1_decoy LN:9779 M5:fdbeb36b87e966517a30478e8fd55631 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001739v1_decoy LN:9568 M5:3562fa1ff9f4f23377f715895ecd504e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001740v1_decoy LN:9344 M5:7c7fa5c413301e5c71020ee588c0c1cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001741v1_decoy LN:9188 M5:ec88b5a808b4c20414719ba271b7b641 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001742v1_decoy LN:9100 M5:bad4d9e7865b7ef45b00609846739bda AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001743v1_decoy LN:8771 M5:56e67b8b7db6db977411d3485186a095 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001744v1_decoy LN:8690 M5:f01b9132254ca4074ba5ddc5b74c3d1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001745v1_decoy LN:8566 M5:d96c00c236c6c63764d62b50443c448a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001746v1_decoy LN:8058 M5:14979af859f72ff6efa1b0230cb0bbd9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001747v1_decoy LN:7759 M5:57af8f9f3fb38d3eb268e3d82b21e918 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001748v1_decoy LN:7585 M5:332f1fac3f4964c85f80b068cd91e49f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001749v1_decoy LN:7471 M5:a2a4f2f140a6703cfaa11c1a6ca07380 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001750v1_decoy LN:7461 M5:ec2b8f7282528afa2de49ece1a8d3daa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001751v1_decoy LN:7342 M5:328d2146da22838f30adcf361c5a9165 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001752v1_decoy LN:7223 M5:b0e8a99c193409a71f86d373159d576c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001753v1_decoy LN:7064 M5:3c4648b387bc44aaabddf795d6678ca1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001754v1_decoy LN:6916 M5:c57ae49f10014609feff4fe84c91b31c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001755v1_decoy LN:6897 M5:0bd737852eeaf5c723587cbbd74005d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001756v1_decoy LN:6880 M5:e3d30ef79c4983f0fb99ecf9ac1ca7fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001757v1_decoy LN:6857 M5:cfd001bcac96f459ceac7a135a59cb04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001758v1_decoy LN:6840 M5:6757a710758275b58b95545211e06526 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001759v1_decoy LN:6728 M5:4d8b4b254f60864202e63aa9dba42086 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001760v1_decoy LN:6688 M5:9e056067d1281622858dfe9830f147f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001761v1_decoy LN:6553 M5:9182e4b1d32ec558a3bd3c94a5254ecc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001762v1_decoy LN:6396 M5:23b91febfc6ba054d109596479f66f8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001763v1_decoy LN:6345 M5:f038e6215610b387550c3b50dddd49a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001764v1_decoy LN:6295 M5:d0f7f5b63499d6efd4d901a757b1cd7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001765v1_decoy LN:6266 M5:95b3fdc4315475b9c0408bc1f1f49202 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001766v1_decoy LN:6173 M5:4db332a6222e767873f0d9c5051b83f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001767v1_decoy LN:6171 M5:399db4ef3a58b54f82a07da4f0d264af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001768v1_decoy LN:6120 M5:399aa8c3cb106b5c685092b0de9313fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001769v1_decoy LN:6105 M5:4990624c065870871ce2bfff6bbd26e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001770v1_decoy LN:6099 M5:2e817dafcd97d49c6dfa1eef14a5e32e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001771v1_decoy LN:5893 M5:c8155a905ca8708a397ff91ea578e41f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001772v1_decoy LN:5829 M5:85146edd3b2fab18762262a7455e00c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001773v1_decoy LN:5793 M5:b72258377a1fd9ccb2a374de66066126 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001774v1_decoy LN:5776 M5:51cdb4aa5438f8b50fb21eb9c0959839 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001775v1_decoy LN:5759 M5:f30e892168c0f735365a13e51c8d0af3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001776v1_decoy LN:5716 M5:c03eea2b4a0bc45e1e7df084b89340ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001777v1_decoy LN:5708 M5:5aba75f216a07e87387db64ea61a7c17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001778v1_decoy LN:5590 M5:09a93eafef7f433e1d2b0d7f3e4c2857 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001779v1_decoy LN:5566 M5:173109c0f5077facb133a124c11fe44f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001780v1_decoy LN:5558 M5:c7f1155230324ea1ff2ec21957290278 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001781v1_decoy LN:5418 M5:8de9a43d5de5e0bd3fbdc3a8ba79bb3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001782v1_decoy LN:5375 M5:2d96ecf69a27a8876ecd20073def54b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001783v1_decoy LN:5300 M5:07550b4953f67bec7ce4f4a04c493553 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001784v1_decoy LN:5255 M5:5c4536fdcf9b0c8f69b6c13e9c535eb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001785v1_decoy LN:5157 M5:af427140b151e2e892fc9a95aec694f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001786v1_decoy LN:5130 M5:254488c203afc62f6965ed57e0644916 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001787v1_decoy LN:4978 M5:a0d7d65d0e93baf75fd6d6d38c774828 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001788v1_decoy LN:4957 M5:6acbb899137257944298b46317165e69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001789v1_decoy LN:4947 M5:cec51f8ad5909dd8e0d3b01e25acbfd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001790v1_decoy LN:4897 M5:a8c98d6ff4dfa416c2dc12f726057ac0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001791v1_decoy LN:4867 M5:8ad543666fcb2e40d2ce2c0bcb95a150 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001792v1_decoy LN:4845 M5:a4cb8d08b6f399bd75e5d3edc40320f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001793v1_decoy LN:4678 M5:02de644cfd20b00dbf3730793f839102 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001794v1_decoy LN:4641 M5:5326e7bd1418a6bd8475fc0cf9383333 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001795v1_decoy LN:4592 M5:bd9741fa5a5eaf10cb939a6822ac9473 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001796v1_decoy LN:4543 M5:465f55fb7df07a219d9cb52c8d369e8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001797v1_decoy LN:4532 M5:4956e33b08cf6f8939a8053da18b8b4e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001798v1_decoy LN:4503 M5:1fe8c217b537b8ff77877f684728af90 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001799v1_decoy LN:4495 M5:317fc278049d65e36b6b4ac9ea865e2c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001800v1_decoy LN:4444 M5:1815e62f1fb46ebe5a8f20ca027f5e3b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001801v1_decoy LN:4414 M5:7911ec2b81df531fe586719cf18f339f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001802v1_decoy LN:4409 M5:65257f0e3c59604d1b9d1534d2e05cc2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001803v1_decoy LN:4302 M5:dd3519a759d8fb2773d3ce4e05d2e0c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001804v1_decoy LN:4300 M5:1baabb53ab93bc883f297c4fd3313726 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001805v1_decoy LN:4277 M5:a93c3da31dbc626ca07c7a5bb2ae1fce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001806v1_decoy LN:4173 M5:ad4dbde798fb8814acca378a14f36ef4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001807v1_decoy LN:4169 M5:5e7896feb74a66cdf343257968e26128 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001808v1_decoy LN:4136 M5:bb27f7b565373b54a90878f371ecb315 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001809v1_decoy LN:4101 M5:cc0696dc2c3a1cf86aa2bcf3be4fea1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001810v1_decoy LN:4089 M5:84d4249370d2ab227a405c59d78a49e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001811v1_decoy LN:4015 M5:13a4dd160518b12fd8900d058ae24627 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001812v1_decoy LN:4000 M5:0d5607a998bac1719a3842db4b2ac324 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001813v1_decoy LN:3973 M5:c54b9de7f485ab7729a4b35a122e5676 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001814v1_decoy LN:3732 M5:0b810e5685d52453ea3c4c3c15f4ab46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001815v1_decoy LN:3709 M5:41dc92336fe91882541594fefae1b397 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001816v1_decoy LN:3686 M5:23342688bf37b8caa294e20464135302 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001817v1_decoy LN:3676 M5:9d214925d90fe222b09cbc3b862d4be5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001818v1_decoy LN:3673 M5:c4bbe25da86730cc4e55c74636296210 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001819v1_decoy LN:3672 M5:3365257914847acb537ffb644b32f6fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001820v1_decoy LN:3633 M5:9af0a5d44c112d976299f598083354bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001821v1_decoy LN:3633 M5:276e5a73fe80f25706975973fca81151 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001822v1_decoy LN:3613 M5:96044e09be5ba69252a13d71123ac546 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001823v1_decoy LN:3605 M5:2402d86c44cceab83a438a4af0e24939 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001824v1_decoy LN:3592 M5:8e4cc1d20a97fbddc8d430158ab2f8a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001825v1_decoy LN:3586 M5:b0cc5444bffc7aec1c01a855b52ec3a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001826v1_decoy LN:3584 M5:9b94b86d924e51adbe1fa241e9eb4980 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001827v1_decoy LN:3577 M5:2ed768998d7e36315f9b21917eff299e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001828v1_decoy LN:3537 M5:b9fb044a6692c6bc7dfdca8fcb811f79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001829v1_decoy LN:3510 M5:27176699c6daad8aa9991c140bb4dceb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001830v1_decoy LN:3509 M5:dab9d17bab4efaf2e54273afe4017807 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001831v1_decoy LN:3488 M5:cc824ab2de05f959425033f7d1b34c54 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001832v1_decoy LN:3473 M5:05d718c7b92a89c2a4b961ee6c0b008c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001833v1_decoy LN:3445 M5:c374915181a1f43da7688151fad2c609 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001834v1_decoy LN:3427 M5:fea3edb105a855523da01bbac633b515 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001835v1_decoy LN:3395 M5:9323a036098595da4ac07b2de10ef332 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001836v1_decoy LN:3367 M5:19070dba7b35a5d94fffb7a4c9bc41d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001837v1_decoy LN:3337 M5:21d6bebf3b38b8e623684b9e0e707909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001838v1_decoy LN:3324 M5:445cf21cdd79290b7e69a748db3691c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001839v1_decoy LN:3315 M5:f1f38a814378ad3f53ab744d03c6faec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001840v1_decoy LN:3313 M5:943531134a853079b30be3d92c9a37ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001841v1_decoy LN:3283 M5:aa33f6f89273b5d970d09f46c4acffc4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001842v1_decoy LN:3250 M5:6c7e5a0af5d65078902e7369e77c3eca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001843v1_decoy LN:3247 M5:a40dde4dacd9b3af8d1346af020f3826 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001844v1_decoy LN:3237 M5:19c321a618697df2f90bf2623e39e09a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001845v1_decoy LN:3235 M5:858d4ef2c5182eec9a3af185040447c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001846v1_decoy LN:3200 M5:5198826fed1230b23329839aa0fe293b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001847v1_decoy LN:3195 M5:bc41aa22979bdd3975774235ac080c4c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001848v1_decoy LN:3175 M5:e3cf116e22c63b9ca8f5f83ef00c9227 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001849v1_decoy LN:3158 M5:2c546de8c11c8b020271c0a602c8e914 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001850v1_decoy LN:3143 M5:b114278cb76d8a47cd1ea131b6b01c46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001851v1_decoy LN:3139 M5:836cf9f277e7abe51f821eea4e72f9da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001852v1_decoy LN:3138 M5:99ec6bed7ebdeb700737347dbb987feb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001853v1_decoy LN:3136 M5:3ce9684d466895b5b1ebc7b730c1a22d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001854v1_decoy LN:3132 M5:4133dd5a44f06f0676fd2c8f8f2e532a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001855v1_decoy LN:3132 M5:1d73546845d822a91cbc6d9f4e78688c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001856v1_decoy LN:3095 M5:318534fba07d7da9181de4e227a5ddf1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001857v1_decoy LN:3094 M5:bb93d34eb9f7a80b575056a9785171f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001858v1_decoy LN:3093 M5:b4c67202f6c2cd5231bdf62ec60bf138 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001859v1_decoy LN:3059 M5:80bd25131b27cbfb7222fb139cdc03f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001860v1_decoy LN:2985 M5:3b138424ffa05470fbaf4e81e0b11722 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001861v1_decoy LN:2975 M5:128ceb0f1b4c41d3107868af22cbd590 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001862v1_decoy LN:2967 M5:f0bd303b1446335f781e0c2f74d28de3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001863v1_decoy LN:2961 M5:562fe7159c1f06d7750af9ef9c3d3e6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001864v1_decoy LN:2955 M5:8028d9a1447473820a8c0b0e88325ffb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001865v1_decoy LN:2935 M5:2fb53f3d6f706d8f5738f63429c8de36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001866v1_decoy LN:2933 M5:a22cdeb6c078d85e19e089f7f9efb045 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001867v1_decoy LN:2909 M5:1fd7abd65c5be9c9dc924daa280f43be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001868v1_decoy LN:2904 M5:5e863959002b0c580d4820a7cebdbf48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001869v1_decoy LN:2892 M5:662acc47cf615cef44478309a902b41b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001870v1_decoy LN:2886 M5:b83662f3f83e28d70a9133675fbe1b1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001871v1_decoy LN:2885 M5:0734ed3f7e1aed9828f22b347664e98e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001872v1_decoy LN:2878 M5:2246626d2530d2260b223f28a96a624a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001873v1_decoy LN:2875 M5:a306eed4bf0048509612220ddfca4dca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001874v1_decoy LN:2861 M5:45f856116b6642c701e0671967fb8bfe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001875v1_decoy LN:2856 M5:a35e380dc9bcacbbc7a29692f039feb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001876v1_decoy LN:2838 M5:e010e81c2ae154a12105872faac2d033 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001877v1_decoy LN:2801 M5:c830abeee2c0527ca00ee4004e2f26f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001878v1_decoy LN:2797 M5:9f0b46d448ffe81f55a61311b72408d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001879v1_decoy LN:2788 M5:ff37de9e839a483b85b9978f165e2aa4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001880v1_decoy LN:2773 M5:45df0f07d5235217631f54d4decf8ce9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001881v1_decoy LN:2755 M5:22fbad6b463ff553fbe7482783018f9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001882v1_decoy LN:2754 M5:f5751d68ef59013dd8a924405b61c766 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001883v1_decoy LN:2743 M5:68564eee42e550492f0bf366f22345f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001884v1_decoy LN:2725 M5:c4477959c12bb115614ea504cf712579 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001885v1_decoy LN:2722 M5:d221c4dd4b764a3cf767ae2f408cd855 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001886v1_decoy LN:2682 M5:6a91b1b63b686c713c6daaa9a5b28c48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001887v1_decoy LN:2669 M5:176039ee6f1d1ae8eaf240056ad7e1ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001888v1_decoy LN:2663 M5:ac2fb1176f2733ad7fcdd03cc15e919d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001889v1_decoy LN:2652 M5:f14b36f702c6db220606dd6696067369 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001890v1_decoy LN:2647 M5:82b5cfe2b5ccc5d14445809aefc4acee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001891v1_decoy LN:2635 M5:fa2959b22afb179b2e6b195f5bba68bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001892v1_decoy LN:2633 M5:62d8ae1cef408d715d22ae3ba3dfb9c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001893v1_decoy LN:2629 M5:cb667e2bdb9486da5a227dbd50803c45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001894v1_decoy LN:2612 M5:923dfb32d8271c70d8e8cd9288621481 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001895v1_decoy LN:2599 M5:691f294fc31908fd910ca9dac0cd4362 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001896v1_decoy LN:2566 M5:9cce036b1dc05a82d7a2bd677688b7a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001897v1_decoy LN:2556 M5:975e1058290d80f4ab2cf207313135aa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001898v1_decoy LN:2551 M5:e52be60ead1084c5dbd6851964b3d575 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001899v1_decoy LN:2551 M5:71028cef766fc1dc75684dc127ec3f73 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001900v1_decoy LN:2538 M5:e180467b2632a688c6d3b1e58b17892d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001901v1_decoy LN:2538 M5:bcaea2754972af50dff62993504801c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001902v1_decoy LN:2525 M5:647f59f3a4ad408b803a4c971db5651a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001903v1_decoy LN:2498 M5:80be471faeb22fb67458b7bb8e00ea3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001904v1_decoy LN:2496 M5:be7e3722d3c1a45b98f79cf89cfc235f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001905v1_decoy LN:2483 M5:609856bcc6aeb799c0a57773bccc7598 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001906v1_decoy LN:2475 M5:e64a6fb38d225decae7e079ea7b9732b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001907v1_decoy LN:2469 M5:e2b450a085ac14eec02539b8c1bd6bed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001908v1_decoy LN:2455 M5:0b0b3b8bce8db6dc091b3429802919bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001909v1_decoy LN:2444 M5:6a091545fa77d96dc253bedeaccb6692 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001910v1_decoy LN:2437 M5:ad77fbca3fa49f1c970e8c64b58391d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001911v1_decoy LN:2435 M5:233e3f635c3bd0fae9ed04c155c799a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001912v1_decoy LN:2427 M5:e22283fea810c2cc4c92cc5ac5ead914 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001913v1_decoy LN:2419 M5:ea7d2ed4522c0ecea6389a3b9fb7bcfd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001914v1_decoy LN:2413 M5:953de10ba34733832f5bbcb37e12c5fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001915v1_decoy LN:2412 M5:ea8ef9ae0476686a6cbd488a0202b2bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001916v1_decoy LN:2400 M5:0198ad2dfad702357fb849a43500deaa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001917v1_decoy LN:2399 M5:d566d3ebbd937aa7ba415298188a1c93 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001918v1_decoy LN:2396 M5:536fac7c509791bd524e9da425d7fd93 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001919v1_decoy LN:2393 M5:522e11044a40018a2f755d9d4fd8103b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001920v1_decoy LN:2386 M5:aa9e69c6d5f6d04b4030be6b3226964c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001921v1_decoy LN:2384 M5:b4d05aabf35963906d1861ef966a4709 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001922v1_decoy LN:2382 M5:97749df462ddf825702a260f9aa2f021 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001923v1_decoy LN:2382 M5:3c0d3376e16a20d57497a815d2475873 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001924v1_decoy LN:2367 M5:e76216aa8c58c6949a9c04cfa9b95995 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001925v1_decoy LN:2366 M5:4b4ae46d37a4f45b63c4b8c3cb63294c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001926v1_decoy LN:2362 M5:589965b553dd53d631ae9970b0c65403 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001927v1_decoy LN:2361 M5:aaac326f62cef7cc31b28e60534d0a3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001928v1_decoy LN:2353 M5:2c60f763bb39af3328df40c97b8e4f0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001929v1_decoy LN:2349 M5:5e3aee054d3451ec9e4e18ee277b5efb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001930v1_decoy LN:2348 M5:c885bcc19373dca31580a65ec6fc7e48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001931v1_decoy LN:2340 M5:b36f2e5330d409cd8ba0973000358c52 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001932v1_decoy LN:2339 M5:63104b56d2278c3cb82c3d6f23d8977c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001933v1_decoy LN:2336 M5:2c7518f9e4ed0d994be4698762511cf3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001934v1_decoy LN:2333 M5:308cac07c79336f8162a8c2e855f7762 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001935v1_decoy LN:2330 M5:bb4702fc9e6227387e8ce3498109d998 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001936v1_decoy LN:2327 M5:ddad50424c1114dd98bc0202ac1cd9fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001937v1_decoy LN:2318 M5:28804e3d50bf7764ac6b1897b1128790 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001938v1_decoy LN:2293 M5:2aa344c0d737b4d9042325fb5a858bee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001939v1_decoy LN:2292 M5:22b000d9737a411cb3844951ebc17b87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001940v1_decoy LN:2287 M5:44ec350c3d506da4df5a5c6c60683796 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001941v1_decoy LN:2274 M5:c2d8c7fed619477a490f674da302b98c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001942v1_decoy LN:2274 M5:bae016f221de9bcae9788e26dee71d3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001943v1_decoy LN:2267 M5:88696dc559363af860e8828eed45eb07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001944v1_decoy LN:2260 M5:be18f9c08c02b23d6bc3e38f71843b69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001945v1_decoy LN:2257 M5:bc65d96f85bac2cf76e5db2847c7c723 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001946v1_decoy LN:2240 M5:98c67c23fdf01dd3a05e1213470d56d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001947v1_decoy LN:2239 M5:0ec5d58555d46a257ce56425c730f4d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001948v1_decoy LN:2232 M5:b8901c5291103859cc240e5d6c96c4ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001949v1_decoy LN:2230 M5:976e267cf6d42bc3c67a345bb56e707f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001950v1_decoy LN:2230 M5:f179f9db12db687102c9a63bacaf36ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001951v1_decoy LN:2222 M5:f5a5058d6f869ae64c9a4b69439d4114 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001952v1_decoy LN:2216 M5:63f1d3d20deaabfeeb68d11879debd0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001953v1_decoy LN:2214 M5:b09d559a9d44f7eb887d75fd192524ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001954v1_decoy LN:2210 M5:7d0a884bf7fd09ebc9175286c058635f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001955v1_decoy LN:2203 M5:6005c464e19405b659d2d2e09778b06b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001956v1_decoy LN:2197 M5:a15768dc613354cb73ec09a4c5c814ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001957v1_decoy LN:2196 M5:cd06502f93b8e17fd05511c84cf6c523 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001958v1_decoy LN:2196 M5:c315413cc7a46460c67bde0cd8e78b71 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001959v1_decoy LN:2179 M5:708d5a6db13c3ac37d5e90e0cc2a8c32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001960v1_decoy LN:2178 M5:e217486e375bc7a5925ec6cc7fa9e003 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001961v1_decoy LN:2178 M5:dd793d59199c7f60817d549e0c149b15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001962v1_decoy LN:2172 M5:aff6ab00ffade197cf1c12f043e2cbe5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001963v1_decoy LN:2170 M5:2cf0f6c81889758a8dadc195f7928b09 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001964v1_decoy LN:2167 M5:c20e5ca2be0e106f7d0694f9e67a3ea2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001965v1_decoy LN:2167 M5:df1f17762d17818e216feee97299c37b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001966v1_decoy LN:2157 M5:071891675e2ba4476534e0035ef13cef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001967v1_decoy LN:2153 M5:59ad2443710d81ac651620a8f216e7c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001968v1_decoy LN:2151 M5:2c5f2ad4a6812000584bf131c918c3f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001969v1_decoy LN:2147 M5:e6458e552c51be648c8cc8ca7c01ac98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001970v1_decoy LN:2145 M5:408a6d5ea59519609696b4228f0cbf97 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001971v1_decoy LN:2142 M5:90b747485a6b12433a92fb55202869fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001972v1_decoy LN:2142 M5:7de080d8181d8066e63905fc22a7ee14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001973v1_decoy LN:2136 M5:b611d1ca78ef211201bfc0b6a68e74df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001974v1_decoy LN:2130 M5:5f1f983972aaf38be9f2fd9fbcef8a9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001975v1_decoy LN:2128 M5:0323f4f5194c96dc1bcb919f06960a20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001976v1_decoy LN:2126 M5:c142de1e2c1924e545f116a373abafc1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001977v1_decoy LN:2126 M5:6ec3293375949e50d082d3f5639ba434 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001978v1_decoy LN:2119 M5:e1eeff28afd215be837a02bfe59d8294 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001979v1_decoy LN:2107 M5:eee07feaf8a44d69317e6b46e8eee089 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001980v1_decoy LN:2091 M5:ea5e9165f2f579567e1addc7de1a7a6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001981v1_decoy LN:2087 M5:635626092c6f01e77135d2798172beb8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001982v1_decoy LN:2086 M5:269d34f32d02129323bbc21d6336cc6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001983v1_decoy LN:2083 M5:5aadd7636d45bda287185de4cefac8d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001984v1_decoy LN:2075 M5:ae2d128f1ba2ba34942dffebf4b7905f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001985v1_decoy LN:2075 M5:0f195e7dde4153887f4f0615cbd730e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001986v1_decoy LN:2072 M5:b236a0d4a67c91d699b3cdf5adc47a71 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001987v1_decoy LN:2068 M5:2e34944b2779f309285d9db7a20b69ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001988v1_decoy LN:2067 M5:233b964d4a2e5bab26b7b996dc46d4b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001989v1_decoy LN:2055 M5:795ffd63a0e2d97ac00ca57cdab045eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001990v1_decoy LN:2051 M5:5e69880a7e6f7bf744cf4b305624a7e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001991v1_decoy LN:2050 M5:abba4241716dcac69b95e887f8358859 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001992v1_decoy LN:2033 M5:096ca0754d9f8f4cf7a582f57c5fc083 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001993v1_decoy LN:2024 M5:288495a36e0f4b1fc8e90cff6d4734eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001994v1_decoy LN:2016 M5:96d95a271cf5d103433921842ead9915 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001995v1_decoy LN:2011 M5:cb8560d292475a0fd481b0e794ed0186 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001996v1_decoy LN:2009 M5:a6503ea36c1b69162d3eda87c4f33922 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001997v1_decoy LN:2003 M5:d3a1bed41244634725882235662d11a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001998v1_decoy LN:2001 M5:35916d4135a2a9db7bc0749955d7161a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:01:01:01 LN:3503 M5:01cd0df602495b044b2c214d69a60aa2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:01:01:02N LN:3291 M5:743d9f66c77fc21b964a681e0c6de2ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:01:38L LN:3374 M5:dd27b7fe617e92bb77eea00fede6fd15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:02 LN:3374 M5:3ba47a11a8a5b47ccb855308e26a2f4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:03 LN:3503 M5:554d43de8f2a97cae068169fe3d8462e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:04N LN:3136 M5:072ea3e53c79f3d00e1f1a7b492b0a8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:09 LN:3105 M5:68176666a98582ea361a9181d69679af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:11N LN:3374 M5:b9ad3338cc73e2a99888a36e04c29f75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:14 LN:3095 M5:0385be87eb49df4c59d7487495e3b1b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:16N LN:2985 M5:10150ad21301a29f92e1521530fdd3f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:20 LN:3105 M5:05dc0384da2f751afe549a9bfdbc3037 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:01:01:01 LN:3517 M5:174a8ac24d2e6625c1e7589219d6fb84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:01:01:02L LN:3287 M5:96a6b1f55c41a7da24857ab8844a7a22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:01:01:03 LN:3023 M5:0ac19a55ed1a22389a2d667c42ba1218 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:01:01:04 LN:3516 M5:f6a0bed71d059f8387d9d22e2b0c46b2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:02:01 LN:2917 M5:a99f213073198aa5a532f950135f6d1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:03:01 LN:3517 M5:8a795bfd81ee3440e8d0fa3e5d09cd35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:03:03 LN:3148 M5:6ec792b8a5944a6edb0c1acc18ee1418 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:05:01 LN:3517 M5:dbb2cf4bd26ccd1d7c17327d2cbc119f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:06:01 LN:3517 M5:00a663d257ac9d4d6eabae95f6fb6d8d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:07:01 LN:3517 M5:2833baebca84548dd4e37d79642db779 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:10 LN:3517 M5:61bf8d00643229eaec4eb8def24f1a98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:251 LN:3517 M5:d39aa010841e51a5fc857e82a3378d96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:259 LN:2978 M5:fcedee868a44319f80c453cf7b833abc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:264 LN:3002 M5:6cc807b0948af0b655ad0265629b7906 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:265 LN:3148 M5:5e00ac7ffc401cd5f866e17cd6b7d76b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:266 LN:3084 M5:fe25829d3992130e1ca423e98507b843 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:269 LN:3101 M5:724d76a112c0b557ae52e35dcc2973dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:279 LN:3103 M5:0aef01822ccf2bada1e9a2ce8c771711 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:32N LN:3517 M5:02ae1b32f6268509dbfab828c8339a36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:376 LN:3104 M5:79dba7660c7fa948d23f2703e80eab7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:43N LN:3218 M5:68aa8847e8ec55dce252be3812b03bac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:455 LN:3118 M5:6903220f41d0f8754d6cc3ff6fb3fbba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:48 LN:3517 M5:2947ea9bc4c28b64abba44002460a38f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:51 LN:3109 M5:84c0d488e0a5f95cb3587efd6c84b00c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:533 LN:3217 M5:34bc003a99760f4ec928572b3a747094 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:53N LN:3305 M5:108696b83e605fa59b435cfb8406edf4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:57 LN:3054 M5:bc22083129551a34dbbdfd07e36f763b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:60:01 LN:3112 M5:b58aed6de00585e7f185bf3eb573cb45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:65 LN:3387 M5:03702f960713a7c42469b033b7ef05ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:68 LN:3109 M5:74777150832f351162301c7d04a64d48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:77 LN:3371 M5:9e5ec638d0de688fc20aaf00b74b5a9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:81 LN:3309 M5:2cbf6e9f368ea4387632204bbdcba76f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:89 LN:3371 M5:782c923ac311a590d29e9e85b6a6b5e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:95 LN:3388 M5:36b421cc1baeb1cc37291f98566cc5f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:01:01:01 LN:3502 M5:bc204fec41a0219e8044aae1c5a3a6ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:01:01:02N LN:3373 M5:c9d431f34db1cf123c6dec89ae7075f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:01:01:03 LN:3094 M5:4744e9f0617b3715ed23779866c2e1ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:02:01 LN:3502 M5:d54cdfb5d7a25804bc3b5a3711d1e42c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:11N LN:3404 M5:fb87c0184303005cf961e7e6bc65a3f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:21N LN:3095 M5:665152840dba04b1bdbfefaf3d4913ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:36N LN:3142 M5:c5889d985a6d5ac0f86ee9a5f1449762 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:01:01 LN:3503 M5:1b32d51d3415a99c68971d21b686744a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:01:18 LN:3503 M5:3283d7a24c7ad61f9024a8f7d76d5bd6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:02:01 LN:3503 M5:fd13f748ca0c574e318250f8dc0f147e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:05 LN:3373 M5:78f70065b11cbfb3f502af9802ae3b7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:110 LN:2903 M5:ca7ce57dc961032a37af87fc26cb626e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:25 LN:3073 M5:e1ba0819b77d173c0a9c6697f76f3e50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:50Q LN:3362 M5:ec1d5f53ad6427e623c41a11393bc518 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:60 LN:3241 M5:6815ddd990a7231bc8dc40a414cba309 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:69N LN:3500 M5:dd8ce51ba7bb514b56ffcb5d7566dcae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:74 LN:3227 M5:057f5c85ad1f09e82b0f04bbc54f9283 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:75 LN:3184 M5:9975bcb416ee87f54025f71692bbc1ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:77 LN:3233 M5:615353e3ceac5a04cb381339a800ad9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*23:01:01 LN:3502 M5:edf8a55a69faad1aab25516e1126b0c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*23:09 LN:3104 M5:fbcac94109d55d95b94b869fd6e42705 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*23:38N LN:3020 M5:83381147ae6889a0af532bcb7af83e6a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:01:01 LN:3502 M5:95495e041aa53313d12032c49baa1b1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:01:02L LN:3502 M5:d91ba7d36f6472faec4c54d1f476c9f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:01:03 LN:3075 M5:a89ed5d11db1d882965e052a6a049217 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:03Q LN:3247 M5:d55685eded22f07791df08b502ad3872 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:10 LN:3356 M5:739b4ee3c4a555c2b699fa358ad07744 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:03:01 LN:3502 M5:d866111fbc6e2ea2cf086915b28442b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:07:01 LN:3502 M5:872c7be9ec525309cd91d949580a87e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:08 LN:3502 M5:f0bbd52535d5ef86e21c4486e1761207 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:09N LN:3502 M5:9d122834f5117a876ff9ef768a61672e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:10:01 LN:3502 M5:035534e6b4f7a7b2b20506a41290b8de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:11N LN:3503 M5:bb7085dbbd00c565896a17505dbd06c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:152 LN:3176 M5:6d81297ebe64b08f9ec9e8adedcde902 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:20 LN:3502 M5:eb4b55e730512095c889a1c36a7fb51d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:215 LN:3116 M5:f6c6ec83d1c70ef4bdc483abf45a141c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:61 LN:3043 M5:8ae770b761bfdf718a8cf382b54fc71a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:86N LN:3415 M5:0e1108b26db8b22f177b460c8a34c017 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*25:01:01 LN:2917 M5:2e22cd0725822e29d3f0df6844339714 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*26:01:01 LN:3517 M5:51cabb4c3149d169568609c1906d969a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*26:11N LN:3091 M5:112419eeaa846213785eadd7380308a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*26:15 LN:3217 M5:2a2c8f5ba64eb0110f2de0d8b74a5d98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*26:50 LN:3141 M5:9a1a6cdedaef2a3c66ca98f77622fe50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:01:01:01 LN:3518 M5:6a6e4c826d8743d5f327d8906a311270 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:01:01:02N LN:3303 M5:497a11cff2fde28a5c500d529581c57b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:02:01:01 LN:3518 M5:77d1ca0d5ea97ccf052d85d9515117ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:02:01:02 LN:3518 M5:53bad80334b21427430686d44dbda04d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:46 LN:3310 M5:b4635ec707263c634b27769afb46323a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:01:01 LN:3503 M5:c6b537ed485b72a6b78cf527493d8ca4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:02:01:01 LN:2903 M5:65d618ee20ba439ef5ae408a182e25df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:02:01:02 LN:3374 M5:4031b0ca00a39d4d076dcdc2808f590d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:04:01 LN:3503 M5:21f4d62eb6e85f6257661e4c94b68aa4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:89 LN:2903 M5:694bc9c1c804f437646697ba9d968bc5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:01:02 LN:3518 M5:6e24e36ceae5a9c0dfa1cbe4520b4425 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:01:23 LN:2918 M5:61060b6e397e85fd905668b5876d8c50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:04 LN:2918 M5:2d4a59604c2d3d795f3647a186685ad9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:14N LN:3090 M5:afc943d7553ef55e21a855f5e266c8a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:46 LN:3075 M5:ae87be36c211dbf040022ade7713d2c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*32:01:01 LN:3518 M5:d3a7f1fb642659538a431ee2c1d8113e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*32:06 LN:3389 M5:06c6aff700dd7ddd935fd83f2def16e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*33:01:01 LN:3518 M5:f1f4a4e1fd2e774e4003c4f94c67b36a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*33:03:01 LN:3518 M5:4e7abd41072e8f3c62c49c683497d39c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*33:07 LN:3389 M5:4ed7b17c57b32199660f285b9e53bdd8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*34:01:01 LN:3517 M5:c79f20a6bd41e2e41b6e067222b4af42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*34:02:01 LN:3096 M5:a3a26d9b6292599851c207c193d92b23 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*36:01 LN:2903 M5:a923a3fb762fa22c7956888b6634dbcf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*43:01 LN:3388 M5:a5e6a04ac5537f379e03956d57cefe3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*66:01:01 LN:3517 M5:787d6cacbda41669a942dc4b54c4f7e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*66:17 LN:3075 M5:5f0734606934302fccb508a2f5d3b915 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:01:01:01 LN:2930 M5:93bb5b64ccd0bab2bc0478d6bd0e8854 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:01:01:02 LN:3517 M5:957d09385dbaaadcf87f85227a2a43d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:01:02:01 LN:3517 M5:0e43acd52311b6485d4542edf7c6d286 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:01:02:02 LN:3388 M5:fbfbf3067287661249f797a0701cbb58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:02:01:01 LN:3517 M5:21b71bd572d6dda388a4d60211edba0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:02:01:02 LN:3506 M5:00fd36e8b22143b0adfbe025e2d5d2b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:02:01:03 LN:2909 M5:df913a8914cc697da83538a7b8e1898e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:02:02 LN:2916 M5:a34e21e7b4de5c05f67281bf68bdeb66 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:03:01 LN:2917 M5:9eaaf636f6b7bcb8557a2b843eda3b60 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:08:01 LN:3120 M5:c2e72d05d212b232f180c5020ad652ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:113 LN:3070 M5:474b432629b8d4cc0486021e71e3dabd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:17 LN:3134 M5:f44b78e8df335a94b8ba2ee62214ed82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:18N LN:3237 M5:250389f8d56a86c0037d9e10ce88aad4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:22 LN:3119 M5:5a8b2633f1fb32860f4d5df30e8677ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:71 LN:3198 M5:dd6320e01a52a1aaa9224cd4c39807e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*69:01 LN:2917 M5:02bd84b3d7b9d16ec8546efc41b4d0c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*74:01 LN:2918 M5:948aa5c51d96d4ecbe3fc862f0214a3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*74:02:01:01 LN:2918 M5:4b972360085a8e764c52f0a30ff47673 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*74:02:01:02 LN:3518 M5:97a7f1d63575aaadaff78b53c7bdd231 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*80:01:01:01 LN:3263 M5:5405ef04524037ea84ce1fc83dc9ac20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*80:01:01:02 LN:3055 M5:5cc77fd13bd6123b7300d6da19ae5c13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:02:01 LN:3323 M5:5eba87e3d51a0b86a498f97022e5714a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:05:01 LN:2676 M5:d41a7c05ac284e89b86b658d33564b3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:06 LN:2676 M5:a5d7749f86004926ffe9fc104b1e99c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:156 LN:2967 M5:8cc8227691836b87823ff2228f9b25a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:33:01 LN:3239 M5:6ab184ee1fa9167f8857a4d6a7b33da6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:41 LN:3266 M5:9b52773dd0c042b641ea254944e932d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:44 LN:3270 M5:03ee83997251cdeeec6269f547238122 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:50 LN:3323 M5:e369192a36b773e819b37507a823343d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:01:01 LN:3322 M5:4ed3fc74f9934e922cc8345b00459784 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:08N LN:3035 M5:3d8eb010a8cb9c3da8d4eb759dee63f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:132 LN:2675 M5:a863b21bd08f28404b8b991486beec56 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:134 LN:2959 M5:cd3c81892d9127631465bd4454169e3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:19N LN:3322 M5:c64401d837f2f4eb51a6f89375d02401 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:20 LN:3322 M5:87e42f5c7d6c6b2f1990fb2477271f14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:33 LN:3322 M5:704bdddcfc1c52e4181d4c12a4e25e54 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:79 LN:2676 M5:f08c9b4724eaaedae63d87b79af851de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:01:01 LN:3324 M5:6a8fa9ecf6d7b7a57c77b21c908740b0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:02:01 LN:3324 M5:120d59fa894b11fe23dce75e3f4869f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:02:03 LN:3323 M5:d52345523e7897e545fffd4718dcccf4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:02:09 LN:2919 M5:ef118f2b15e542e80c1b9c162ad69345 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:08 LN:3324 M5:11f30cc59a8a4b6d4b43144c294440c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:15 LN:3323 M5:0684fd43ee5428bc529561b33db2f2d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:25 LN:2689 M5:dbbc5af54a1289ade5eb273e2f7aee7e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*14:01:01 LN:3312 M5:3764a48b755f8e31055b0e861e4c74e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*14:02:01 LN:3312 M5:26b567e4c01ece594ca1d0f0b18ae0c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*14:07N LN:3255 M5:74dd725f56e8dad2652028bd0b496125 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:01:01:01 LN:3336 M5:b00240fd0143d1f67ee96b53a30adcfa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:01:01:02N LN:1208 M5:1c5acd964349055939ac8654093dde0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:01:01:03 LN:3026 M5:dcd416dc1f3d5d91d7374096d09a68ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:02:01 LN:3335 M5:25973b11c58535f98da0dae1d36e1ce7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:03:01 LN:2689 M5:bc488eabb3f7519b04b6a795acdf81c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:04:01 LN:3052 M5:6ccb4f7a3eeb9e8ed44236b5092c2bd9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:07:01 LN:3336 M5:7630abd7e06b6d17b3542a0efdb6c780 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:108 LN:3283 M5:80b9c94caa804a2bd7f2447b9d24cf82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:10:01 LN:2689 M5:c0699fd2bce33c66fbad3066177f17db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:11:01 LN:3336 M5:c3971913c6e6b41e2f1bbb56026c60b0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:13:01 LN:2688 M5:a5d9251e2d32c20001b7845134141a39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:16:01 LN:2688 M5:fc7d48526274847fbb255137159d9d47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:17:01:01 LN:3051 M5:fbfa24d81ff319e1c9a77eb23a5c5af6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:17:01:02 LN:3051 M5:547e0689ef02b1b497deaa785f374c32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:18:01 LN:3336 M5:79c954404a5e1b10f46264fbb3c6b32a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:220 LN:2878 M5:a87213c0fe840a0cac742fc92c4a203c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:25:01 LN:3335 M5:316c1666b4ee7ffb47f4922157d121c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:27:01 LN:2689 M5:e01a2e586f79a078cc425bfca6367182 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:32:01 LN:3336 M5:4411f20a66f0e08032144115799b7530 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:42 LN:3333 M5:e6b197d6c9397d8de0ea8de14a814b05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:58 LN:3336 M5:1c0d71c98a79449eabd99e163692bd6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:66 LN:2902 M5:a5186448b35a7b3923ccdae5bdf4bd8c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:77 LN:3336 M5:a4984835f8285fd5518e523394749864 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:83 LN:3337 M5:322d07dc63950f70a35cd4a6cb9ba2ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:01:01:01 LN:3323 M5:b0017c6a0823ba043caa28c260a41b12 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:01:01:02 LN:3323 M5:a51373cbff28c2af5ebec8fac8e33cca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:02 LN:2686 M5:ba01be9495db45e331f731023378e599 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:03 LN:3323 M5:207b298dc49c700b8a16865a72eb7c7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:17N LN:2979 M5:01b001b48d8d89f7671231f8cd45ca05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:26 LN:3323 M5:655b4f8cf9b575997c39e45df3664c8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:94N LN:2970 M5:67c613fbd0339031dc79fc91e294348a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:04:01 LN:3325 M5:4380eeb25545f28b8d6a8bf602e7c2f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:05:02 LN:3325 M5:f60437ab7a86bf431ed0854fd2641cdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:05:18 LN:3321 M5:ff2e5f34be64b46f1e15d1091ea54645 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:06 LN:3325 M5:4c3f65501973406722a9c66c6f129061 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:07:01 LN:2677 M5:61c1b2092f60d8b21a413b8e6846c58d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:131 LN:3325 M5:08dcdc60c6c29f52d100af9900b30e39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:24 LN:2677 M5:c0e3b858ba702a5959d35e51b8b75406 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:25 LN:2677 M5:f1a1a745dc082e0c0a91813d3f12e52d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:32 LN:3325 M5:ef9b650861b7081940788ef1618a074c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:01:01:01 LN:3327 M5:72eabdc1286e5f8faec021e4c3fbd212 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:01:01:02 LN:3327 M5:8d6dd73094fd1458c95866fab0bccfb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:01:22 LN:2806 M5:198a61b3d4b83cfed1fa018f0b5313e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:02:01 LN:3327 M5:69e50f2988b92d745c93ebc9877eace7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:03:01 LN:2689 M5:866f05a4324734d3cca067f98354488e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:05:01 LN:2690 M5:c6cc89ecf3130ee79cefb981dd362f0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:08:01 LN:2689 M5:6baeeca7110354530934af4af0cccd8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:14:02 LN:3327 M5:99db27c20c358808c9e75b090eb54d06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:241 LN:3042 M5:9fd1849b96ef49c7b705acfdfb430e8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:41 LN:3327 M5:8526562f5800fb5180e418bdf4b6e56b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*37:01:01 LN:3324 M5:8e4396d6b7c04761713fc800437312bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*37:01:05 LN:2687 M5:c4312bfb5ca6f84d1c4b2c444107b844 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*38:01:01 LN:3312 M5:205bcc2884f405305b551c58c25d7232 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*38:02:01 LN:3312 M5:501fd25edfcd87eeda45de0caa78e1de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*38:14 LN:2738 M5:7639a6e735e55ac574403a7970e113b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:01:01 LN:3155 M5:eee292da1356cc9c3bf1b333e89661d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:01:02L LN:3153 M5:cd343572a20faec9ea375660b4b08feb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:01:03 LN:3312 M5:e3fff974f234f099f66e0fe53a93ef2c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:03 LN:3155 M5:2e520e3148dcdf7d8fc7763872d61957 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:16 LN:3155 M5:cb333cf3f06cf66b86f11654c941690f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:21 LN:3312 M5:6e1fb83beab576ba8c39ff0237d40277 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:05:01 LN:2675 M5:bf2d7c62a16bf00c2559565daeb0538d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:06:02 LN:2674 M5:77758f231bef5ff95e5a4be58d38dde1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:10:01 LN:3027 M5:fb13d6eeb084ecb4d241e45485ef36e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:13:02 LN:3255 M5:5836ea0fc7935bd208b6caa597934b98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:14 LN:2765 M5:76c31f2b103685de65a25008bf484f11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:34 LN:3254 M5:840ee3b914f83a21f98cde71f89d77d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:38Q LN:2675 M5:55571273ba2d1a50d1f87b47ae59d9aa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:01:01 LN:2676 M5:afc20b1efd5b1b479db2e62fb8b88337 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:01:02 LN:3323 M5:e80885c2e036b557e2bd1ca6c2b6667f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:02:01 LN:3258 M5:e6e0e85a0fab0b1e17686742e0ace0e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:03 LN:2677 M5:a4f89215e2d83f162c338ac822bfb46e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:06:01:01 LN:3325 M5:9a238e4bba71b906acf8c46254a9bc31 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:06:01:02 LN:3299 M5:ee4804e6a27f57a5c37e372dc6daa312 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:10:01 LN:3304 M5:5d4db1b120369dcee6c52764f69bfb3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:150 LN:2800 M5:f889007857633aee1ffcdf1fc924ca96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:40 LN:2677 M5:549008522cb77878ea5c2cf5bd048064 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:72:01 LN:3283 M5:7d61179ccd5e3f1fe4b4976456960d02 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:79 LN:3257 M5:521e3a50ed37f445b431b465b0d4ed77 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*41:01:01 LN:3322 M5:17390ad33a3efae3617d3a175671902c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*41:02:01 LN:3322 M5:c886279897cd7e75a357ac3218a1be5f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*42:01:01 LN:3322 M5:154e1df41ca09b47ebd7e365545f6e6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*42:02 LN:2675 M5:59d27bea1d07ea5695101e714f65812c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*42:08 LN:3165 M5:d860761be3a99c6724146e606a28aac9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:01:01 LN:3323 M5:477ac3a92e88828aa579f38ac0fc39d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:01:02S LN:3152 M5:05fc8de1a02c971099db853c790d3fca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:01:03 LN:3152 M5:2202501e60f1d3e547cfe4e814c7f877 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:17 LN:3323 M5:3af3bf43df87b594bc20bc5f791785b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:27 LN:2872 M5:6ca96787a367bd1ce0838f941140cb81 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:03:01 LN:3323 M5:83f22de8d085ea321aad42dbf25a571a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:03:02 LN:2676 M5:9fcac4fbbe8fd92d125550cd06db12c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:04 LN:3239 M5:9b24c6a9a01dea4a6bcdb76824470e3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:09 LN:3317 M5:5ed7833ec37da80387b4a86c6b2a2040 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:138Q LN:3043 M5:1088ef8207c18405bc0b180f0226dab0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:150 LN:2676 M5:0290d7c3b24a19eefc6a89bc41146c39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:23N LN:3323 M5:f1ec2e8fa319def50d20ce89e0b80d5a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:26 LN:2804 M5:174005655892f2cff1ad41bb64927506 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:46 LN:3323 M5:4b352ce812b6c8a65a2e45741d805d7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:49 LN:3039 M5:cb75887e3f845944c90cdf5315369b16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:56N LN:2676 M5:4da8a161653ca5951070a765b2070b3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*45:01:01 LN:3338 M5:86f5f0263cbccdf31fc646079fce98d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*45:04 LN:3339 M5:bba751b5e3727ad2af0a8cb343a94d57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*46:01:01 LN:3336 M5:7ab2f1273efeb3a770ca80b5d0d078b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*46:01:05 LN:2891 M5:314e19fc403d8ea017669e53723aead0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*47:01:01:01 LN:3041 M5:3107f208d002db7e36cf098ebbb8516c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*47:01:01:02 LN:3041 M5:9f6a5f1290f5f00afcc6b1e732a37b14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*48:01:01 LN:3323 M5:105f81689cb818d76fe1effd3d150157 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*48:03:01 LN:2676 M5:874fcca35339a027ede1021bb682c5b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*48:04 LN:2676 M5:77accce2b51d36c34cfae7d7f77a0644 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*48:08 LN:3323 M5:f6f1a40b586aa5025bb2ed56a890ac8c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*49:01:01 LN:3340 M5:7da4db3c2933e38871dde7de2cdf0131 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*49:32 LN:3340 M5:1a762b6501a216624feb498212c99a07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*50:01:01 LN:3340 M5:9d8a8957807527e6413e745a8fd4e068 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:01:01 LN:3327 M5:263006da7f87d352df017a5efcc6a2ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:01:02 LN:3043 M5:d0a5d20ecc047c9db286860c217ffe57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:02:01 LN:3327 M5:0f09e1d79fda822bb499e29d59e7dfb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:07:01 LN:3327 M5:63b4b6ba9c4049e98e44399a1b1ad03c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:42 LN:2962 M5:8253b5b1e485378dfeedfa598e677579 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*52:01:01:01 LN:3327 M5:bb94101c60541202c4b844e21b640a92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*52:01:01:02 LN:3327 M5:ff0ebc333c63692ac07e7b95c6febbd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*52:01:01:03 LN:3327 M5:9e6abe5b1d3205aed3a8b62d580f5c6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*52:01:02 LN:3327 M5:d7fde559163710e8a22f5497902dee7b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*53:01:01 LN:3327 M5:0e08f9e5e5ee052f077c388fe43ed672 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*53:11 LN:3274 M5:9d84a07be4be471551bc6c8cd89ddfa0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*54:01:01 LN:3332 M5:7621d4b27eef76b4b57df91eee3bd38c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*54:18 LN:2813 M5:ecf8408d4379ee7e2467c784e51ea2bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:01:01 LN:3332 M5:b19860ce7d3e3feec3da15d850ffaf83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:01:03 LN:3332 M5:17fe5fcacdc35ec18448d04e206578e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:02:01 LN:3333 M5:fe9cf4bfff80e738fa573a1e4336621c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:12 LN:3332 M5:570fdcabb0ff55d30de3a319b09b2da2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:24 LN:3332 M5:0194f66b5128ba6d3eb9fec43ee985c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:48 LN:2980 M5:b8cd7ebdabaea8025fe0b0308b1c500f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*56:01:01 LN:2688 M5:8ea679a7f814ff4b104970fc3363591c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*56:03 LN:2688 M5:13a5b854a9c6cf607e0758dd8977a136 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*56:04 LN:2688 M5:52674e8d83e65bf23b0b36f2cee3b279 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:01:01 LN:3337 M5:435c90dcaa816e70a0a07c23d2f363b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:03:01 LN:2689 M5:b412ccacf520ef015be9010e88d13fd6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:06 LN:3284 M5:14711544ed455ec1aa9a55bae251514e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:11 LN:3306 M5:66b4e723563c1e4a79cc9233cbc2d5fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:29 LN:3337 M5:ae6a6681ba3a2ed0efeceafc6ac41fb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*58:01:01 LN:3336 M5:89112836a876c731a21d3e2357e297d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*58:31N LN:3004 M5:8507d0acf3a65b125d7ff5bd6c4d1e8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*59:01:01:01 LN:3333 M5:23fda5090f014267db805d001c7c3add AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*59:01:01:02 LN:3332 M5:c4602c638fb61927261e08d529f2898f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*67:01:01 LN:3312 M5:87814da89393ae312125f9b36af8bb77 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*67:01:02 LN:2675 M5:390a5500664173ba6708dbeed0e360dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*67:02 LN:3307 M5:ca5872a8e8c8fe4b920ba96e1542cf58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*73:01 LN:3323 M5:0136d8cfbbe9fd393a1e699753f7f7a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*78:01:01 LN:3327 M5:81fbcef3edbbc1e8df879a12d817a9b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*81:01 LN:2676 M5:06b880357cb8d04e7715100462e6e58d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*82:02:01 LN:3050 M5:7f0f011b72e32064bdeab6fc9d15df0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:02:01 LN:3349 M5:0071e65ee429afd318ef699ad315c4b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:02:11 LN:3057 M5:b9f8c9b73140b44e888ca0d3cb97a51a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:02:29 LN:3349 M5:daaad7b0fa23883b6f6a74c29b218154 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:02:30 LN:3333 M5:f72ada7c617959035065509827004c55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:03 LN:3349 M5:1dfba36de6a84343e0f1bc21f4290dd1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:06 LN:2895 M5:707a109a70808774faabaa9f20fc9c2d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:08 LN:3349 M5:d84d29f8412f7bc25c6faa02ce1e8027 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:14 LN:2895 M5:6184a7ce778825a8d3dbbdca08425352 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:21 LN:2895 M5:7c3c33a8a09cf7ab14dfb252dbb028be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:30 LN:3349 M5:e7dc7b0b79ca3fba89e46935c2f6f53a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:40 LN:2968 M5:1f1ff8df1d52ca176768c131fa0dfd1b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:02:02:01 LN:3347 M5:7d432e207af5901819172d943367ab85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:02:02:02 LN:3347 M5:3b927e5396f09d7b73cebc3cf7894022 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:10 LN:2893 M5:bc3caf3cb6c08beee025921ea8ab2c2b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:11 LN:3320 M5:86a83cd46a667da7f75c104e6964997a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:16:02 LN:3029 M5:117c55e59cdf735f8e4600c677295e86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:69 LN:2933 M5:8fb20dc7ab2383635eb05c7b6aa75585 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:85 LN:3347 M5:19bc16298211d1df9285935c0e74349e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:86 LN:3347 M5:1a839f0d783dd916f4c4d85314fb33d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:87 LN:3064 M5:efb30bed21ab99dd6db7b5aec573702f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:02:01 LN:2894 M5:df3f967e88fe534c02bfad024b8c887a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:02:02:01 LN:3348 M5:7ca03d45f7f1fd27eac518520148daa3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:02:02:02 LN:2896 M5:6d6e1775bedec2a59fa4d0bd7c94f4c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:02:02:03 LN:3348 M5:22fe2d580ec4460d1b085eba87d9aac0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:03:01 LN:3348 M5:4e9e631972020eda52a012a3bcce4cd5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:04:01:01 LN:3348 M5:df0eaa78940580a0f21395f9387cc32d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:04:01:02 LN:3348 M5:d13c9657f578e20631d54771581b5204 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:04:02 LN:2877 M5:be42038dd5348757a9c683918b1db4f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:04:04 LN:2966 M5:deeefe05be47eaf45bb483add4913ffc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:05 LN:2894 M5:bb0c05e7fd6c15d9d6593a4f3bbe783f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:06 LN:2894 M5:21c18b0c0ff10700610d7f1a50b1c899 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:100 LN:3034 M5:99e13ee46eceaa60fe5084f320894a2d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:13:01 LN:3065 M5:3981907aafcbb510b01423d7f323477c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:20N LN:3321 M5:b3a7cb20db02d1256c2106d420e765fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:219 LN:3070 M5:2f9e694079fd1378d796e05baa51889c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:261 LN:3348 M5:3248cc886e5d3793ba099f0ab1a05d66 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:40:01 LN:2894 M5:93c62f86d2dfc6633dbd2c975908da1a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:41:02 LN:3328 M5:f5752e34d19b00f37d306621c38909a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:46 LN:2997 M5:0ea8327e0b67ad6f90e5a44c1629c7d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:61 LN:2894 M5:6d712f749acb251535e2ae8c3c617413 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:01 LN:3349 M5:3efce3936c70251730ad6b287f7d110e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:02 LN:3349 M5:5d4e1f36ad16f12cbf6447e60f24081c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:03 LN:3349 M5:9e9f6956c08e23d56266b6fa217efd7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:04 LN:3012 M5:2579591d3a321b72379ecd8a51d7edd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:05 LN:2931 M5:64ad58c15cabe00bc7528c32341c0878 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:62 LN:3329 M5:43792d77155a7b8f48cd4c57e217997e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:03:01 LN:3349 M5:0ccb8d21235af6c2aff22aa6afbc6732 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:06 LN:3349 M5:63b57fd97300edc439359a50449974db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:09N LN:2991 M5:0fbbbf7cb8fddeb130cf9e967404f973 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:128 LN:3086 M5:e6d5cc6672b9d7e2050ce659e5ed35b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:161 LN:3237 M5:5bf40c2edbc86b4e13300af3d685dc1b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:177 LN:3349 M5:8547dcf17572b7586eec8ec28cbb8792 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:70 LN:3058 M5:5f1c7d679cd5c3f3110db5fe628cd613 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:71 LN:3086 M5:02b46fcce463bf80c626c51f5d36bab3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:01:01:01 LN:3349 M5:c6d922fe90d58a4380b338ce33a098db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:01:01:02 LN:3349 M5:a7b54d490750d2723ab72f5eab4de589 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:08 LN:3059 M5:1560938f348bbf8027a77fe08ce4b46f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:09:01 LN:3322 M5:bb8835a101a1bd226ba1cf04e30c8298 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:93 LN:2946 M5:8163cb61a36ebacb034b44d4537e3ccd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:02:01:01 LN:3349 M5:e2d2d51306ffa6a15072abc9e218afa3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:02:01:02 LN:3349 M5:289ade2a84e2a669f4950d905de18ef3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:02:01:03 LN:3349 M5:541d1cf5b93596d04882fdcea98fdb24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:23 LN:3349 M5:f90da72a0371a17e345090ee35ced67e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:24 LN:3349 M5:8416842ec1691954a14211e9b178951b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:46N LN:2987 M5:1276d9ecb257086ba85fb1dff231b2d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:01:01 LN:3354 M5:718bc83515052da25d2aa2cf1017aa8d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:01:02 LN:3093 M5:e45eed48ec341cc12ae10b917381d885 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:02 LN:3352 M5:d7dd73d1eb5b9a25c83e84ef950dd44b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:19 LN:3354 M5:db13dc42d8ac6f58daa4d04dd21e0296 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:27 LN:3195 M5:53fc59605c057f246aa7cb06caa3523c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:45 LN:3354 M5:7b104b85dc1b908764ff4904a903c90a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:01 LN:3354 M5:00b5a7cce8e5acc98b508e4d39091f15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:02 LN:3074 M5:152f1c93813d70470aa3a116478c5a69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:03 LN:3354 M5:b854cfa857b40775c2ad6e6ded4b848a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:04 LN:3353 M5:7de039797ea7911c70f4fa82c658366e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:05 LN:3354 M5:00709b8f2f15aa3aa482a992d1d87b60 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:05 LN:2903 M5:c7cbc76d1fb0114a55ee635afdb0cd15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:06 LN:3354 M5:1d0e73f11030eece15f033cab7216c51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:64 LN:3354 M5:7f780958705ae801a5814f2471cb59f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:04:01 LN:3354 M5:7aa1a4c1a413aca4e232a2e7dce8ee4d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:04:02 LN:3343 M5:b44a66a5ff9ba711c465dc629d4336e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:06 LN:3354 M5:3ac9135bdf1975f31d5f501cb5b62c98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:149 LN:3098 M5:df315cb1e89fca70587836e750b11737 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:18 LN:3353 M5:fa6f988acdf9509ba3790814e29ef79c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:19 LN:3222 M5:2597c84fe3afb1831211a4c9ad6427ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:26 LN:3069 M5:705cb7c1e6112114a894aab34b391fdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:30 LN:2903 M5:e5947b700176aabf378cf29e78c17084 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:32N LN:3334 M5:fe7d565923067a8248624f41f45c79df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:384 LN:3349 M5:90a8a5267a890ccd78717e88de59232d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:385 LN:3354 M5:20b5d8a093d1e81d1e6b9e56b6d4ad17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:386 LN:3183 M5:b5524ee2cc10b5a45e99af42e190f5f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:391 LN:3354 M5:de98c716203e1ca551130af6affe2199 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:392 LN:3354 M5:1a509719976de84a60b59343364e4b51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:49 LN:2935 M5:45a4d818fffa2d2428658489af9e98b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:56:02 LN:3354 M5:e4c99b9226de6adbf587934d835048d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:66 LN:3354 M5:a822c754dee47e720af532f5f5bb1ef4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:67 LN:3354 M5:2ba41a6538775c77f84b648069196d70 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:01:01 LN:3349 M5:96d5d92a1f9a605bb014f058b767ecfd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:01:03 LN:2998 M5:585c1deb75a38ddadc48575546be3772 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:02:01:01 LN:3349 M5:734e931f1481380f2d0bf98c7925ee2f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:02:01:02 LN:3349 M5:8f2c108d077649a22ae5df5fb42fe265 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:03:01 LN:3349 M5:633f446c1fba5006f49dd2bbddb3ce5e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:04:01 LN:2895 M5:0d4f700e3c6bb58e12ab10c1c85f1bcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:112 LN:3178 M5:ad581d3ae2ddf7d3895c8bda459221c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:20 LN:3349 M5:de321b1690b9ce4e07c6f6f1c838ba7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:21 LN:3349 M5:574d8b3a969397fe0d6168a851acac10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:22 LN:3349 M5:c4fc4ff7544492d91fc221e274b790a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:24 LN:2895 M5:9cc0d743f4c6cea3a61dd94cf81e8782 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:27 LN:3349 M5:3ab94e3b0cb8b613e8cc644c6dc715d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:36N LN:3097 M5:5e4997d79367c75ea3301d1222f70938 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:40 LN:2978 M5:e8013eaab611499b1827191279b34223 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:41 LN:3019 M5:bf7ecc6786f26c3740e9291e7fdd990e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:62 LN:3086 M5:a3f951c6e67ba7b5d43b4678504ceb8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:02:02 LN:3349 M5:6f12358794b5c624b6948b27722c0d4d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:03:01:01 LN:3349 M5:a5f9f1324e2a617a08c5bcbc275608b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:03:01:02 LN:3348 M5:ff3c56a68534ef6adbf0622ea691498c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:08 LN:3066 M5:5800471074ab27c8bea70d68c5e225d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:13 LN:3058 M5:807b94f9d89314085415b5578b24a778 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:19 LN:3349 M5:3f11cc62c9ed887231ac88ad834d72c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:22 LN:2895 M5:9ba9eb10b465c567357944d23d28cb83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:99 LN:3349 M5:6bc65113a76be4e417061df97ec9323e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*14:02:01 LN:3349 M5:8707b7806173ec4a4c61b1d405f1aae3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*14:03 LN:3349 M5:833afc09e1ba23f97925580cbd67b077 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*14:21N LN:3099 M5:360ab26c5e5b147d6195bcdff0c92871 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*14:23 LN:2976 M5:e5e65cbe62521c667b3ed587aaa762e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:02:01 LN:3349 M5:95c60c535112b121a9e6ee900399d619 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:05:01 LN:3349 M5:d59cc60db3e774256fafc8cb4e13702e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:05:02 LN:3349 M5:e4ecf0c60d3ee668e494d70c54964c29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:13 LN:2895 M5:a7312985b9c4182c9232eb0ffdc57ed0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:16 LN:3066 M5:35043b5832829f2204f9418cc925e19b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:17 LN:3349 M5:82cd4aaf3336e9d3414b28f0d7286e9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:96Q LN:3349 M5:42133cdaef4b18738bc26fa5695f8f65 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*16:01:01 LN:3349 M5:0c9b3216f1f00e1a3201ea90fb49bd61 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*16:02:01 LN:2895 M5:cf1da0837be9b9302b0fb7158fc5396d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*16:04:01 LN:3349 M5:aefc6289675459afe38397002b7451c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*17:01:01:01 LN:3368 M5:aafe636c5bfce4449d6eed73eefa3a9f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*17:01:01:02 LN:3368 M5:d3cbf8067c1957eaeb80c6a399477245 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*17:01:01:03 LN:3368 M5:f2cc1e59a91a4f102f9ab5fdf4d3c1ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*17:03 LN:3197 M5:a94688722b11045bbf7ef13dfc7d34a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*18:01 LN:3346 M5:d53dd9ee731f0437bbbffc584867b0b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:01:02 LN:6489 M5:d0d728fb8e62a0b0366517669b0e4164 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:02:01:01 LN:6484 M5:823632b556203973124fe9c35cb13a3b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:02:01:02 LN:6485 M5:6d2b0b5b4de67207756f9a9ca9132232 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:02:01:03 LN:6485 M5:df8eab835a0677224be043db0196865c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:02:01:04 LN:6492 M5:1e79553d8e925c6243368db955220c7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:03:01:01 LN:6485 M5:705ec2d75d9d349a7e4d1b2df73073d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:03:01:02 LN:6492 M5:dc4b199889931d13d1522358a9a01f3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:04:01:01 LN:6484 M5:f9a28fc80725b04a807c1a7fa37786bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:04:01:02 LN:6485 M5:da201e2fb04103e9cfa1eaecab78b098 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:05:01 LN:6485 M5:a13023aaec38d48c163c5fe5996596d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:07 LN:5959 M5:1af58658f072dc6319086af52c3d5f6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:10 LN:5790 M5:52685ee8463a30a3909841a38e4b9d8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:11 LN:5926 M5:18894dd38987f5ffd32b9896a4a7f732 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*02:01 LN:6403 M5:14bb0fb46e443150199a75018f001115 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*03:01:01 LN:6437 M5:75b42b5c4fb93885ab4fdb6a312d690f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*03:02 LN:6437 M5:caaf9e4318294ebd0c262db0018d88fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*03:03:01 LN:6437 M5:c0908bb87356f6cad982be1acb618dcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*04:01:02:01 LN:5853 M5:dc7c3223c9df7e828a1c8f22c4cc89c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*04:01:02:02 LN:5666 M5:6548c257283705fae841fe89148efc1f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*04:02 LN:6210 M5:6d9b8e4e332e7e398b831c81a6179e76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:01:01:01 LN:5806 M5:72dbcba71cbed79962e1fcb9efa94824 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:01:01:02 LN:6529 M5:b129bfcbf4b80c10ffab12eb652ba5a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:03 LN:6121 M5:38e52c5a505ee662100c0789cfe884a7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:05:01:01 LN:6593 M5:f4020b6d26ac50eed22026f28371f610 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:05:01:02 LN:6597 M5:456ddd5aaccb336023a80f2ae5abbbdd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:05:01:03 LN:6393 M5:39e340eb675634315a0f9aa27e8fdb32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:11 LN:6589 M5:a47aa87bace1ec4da327ee121bceac36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*06:01:01 LN:5878 M5:cd02d6c8bd4c86f9abb999bab52820cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*02:01:01 LN:7480 M5:0b0031da03392e56acd208fc67ae6e39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*02:02:01 LN:7471 M5:69337da3c9bd0a6048d1a1144aabbdb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:01:01:01 LN:7231 M5:78802163e98cdc6f909438b62e0cfab4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:01:01:02 LN:7230 M5:e8f01ef987d6dd2a878f94e6d97be1f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:01:01:03 LN:7231 M5:2423aebb09fea4369cab41a1ea47afc8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:02:01 LN:7126 M5:2218c10eeaa7f39f94ed3f0309605510 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:03:02:01 LN:7126 M5:ffa1cdc44c405e284e6f51859e1c2b36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:03:02:02 LN:7126 M5:739f0c7c0c72cf31a975aebe2109f11c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:03:02:03 LN:6800 M5:2dd9cf67abbc473a663d6d559694616b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:05:01 LN:6934 M5:0de7b3ac9974b084f8db58e416c25eb5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*05:01:01:01 LN:7090 M5:38570713e3fcfe831cc045e479f65e9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*05:01:01:02 LN:7090 M5:0f304adf7acf3bd4b7c54c1394c85a4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*05:03:01:01 LN:7089 M5:618b80618d0a6750a82d9caf5b2b01ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*05:03:01:02 LN:7089 M5:198d06518fff03b2dafc0bb113efc008 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*06:01:01 LN:7111 M5:231c9c7d1321a266933777181a2761a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*06:02:01 LN:7102 M5:739d56a7e8c44823d1a11bd4ff13f465 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*06:03:01 LN:7103 M5:1bfde4e12c5bac5e9e5e7e6b84582b0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*06:09:01 LN:7102 M5:805267e877e03b8ec95319888e38c5dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*01:01:01 LN:10741 M5:91618decb1b3933c623070b2ccbe52a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*01:02:01 LN:11229 M5:9efa1a8356e55f6be83b4ddb84833e4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*03:01:01:01 LN:13908 M5:411919f8128149a1f5099cdd22d276ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*03:01:01:02 LN:13426 M5:869ae29cc3f279d7fc43e27249a53e8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*04:03:01 LN:15246 M5:ce0de8afd561fb1fb0d3acce94386a27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*07:01:01:01 LN:16110 M5:4063054a8189fbc81248b0f37b8273fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*07:01:01:02 LN:16120 M5:a4b1a49cfe8fb2c98c178c02b6c64ed4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*08:03:02 LN:13562 M5:dc6eb484555ba796b15b9b91aa1a9ec6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*09:21 LN:16039 M5:cad793cbc22699d1cca3101b5a55437d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*10:01:01 LN:13501 M5:91dcd8c149b00a3edb1afa43a1cc6346 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*11:01:01 LN:13921 M5:07cefc23572c21731a2804c5d44fcf55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*11:01:02 LN:13931 M5:f47cd478ee5be3ff048069adbbb5c101 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*11:04:01 LN:13919 M5:fc86714e3d7b9503d74e40d92f08cd7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*12:01:01 LN:13404 M5:31f08980f62b68be96334f3cafc3e7c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*12:17 LN:11260 M5:b0b7bea536479c8e61164e1475203038 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*13:01:01 LN:13935 M5:937994edc4b4760eb13cbf451c3f3bbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*13:02:01 LN:13941 M5:6a124566ab0a103d525d2fcf1292ce15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*14:05:01 LN:13933 M5:10890137f738be0861b6ba128cfb953d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*14:54:01 LN:13936 M5:2b67be4ed005b3f3040e3c72bfc65c0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:01:01:01 LN:11080 M5:d22cd7f323b0e51abb025a4dec827aa5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:01:01:02 LN:11571 M5:5e3280587aa6f38dd9a282e9bf21287e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:01:01:03 LN:11056 M5:d548f5e5798e09c869571ea8c660c983 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:01:01:04 LN:11056 M5:3bb2753595aaf099a490a7ce1e042fce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:02:01 LN:10313 M5:2deab6035ce8cc2e09db20698cf1f117 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:03:01:01 LN:11567 M5:e6a26b767a62b282e0db211bbc9a7363 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:03:01:02 LN:11569 M5:4e0d459b9bd15bff8645de84334e3d25 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*16:02:01 LN:11005 M5:4a972df76bd3ee2857b87bd5be5ea00a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +chr1 1 248956422 + . +chr2 1 242193529 + . +chr3 1 198295559 + . +chr4 1 190214555 + . +chr5 1 181538259 + . +chr6 1 170805979 + . +chr7 1 159345973 + . +chr8 1 145138636 + . +chr9 1 138394717 + . +chr10 1 133797422 + . +chr11 1 135086622 + . +chr12 1 133275309 + . +chr13 1 114364328 + . +chr14 1 107043718 + . +chr15 1 101991189 + . +chr16 1 90338345 + . +chr17 1 83257441 + . +chr18 1 80373285 + . +chr19 1 58617616 + . +chr20 1 64444167 + . +chr21 1 46709983 + . +chr22 1 50818468 + . +chrX 1 156040895 + . +chrY 1 57227415 + . +chrM 1 16569 + . diff --git a/assets/chrY_grch38.interval_list b/assets/chrY_grch38.interval_list new file mode 100644 index 00000000..ef58ff66 --- /dev/null +++ b/assets/chrY_grch38.interval_list @@ -0,0 +1,3368 @@ +@HD VN:1.5 SO:coordinate +@SQ SN:chr1 LN:248956422 M5:6aef897c3d6ff0c78aff06ac189178dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2 LN:242193529 M5:f98db672eb0993dcfdabafe2a882905c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3 LN:198295559 M5:76635a41ea913a405ded820447d067b0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4 LN:190214555 M5:3210fecf1eb92d5489da4346b3fddc6e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5 LN:181538259 M5:a811b3dc9fe66af729dc0dddf7fa4f13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6 LN:170805979 M5:5691468a67c7e7a7b5f2a3a683792c29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7 LN:159345973 M5:cc044cc2256a1141212660fb07b6171e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8 LN:145138636 M5:c67955b5f7815a9a1edfaa15893d3616 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9 LN:138394717 M5:6c198acf68b5af7b9d676dfdd531b5de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10 LN:133797422 M5:c0eeee7acfdaf31b770a509bdaa6e51a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11 LN:135086622 M5:1511375dc2dd1b633af8cf439ae90cec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12 LN:133275309 M5:96e414eace405d8c27a6d35ba19df56f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13 LN:114364328 M5:a5437debe2ef9c9ef8f3ea2874ae1d82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14 LN:107043718 M5:e0f0eecc3bcab6178c62b6211565c807 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15 LN:101991189 M5:f036bd11158407596ca6bf3581454706 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16 LN:90338345 M5:db2d37c8b7d019caaf2dd64ba3a6f33a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17 LN:83257441 M5:f9a0fb01553adb183568e3eb9d8626db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18 LN:80373285 M5:11eeaa801f6b0e2e36a1138616b8ee9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19 LN:58617616 M5:85f9f4fc152c58cb7913c06d6b98573a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20 LN:64444167 M5:b18e6c531b0bd70e949a7fc20859cb01 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21 LN:46709983 M5:974dc7aec0b755b19f031418fdedf293 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22 LN:50818468 M5:ac37ec46683600f808cdd41eac1d55cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrX LN:156040895 M5:2b3a55ff7f58eb308420c8a9b11cac50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrY LN:57227415 M5:ce3e31103314a704255f3cd90369ecce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrM LN:16569 M5:c68f52674c9fb33aef52dcf399755519 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270706v1_random LN:175055 M5:62def1a794b3e18192863d187af956e6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270707v1_random LN:32032 M5:78135804eb15220565483b7cdd02f3be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270708v1_random LN:127682 M5:1e95e047b98ed92148dd84d6c037158c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270709v1_random LN:66860 M5:4e2db2933ea96aee8dab54af60ecb37d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270710v1_random LN:40176 M5:9949f776680c6214512ee738ac5da289 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270711v1_random LN:42210 M5:af383f98cf4492c1f1c4e750c26cbb40 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270712v1_random LN:176043 M5:c38a0fecae6a1838a405406f724d6838 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270713v1_random LN:40745 M5:cb78d48cc0adbc58822a1c6fe89e3569 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270714v1_random LN:41717 M5:42f7a452b8b769d051ad738ee9f00631 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270715v1_random LN:161471 M5:b65a8af1d7bbb7f3c77eea85423452bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270716v1_random LN:153799 M5:2828e63b8edc5e845bf48e75fbad2926 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_GL000221v1_random LN:155397 M5:3238fb74ea87ae857f9c7508d315babb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_GL000008v2_random LN:209709 M5:a999388c587908f80406444cebe80ba3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL000208v1_random LN:92689 M5:aa81be49bf3fe63a79bdc6a6f279abf6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270717v1_random LN:40062 M5:796773a1ee67c988b4de887addbed9e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270718v1_random LN:38054 M5:b0c463c8efa8d64442b48e936368dad5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270719v1_random LN:176845 M5:cd5e932cfc4c74d05bb64e2126873a3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270720v1_random LN:39050 M5:8c2683400a4aeeb40abff96652b9b127 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270721v1_random LN:100316 M5:9654b5d3f36845bb9d19a6dbd15d2f22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_GL000009v2_random LN:201709 M5:862f555045546733591ff7ab15bcecbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_GL000225v1_random LN:211173 M5:63945c3e6962f28ffd469719a747e73c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270722v1_random LN:194050 M5:51f46c9093929e6edc3b4dfd50d803fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_GL000194v1_random LN:191469 M5:6ac8f815bf8e845bb3031b73f812c012 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270723v1_random LN:38115 M5:74a4b480675592095fb0c577c515b5df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270724v1_random LN:39555 M5:c3fcb15dddf45f91ef7d94e2623ce13b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270725v1_random LN:172810 M5:edc6402e58396b90b8738a5e37bf773d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270726v1_random LN:43739 M5:fbe54a3197e2b469ccb2f4b161cfbe86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270727v1_random LN:448248 M5:84fe18a7bf03f3b7fc76cbac8eb583f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270728v1_random LN:1872759 M5:369ff74cf36683b3066a2ca929d9c40d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL000205v2_random LN:185591 M5:458e71cd53dd1df4083dc7983a6c82c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270729v1_random LN:280839 M5:2756f6ee4f5780acce31e995443508b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270730v1_random LN:112551 M5:48f98ede8e28a06d241ab2e946c15e07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270731v1_random LN:150754 M5:8176d9a20401e8d9f01b7ca8b51d9c08 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270732v1_random LN:41543 M5:d837bab5e416450df6e1038ae6cd0817 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270733v1_random LN:179772 M5:f1fa05d48bb0c1f87237a28b66f0be0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270734v1_random LN:165050 M5:1d17410ae2569c758e6dd51616412d32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270735v1_random LN:42811 M5:eb6b07b73dd9a47252098ed3d9fb78b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270736v1_random LN:181920 M5:2ff189f33cfa52f321accddf648c5616 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270737v1_random LN:103838 M5:2ea8bc113a8193d1d700b584b2c5f42a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270738v1_random LN:99375 M5:854ec525c7b6a79e7268f515b6a9877c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270739v1_random LN:73985 M5:760fbd73515fedcc9f37737c4a722d6a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrY_KI270740v1_random LN:37240 M5:69e42252aead509bf56f1ea6fda91405 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270302v1 LN:2274 M5:ee6dff38036f7d03478c70717643196e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270304v1 LN:2165 M5:9423c1b46a48aa6331a77ab5c702ac9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270303v1 LN:1942 M5:2cb746c78e0faa11e628603a4bc9bd58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270305v1 LN:1472 M5:f9acea3395b6992cf3418b6689b98cf9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270322v1 LN:21476 M5:7d459255d1c54369e3b64e719061a5a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270320v1 LN:4416 M5:d898b9c5a0118e76481bf5695272959e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270310v1 LN:1201 M5:af6cb123af7007793bac06485a2a20e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270316v1 LN:1444 M5:6adde7a9fe7bd6918f12d0f0924aa8ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270315v1 LN:2276 M5:ecc43e822dc011fae1fcfd9981c46e9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270312v1 LN:998 M5:26499f2fe4c65621fd8f4ecafbad31d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270311v1 LN:12399 M5:59594f9012d8ce21ed5d1119c051a2ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270317v1 LN:37690 M5:cd4b1fda800f6ec9ea8001994dbf6499 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270412v1 LN:1179 M5:7bb9612f733fb7f098be79499d46350c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270411v1 LN:2646 M5:fc240322d91d43c04f349cc58fda3eca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270414v1 LN:2489 M5:753e02ef3b1c590e0e3376ad2ebb5836 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270419v1 LN:1029 M5:58455e7a788f0dc82034d1fb109f6f5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270418v1 LN:2145 M5:1537ec12b9c58d137a2d4cb9db896bbc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270420v1 LN:2321 M5:bac954a897539c91982a7e3985a49910 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270424v1 LN:2140 M5:747c8f94f34d5de4ad289bc604708210 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270417v1 LN:2043 M5:cd26758fda713f9c96e51d541f50c2d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270422v1 LN:1445 M5:3fce80eb4c0554376b591699031feb56 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270423v1 LN:981 M5:bdf5a85c001731dccfb150db2bfe58ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270425v1 LN:1884 M5:665a46879bbb48294b0cfa87b61e71f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270429v1 LN:1361 M5:ee8962dbef9396884f649e566b78bf06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270442v1 LN:392061 M5:796289c4cda40e358991f9e672490015 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270466v1 LN:1233 M5:530b7033716a5d72dd544213c513fd12 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270465v1 LN:1774 M5:bb1b2323414425c46531b3c3d22ae00d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270467v1 LN:3920 M5:db34e0dc109a4afd499b5ec6aaae9754 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270435v1 LN:92983 M5:1655c75415b9c29e143a815f44286d05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270438v1 LN:112505 M5:e765271939b854dd6826aa764e930c87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270468v1 LN:4055 M5:0a603090f06108ed7aff75df0767b822 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270510v1 LN:2415 M5:cd7348b3b5d9d0dfef6aed2af75ce920 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270509v1 LN:2318 M5:1cdeb8c823d839e1d1735b5bc9a14856 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270518v1 LN:2186 M5:3fd898b62ca859f50fb8b83e7706352b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270508v1 LN:1951 M5:7d42a358d472b9cbdfdf30c8742473d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270516v1 LN:1300 M5:1cbaaafbbf016906a5bf5886f5a0ecb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270512v1 LN:22689 M5:ba1021c82d1230af856f59079e2f71b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270519v1 LN:138126 M5:8d754e9c9afd904fba0a2cd577fcc9a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270522v1 LN:5674 M5:070b4678e22501029c2e3297115216bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270511v1 LN:8127 M5:907ca34a4a2a6673632ebaf513a4c1a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270515v1 LN:6361 M5:dd7527ee8e0bdb0a43ca0b2a5456c8c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270507v1 LN:5353 M5:311894d0a815eb07c5cac49da851cb4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270517v1 LN:3253 M5:913440c38d95c618617ca69bb9296170 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270529v1 LN:1899 M5:4caf890f2586daab8e4b2e2db904f05f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270528v1 LN:2983 M5:d75c9235f0b8c449fc4352997c56b086 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270530v1 LN:2168 M5:04549369e1197c626669a10164613635 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270539v1 LN:993 M5:19e3a982e67eafef39c5a3e4163f1e17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270538v1 LN:91309 M5:d60b72221cc7af871f2c757577e4c92a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270544v1 LN:1202 M5:e62a14b14467cdf48b5a236c66918f0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270548v1 LN:1599 M5:866b0db8e9cf66208c2c064bd09ce0a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270583v1 LN:1400 M5:b127e2e6dbe358ff192b271b8c6ee690 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270587v1 LN:2969 M5:36be47659719f47b95caa51744aa8f70 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270580v1 LN:1553 M5:1df30dae0f605811d927dcea58e729fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270581v1 LN:7046 M5:9f26945f9f9b3f865c9ebe953cbbc1a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270579v1 LN:31033 M5:fe62fb1964002717cc1b034630e89b1f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270589v1 LN:44474 M5:211c215414693fe0a2399cf82e707e03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270590v1 LN:4685 M5:e8a57f147561b361091791b9010cd28b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270584v1 LN:4513 M5:d93636c9d54abd013cfc0d4c01334032 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270582v1 LN:6504 M5:6fd9804a7478d2e28160fe9f017689cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270588v1 LN:6158 M5:37ffa850e69b342a8f8979bd3ffc77d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270593v1 LN:3041 M5:f4a5bfa203e9e81acb640b18fb11e78e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270591v1 LN:5796 M5:d6af509d69835c9ac25a30086e5a4051 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270330v1 LN:1652 M5:c2c590706a339007b00c59e0b8937e78 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270329v1 LN:1040 M5:f023f927ae84c5cc48dc4dce11ba90f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270334v1 LN:1368 M5:53afe12d1371f250a3d1de655345d374 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270333v1 LN:2699 M5:57baf650c47bba9b3a8b7c6d0fb55ad6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270335v1 LN:1048 M5:eb27188639503b524d2659a23b8262ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270338v1 LN:1428 M5:301ef75a6b2996d745eb3464bd352b57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270340v1 LN:1428 M5:56b462bac20d385cdfcde0155fe4c3a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270336v1 LN:1026 M5:69ad2d85d870c8b0269434581e86e30e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270337v1 LN:1121 M5:16fc8d71a2662a6cfec7bdeec3d810c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270363v1 LN:1803 M5:6edd17a912f391022edbc192d49f2489 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270364v1 LN:2855 M5:6ff66a8e589ca27d93b5bac0e5b13a87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270362v1 LN:3530 M5:bc82401ffd9a5ae711fa0ea34da8d2f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270366v1 LN:8320 M5:44a0b65b7ba6bcff37eca202e7d966ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270378v1 LN:1048 M5:fc13bda7dbd914c92fb7e49489d1350f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270379v1 LN:1045 M5:3218bef25946cd95de585dfc7750f63b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270389v1 LN:1298 M5:2c9b08c57c27e714d4d5259fd91b6983 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270390v1 LN:2387 M5:7a64d89ea14990c16d20f4d6e7283e10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270387v1 LN:1537 M5:22a12462264340c25e912b8485cdfa91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270395v1 LN:1143 M5:7c03ca4756c1620f318fb189214388d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270396v1 LN:1880 M5:9069bed3c2efe7cc87227d619ad5816f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270388v1 LN:1216 M5:76f9f3315fa4b831e93c36cd88196480 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270394v1 LN:970 M5:d5171e863a3d8f832f0559235987b1e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270386v1 LN:1788 M5:b9b1baaa7abf206f6b70cf31654172db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270391v1 LN:1484 M5:1fa5cf03b3eac0f1b4a64948fd09de53 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270383v1 LN:1750 M5:694d75683e4a9554bcc1291edbcaee43 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270393v1 LN:1308 M5:3724e1d70677d6b5c4bcf17fd40da111 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270384v1 LN:1658 M5:b06e44ea15d0a57618d6ca7d2e6ac5d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270392v1 LN:971 M5:59b3ca8de65fb171683f8a06d3b4bf0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270381v1 LN:1930 M5:2a9297cfd3b3807195ab9ad07e775d99 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270385v1 LN:990 M5:112a8b1df94ef0498a0bfe2d2ea5cc23 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270382v1 LN:4215 M5:e7085cdcee6ad62f359744e13d3209fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270376v1 LN:1136 M5:59e8fc80b78d62325082334b43dffdba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270374v1 LN:2656 M5:dbc92c9a92e558946e58b4909ec95dd5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270372v1 LN:1650 M5:53a9d5e8fd28bce5da5efcfd9114dbf2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270373v1 LN:1451 M5:b174fe53be245a840cd6324e39b88ced AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270375v1 LN:2378 M5:d678250c97e9b94aa390fa46e70a6d83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270371v1 LN:2805 M5:a0af3d778dfeb7963e8e6d84c0c54fba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270448v1 LN:7992 M5:0f40827c265cb813b6e723da6c9b926b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270521v1 LN:7642 M5:af5bef7cefec7bd7efa729ac6c5be088 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000195v1 LN:182896 M5:5d9ec007868d517e73543b005ba48535 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000219v1 LN:179198 M5:f977edd13bac459cb2ed4a5457dba1b3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000220v1 LN:161802 M5:fc35de963c57bf7648429e6454f1c9db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000224v1 LN:179693 M5:d5b2fc04f6b41b212a4198a07f450e20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270741v1 LN:157432 M5:86eaea8a15a3950e37442eaaa5c9dc92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000226v1 LN:15008 M5:1c1b2cd1fccbc0a99b6a447fa24d1504 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000213v1 LN:164239 M5:9d424fdcc98866650b58f004080a992a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270743v1 LN:210658 M5:3b62d9d3100f530d509e4efebd98502c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270744v1 LN:168472 M5:e90aee46b947ff8c32291a6843fde3f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270745v1 LN:41891 M5:1386fe3de6f82956f2124e19353ff9c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270746v1 LN:66486 M5:c470486a0a858e14aa21d7866f83cc17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270747v1 LN:198735 M5:62375d812ece679c9fd2f3d08d4e22a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270748v1 LN:93321 M5:4f6c6ab005c852a4352aa33e7cc88ded AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270749v1 LN:158759 M5:c899a7b4e911d371283f3f4058ca08b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270750v1 LN:148850 M5:c022ba92f244b7dc54ea90c4eef4d554 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270751v1 LN:150742 M5:1b758bbdee0e9ca882058d916cba9d29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270752v1 LN:27745 M5:e0880631848337bd58559d9b1519da63 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270753v1 LN:62944 M5:25075fb2a1ecada67c0eb2f1fe0c7ec9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270754v1 LN:40191 M5:fe9e16233cecbc244f06f3acff3d03b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270755v1 LN:36723 M5:4a7da6a658955bd787af8add3ccb5751 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270756v1 LN:79590 M5:2996b120a5a5e15dab6555f0bf92e374 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270757v1 LN:71251 M5:174c73b60b41d8a1ef0fbaa4b3bdf0d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000214v1 LN:137718 M5:46c2032c37f2ed899eb41c0473319a69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KI270742v1 LN:186739 M5:2f31c013a4a8301deb8ab7ed1ca1cd99 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000216v2 LN:176608 M5:725009a7e3f5b78752b68afa922c090c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_GL000218v1 LN:161147 M5:1d708b54644c26c7e01c2dad5426d38c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270762v1_alt LN:354444 M5:b0397179e5a92bb7a3300b68e45a9f72 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270766v1_alt LN:256271 M5:e3f36479d0e07abbd0d47babdc76e19d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270760v1_alt LN:109528 M5:f2ea4b127c54df13f53a2b2b5a358087 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270765v1_alt LN:185285 M5:628b663499df4f5de7dbdd56943bdb6e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_GL383518v1_alt LN:182439 M5:978987018f1a910273ebcc387e038de8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_GL383519v1_alt LN:110268 M5:349e96f115f829409bd1087b5fb684ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_GL383520v2_alt LN:366580 M5:52e97087cc76c9fd73d4815c1e379ee0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270764v1_alt LN:50258 M5:36d9e8a04906213f8c1d4cf81fc4f83f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270763v1_alt LN:911658 M5:2f651e42b9fd434c2310be375fe8645e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270759v1_alt LN:425601 M5:8477794d60329af9bd00cd9277981a59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270761v1_alt LN:165834 M5:3909a76846aa6ed534ba6be66a60cc81 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270770v1_alt LN:136240 M5:38181b04426519779c84cf9a8927cf00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270773v1_alt LN:70887 M5:aa8b8ec2dd7776e643699db29ac85d74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270774v1_alt LN:223625 M5:a6d8be44258a4b8e3b55ffaccbd3b444 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270769v1_alt LN:120616 M5:537f266cfc0ba05dfb532658fb592eb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_GL383521v1_alt LN:143390 M5:8c6f0a214ddbfbd52be574a566e4b21a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270772v1_alt LN:133041 M5:7cc5209d7e796e90bd024204c04a9b7f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270775v1_alt LN:138019 M5:79c3c0ad56276d3eff8cb747b57973a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270771v1_alt LN:110395 M5:3739c7d552cfc62c495704f4f2d61330 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270768v1_alt LN:110099 M5:5f6d54708a2fd0e4592319c2c91850a7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_GL582966v2_alt LN:96131 M5:485c442c93fe19514153702f0c84d952 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_GL383522v1_alt LN:123821 M5:df3e809f9a87f792218db18db51f6ad4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270776v1_alt LN:174166 M5:87fe3336a33a4aa9c04ff7991aa78a11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270767v1_alt LN:161578 M5:160c7bb94aa35c1d61c27aadf1727862 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_JH636055v2_alt LN:173151 M5:42f48ed9d46aded55795ef64e4713d55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270783v1_alt LN:109187 M5:3a60aafd707904d4da9c1c090a7cf0ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270780v1_alt LN:224108 M5:2c050e6aeecf29b54469dea8c5631057 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_GL383526v1_alt LN:180671 M5:620913159e2fbd4e931ac120e3c584c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270777v1_alt LN:173649 M5:9673b29322cf16da2d295778229c1772 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270778v1_alt LN:248252 M5:f0053d7b401730af8c34cd7d20dd0a91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270781v1_alt LN:113034 M5:c94ff451868540e0399bf62acb24e1dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270779v1_alt LN:205312 M5:3eec883e9656d4c4d96ea1e6d3c118ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270782v1_alt LN:162429 M5:ceaa7d4ca7d4b80ba9a8d9e48223de2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270784v1_alt LN:184404 M5:35980922a4773cefc710c08134d16772 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270790v1_alt LN:220246 M5:07cf7caef89c4677af575c370a1ebbb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_GL383528v1_alt LN:376187 M5:2948653361f974fbed3e26a4dfbf332c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270787v1_alt LN:111943 M5:e315d4f96ad548f1af1935d97f2af9df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_GL000257v2_alt LN:586476 M5:03c6c36060cd6c9f9b4fd0b096ff40e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270788v1_alt LN:158965 M5:463baeb6369579e0d387371989492dc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_GL383527v1_alt LN:164536 M5:6d728406957c5c7fb158dbdb7efef2b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270785v1_alt LN:119912 M5:4932c3e044a1e3731cd4de290f6492b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270789v1_alt LN:205944 M5:3c9ef00afbe249de4934eeac37d64233 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270786v1_alt LN:244096 M5:107c6b17f17b5d24936663fe8e70cd2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270793v1_alt LN:126136 M5:0c6c632ce75031c86e3054c34d3b9b49 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270792v1_alt LN:179043 M5:3677eaca510b7e7c5f30ec8382a09d24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270791v1_alt LN:195710 M5:3a62433e49995583fc44e640241a60bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL383532v1_alt LN:82728 M5:eb61b6b3f9374b05ce68ae4a393cf5ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL949742v1_alt LN:226852 M5:20d5046bbd2a21729fdd64fa94bdd5a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270794v1_alt LN:164558 M5:9808234a2843375d92d4c34e262373b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL339449v2_alt LN:1612928 M5:1b6fa375fdf382778e6645d822d12254 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL383530v1_alt LN:101241 M5:adcb4048e465b6b949990853e436a136 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270796v1_alt LN:172708 M5:6b125232b8842fafd4179203620fa2be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_GL383531v1_alt LN:173459 M5:9161d10779b02fa44b841136ef9e499c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270795v1_alt LN:131892 M5:6670fafb8f6ceb4f46392f3178f29666 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000250v2_alt LN:4672374 M5:740358c10fbb870c86a7e44226bbdb3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270800v1_alt LN:175808 M5:3ed7e87ce250a8466359176e96d6a6a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270799v1_alt LN:152148 M5:80fd907ae0e4d20ad13960cb92ab6d45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL383533v1_alt LN:124736 M5:7d1a65603558094937299ff10e8714af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270801v1_alt LN:870480 M5:bd0c66e2085cf16906ebc6b130862bd6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270802v1_alt LN:75005 M5:c66357c9b0909ee32c75286796602ce3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KB021644v2_alt LN:185823 M5:332d693d4f2026747d670e52836694ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270797v1_alt LN:197536 M5:2b76b3d07dc4cb2992e7125c19e32594 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270798v1_alt LN:271782 M5:7f074e537d58c543d116ce2c45bb0966 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270804v1_alt LN:157952 M5:9babd3431c32811769c782703f7b8c3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270809v1_alt LN:209586 M5:26d14130d09dc093446dd31e8f0be76c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270806v1_alt LN:158166 M5:b55d6ad642408486735aede89d70c0c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_GL383534v2_alt LN:119183 M5:c6ff49147dedce02366d6ade10580611 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270803v1_alt LN:1111570 M5:986e63220694b8c91bad1d6d990f6c83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270808v1_alt LN:271455 M5:52ce11809c32fe22003c5039e407d3e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270807v1_alt LN:126434 M5:4da184771ac6a8644e6df506bbd8a35e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270805v1_alt LN:209988 M5:d3a95141230a470a930f685fbce90a04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270818v1_alt LN:145606 M5:5f8af0060f092d941cbe9d873ccc1d41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270812v1_alt LN:282736 M5:93b572cdabe748641570fa2ed3391222 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270811v1_alt LN:292436 M5:dacc0b0ef9fae890a1741dca03ba7d5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270821v1_alt LN:985506 M5:bbdee492e8852d313be96b6340fbfb1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270813v1_alt LN:300230 M5:c91599edb1c553cf527c7f3ba754bb20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270822v1_alt LN:624492 M5:2cd6749ad4385747595c0b41440cb41d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270814v1_alt LN:141812 M5:84d9d4bbbac92a40b13809e501ff92fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270810v1_alt LN:374415 M5:369545bbf4f206fd1175a84da12b38fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270819v1_alt LN:133535 M5:29d6d49a19ae259feb012f492ab83ce0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270820v1_alt LN:36640 M5:d3b4609d5f29708fc33023259e4b775a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270817v1_alt LN:158983 M5:d6e6a3ac3c2f5afe16c2cfb2e813b30c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270816v1_alt LN:305841 M5:60bb5379ab4d817058300ef606b9fee6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270815v1_alt LN:132244 M5:8be72bf872ff1edfc3f43cd9b7d0b9b3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_GL383539v1_alt LN:162988 M5:12406aad3f3da31bda9c21a1aa0e16b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_GL383540v1_alt LN:71551 M5:23aea04f46682e2a2be1a5ff3934a9fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_GL383541v1_alt LN:171286 M5:0c787911df2449cbba8609bebf897ecb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_GL383542v1_alt LN:60032 M5:12a3180640a49f33c960eb12ca61a6c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr9_KI270823v1_alt LN:439082 M5:ad4baa1567e313eda0aad427008e10cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10_GL383545v1_alt LN:179254 M5:c27dc6fea378fecf178a44682257c25e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10_KI270824v1_alt LN:181496 M5:af40e32c32de290cfe497a110ff3bdfa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10_GL383546v1_alt LN:309802 M5:ed6fb45e0a25c31903cbb0f78d9d487e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr10_KI270825v1_alt LN:188315 M5:3119d196965ee9cae7aeda77131076f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270832v1_alt LN:210133 M5:2b63a3f97e490e807587639807d26293 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270830v1_alt LN:177092 M5:dbe0c94a39d4a91469ffa6e509b3f191 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270831v1_alt LN:296895 M5:b0f755388212c03651b6fdc7531c3fd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270829v1_alt LN:204059 M5:6bc1308e442a1662ae27952f126b7c01 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_GL383547v1_alt LN:154407 M5:7b556f03729e304a286c8d7ef0f0c10e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_JH159136v1_alt LN:200998 M5:8ac9fb9d942dba38bfd30f8d767f4bba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_JH159137v1_alt LN:191409 M5:b293c854ddcbc316cb1d449bca46fbb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270827v1_alt LN:67707 M5:86017dee76a03e3dc3c8833018101fae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270826v1_alt LN:186169 M5:a903d85efe5aa37dac36160bddeeac87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL877875v1_alt LN:167313 M5:3dd30a7638c3a3c518fc15571546b1be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL877876v1_alt LN:408271 M5:5c3a364520bf7ed46894abdce8f6e032 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270837v1_alt LN:40090 M5:e749a70a94624f09e134600d122c130d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383549v1_alt LN:120804 M5:60a7c1711d7f23fd7311a7e4f96896f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270835v1_alt LN:238139 M5:b163c6fa013f6cb75b01088689f1a67f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383550v2_alt LN:169178 M5:d61d9a153c3fd556b48e1c511a6145e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383552v1_alt LN:138655 M5:c28f12c6ee0dec4cc6995766a710960c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383553v2_alt LN:152874 M5:89b111e38005345de92036b249ab6080 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270834v1_alt LN:119498 M5:3ad1c94c00299533f6acd33ea2f04df1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_GL383551v1_alt LN:184319 M5:d96719c32333013a51c4d6d3261f984f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270833v1_alt LN:76061 M5:8c9988aa66d02708e3e57663902fc664 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270836v1_alt LN:56134 M5:28a69648439a2c02d46750eee929b20d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270840v1_alt LN:191684 M5:d90a653d7ac3171c8fb762d0012249f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270839v1_alt LN:180306 M5:b97ea581776626ac41b69f851a85a456 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270843v1_alt LN:103832 M5:563c8412eb284fc5321af590a4c9ab9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270841v1_alt LN:169134 M5:6ac8a99077817e6bc9be36327b8aa18e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270838v1_alt LN:306913 M5:baf90eafb4ed6330cb151c1d5538f721 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr13_KI270842v1_alt LN:37287 M5:231dd4484df464129d3120986fe2af73 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270844v1_alt LN:322166 M5:b64acbff6218bd210676141e4e678a82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270847v1_alt LN:1511111 M5:9d380ae26e2edb178ef0121021f7a7ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270845v1_alt LN:180703 M5:51b3fa9f43d11aeb91b3debb33496d22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr14_KI270846v1_alt LN:1351393 M5:1ee28b84d30d13e03341b382995b05bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270852v1_alt LN:478999 M5:5104fe22193b4bd04166ecb401beb06a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270851v1_alt LN:263054 M5:64217994ed61c2feb5412ecc5a7a37b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270848v1_alt LN:327382 M5:d61e4262335c4884ad97dc5d73782870 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_GL383554v1_alt LN:296527 M5:4a3d54bda53308ca941d6d0e794b05cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270849v1_alt LN:244917 M5:7966604eef1b897ee97e8dce9e79b18e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_GL383555v2_alt LN:388773 M5:c904b1792869ae0565acbbdc19b9522f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270850v1_alt LN:430880 M5:5371d98deea30e91051e3efd20016b76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270854v1_alt LN:134193 M5:0e126949f4b012d27f55aed5f1c4ca84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270856v1_alt LN:63982 M5:515d2b9de600d584473c20bea079f34c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270855v1_alt LN:232857 M5:436afa974458133c013b037d4a2dc1c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_KI270853v1_alt LN:2659700 M5:5e28daf08ffeafb037b6e97ba3c959e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_GL383556v1_alt LN:192462 M5:bed6a2667e8452a176e93e921e0c21f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr16_GL383557v1_alt LN:89672 M5:0989118882ce9c38635e2809e5bf71c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL383563v3_alt LN:375691 M5:fcd64ac83b2ebb57f50931c9d6fc0a31 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270862v1_alt LN:391357 M5:f2efc8dc887a8c0101053fa14491e07f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270861v1_alt LN:196688 M5:808750bf9b346e0a731a1bffac75a01e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270857v1_alt LN:2877074 M5:f5ca1bb91881efefa473c983f9519561 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_JH159146v1_alt LN:278131 M5:384b5b32f0ea2cfd15ac268a2ce07909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_JH159147v1_alt LN:70345 M5:4bf63957bfa1ecdbbab483d4c0ce6682 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL383564v2_alt LN:133151 M5:fc2eb07543a6ecb0a27d9fa12cd91cfc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL000258v2_alt LN:1821992 M5:8bd6071029f2dbc5ab9d2d912bf5c953 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL383565v1_alt LN:223995 M5:063358c8e7f81361b959efab7b3f15cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270858v1_alt LN:235827 M5:69fbdc82c5ef837f574d0b3c8b9c647f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270859v1_alt LN:108763 M5:8d28bd3b1a63fa9a945051f28e087668 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_GL383566v1_alt LN:90219 M5:a0f25165c6537c9861cc1231f710e99f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270860v1_alt LN:178921 M5:91e560df1ad6c58e7e1739178b8c7209 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_KI270864v1_alt LN:111737 M5:04e6ca7eabe96be35a18eb4c0675071d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383567v1_alt LN:289831 M5:d9015dd9a0916a98ed8ab99fd3cdd012 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383570v1_alt LN:164789 M5:08366c03855961f13b1d5e65920ccf74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383571v1_alt LN:198278 M5:40015159c7da8f06875bb558587e3f07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383568v1_alt LN:104552 M5:e9aba11d18125a2bce2b1e5915e9a904 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383569v1_alt LN:167950 M5:8d13c3e7cbb2b7e1a3225c5a54fe8f44 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_GL383572v1_alt LN:159547 M5:8fc7aaa775b43df3d77c9782a140a981 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_KI270863v1_alt LN:167999 M5:2e691a3fc5108cc7decde377ef398fde AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270868v1_alt LN:61734 M5:2dfd26bf8f217b858edc062be1846db5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270865v1_alt LN:52969 M5:b95ce15823c60ab83ec7a984f3dc9ebc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL383573v1_alt LN:385657 M5:5404455aab275489bc8e6c9fb3ead5cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL383575v2_alt LN:170222 M5:dd8730d9d33765ff135fcfadb8810280 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL383576v1_alt LN:188024 M5:8d4496a682182f8273a2fad665fcf4a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL383574v1_alt LN:155864 M5:0386df1d3476e6649f919195cc072fc7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270866v1_alt LN:43156 M5:d205b57d55e89546400e0f1e230a8a53 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270867v1_alt LN:233762 M5:3d8464a9e183031ea70e0e12fa231163 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949746v1_alt LN:987716 M5:d76e635e75bc038782fb3d0c195d33fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20_GL383577v2_alt LN:128386 M5:f00c218d09df83c8b515a6b5591fe30c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20_KI270869v1_alt LN:118774 M5:2b8065d3bdbac6664d7f35c25d049113 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20_KI270871v1_alt LN:58661 M5:29e7c064fe54ab6b7fd8accb0363821b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr20_KI270870v1_alt LN:183433 M5:779f6fd5220eddc54631e80b94bb905a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_GL383578v2_alt LN:63917 M5:d512f47a48fc477e7232d3b46f2bda86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_KI270874v1_alt LN:166743 M5:45c435343bfd1d94c4ff17689faf507d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_KI270873v1_alt LN:143900 M5:22bc49cad0dda4ec9d79ffd619be94d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_GL383579v2_alt LN:201197 M5:631f76952802048256225746f1a14a89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_GL383580v2_alt LN:74653 M5:b0cfe93a0987bda7488445b3c37b2516 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_GL383581v2_alt LN:116689 M5:1c9b893acb0fb6a6d9ff1915ce9004ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr21_KI270872v1_alt LN:82692 M5:e8daa648582ccb498c469d4f6dcf4140 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270875v1_alt LN:259914 M5:8a27dfcd4c4ae0239e3207b9994d8331 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270878v1_alt LN:186262 M5:07e6bd13f82b45996b0165c0a2c0ebb2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270879v1_alt LN:304135 M5:9fb8076a6ca93af66b2878d5cf07ebb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270876v1_alt LN:263666 M5:507bafbc0e637e7e5854acab4d2b7de7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270877v1_alt LN:101331 M5:b6724c024308122f0d19c875771d571e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_GL383583v2_alt LN:96924 M5:03ed78804fcfe33fb202c22d20e1ed05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_GL383582v2_alt LN:162811 M5:1919a95f3ea48fde56ba925295086028 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrX_KI270880v1_alt LN:284869 M5:e4ed2d1ef2ee71f00075ed9537aab284 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrX_KI270881v1_alt LN:144206 M5:6370851c900248567c9bc5bee75089ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270882v1_alt LN:248807 M5:9a4ca55b5d44458dc5a1682ac6483738 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270883v1_alt LN:170399 M5:79916aa2c6a7669500b59ddd7b4eccec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270884v1_alt LN:157053 M5:28517f9e5682de5e74b42ba7c84a9d41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270885v1_alt LN:171027 M5:b5fc4688af8411394923dbcf6a85b85d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270886v1_alt LN:204239 M5:fae7fb0677c513b24e8027969233140f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270887v1_alt LN:209512 M5:3c672b8b13188d46ed1ea6806fdc9662 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270888v1_alt LN:155532 M5:325a22a47ae227dda0c8704cf4725601 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270889v1_alt LN:170698 M5:680f4977d9743df71085eacbff34769b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270890v1_alt LN:184499 M5:8862bbaae8fc895769859a6e89d19601 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270891v1_alt LN:170680 M5:0b1dd9ea37a3772563fb7298ad1f3857 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr1_KI270892v1_alt LN:162212 M5:24ba517f0feae1b6a95e1c65c21282be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270894v1_alt LN:214158 M5:0bfafe4b4a536ed3e5b77a89408d7534 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr2_KI270893v1_alt LN:161218 M5:d701ebc3d24a0056dc6b9418ba4e15c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270895v1_alt LN:162896 M5:4d08672ade726bd914e62a36d734da0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270896v1_alt LN:378547 M5:751a447059436d9d5987f8417b2e2bd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270897v1_alt LN:1144418 M5:5a8582c4943187c1a842801cf17d3706 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr5_KI270898v1_alt LN:130957 M5:9919f71320ac92b1abb42e2aedea84ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000251v2_alt LN:4795265 M5:e51d466e4a702acf3c9c5ffdc1ee0c51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr7_KI270899v1_alt LN:190869 M5:b42d6c28bfd9049414fb9d2617528db4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270901v1_alt LN:136959 M5:3d60ee1215e273e0c0267ad063614015 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270900v1_alt LN:318687 M5:80404f3147bd316898e6b5281f32c073 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270902v1_alt LN:106711 M5:f100803823a7cde3694698028e4c515c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270903v1_alt LN:214625 M5:5ce11ce469afc974c3024b30033dc5d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr12_KI270904v1_alt LN:572349 M5:6d8ebe7fb3dd3be62e34a1d2982e6f46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270906v1_alt LN:196384 M5:eb8157203f051ef7cfcab1f4647f22c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr15_KI270905v1_alt LN:5161414 M5:31c97360f2a53ab92bd8d6db1b1a410d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270907v1_alt LN:137721 M5:f5a65eb09de3017536d1b7c0b2237fbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270910v1_alt LN:157099 M5:4eef5dbfe56e13c810780221b0f6426d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270909v1_alt LN:325800 M5:6a46afe4c5e257b556f25c37a09fc024 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_JH159148v1_alt LN:88070 M5:bd147af8e713f365ff05352eb8a4508f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr17_KI270908v1_alt LN:1423190 M5:ef3f9ebebe7ad9f9690daedeae8a74f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_KI270912v1_alt LN:174061 M5:3a8acbc0c5c751ccad11263a608715fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr18_KI270911v1_alt LN:157710 M5:930ee72eaddcaf1355220cd39539c326 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949747v2_alt LN:729520 M5:10169e6e86933b2bf74797be020fc857 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KB663609v1_alt LN:74013 M5:54abe159678a84e88ceb2d5271027628 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrX_KI270913v1_alt LN:274009 M5:a4d4a5e5b5da1e65f007116b2797a4f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270914v1_alt LN:205194 M5:086e17b28e2ac14e602c5dae2c358364 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270915v1_alt LN:170665 M5:a5c43ab0e4289f3951e65fd57419782a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270916v1_alt LN:184516 M5:45199873c7617fab0ba00e85a43ddbeb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270917v1_alt LN:190932 M5:1595cb5d2e776d8a505a06db45ea2c04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270918v1_alt LN:123111 M5:e79cb3af945f28de17d744bf24cde080 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270919v1_alt LN:170701 M5:a25ce4a282c7ead76bb2468a9a56d082 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270920v1_alt LN:198005 M5:009fb96b4ee6d64732dac95a1f380f41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270921v1_alt LN:282224 M5:4e9f360581e618964d379d67e3b51f90 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270922v1_alt LN:187935 M5:7b6dc564b92bed8df5de2c1fa8de0986 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270923v1_alt LN:189352 M5:5b0339dbf41b0301512639781d44d546 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270924v1_alt LN:166540 M5:944759f109cad94523d1f3918ac0b382 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr4_KI270925v1_alt LN:555799 M5:08b3f5ff9beac37e3bbc50767cf3b43b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000252v2_alt LN:4604811 M5:0c2ee784f397289b1713ad133fd93d39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr8_KI270926v1_alt LN:229282 M5:58a00f9d6216734f0bf36a0f2294c246 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr11_KI270927v1_alt LN:218612 M5:159fb3a622d456897c41d93f4627d169 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949748v2_alt LN:1064304 M5:21fd288470eea03e7424729134f472f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr22_KI270928v1_alt LN:176103 M5:efcf7ce77388977478ffe2757b8f8430 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270929v1_alt LN:186203 M5:9f8d51d9c1ec4887cd55a1d0d8e61469 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270930v1_alt LN:200773 M5:2c5abf84ad91658f7262dff7ade3e7b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270931v1_alt LN:170148 M5:36b9336df72c820b6efa95567a5aaf28 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270932v1_alt LN:215732 M5:4a92a470a7851edf0c238a74814dece5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270933v1_alt LN:170537 M5:413442cc380f0bb8f15b33bc25149af1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL000209v2_alt LN:177381 M5:0e7a0f548f1f770b4272be1bd8b018fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270934v1_alt LN:163458 M5:43c32fd3aae0eee20305d3d735e7bbb4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000253v2_alt LN:4677643 M5:a5cdd062ee0d61ea6b3c5166e79b472e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949749v2_alt LN:1091841 M5:cf8641cadcdb22174c55a5d9d5c46036 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270935v1_alt LN:197351 M5:8175b26fd25c1671efd5af96e8b44835 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000254v2_alt LN:4827813 M5:ad357767de6beef959952d39200522ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949750v2_alt LN:1066390 M5:c48b453696107dc7105bce3857e1cbc6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270936v1_alt LN:164170 M5:64f7f27938eb4c80140f34e3d2aed483 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000255v2_alt LN:4606388 M5:bceeb4190283066a6d0891562b41d164 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949751v2_alt LN:1002683 M5:1615d0a6f8a5ff11274ba2e00b9487a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr3_KI270937v1_alt LN:165607 M5:39b5207a79f67fb863be3b2a5bed0963 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_GL000256v2_alt LN:4929269 M5:a80b1b3c21ac7e7b7acf75178ae3d83c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949752v1_alt LN:987100 M5:7d007a35ff02e56325881c68bb17b565 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr6_KI270758v1_alt LN:76752 M5:9d0d4a56d72f18d39c7a1094deb177a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_GL949753v2_alt LN:796479 M5:19162055ca3e800f14797b6cd37c1d4c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chr19_KI270938v1_alt LN:1066800 M5:9363b56f7b34fb35ab3400b1093f431a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrEBV LN:171823 M5:6743bd63b3ff2b5b8985d8933c53290a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707606v1_decoy LN:2200 M5:20c768ac79ca38077e5012ee0e5f8333 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707607v1_decoy LN:3033 M5:444cb839a910d9af9b5c5f013cb31063 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707608v1_decoy LN:3112 M5:bc263c9aacc51dabcb0ac4987c416a0a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707609v1_decoy LN:1642 M5:ec7a95a8f6e3d63152c0b1f46601e2ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707610v1_decoy LN:1393 M5:441a56ef62eccbc2ec6d0384fe40367e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707611v1_decoy LN:1103 M5:a5378db83cbffb5f31da4a549152cf80 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707612v1_decoy LN:1039 M5:4ac166fdb188d87a64b59e346fc040cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707613v1_decoy LN:1619 M5:af5b7705364129a1fdf718e223e8dfb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707614v1_decoy LN:3122 M5:67860fb1c59453dbaf2bc21834f76ff1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707615v1_decoy LN:1934 M5:e8773170190290d21bf5c7bac36c73ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707616v1_decoy LN:3111 M5:9792c2376ee383fa1d0763ff6b391fd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707617v1_decoy LN:2545 M5:7d9f68ca65f2e9029ef8c2d352b6068d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707618v1_decoy LN:2295 M5:dfec4823eafc51fe89a1c8a61a7861a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707619v1_decoy LN:1551 M5:f0f821c64e2f1339f4452cfabcd1a247 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707620v1_decoy LN:2046 M5:9e54f11658064725f046e3ffc7f5166e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707621v1_decoy LN:1222 M5:4053fd7005d4e430ff32b9b0c9dda52d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707622v1_decoy LN:1535 M5:393bc14f66f0af8c20fdd93b1a3dc78c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707623v1_decoy LN:3784 M5:5da25a3d7060acf52ce5d2084d8922cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707624v1_decoy LN:1329 M5:18daae4566bfb62823b548ab88fa894a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707625v1_decoy LN:1238 M5:8a05b8842f52e87406e28162b8fa7249 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707626v1_decoy LN:5623 M5:e6705349b3e2839fcd382596f831045d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707627v1_decoy LN:5821 M5:cafc12fed95e40d4c1b441ad93f0493a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707628v1_decoy LN:2960 M5:1e0a770fe11a74301ab4535bd9be16c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707629v1_decoy LN:1848 M5:5288216fe388c6966e89e6f8a3a5118e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707630v1_decoy LN:2315 M5:1cab33f8538d939c751e2b2d9b01957a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707631v1_decoy LN:1945 M5:099f236a02fe8e80d7f135727589bce1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707632v1_decoy LN:1424 M5:a2e305f020577c5f7806c411f995402c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707633v1_decoy LN:1274 M5:967deda0c966a0bcd27c6e047e18e7f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707634v1_decoy LN:1007 M5:093928d5a51ad63c286ec229982828ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707635v1_decoy LN:1414 M5:270f3e796a1b7c345e83762fa735bfe1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707636v1_decoy LN:1725 M5:f00ca03da369b2dcf101bda70773022b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707637v1_decoy LN:5354 M5:ecf9ac0af0f7009b8b4e5fa639e7fc97 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707638v1_decoy LN:2189 M5:5a928a8e7ad5ec7808ae7dbcc7ba72d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707639v1_decoy LN:1294 M5:692623b127f6621794d92bfc65f198f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707640v1_decoy LN:1831 M5:23d5c8473f768ca2c6a3eed843fc2cf2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707641v1_decoy LN:1647 M5:09778e8253cf377911db86530bec54a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707642v1_decoy LN:2943 M5:6759f7bb4098b6eb0ec14f5c63369661 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707643v1_decoy LN:2857 M5:a6d7044f6c244253ec1e142bbb35d859 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707644v1_decoy LN:1030 M5:e3e8c02e17ebf79c0e90ce41a16ccedb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707645v1_decoy LN:1070 M5:26882fb498a5b281266a48f82726a7c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707646v1_decoy LN:1735 M5:b120aeee1c12ed6986a9743badfcc505 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707647v1_decoy LN:1982 M5:d1d012b49d3cb20db627f6dd65326217 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707648v1_decoy LN:1564 M5:a4fae6ab9f74c3f1b2c0f8352e9a3519 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707649v1_decoy LN:1775 M5:4bcea8af13f18547fe066845bdc1c120 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707650v1_decoy LN:1540 M5:b4256e83f91ba0174562138c3b466a45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707651v1_decoy LN:2013 M5:f7d9c80ab1716aee1a2237dce70b768a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707652v1_decoy LN:1176 M5:4af9bb8c4125407fb9f03e5fc7798528 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707653v1_decoy LN:1890 M5:854efc081d295baa5a1efa0fe1f9bb3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707654v1_decoy LN:3644 M5:5c90649c1bc38e0b333381ac593252bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707655v1_decoy LN:2785 M5:407de1fa7cb87b88317888d98ea56599 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707656v1_decoy LN:1017 M5:f521affa49ef813fea48a8f5b1fa8e13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707657v1_decoy LN:1068 M5:478f244a134bc02c1c51f63009626864 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707658v1_decoy LN:1007 M5:f4ce5e4a861ab83037e05e271e74497b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707659v1_decoy LN:2605 M5:5c8b18731c2eeda273e0caaf2e878654 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707660v1_decoy LN:8410 M5:b581d341cdf7f17875e60e3da33c398b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707661v1_decoy LN:5534 M5:fd57c53936fe1011e42fc08ef3ff65c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707662v1_decoy LN:2173 M5:5ca2d18676a26044b213465e1e6ac206 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707663v1_decoy LN:1065 M5:07cb60b1a2ff813eed23c7cc4128baa7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707664v1_decoy LN:8683 M5:ac12df9c6d81003f812323327f937147 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707665v1_decoy LN:2670 M5:366d796fda2fe9f8baadd88deddf9dca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707666v1_decoy LN:2420 M5:b5c696c469b2e831e8a5e8e87c6813e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707667v1_decoy LN:2189 M5:1f055f8a1a1f8c356b45cfcbd6db6713 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707668v1_decoy LN:2093 M5:839cff5bd33068228bd1031bf8be9a64 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707669v1_decoy LN:1184 M5:ad69f6deb582834c638527c565c4de2e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707670v1_decoy LN:1205 M5:aa9070a191ece87a421285b5be2e8b68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707671v1_decoy LN:2786 M5:28c96decb9c1d76b9a76b1ee75e2421d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707672v1_decoy LN:2794 M5:4d547ee98d0678f832df5c46f91604aa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707673v1_decoy LN:19544 M5:2d2080522d0d729d94c7d73eda00c62a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707674v1_decoy LN:2848 M5:9182728e5875ee5cfba2c524c997fcbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707675v1_decoy LN:10556 M5:021a0164c68fd77f51bead9e2c4e9cea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707676v1_decoy LN:9066 M5:c8c71f6c1f2612fed812e69c737ca6ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707677v1_decoy LN:7267 M5:0e929202e653306730239e7dbea8a861 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707678v1_decoy LN:2462 M5:21e3c2e28a7980351470a14a0d48160c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707679v1_decoy LN:1774 M5:9f0f7ecdb5b097f83aab97fff76127d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707680v1_decoy LN:1297 M5:3eab486a1f41712d26b8c251ad9dbff1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707681v1_decoy LN:4379 M5:04aec18ad103fe46337c6643d0eaca0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707682v1_decoy LN:4208 M5:b413a0a980c7752db350c74c5f97937b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707683v1_decoy LN:4068 M5:80a8f28af2c872b62345c85f6217dea7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707684v1_decoy LN:2940 M5:774582f989e0cda16927addcf0ece955 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707685v1_decoy LN:3938 M5:cd0020e224ec3edc01ecdfd648f4099d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707686v1_decoy LN:2072 M5:879ef8f0e126b3f557a0170b71459c6e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707687v1_decoy LN:1136 M5:69aff37696b0d4542e56fcf9ad9af43c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707688v1_decoy LN:4248 M5:d301756f721c9141f1216e52fa4003da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707689v1_decoy LN:5823 M5:f29516cc0ba82ac48516c65b100b2255 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707690v1_decoy LN:3715 M5:a154584ab9547c044251e469591cfd94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707691v1_decoy LN:4885 M5:ab7f60b71af56c68e4a0f56174c90e4e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707692v1_decoy LN:4813 M5:e8f5365670fcf6e3612d2e77ba943aaf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707693v1_decoy LN:2899 M5:3cf4cd0669a4fc846ef0aa0aac7cb739 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707694v1_decoy LN:1228 M5:38a9e18c0e3208c8b593dc4fdf118a9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707695v1_decoy LN:3119 M5:ba7aa2faa9f2fad7ad94f0acd152e6f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707696v1_decoy LN:3828 M5:4b39179f8d3eefee8f4865bf6d11dd9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707697v1_decoy LN:1186 M5:0b3eecab59c656d96325f01e70a906c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707698v1_decoy LN:1908 M5:708018246fdce7d4b8f47502bfdbc3a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707699v1_decoy LN:2795 M5:001979586db1b719cca6d3dc0e50e71c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707700v1_decoy LN:3703 M5:5c692cc6be5262461fdbba8574e6ff40 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707701v1_decoy LN:6722 M5:378424a19c93bf19eb0f565cba923eb1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707702v1_decoy LN:6466 M5:1b5a6efaa31d7974dffe73fc4bb88349 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707703v1_decoy LN:2235 M5:c045d23c4c9497849b45c45423f705ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707704v1_decoy LN:2871 M5:b44844f0650f1953d042b7b0c9740cb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707705v1_decoy LN:4632 M5:6c1d769d4a84500b2eefafe1cf460164 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707706v1_decoy LN:4225 M5:d37d4a4d41be60f45aa967ecac1a0c5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707707v1_decoy LN:4339 M5:ffcd631ed0bf56e54cd72ed51c70fa3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707708v1_decoy LN:2305 M5:6ebdd668b564460303637164213d0dff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707709v1_decoy LN:3273 M5:3531b30c5833b2f37585aeabefeafe36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707710v1_decoy LN:5701 M5:943eba7b0fd71418d0ef4ab2bdcc3f14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707711v1_decoy LN:4154 M5:8e6daf77c80fc9e8710c6732e9d72918 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707712v1_decoy LN:1243 M5:65e4a30840d6420ebc8b7681d38ae431 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707713v1_decoy LN:1308 M5:d9aafcd2c4b12f82a113eb5418d120ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707714v1_decoy LN:2922 M5:4904d632dac614c608b8b7e3478dc3f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707715v1_decoy LN:3044 M5:15707c34a9803e1349a621fef2605913 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707716v1_decoy LN:2888 M5:68339f161a66b364c5e9ffed664272f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707717v1_decoy LN:1742 M5:1fd1325fe768dfe31d9199ee60b60206 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707718v1_decoy LN:4969 M5:454864584e92f6e195416ac9f9a8ee38 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707719v1_decoy LN:3270 M5:10feb2ed6ea7480290058dfc77385541 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707720v1_decoy LN:6028 M5:ab8f184e44faa3d93d59d9e3beba3acc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707721v1_decoy LN:1105 M5:97e3e0ba281c40270062097594c95b2c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707722v1_decoy LN:2884 M5:983f9666298bffa6bb3bc09593f83ab7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707723v1_decoy LN:1124 M5:d1d03191a7579c36409ca1686af957c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707724v1_decoy LN:1454 M5:648298f5e7a06c49b911d520d02036f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707725v1_decoy LN:2565 M5:507d9e32ff14b42ffc67abc3e66f8420 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707726v1_decoy LN:2149 M5:2cc36819133158e39f0ec48e7cadeb08 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707727v1_decoy LN:2630 M5:2ce79b6f499673a5546b3b608cc6d262 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707728v1_decoy LN:14625 M5:5c193cc3e52b61477ff6efd7d6bf1168 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707729v1_decoy LN:7431 M5:a6530e653f0ed096c60f6d44f83a5ac3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707730v1_decoy LN:5776 M5:8131fcdd109e0c725a9cd0f4dc240efa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707731v1_decoy LN:4820 M5:e86dbde0af3f5ba60b0ca212f4e51b75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707732v1_decoy LN:1227 M5:326c77e23881e6196b8441b3a96fc1d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707733v1_decoy LN:7503 M5:c633c411b0c6959cc08d71120f604c30 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707734v1_decoy LN:9652 M5:97472a33b38a6285aadc3ea8e200a0c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707735v1_decoy LN:1091 M5:8eb7237ab5103bf046f0b4fd8956e506 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707736v1_decoy LN:2467 M5:90141a455f60c4f02dc064d0200707c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707737v1_decoy LN:1270 M5:40c2e03cacd0e24267f2f495997de86f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707738v1_decoy LN:4365 M5:5a1da2ab0c8d8ec4e368ecdcb314a951 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707739v1_decoy LN:4284 M5:62bdd88183d94495bcb948a7c17e045c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707740v1_decoy LN:10282 M5:d20046e860cc9e220ba67181d6317b0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707741v1_decoy LN:5601 M5:8eedf1585943eb4a63b18a14c9d60e08 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707742v1_decoy LN:4758 M5:453aaa1ccce2e7bcd76462fc6fb82810 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707743v1_decoy LN:1624 M5:6b23b3de3fd00f6eae35fa84c9f0a1f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707744v1_decoy LN:4024 M5:a5fc63b6fa7d72420c481475f1a9b25b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707745v1_decoy LN:1276 M5:1aa689253b47a87a0497755453cc3064 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707746v1_decoy LN:5083 M5:4df51fadbde93b81c9ce73ae34ad299d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707747v1_decoy LN:2075 M5:b020b9e14b2329811d8020661a1b223b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707748v1_decoy LN:3553 M5:3aae97b73e2f50aa215741927751caf2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707749v1_decoy LN:7010 M5:5f573deb341bf1ebc60148d185f3863b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707750v1_decoy LN:4718 M5:c90f362bf73d35d5b7ecc0df55b8e7f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707751v1_decoy LN:3546 M5:0a4232c675b33b2779a9f54185a01bf8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707752v1_decoy LN:2873 M5:dffaf05b9fdcf311b6631694c9a7f721 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707753v1_decoy LN:2144 M5:f62da5d7fb084c6276e9144911369e38 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707754v1_decoy LN:2243 M5:c01ba9f403c104a17c7a56c2e246402b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707755v1_decoy LN:5343 M5:fc0967e1b54e87ee9e6649ee9e135bfd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707756v1_decoy LN:4877 M5:7cddadbee2311357be0a6cbc21b7c3ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707757v1_decoy LN:3034 M5:8bbd8d0206582bdd7ff0d98834c11701 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707758v1_decoy LN:2826 M5:d1fe878facfdb974e00aa366bf3f6574 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707759v1_decoy LN:1221 M5:f538752a6b30c7db1def6888006fdf82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707760v1_decoy LN:1169 M5:45388eebdbbcd5727ecb94a69d2b09dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707761v1_decoy LN:2319 M5:880e2410158ce2b1647e1b9d4e80632e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707762v1_decoy LN:3450 M5:1a94da832f9b0b1e2cf7e642869d2b68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707763v1_decoy LN:2674 M5:98597e188d3ba588151f6808ded88a91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707764v1_decoy LN:3912 M5:5b188ee33158e7afbe044f110d28e434 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707765v1_decoy LN:6020 M5:487d6332ace17c42a8f64aa9adf10de4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707766v1_decoy LN:2303 M5:05f988a4a7180849c6c81602c29279eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707767v1_decoy LN:2552 M5:4f8579ec6353f301ef8362afb14c9e1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707768v1_decoy LN:3656 M5:dd57001db92b45e0677136beb49e978d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707769v1_decoy LN:1591 M5:cae5200b9ceb32d63e9183210ec694c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707770v1_decoy LN:1209 M5:fde0c42984e1da0ba9aada4b168c4913 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707771v1_decoy LN:3176 M5:e48eeb05bf1913704ee94aad24e95e39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707772v1_decoy LN:8915 M5:e41a1182f28ef302e03876ec46b7ba76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707773v1_decoy LN:4902 M5:61cb73463b0096ce7f34215a0e9c7d2b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707774v1_decoy LN:3324 M5:d0d739ef87156a3f1b0083d560547169 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707775v1_decoy LN:5997 M5:b23670b667f938d11721f9239ce46676 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707776v1_decoy LN:2618 M5:51e373cda128d4d44cf38c8c0057966c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707777v1_decoy LN:10311 M5:c35ba91babc524c1b3270599ece90957 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707778v1_decoy LN:2440 M5:f3bed9c00d53e9777a38a27156dd1659 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707779v1_decoy LN:12444 M5:bf5be5d1c5a27ad4ae37d468d9bf5990 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707780v1_decoy LN:5691 M5:2813badf81db953a968eb7d49bc2882f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707781v1_decoy LN:2717 M5:0a1557b49527e901599bd44d72da8e1b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707782v1_decoy LN:5277 M5:4061182ba5da9755a2a25e68a304ac01 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707783v1_decoy LN:4373 M5:3eef41e80ceccdcb21b9dba8a2cbca5a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707784v1_decoy LN:3224 M5:ef2e57d4220e2cf9680eb6cb27022a8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707785v1_decoy LN:2631 M5:3ae2eacb39d96c2b69c8036fa48550e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707786v1_decoy LN:5385 M5:cba39df25869787d7270324f4c2e11be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707787v1_decoy LN:3678 M5:ee5041cbefd1339ffe625fe56a2ad8fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707788v1_decoy LN:1412 M5:cd5878fb701bca2a77f7f0479ada562a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707789v1_decoy LN:1443 M5:098268af4ad1b71ed7dbf4648ea026a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707790v1_decoy LN:1098 M5:437c3cf69fd5e7568ba6cd5302f1b0e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707791v1_decoy LN:3240 M5:b4243a9c38158ab50bf873d91a699467 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707792v1_decoy LN:1915 M5:44e6058f98843778f5708a68a650bd10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707793v1_decoy LN:4667 M5:1664dafd7db46e3d2e9257978a3c0282 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707794v1_decoy LN:7219 M5:69855847368a4c0722753f3097f73427 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707795v1_decoy LN:3277 M5:21882b529bd5fd85dd805de6c51c1d58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707796v1_decoy LN:3473 M5:386834c5cf2dacec8dc5f75898909eb2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707797v1_decoy LN:4243 M5:4d8a0b4dee134f88bc4604b841d38ec4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707798v1_decoy LN:17599 M5:6ab64c474c333b7a8e0aaf72d39306a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707799v1_decoy LN:5095 M5:f1c458ebccd70c843cec05e23921bbf6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707800v1_decoy LN:2237 M5:0feef89c01eacd296069717f5c7a7c71 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707801v1_decoy LN:2901 M5:27662470b962dfea212da33f14909142 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707802v1_decoy LN:2666 M5:1eb4be22c4e6d37a91facfb3025520b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707803v1_decoy LN:5336 M5:db6d33944d47e02a8df7cda94a1e996c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707804v1_decoy LN:4383 M5:bd1e2dc89c9dd82b43d3787afc9abe47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707805v1_decoy LN:5446 M5:4103eb12b8c3ebec9cd8fe2f49b6d1e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707806v1_decoy LN:6252 M5:9218b0dc97e8ccb069eba3e9d676a995 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707807v1_decoy LN:4616 M5:4d717a57114c8f1b9b4ffb96edcd6615 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707808v1_decoy LN:3021 M5:eaaf056266a70e2a7be4db848d68672d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707809v1_decoy LN:3667 M5:4c8c58d51417cec07e970c76f7b280d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707810v1_decoy LN:4563 M5:4bd16dfab458c175a83a781d1b602d8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707811v1_decoy LN:1120 M5:f63cbec018752a7584fd25ba859e6807 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707812v1_decoy LN:3845 M5:47464e332307f876b9138d74f8726752 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707813v1_decoy LN:2272 M5:c5516af17e36a2e09f21f2f4120377e6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707814v1_decoy LN:4764 M5:5d190274f9c28c4642fe1f75b5e3c9f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707815v1_decoy LN:5410 M5:c87029fcb5e0f94edf755e7b6b18f89e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707816v1_decoy LN:7150 M5:e2a7085047a795f4ee89232573d43df7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707817v1_decoy LN:1762 M5:2bf3e07e17fb50802f7da42c78322860 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707818v1_decoy LN:1207 M5:db2fca33bf9e3730c72e754f7e536e79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707819v1_decoy LN:1331 M5:b96ffe2a3a7a75977f2286d021069bc7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707820v1_decoy LN:8307 M5:89d9580408ce4fde62950344c2daa448 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707821v1_decoy LN:2276 M5:2a9fffb25e3ccf46680306388d4c2e6a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707822v1_decoy LN:2575 M5:8e5278c0a004efc105d35744a6aed334 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707823v1_decoy LN:3970 M5:ef86294088659e3b6c564f7a2c94abd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707824v1_decoy LN:1352 M5:af1ddf1aad7bb03a0c72d325e8e9a52c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707825v1_decoy LN:3040 M5:673e8681ea9b0fe7b4b74a011c7780e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707826v1_decoy LN:2070 M5:83ff186bce877c493f356e110486b13a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707827v1_decoy LN:2913 M5:156af338c90535ad8ddbebc3cc2b8e06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707828v1_decoy LN:2389 M5:dec17b4db1503252e0d25e88839aef19 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707829v1_decoy LN:1835 M5:495cf270e534859f024d452fa5714a83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707830v1_decoy LN:4807 M5:9d8e879d40a82477b244fe7baf4f1603 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707831v1_decoy LN:2201 M5:661353dc86a8b62e524ea43ee3f39c6e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707832v1_decoy LN:1265 M5:e33ce5ec06d99813aca09515f057e64e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707833v1_decoy LN:1961 M5:93e5f197aa47e632cdc4f4f9a06504c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707834v1_decoy LN:1064 M5:28a2c878efec380df24a5544738eda91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707835v1_decoy LN:1932 M5:bf3bff12edc1fb4331c341b1b2044e32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707836v1_decoy LN:3213 M5:d47bed4a51e112b3d415b77d354290ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707837v1_decoy LN:1178 M5:2a4f6a9f9df49215bb56bfbe5d6e1990 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707838v1_decoy LN:2926 M5:5f28eba962c1026228afdff4fad6ade4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707839v1_decoy LN:1038 M5:b42a95db827e89510d3dcdeac5fba1c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707840v1_decoy LN:3298 M5:54dc58ad6f4d92475e298f41206a1118 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707841v1_decoy LN:8992 M5:176684391390b0afaccaac0eecdb9560 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707842v1_decoy LN:6698 M5:b309273a9a78c30bcd5a5573742fd06e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707843v1_decoy LN:4880 M5:3ad4a232fe303ab7c09600c91b6c406b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707844v1_decoy LN:1766 M5:85cb4f0b6ab4d7dcec41ef37ca81ead2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707845v1_decoy LN:3532 M5:fa5f7bc4de1539f23d5610c26d69ed49 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707846v1_decoy LN:2297 M5:2bda3374523a39aa9c8766059468392e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707847v1_decoy LN:1234 M5:23e58f01c32ab1539dc5738c36b70940 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707848v1_decoy LN:1205 M5:c9b75dbdb9a2d4ee4648ed7fb537fb0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707849v1_decoy LN:2790 M5:20b3eef55d3dad7a5dbcd68268dad36c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707850v1_decoy LN:2006 M5:67d720cd69f97ad773cdcb3ccde8d47e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707851v1_decoy LN:4593 M5:7c836d280ec9794d222476d02e21b416 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707852v1_decoy LN:1579 M5:ab4542b394c8e1133f8eba10d896cb44 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707853v1_decoy LN:9597 M5:9d6b74ff3ae40b1134f4b1f1eabe16ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707854v1_decoy LN:10451 M5:ec7353db2ae0657678d29512a5b78b59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707855v1_decoy LN:3219 M5:b522f004eb3c1bdf17fe74e82e23ff88 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707856v1_decoy LN:2300 M5:7a18b1dc033c5a406a5f752e8a7d5a6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707857v1_decoy LN:5985 M5:28c60286011df7faa5b7167d8dc7a5f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707858v1_decoy LN:2959 M5:682104fe067bc0a5e18763b5d0eae010 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707859v1_decoy LN:1340 M5:3b47b99a35fcc0a437518350a37c97c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707860v1_decoy LN:3148 M5:cc961e4253553c5534e478b629b89930 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707861v1_decoy LN:2242 M5:beedf4d2ae00fca7cc2cd7e9d4ce6012 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707862v1_decoy LN:16513 M5:968c6df8aaaaa1015e74f591e4722ed5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707863v1_decoy LN:7821 M5:9c8e1c87e1b58622c67edbf732b7ce9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707864v1_decoy LN:2159 M5:37c9ce7cb170bed17a0deb982f64fefc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707865v1_decoy LN:2114 M5:8b637137aa5f04b43be61da029e5f818 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707866v1_decoy LN:4109 M5:1d5a765b813cd25ff873c52ca2b47f05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707867v1_decoy LN:1544 M5:c2744b7344993ebcf11d21cb098cace1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707868v1_decoy LN:1005 M5:241518a7a0343d82a0d99b1dc00e5d79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707869v1_decoy LN:8632 M5:010737c4caab4d5e629753ad40bee3bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707870v1_decoy LN:1012 M5:88b3e83459db1925338cff6156325503 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707871v1_decoy LN:4728 M5:dcab24555bd79f11062bd6e856a1db4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707872v1_decoy LN:2165 M5:aff31850364e11f37ba76baa5b7164d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707873v1_decoy LN:7591 M5:b034989a9fb62216a2547cd1206f4185 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707874v1_decoy LN:5202 M5:1e514f0c86c918e80fa4b29c206cb8cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707875v1_decoy LN:4241 M5:da66844cc4d4846716264b16f77233a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707876v1_decoy LN:4131 M5:60562638c91c3b3655e2ab9544600425 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707877v1_decoy LN:2272 M5:d672677153fa65839a94ae64d9284d49 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707878v1_decoy LN:2085 M5:d1bc85197aa7215a4b0248a74c19b399 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707879v1_decoy LN:4346 M5:1999b7a1b498a212e212e60377adb20d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707880v1_decoy LN:1208 M5:ea9da47963d703e465aaff5693250f76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707881v1_decoy LN:4543 M5:e84492cd2aa22936e00b280fcaca8212 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707882v1_decoy LN:2772 M5:bed5000e1788ade3ad5a8541cf1c1671 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707883v1_decoy LN:2490 M5:3d040ea1d7a17b15bf44f59b8e66c98c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707884v1_decoy LN:4568 M5:bd5a8cfffb4d5bab0900b4fa1fbf9390 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707885v1_decoy LN:1776 M5:f0f2b210ad8e779eec5a4ba478c83ef7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707886v1_decoy LN:2699 M5:91fad31e963c9f7821cf37705e55f40e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707887v1_decoy LN:3534 M5:f6d25106c5942148df4207ebc4a60371 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707888v1_decoy LN:2424 M5:4857413cb43abc01f2f0c2d56e196332 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707889v1_decoy LN:1747 M5:e1946468f8d77d4ac72dd72fe8ce04f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707890v1_decoy LN:1088 M5:698423687f8bc007b40065a2658b7360 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707891v1_decoy LN:1143 M5:3dbbd76127230ad72adb348524c250da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707892v1_decoy LN:2530 M5:8909228bbdb37a62a906447c5b24616a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707893v1_decoy LN:8049 M5:a4e81d020fe37025f26c26aa8241f26d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707894v1_decoy LN:1366 M5:69423d07e5d284b7ad365c144aec6f4e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707895v1_decoy LN:4284 M5:da455b511b9da89b4527ee045c5fe231 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707896v1_decoy LN:33125 M5:10522217e43c9d9228b02fc14c418df3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707897v1_decoy LN:2137 M5:962521d05f6b98894c65d3669ba66008 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707898v1_decoy LN:3840 M5:561d50151a7132f385be0617165bcecb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707899v1_decoy LN:3087 M5:46cc4f61d95475ad4c963e9bfeb206fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707900v1_decoy LN:2041 M5:cea01cf71468a810b970138149139764 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707901v1_decoy LN:3344 M5:ef03bb9d9f28ee51bfc7291ee41812e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707902v1_decoy LN:2921 M5:dcc9f313bc6e72cc000ac62e62e975f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707903v1_decoy LN:6581 M5:6346aa1b0e3055e121b9cdccb04a53fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707904v1_decoy LN:3968 M5:ed15d6545609df15a0758922f36c9f87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707905v1_decoy LN:2339 M5:af66f6d8d03e1c43cef4284aef73ed96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707906v1_decoy LN:1243 M5:bec4227b2724132e7ac912e4532bcf8d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707907v1_decoy LN:7776 M5:a9e8cc852787e0a7dea34bd16fd28b35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707908v1_decoy LN:19837 M5:63f4cfca34f0fcd66c826ccc8c6d6cbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707909v1_decoy LN:1737 M5:0eb45f3727a363ec209755519593220a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707910v1_decoy LN:1098 M5:bda7161c475d6f7bae40ce030d70fe87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707911v1_decoy LN:1893 M5:80bef2e1b21000a202a974145a551fe4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707912v1_decoy LN:1281 M5:96d1e0d5628111d9566a6da789c6204b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707913v1_decoy LN:1527 M5:ad42dca85dd0540c9229a86997665245 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707914v1_decoy LN:2055 M5:c7f0324e70cef84566fa5453dcb23f5d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707915v1_decoy LN:2527 M5:f7d3cdbc2f96d05bc8ff741d46f2f687 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707916v1_decoy LN:3275 M5:d9702219a1b8982c63cc1d6238368ab2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707917v1_decoy LN:1265 M5:6df0a4af8c86a2528464f45af7cbaccf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707918v1_decoy LN:2623 M5:5c6afdd9afcdaae5399f684978746b65 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707919v1_decoy LN:4850 M5:aed47145c2269b8c33a71652002e351f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707920v1_decoy LN:3584 M5:47dcd6ad41f139cfd6b9a02581cad11c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707921v1_decoy LN:2561 M5:33902e088970543e1715ee99abdcf7b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707922v1_decoy LN:3041 M5:313f5e86963d937b91534f4895c3a590 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707923v1_decoy LN:1409 M5:6af5cfeb86bc84ecdcfb91e994b4bdbb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707924v1_decoy LN:4596 M5:3415bc1f3a762bb7077c328b9e9e723c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707925v1_decoy LN:11555 M5:10cf29455a308a0380471d6bce16f4a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707926v1_decoy LN:1266 M5:ed2740c08c55e9dbdd3cf9db469d0df6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707927v1_decoy LN:1079 M5:7d006b7ffa2791321663578e50f456f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707928v1_decoy LN:1087 M5:e6a75cbd458016b1643e76ecc570d33a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707929v1_decoy LN:1226 M5:21256ce4fdadc803045a9b8f60dfe16b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707930v1_decoy LN:1131 M5:2f7c4c54c98b465c14120d32e5d60362 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707931v1_decoy LN:1199 M5:68471da27aefc5565f37a51052c09c8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707932v1_decoy LN:1084 M5:ff5f2aa407bb1f0573a4d815fb69f917 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707933v1_decoy LN:2038 M5:1b9a682cbf0c31fe8f29a4aa0bbef274 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707934v1_decoy LN:1070 M5:f8c939429a099c8eaead4319b5ecd2b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707935v1_decoy LN:1312 M5:00ead3e9dd86f6d5e7d499e285b509b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707936v1_decoy LN:4031 M5:9175dddf96d1e576065b2465c6e2b567 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707937v1_decoy LN:7445 M5:f83991a23f7bca6045f72a0bf34ecf13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707938v1_decoy LN:1770 M5:d7487b3fc5cbe693cdcd5ef883b5f00d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707939v1_decoy LN:5600 M5:5fc39cbf76db7d0c1d56123a313a22c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707940v1_decoy LN:1882 M5:f239e0af7db0be33b82e8e4dc2405165 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707941v1_decoy LN:1170 M5:e7c47b0be4905c7dcf70b8659a334abb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707942v1_decoy LN:1300 M5:1beccd3ea3988863bad1b7614a1db1e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707943v1_decoy LN:5325 M5:54c4ba54e1ad9eebc7832dfb6cf778fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707944v1_decoy LN:2043 M5:669c152c4b3e10d1f61d5afb2cf22bcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707945v1_decoy LN:1072 M5:d9416b21be3f6603426526a22e7e558e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707946v1_decoy LN:2463 M5:ce498b9d34e1447317c0d5d27aa0f911 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707947v1_decoy LN:1010 M5:4183a38dcef3c56b79dcf7eae090e37f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707948v1_decoy LN:1432 M5:c261bf235424d74a7b1d8624bb8d6ec2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707949v1_decoy LN:1162 M5:26aeb5ffbd148e35fa48fee69317843f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707950v1_decoy LN:1095 M5:2c795c49d9b77f2b5c0ef5c97e76ae46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707951v1_decoy LN:1118 M5:a0c0ea97493f7c511c5b0af1e8913e92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707952v1_decoy LN:1383 M5:fcc78a7bf9b47bb52730911e285ad0f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707953v1_decoy LN:2289 M5:ba3eede08e65f36da588370a142cc02a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707954v1_decoy LN:1648 M5:de71b9c9ca48f28bc0c9d13c5139ce68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707955v1_decoy LN:2203 M5:4c9964a811b62ea018169d81ba474499 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707956v1_decoy LN:3270 M5:316a59db52a456d6aa5e140e1b1c8794 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707957v1_decoy LN:11499 M5:cd3bb1a0e33bc1aafb51df407fcf16df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707958v1_decoy LN:2474 M5:5909618b2a56c4db15b017bfff248a13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707959v1_decoy LN:2294 M5:bfd4a30a41e5e647cba935da2e8a63de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707960v1_decoy LN:1238 M5:8025797164ec304ff940e4ad94643c70 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707961v1_decoy LN:3410 M5:02a40e206c78446d368b6001622aa540 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707962v1_decoy LN:1523 M5:7f11ba71c0814d0ca2b3839d55de672d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707963v1_decoy LN:62955 M5:d620b771cabe5b2cc4b943ffa6d69a68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707964v1_decoy LN:6282 M5:fc00ea543316aed78deefeac0eaf8727 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707965v1_decoy LN:3836 M5:97e94c098f92403b805a0a60f9475542 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707966v1_decoy LN:6486 M5:a977897a46254d42ed9a60e6ed5d9d20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707967v1_decoy LN:15368 M5:220b351d87053eb9b844bc6e6e5182a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707968v1_decoy LN:9572 M5:060b9bb36bc05042b371bfbfc6618e3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707969v1_decoy LN:6413 M5:b25e652840d89c9eef74c04703958f9f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707970v1_decoy LN:4104 M5:d103bed226a1a7b95d98a8d61e39f70d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707971v1_decoy LN:12943 M5:8a88d2df497490f21c8c2b796544f699 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707972v1_decoy LN:4650 M5:93e792bf92036380920f5d06321cafe3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707973v1_decoy LN:3080 M5:127f70f3cf2cf09e8c7a399c471acf75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707974v1_decoy LN:3134 M5:a0447f79285905c6b9f2202fdb83f838 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707975v1_decoy LN:6211 M5:931aa6a0b0412241d93c942acba0c103 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707976v1_decoy LN:1126 M5:c068c96f088fa2ef7cfe6a805c22121a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707977v1_decoy LN:1101 M5:e86b95e84b7662e5e6e509be83db4b41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707978v1_decoy LN:1101 M5:d46f001c034076f4a3687b647a980623 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707979v1_decoy LN:2648 M5:fe4d1437f61ce0406d36a071f4e7293a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707980v1_decoy LN:2973 M5:9c4cb203ab1d6a54a7ed36d116c60853 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707981v1_decoy LN:2520 M5:3ccf197ae78ce07e23eef5e3c31fb576 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707982v1_decoy LN:2318 M5:6e5cf7df1252379ee351fb2386bcc144 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707983v1_decoy LN:2606 M5:64cc9674054ed4f7cdf0701da89de296 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707984v1_decoy LN:2205 M5:e5814756cacf0c02827237dcd24155a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707985v1_decoy LN:2929 M5:6a2895e9dda391590b1db42aea33e330 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707986v1_decoy LN:3869 M5:9640cfef88fffced10f0edaf20dbda2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707987v1_decoy LN:1117 M5:60f8230f4e335416aa92256695cbcf46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707988v1_decoy LN:2960 M5:b0447a959fdacb8b553c3684184cf036 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707989v1_decoy LN:1009 M5:75d4d43433fa532ce2da4a724ee25c42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707990v1_decoy LN:4048 M5:f0720d93745203f7d155f219ab83b618 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707991v1_decoy LN:2193 M5:fede10b713c7d561d4872feb26040c3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_KN707992v1_decoy LN:1830 M5:1bac13a3ad2592a344e18bf8de117574 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000001v1_decoy LN:25139 M5:9b27ee6060931ae7d17e451b7739e547 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000002v1_decoy LN:18532 M5:9955447b0a6444031f1d68c821fcea22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000003v1_decoy LN:15240 M5:b635cbc1fc3962e93bc1427bc678396e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000004v1_decoy LN:13739 M5:7fa6d2a124f7c9bfeb030b859269f78f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000005v1_decoy LN:11297 M5:44c68451b1d90987e31184e887a24455 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000006v1_decoy LN:10074 M5:ddeeb2059f6f27dee5330cb501a11446 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000007v1_decoy LN:9891 M5:30b47b3ef6b82a46ccfec6573b0c6c10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000008v1_decoy LN:9774 M5:f0bed43412c69b6db572994c9d5d9cd4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000009v1_decoy LN:9727 M5:0cab8d3c0896fb15383dc8aaef1a1f9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000010v1_decoy LN:9358 M5:aba5595273a0e4398df3a8323523d10c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000011v1_decoy LN:8920 M5:fc623f57c6ad9441d3750c0f51722a0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000012v1_decoy LN:8479 M5:6dca96b0605fddf041e27a9f4beed770 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000013v1_decoy LN:8312 M5:f34a4b1860ec9fbd1acc736a3a174193 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000014v1_decoy LN:8261 M5:6deaa38e9033c12ed1ad7f62191a3e04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000015v1_decoy LN:8131 M5:c3df1d07395395fb96b81e27ef3dcf61 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000016v1_decoy LN:8051 M5:f732550392ca9c30b42b4c6acd5d9263 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000017v1_decoy LN:7832 M5:03557dc0d8d0509da30549dc16031c51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000018v1_decoy LN:7710 M5:942aca2604695877a0a642916aafd2b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000019v1_decoy LN:7702 M5:c6c2453adbb040df0ea58395995ebae1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000020v1_decoy LN:7479 M5:5b348e642370fdd96c7f2a306318869e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000021v1_decoy LN:7368 M5:0693c472fdc0225c133374a15973bec3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000022v1_decoy LN:7162 M5:6629bbc8b7d3fa10074025773e597c29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000023v1_decoy LN:7065 M5:6b413d9f61a68a7ce1ea620aebb3be6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000024v1_decoy LN:7019 M5:14f555be268a0666a71794d0515cd6d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000025v1_decoy LN:6997 M5:470d24c11b0ea5dbd4329912231aba50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000026v1_decoy LN:6994 M5:1a45d626e4f7add376267b1e77bcc942 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000027v1_decoy LN:6979 M5:6890d5c807ceff3e680405d80c19b990 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000028v1_decoy LN:6797 M5:6cde21bfadb3f954f76aba8775f5b89f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000029v1_decoy LN:6525 M5:091fdeaa7841b60f964f1a9cedc12bd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000030v1_decoy LN:6246 M5:7c23df0bfe1cc7d18d52be126f396cca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000031v1_decoy LN:5926 M5:5555324457dbc04a20ac656a15cce856 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000032v1_decoy LN:5914 M5:67d2d8955ebee73fe7f8f3764e4158f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000033v1_decoy LN:5898 M5:de8113c2b1586e776f28207cd56cec1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000034v1_decoy LN:5879 M5:1c6aa8f142642d8cf57f4f7029a20061 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000035v1_decoy LN:5834 M5:29c393ec5d6804ee5dc06b435ffc02f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000036v1_decoy LN:5743 M5:2f131c59606d7cb8cf6c6c495ce84aa4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000037v1_decoy LN:5577 M5:20bd1281fc32355adf567b4e0ff160a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000038v1_decoy LN:5413 M5:3d2ed60178406278eb02030b7c0cc328 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000039v1_decoy LN:5250 M5:62ebce054cc44d5c32625c44fa1e5ff5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000040v1_decoy LN:5246 M5:7cf464d2ec26fa4cea2bfd25f995969c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000041v1_decoy LN:5118 M5:ad3a1c8041863a52b7fa6d6d56ce0d3b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000042v1_decoy LN:5058 M5:bce45aec79ec4861d8442ec3d738761b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000043v1_decoy LN:4959 M5:f653839b5c54df56a1a2fdd7ceb42db8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000044v1_decoy LN:4853 M5:3505d16e35e056be0892167f5a564661 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000045v1_decoy LN:4828 M5:d43e63bb33a6cb65d5cdd1ca31e94c19 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000046v1_decoy LN:4819 M5:db9c73fa0d581cecaf0175aab4a0fc7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000047v1_decoy LN:4809 M5:1b157b5c5c208470638b188e23b55a59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000048v1_decoy LN:4710 M5:ad9552980f4f1bf74b72740d14d2f5ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000049v1_decoy LN:4680 M5:5bb4ddca04b26e3afd0bf218f2947a7e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000050v1_decoy LN:4645 M5:6a821c450a9bcf89dfccaa62d46212cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000051v1_decoy LN:4514 M5:bab340cdaa58e6d32ad1138612c84e07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000052v1_decoy LN:4439 M5:3cd292c1df3855202250324272a95b5b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000053v1_decoy LN:4416 M5:73c9659871560313e754f9363053d56c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000054v1_decoy LN:4409 M5:8ab5d2ce8c35201fa585fdf6f4ae670c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000055v1_decoy LN:4392 M5:e2b0cc1cca4b7ed60f85199816696690 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000056v1_decoy LN:4359 M5:ad16965c23d8e07c823a47e9b098f162 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000057v1_decoy LN:4319 M5:3bfb10064835da4e9caf7e8deb1857f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000058v1_decoy LN:4290 M5:947253137780def5c1c0db12039bdeca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000059v1_decoy LN:4242 M5:2a6de19fbea3d44dbf76c71f1778b47e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000060v1_decoy LN:4228 M5:8b1e73bd29fd4c77bb54fb586721b1a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000061v1_decoy LN:4222 M5:8576a97cd4f61cd6455b423f14eaed92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000062v1_decoy LN:4216 M5:d885db4b883ae34dd53ed184783c2144 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000063v1_decoy LN:4210 M5:1bfa5c8aecb62137e83c3274991deceb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000064v1_decoy LN:4206 M5:48398977c32247e425a6a85f97026636 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000065v1_decoy LN:4102 M5:f7d638a8f28d1c9842128b1225325947 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000066v1_decoy LN:4101 M5:78254b10a1884b61ecbfc72be3ad38d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000067v1_decoy LN:4083 M5:19683f0eb0d378e403a918d10931eb76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000068v1_decoy LN:3967 M5:2519be1b425e386f50cf02ec88f8f903 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000069v1_decoy LN:3955 M5:7c186eab354093fe3b26a9e757407fca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000070v1_decoy LN:3945 M5:4cf91327091051082a0ff114dd170f21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000071v1_decoy LN:3930 M5:d97123bfd4ea271ec354c170d89d80d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000072v1_decoy LN:3929 M5:147eecc4607f1ae7fd1dff1c0f98ca25 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000073v1_decoy LN:3924 M5:84bdf303142b233c179ecef62ab58b07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000074v1_decoy LN:3919 M5:648c37f3fa6e7d658440858761213e7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000075v1_decoy LN:3908 M5:36f5d13bc1a3b72a21c0a4b68148d469 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000076v1_decoy LN:3892 M5:052f146ade5330135e5381db9c779f75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000077v1_decoy LN:3890 M5:22c368b726169405e1f364115fc2356a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000078v1_decoy LN:3859 M5:85a6fde3123e4ae2ef854e83b790e55d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000079v1_decoy LN:3846 M5:21dfcbee386bf64a6e7639d212fe4ba0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000080v1_decoy LN:3835 M5:7f8ace0d7314cec254a8ff5addedb0f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000081v1_decoy LN:3830 M5:d40bb66c2d194acad4d612db8d34e1b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000082v1_decoy LN:3828 M5:c6c7826a848a366317f63f5db5dabe87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000083v1_decoy LN:3825 M5:632e853a99e258e0ae002c0c03aa7caa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000084v1_decoy LN:3821 M5:67720b3ea8a4c3be301aa0519627e306 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000085v1_decoy LN:3809 M5:8ee2faad62aedf582f3c33635df47f84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000086v1_decoy LN:3801 M5:dbd8292192827196a4c3d545bfb9b67c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000087v1_decoy LN:3799 M5:15066eea555ea13dca8b28620db8ae45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000088v1_decoy LN:3737 M5:83437130e836bac50aba2aa79fa9d80c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000089v1_decoy LN:3701 M5:16d790e451ef2c33018834904a04c177 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000090v1_decoy LN:3698 M5:4045cd2ec9d306542cc3804aab489587 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000091v1_decoy LN:3692 M5:3a1e6d05d94debffbe6070b59627d610 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000092v1_decoy LN:3686 M5:f2bcad40026ed9d729d9c31034159300 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000093v1_decoy LN:3677 M5:50536f98dd2e44e8a77c5f9d289ad87c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000094v1_decoy LN:3664 M5:65fd750160fcf7b7944c8e015e46a443 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000095v1_decoy LN:3613 M5:3257e4358f19507804bfac363c932664 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000096v1_decoy LN:3611 M5:d10add8e30105013e264b6feede833e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000097v1_decoy LN:3606 M5:c78427ed0c2856bbf8131bd73e54c3f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000098v1_decoy LN:3584 M5:81a78209d26627e698602af1848e2b03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000099v1_decoy LN:3581 M5:90e3913247adb7b30059e051bbcefe4c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000100v1_decoy LN:3543 M5:3dd50a694f9e6011fc694fab191cb759 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000101v1_decoy LN:3528 M5:0eefcbd5209d0d32ccf640f76a69f676 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000102v1_decoy LN:3527 M5:0bc37681f399eec3b3b7dcbf22498b37 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000103v1_decoy LN:3496 M5:c04b909a1562f77654eceacd0b8a935f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000104v1_decoy LN:3493 M5:fb84ec004fe99371b9b2d74bfb8570ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000105v1_decoy LN:3484 M5:e07ccdf102c986c26b2bda46045943b2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000106v1_decoy LN:3435 M5:4be97b9bc8d65dffe17f17ef9f801240 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000107v1_decoy LN:3391 M5:0878850e674ca72172a37319b9321acb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000108v1_decoy LN:3374 M5:5b7dd688c7eafb7b418766bdab494a84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000109v1_decoy LN:3371 M5:fb407b611c6eab3bb1609123cbeb47c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000110v1_decoy LN:3361 M5:4851563bcd9e0f7af3768f20f33bb22a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000111v1_decoy LN:3351 M5:24701a0d266ed39e5bfd3757bbfa218e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000112v1_decoy LN:3340 M5:d10fcebc376b84a0e301d97eff284137 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000113v1_decoy LN:3320 M5:05f2acb99e398b98f272d297727f28d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000114v1_decoy LN:3282 M5:d20adc7c458920890e8c1c56717c60b3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000115v1_decoy LN:3278 M5:9baab7452d6c49d97acd68acc83ab547 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000116v1_decoy LN:3260 M5:b2b6112ec6f9d22a7842f78e37d6a3b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000117v1_decoy LN:3258 M5:edb413acc1f07788b1a55b647c56997c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000118v1_decoy LN:3253 M5:1143d3e269aa80abfae249b7c653814c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000119v1_decoy LN:3247 M5:8d905fa140b8fded3a9560d24a32cfe9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000120v1_decoy LN:3230 M5:8c96125639143835c0e5b29884855e8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000121v1_decoy LN:3224 M5:6314311a75a1832245fb87dd86655de8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000122v1_decoy LN:3216 M5:80770770768ebb238cb4572d674e1579 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000123v1_decoy LN:3212 M5:63a4964026424edcd64a0e174de5c51a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000124v1_decoy LN:3194 M5:c68922465f39c47a5ebcf4767811e41e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000125v1_decoy LN:3189 M5:9e4ae67a2bea0ce8335cfb82e125cc2c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000126v1_decoy LN:3177 M5:94806d6a47b3781ed8e5004a2c577255 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000127v1_decoy LN:3176 M5:419d834659cd952516de6d9dcae8c3b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000128v1_decoy LN:3173 M5:050df236c1fa3a63c31f33b73308c168 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000129v1_decoy LN:3170 M5:61f6339992ffab5d3091b4a3b3baead8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000130v1_decoy LN:3166 M5:1fc75a1345ce98d6f25ba4d916b5d7f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000131v1_decoy LN:3163 M5:c262387ff17ca2ee56fb368575275676 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000132v1_decoy LN:3143 M5:790557e383cdc852732e3da2c6b6c615 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000133v1_decoy LN:3137 M5:ea2bf77f700236081cf8eb7aa0d9a909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000134v1_decoy LN:3116 M5:a8ae3ccc9f17c0f0edcacc5079219d51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000135v1_decoy LN:3106 M5:89002d8689e45952391a7984d69df23d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000136v1_decoy LN:3093 M5:2dc162e245d6ff81936bc650004ec8cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000137v1_decoy LN:3079 M5:38068261005ed014603a09dac9438db7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000138v1_decoy LN:3053 M5:bb3a8eab3c8ea2aa961e65ec5e1d91da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000139v1_decoy LN:3051 M5:87d0e9b49ecda7ba160f80012ca40de3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000140v1_decoy LN:3015 M5:303ba1d7f1155342056b491810358e6b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000141v1_decoy LN:3012 M5:c7a07f27a9874d99e33c27c2a2280cd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000142v1_decoy LN:3009 M5:d88319790f0a837a02a625cfdb6c1971 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000143v1_decoy LN:2997 M5:2b912adb843e4f2d90726c884ca7ab4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000144v1_decoy LN:2997 M5:f6bf68bca6151666f29be31cb16f1c0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000145v1_decoy LN:2983 M5:3473d9484854e710526e0c7ccc80b5bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000146v1_decoy LN:2979 M5:90d61da24b116c2bacb63747666a326b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000147v1_decoy LN:2967 M5:c84a0386ea78dc84323f55723fc42ef1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000148v1_decoy LN:2967 M5:a2b48635d63117baec9f7dbeae644928 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000149v1_decoy LN:2966 M5:0b15201439291bf53043abb6dcdab743 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000150v1_decoy LN:2954 M5:f36be073b0668fe6c56206c0a9bcf742 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000151v1_decoy LN:2952 M5:0aa12dea5cdf7b9dea2d56a71e233dab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000152v1_decoy LN:2934 M5:70eafae03cdb824f956cc77cc9b342ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000153v1_decoy LN:2918 M5:d7711561e6c2a87e3771c3ce9e28ffaa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000154v1_decoy LN:2895 M5:b40089d10ae6fb3b2a90a260a6469229 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000155v1_decoy LN:2887 M5:9be2679cff5e171c42de84446d6fedfa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000156v1_decoy LN:2879 M5:100d6fd294d6998c7928887ba353f441 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000157v1_decoy LN:2878 M5:e081c58ad4b64da9af95ca27932e7ebb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000158v1_decoy LN:2872 M5:0469343a7677dac01c66bf219aa0611d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000159v1_decoy LN:2868 M5:fbc27037c78cd3b3982d7f792147d4ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000160v1_decoy LN:2866 M5:33497edef237132c3e3efe7304d5a685 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000161v1_decoy LN:2865 M5:65371a3805dd2779f5807f1849df8a2f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000162v1_decoy LN:2864 M5:7e9448d377e58534ce56c68cd97278d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000163v1_decoy LN:2859 M5:93dbbd6f23a68673abfe169d241204a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000164v1_decoy LN:2854 M5:c468c0f380889b274a988802cc95f8ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000165v1_decoy LN:2830 M5:bb1fb10e20767215b036dbad18b92018 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000166v1_decoy LN:2828 M5:9f9279b092a64e7648f91091e5112414 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000167v1_decoy LN:2824 M5:774c1242a9fec9c39b231e3a4244c48f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000168v1_decoy LN:2819 M5:5e794be8f02e6190282545c4a587a131 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000169v1_decoy LN:2813 M5:f7e3bb8a09ce56ebcb9638b710cd2ce3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000170v1_decoy LN:2809 M5:8fb1846cc5b62db20428a2bf2bfaded5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000171v1_decoy LN:2802 M5:9bd40f006580d92c066ff544ddc22d8d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000172v1_decoy LN:2791 M5:5f91fa423cf6ea436c30cddd27d2f7b2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000173v1_decoy LN:2783 M5:698dd6fdb96a0f8653015f1bf3406d29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000174v1_decoy LN:2778 M5:3aae745709a336cef318bd095be7bf93 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000175v1_decoy LN:2777 M5:14ba8c26038f60c5a103e430e7fba5e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000176v1_decoy LN:2770 M5:467d903833c580a48fa311a7a15c61c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000177v1_decoy LN:2769 M5:beb768213f5d753b7f6a857687fb1c9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000178v1_decoy LN:2767 M5:2d998199f83204c294ff1e618648e88a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000179v1_decoy LN:2763 M5:9244414120396c3b53b847abfd80bc74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000180v1_decoy LN:2745 M5:8657cb328a0d649107216245ce042ff3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000181v1_decoy LN:2742 M5:9a35552497474ad6e9b35b843c759b60 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000182v1_decoy LN:2736 M5:4fdea3271d6795c56d47fc6d54f11972 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000183v1_decoy LN:2729 M5:5da3445ac176ed7cca1131267e6dfb95 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000184v1_decoy LN:2726 M5:9cc9d79dd54416be6fc2b500d4ca8223 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000185v1_decoy LN:2719 M5:8d898d7f057764e7d11b7121f8cfb366 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000186v1_decoy LN:2715 M5:0bd839a4a62fe7568bf02c2bdf660047 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000187v1_decoy LN:2708 M5:0bcff7297c716264bc76813a0516ad12 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000188v1_decoy LN:2704 M5:0ceefe5f0373922aa642a3180f917c9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000189v1_decoy LN:2692 M5:a1ed1d3ee4d5cc17aae0d9d0fa0775b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000190v1_decoy LN:2691 M5:43df7d9d35f2d15ff844b2f4564338dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000191v1_decoy LN:2690 M5:b7809dc0c98369b8235b36dfbd7e2ae3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000192v1_decoy LN:2687 M5:a61002b74d916bbe06d09eb62cdb9144 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000193v1_decoy LN:2677 M5:02cb7169934dce464116e8644638b22d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000194v1_decoy LN:2668 M5:0e691a59ae468d427df06bdb2e34e315 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000195v1_decoy LN:2668 M5:4e1222dfcb9ce80e3a7544e3af791e70 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000196v1_decoy LN:2663 M5:5e4092300f7a24534a4fc2afe6c68b5f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000197v1_decoy LN:2655 M5:8bf68a2085f6903253894b5ac2be0d10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000198v1_decoy LN:2644 M5:035eac523101444b286c852a129bb0f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000199v1_decoy LN:2642 M5:518ada0e1f2b63c0a99a0154b584120d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000200v1_decoy LN:2632 M5:40870ec46cc59053e01def95871a68eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000201v1_decoy LN:2632 M5:af03b437e04ad5f5cc86e2a67adee8ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000202v1_decoy LN:2628 M5:fa043c52050897ca77e0b475bc77776f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000203v1_decoy LN:2623 M5:0761598e68213207c0d256d5e7e1bcbb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000204v1_decoy LN:2622 M5:502e3af12800de14f86b2cfd3de9bd2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000205v1_decoy LN:2619 M5:74fb4a710fd8bb14104c1cbde54ee247 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000206v1_decoy LN:2605 M5:73c6a5d1feb99a88b122655b4dcdd742 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000207v1_decoy LN:2603 M5:2d1e488c4ee483df72211d2762b1b7cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000208v1_decoy LN:2601 M5:c72de668308e8c098888b96b543703d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000209v1_decoy LN:2598 M5:33dd6c20ea4712d7d3b200db8f026cbf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000210v1_decoy LN:2597 M5:cd6c72af3776b51a1619b01b5eff8bc8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000211v1_decoy LN:2596 M5:40ba1e4b99e2625ec5a5cc4038fa9a06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000212v1_decoy LN:2594 M5:fe8d3058e4af4e6063be2c2f955b2bfb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000213v1_decoy LN:2586 M5:2ae32263b19fd8541852cb566f82be30 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000214v1_decoy LN:2585 M5:873a6619e50330ccdcebeb56cf56b70a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000215v1_decoy LN:2583 M5:13d7b02826997cd3db01ccfc712000ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000216v1_decoy LN:2578 M5:f891eed2ad267879c435cbc346ebfaec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000217v1_decoy LN:2569 M5:17baf081bd68afecee4fb26591fb7d44 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000218v1_decoy LN:2569 M5:b543771b65b36e55866a9191f68deb0e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000219v1_decoy LN:2551 M5:cd59a6042156743484b01e429d67dcb9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000220v1_decoy LN:2548 M5:822737a44cc33c2db164829922cdb96a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000221v1_decoy LN:2548 M5:cfc1c1a98c1e72f1193cf3bdbd7d6e22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000222v1_decoy LN:2546 M5:4b897ac33360cfc5dda50c492edd5264 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000223v1_decoy LN:2545 M5:3e5f015ea4c3e8e3f4aa413fc8e33ff7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000224v1_decoy LN:2534 M5:8a161ea48715e813fd05aa43c1e4524a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000225v1_decoy LN:2533 M5:fb3804f1f8c9b481a5684e24912cdb2e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000226v1_decoy LN:2522 M5:4a6ae65ea92c112f656b5d39d76a7741 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000227v1_decoy LN:2522 M5:4b56d4e6c02a6e93eace0b35a8e81178 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000228v1_decoy LN:2515 M5:38e333d2fbaeea1196ff289ff007b136 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000229v1_decoy LN:2513 M5:6948ea45d0167313b03bb520dece25ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000230v1_decoy LN:2507 M5:ae1256f74ac53ab9f03548cd40e2fe8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000231v1_decoy LN:2504 M5:615e1e7e5b15386539deb06dd4e70457 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000232v1_decoy LN:2497 M5:2601507db41c0111c04735355c122721 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000233v1_decoy LN:2471 M5:204b14540e382d6178cbf75d805ad164 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000234v1_decoy LN:2465 M5:8bf3deb57ae47354c0f07b477420f838 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000235v1_decoy LN:2464 M5:ef6b06a889077e9b0c4ae3b5eeaf21cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000236v1_decoy LN:2459 M5:cf22036ebb20e5c07502642f1d926f55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000237v1_decoy LN:2457 M5:64a6bc4d08e4f9e0d6ba8cce58b7f505 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000238v1_decoy LN:2450 M5:e83868519a491203921eb9f7286a5e98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000239v1_decoy LN:2435 M5:8292756d8d376c15256d12d69951d1ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000240v1_decoy LN:2434 M5:e850a25d74b1a7564101247ce3b1fb7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000241v1_decoy LN:2432 M5:b0696db696f0e45c6909f75d3f17ab87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000242v1_decoy LN:2427 M5:4a78bf09eb53eaefba5d6406f424579a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000243v1_decoy LN:2421 M5:6751a1f3f80e5a43badc5b9a986fa49a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000244v1_decoy LN:2420 M5:b8c086bba1ed8bc4eb0ea05e7031664e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000245v1_decoy LN:2414 M5:4ae74a7c8879b7eadc4ff52f6c247436 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000246v1_decoy LN:2404 M5:cd50b4acbe112fb299328b26c243aad7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000247v1_decoy LN:2403 M5:0a7f0ec7ad3711a0173947d4768d9193 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000248v1_decoy LN:2402 M5:cf164664d17746b996c1b51b7a1b2d1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000249v1_decoy LN:2397 M5:d5f7a437c859d40100bf3a757b38ea7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000250v1_decoy LN:2395 M5:fdf94cbe463685fab85e81430541c656 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000251v1_decoy LN:2394 M5:9e100dfb362640d77d73adb06f63c206 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000252v1_decoy LN:2388 M5:0f0f93cc335a9faecc119d22738a778e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000253v1_decoy LN:2382 M5:af0841d63c2d4ca67c11f8e2f0c0b42b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000254v1_decoy LN:2381 M5:948e4e6ebbce9d82413e86c3c96d684f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000255v1_decoy LN:2380 M5:46be4a58c4b132b788bd04a3c51f0108 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000256v1_decoy LN:2368 M5:722aeea650c487dc132f37322a5b5eb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000257v1_decoy LN:2364 M5:44995a3c81d834bd8bbceda57ee73d51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000258v1_decoy LN:2363 M5:a71f07406eabc3a412250ac21c446ba3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000259v1_decoy LN:2348 M5:99b15b0bac8cbd7497c5ca04a721c657 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000260v1_decoy LN:2339 M5:0768f34e39c5c97c1639fd42b72fec1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000261v1_decoy LN:2335 M5:974a3d6e7628eaf95db035d99f046379 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000262v1_decoy LN:2332 M5:9a0e708d8a88bfa96a75e98604a273b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000263v1_decoy LN:2331 M5:60412161b03d0c2f2ce5659369ee368e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000264v1_decoy LN:2330 M5:5593063ebd79eae9ac5a5a5ba9095b7e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000265v1_decoy LN:2323 M5:6042dc9c77f44643d41e68ea0cda385f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000266v1_decoy LN:2319 M5:ba867aa03d1617be8f801a89c1530937 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000267v1_decoy LN:2314 M5:a29f663eddf36e84b6cb6faff0f62309 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000268v1_decoy LN:2308 M5:659c8649b3dbe0dd672045a5ed7fa3b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000269v1_decoy LN:2306 M5:e10dadf09b67626744c1c39c1fea5fe4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000270v1_decoy LN:2296 M5:81f921a9ec2bd029889721432b22d4d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000271v1_decoy LN:2287 M5:095a5e8a3ae51b66207f518822bf71a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000272v1_decoy LN:2279 M5:47fde7cc81a14c0c6be4ccbfa3312015 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000273v1_decoy LN:2276 M5:35e9863bbef84bef6634eb206bc66c15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000274v1_decoy LN:2273 M5:9e8590286f229ad55bf921bb4d7236f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000275v1_decoy LN:2262 M5:f184b3c6054e080672a50e932da0aafe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000276v1_decoy LN:2254 M5:06e878f736f352fe167cc033f030b492 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000277v1_decoy LN:2252 M5:af9e9099df9fd3abe01d3ab305c9d65b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000278v1_decoy LN:2245 M5:8f7d8cb82a282dc326d4bd286895492d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000279v1_decoy LN:2239 M5:ae67f16bc2c56baec5093246804b3df5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000280v1_decoy LN:2223 M5:bffd2399ce899d9fa674d826311500f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000281v1_decoy LN:2220 M5:926bf451304bc000be7146acb11c393e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000282v1_decoy LN:2218 M5:adcddfbd560a42060c45d80c751787c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000283v1_decoy LN:2215 M5:706580b59cf8322b639309fc6110d094 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000284v1_decoy LN:2213 M5:7145c3c0ac2cc197f7d0fc0fb18d6c1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000285v1_decoy LN:2203 M5:0c6c215de5d00669ece9d0d461b7b5c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000286v1_decoy LN:2200 M5:a724f88e94788f5e1738a038d67d8d7b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000287v1_decoy LN:2197 M5:fd0cdd36334762ca58e7b82b6ebf802d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000288v1_decoy LN:2194 M5:441ebd8ba7d0673bebf054e6ce9b405e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000289v1_decoy LN:2183 M5:df57267be3acda36409e42dd3c0da306 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000290v1_decoy LN:2179 M5:8bc6beaec162ccebf341b6c46ebaf3fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000291v1_decoy LN:2177 M5:d0d5b33e946654d9b23402cef3f10822 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000292v1_decoy LN:2177 M5:bc189c463b5d9bae5c71afa304910390 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000293v1_decoy LN:2177 M5:c74d19e91cd80fb55bc91184bdc0eac4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000294v1_decoy LN:2168 M5:c828de6bd73d4226b924cbe268ab5d35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000295v1_decoy LN:2160 M5:33980619d2c675019c4fb26681973f1f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000296v1_decoy LN:2155 M5:40e793695b37b027d9d893448ad20eac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000297v1_decoy LN:2144 M5:55b3946760e337f7fa9358993879d5d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000298v1_decoy LN:2143 M5:5c8fe70b46ce7d299039403820af18c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000299v1_decoy LN:2136 M5:7a28362f930fcd9a245cc239750dd1d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000300v1_decoy LN:2134 M5:285c47826e725f4442c18898156ac4fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000301v1_decoy LN:2129 M5:b4ad7d61b3d8b5b5f03100792231b056 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000302v1_decoy LN:2128 M5:a6fd1741e7a81251829a88549717a433 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000303v1_decoy LN:2125 M5:c95f162916242e94c057ec50e3f666e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000304v1_decoy LN:2125 M5:cf878bbb13f4cb8f6ad2f6134d4152f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000305v1_decoy LN:2122 M5:ffc29d2524335853c556eac4b936ac47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000306v1_decoy LN:2111 M5:13ad53d0306dcdc84cfbe5af890ffa7f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000307v1_decoy LN:2106 M5:2705f017f46d301002f0ccf08933080c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000308v1_decoy LN:2094 M5:dc17db769fee486df656f8334528abba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000309v1_decoy LN:2093 M5:61b8e15e0c011168970bf67fa28a893c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000310v1_decoy LN:2088 M5:4a0f2b01b92451953bcb14f94874625a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000311v1_decoy LN:2086 M5:560b32a4aa380573107a95fe8344fcbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000312v1_decoy LN:2086 M5:f4a368ddba66f5647c78853a2080c7e1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000313v1_decoy LN:2084 M5:90b16478fad5417ff33d03ed3cdb9897 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000314v1_decoy LN:2080 M5:eb02520ddd2b898796bf56257623ff11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000315v1_decoy LN:2079 M5:214af8bfae249648407394750763140c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000316v1_decoy LN:2076 M5:b2439d0b325e4cd30b1869e8e17005f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000317v1_decoy LN:2071 M5:d8e3a93de5b5c8fa58e8785c44e165f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000318v1_decoy LN:2066 M5:03ab659ca0a3d031ed57f5b71c40b7bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000319v1_decoy LN:2061 M5:b7df3a4252d3ed398842dacc1ef5119d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000320v1_decoy LN:2055 M5:3225edb2d4dc98b7b0cfd91afeacdba1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000321v1_decoy LN:2053 M5:d0f66764a23cc8c03b6e0b1b8dcd2aec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000322v1_decoy LN:2040 M5:a53241c8700359fdfc69eff381d88829 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000323v1_decoy LN:2036 M5:8b83d6b87f9d9045336bfe2d4f2d638f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000324v1_decoy LN:2035 M5:641af824694766c85122b263dc1b3649 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000325v1_decoy LN:2034 M5:7f2f9c9fa94f3acab772792c44b4c167 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000326v1_decoy LN:2032 M5:1f32623318d9221ee867209755a538bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000327v1_decoy LN:2029 M5:053ea4692acbe04aa98a6f331417531f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000328v1_decoy LN:2025 M5:930554d67c2f289a7f2bbcce35c88e75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000329v1_decoy LN:2021 M5:b3cda19a888b02b135de2538d4a74936 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000330v1_decoy LN:2018 M5:abfba957d4a6107fa109f1dd5a572de9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000331v1_decoy LN:2015 M5:0ccdc46d98d147f9b6bb6808f723d28c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000332v1_decoy LN:2009 M5:634f88805091cb15be16b1af5e720775 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000333v1_decoy LN:2007 M5:957b5291471bee32d4771292a611cfa9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000334v1_decoy LN:2005 M5:6d2a28c1dcd5377a19f5768b3fa75ad2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000335v1_decoy LN:2003 M5:7fcaa8fce3cf7cda00a42df29b938b6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000336v1_decoy LN:2001 M5:e28b02249a274e4b98551241e243fcbc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000337v1_decoy LN:2001 M5:4718723746d62e7eed277db09d01884a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000338v1_decoy LN:2000 M5:7071be152f29ebf4ec4cfede2d44d70a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000339v1_decoy LN:1996 M5:21924fac8b9023e37be232641581d24c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000340v1_decoy LN:1992 M5:462035d8f8260ac9d68132b5ac63ceea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000341v1_decoy LN:1985 M5:80c971eec06361d4428c1c731da5d2eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000342v1_decoy LN:1981 M5:6f5d885e4d0a0476e309c004c8d7116c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000343v1_decoy LN:1977 M5:07b50b0be202b0e56fae3ff7b729fcf1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000344v1_decoy LN:1971 M5:ec1eccee490917513ffa0844c16cd648 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000345v1_decoy LN:1968 M5:a44124ee81131e9ba181e4d57343b933 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000346v1_decoy LN:1962 M5:a46b7187d8afab3b6711d2b57dbb649e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000347v1_decoy LN:1961 M5:391b9551b7df1ea41abd51c70c6391ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000348v1_decoy LN:1960 M5:2272602c288691975c385900ff1871d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000349v1_decoy LN:1960 M5:92f15826c95eeb01e4b619c7b646a17a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000350v1_decoy LN:1954 M5:98742b24ea14c25494dc15620ed8d346 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000351v1_decoy LN:1952 M5:5d5e3c8f90d84b8f2e912de53d0250a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000352v1_decoy LN:1947 M5:f5e22c20cf8f7956480ff337ad36be24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000353v1_decoy LN:1944 M5:cd921451a9fcf4ec5d06cb74cee21605 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000354v1_decoy LN:1943 M5:eba8670102e02d674c11f1779a39338e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000355v1_decoy LN:1941 M5:79a20867ab6678a0eb6a1bddd2d467f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000356v1_decoy LN:1937 M5:e17159dcd1117f3bb92bebb710740ba2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000357v1_decoy LN:1934 M5:9266a855ef31e94c5f77d277055f2125 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000358v1_decoy LN:1929 M5:11b07e8db80b814bbcd4814bebafc177 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000359v1_decoy LN:1924 M5:e9df9c6169849c4d69eb8a286f274eab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000360v1_decoy LN:1924 M5:5152172dba1a32a5529708855c21201b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000361v1_decoy LN:1923 M5:22f23fe69e62cdfb4304b679a6916bad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000362v1_decoy LN:1921 M5:b5eaf4b290ab9cf157680d65e640a5a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000363v1_decoy LN:1918 M5:9dedcf6b3a849e4c681f05753c2597d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000364v1_decoy LN:1915 M5:a1c06309d5103a00f8c5cf1847f58856 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000365v1_decoy LN:1915 M5:7a8b1fa154de78062577f95bcbf9cd7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000366v1_decoy LN:1914 M5:6db99643422d9ef62392ced193881137 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000367v1_decoy LN:1912 M5:61c61bda79ca84060bd63c678715b83c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000368v1_decoy LN:1910 M5:64edcf78348cea32c4e946329efd3ff9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000369v1_decoy LN:1907 M5:9266a29087762dab9b2c3f0065838122 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000370v1_decoy LN:1904 M5:f753bc41e46a7b0a9a9c63055a0553fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000371v1_decoy LN:1897 M5:df2a02d92f1a99000001bd1979b387b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000372v1_decoy LN:1891 M5:1664892a75f937da1e68f5c28f0be6f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000373v1_decoy LN:1890 M5:ad597d36bffdf82ff75f444e98be4928 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000374v1_decoy LN:1888 M5:570f07c26f0d742b21502cff22b7d2cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000375v1_decoy LN:1888 M5:a85dc5b82df805bdd2ee38b94de6133c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000376v1_decoy LN:1885 M5:d5cfea6c2a90821c0bac19bb1b81c97b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000377v1_decoy LN:1881 M5:cdcde92ccd92dd4531ee3ccae640577b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000378v1_decoy LN:1879 M5:fa3996c5e3cb86b5904ad5ab423f06ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000379v1_decoy LN:1877 M5:4659566201687f420c913a424ff09d62 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000380v1_decoy LN:1876 M5:e619de3bcb3f53147ec25a74324350be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000381v1_decoy LN:1876 M5:7d297256bbb1ec6cdc08e447670e69d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000382v1_decoy LN:1874 M5:bd4b0fff3b0f9b3c27bc270d80d2d91f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000383v1_decoy LN:1872 M5:d337922792c71f4bb3ec1c522519d7cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000384v1_decoy LN:1869 M5:95a4dae294e133dca09afd04559a3d82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000385v1_decoy LN:1866 M5:38b2fbf522a772de9e5971e2c248d773 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000386v1_decoy LN:1865 M5:a2b125ab6d06ffdfbfde0a2899a63d38 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000387v1_decoy LN:1865 M5:eeb193e267c0aad102b5a8c55b899094 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000388v1_decoy LN:1865 M5:a21001e6acebfcf03c2f187db59bca58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000389v1_decoy LN:1862 M5:e1aa83bd329fed4cea1a31c2b26605cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000390v1_decoy LN:1862 M5:e80fe8b2857e4e57c40cff1a604ca905 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000391v1_decoy LN:1859 M5:e85c5d8da9312ccb56a4ecb47e7cb397 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000392v1_decoy LN:1856 M5:d1448f2aeede93e71be4fa57f641c1ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000393v1_decoy LN:1856 M5:dcbc9c61d537f450dd4fae3b11f71d19 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000394v1_decoy LN:1854 M5:a427d47a812c6fe6c9d26190b4b83f7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000395v1_decoy LN:1850 M5:876c26621463a5218a5953d9be4d0810 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000396v1_decoy LN:1849 M5:4797d275b03add54ab91c5b8c318a7e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000397v1_decoy LN:1849 M5:707d492cfa678968ded0e2306392504a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000398v1_decoy LN:1847 M5:06eb26d8459f3e43735ded45aa07a2e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000399v1_decoy LN:1839 M5:1ec1c61f264cc1ec9596dab78ea77adc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000400v1_decoy LN:1834 M5:c268a5b922576efd86cb97619df6fb55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000401v1_decoy LN:1821 M5:37647f03de6c012f655cbffbfbe570b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000402v1_decoy LN:1815 M5:edf2017fafb77c03c7f392ec8489ffae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000403v1_decoy LN:1811 M5:60131480b353a90b21d6a47f52a7d1eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000404v1_decoy LN:1808 M5:b4009abb588476a2593dd27cef872705 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000405v1_decoy LN:1808 M5:ef9e792232f15cf2b18c4d4a7ce99253 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000406v1_decoy LN:1807 M5:09de8b5234448cff4c1e3defd30ee794 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000407v1_decoy LN:1807 M5:212f6e4df329ece3ab38c483cdf02535 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000408v1_decoy LN:1802 M5:291bcca126e0b971eaa6fde409109815 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000409v1_decoy LN:1801 M5:12ba0451f91998e31fd25003c892102b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000410v1_decoy LN:1800 M5:d47cda8c33b62a63e40f02664d4811d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000411v1_decoy LN:1795 M5:7f941c23c25bebc1937eae96aa5e98d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000412v1_decoy LN:1794 M5:1354d0a5f0d586b01f493802f991dd7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000413v1_decoy LN:1792 M5:7b03b07cb1cf327205fb693d3ace8a42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000414v1_decoy LN:1788 M5:36d568b75f9e3cf031e037043ac02384 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000415v1_decoy LN:1786 M5:393fd0366a1270f611866e1fb5af3cc1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000416v1_decoy LN:1782 M5:2652e35a4315660b304c6b7522e5f7d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000417v1_decoy LN:1782 M5:c7c0bd282280cb9eb969940cc3b68acf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000418v1_decoy LN:1781 M5:5a9a78f89d320fbabd4693bd232704a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000419v1_decoy LN:1781 M5:75304d27b61d40a759bd36190202926a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000420v1_decoy LN:1779 M5:95cf227ee90e6dced27e307b52d240fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000421v1_decoy LN:1777 M5:c1fd358a71fe269cee210b27840c272e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000422v1_decoy LN:1764 M5:5db13804da88f18750e478f6682b83a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000423v1_decoy LN:1762 M5:bcf551251490bd2c7ab5a99232bbbcf0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000424v1_decoy LN:1755 M5:c8de78702f0a0471f26cfe586a8d9263 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000425v1_decoy LN:1749 M5:9c843f2e59ba4aeed3517c0aa36ed8c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000426v1_decoy LN:1747 M5:431f95d76dc16b369e6765e38ae92ee1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000427v1_decoy LN:1746 M5:1641a71638dd63211280e6bef22e6a4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000428v1_decoy LN:1745 M5:98de780057460a078034b25725bad406 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000429v1_decoy LN:1744 M5:16ceb3de9929ccc268d4aeacb8f20439 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000430v1_decoy LN:1742 M5:6c61a88798f9fe78567c879793385c29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000431v1_decoy LN:1740 M5:e2ecdbd050ed1413eb2a07f7d9ebc8c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000432v1_decoy LN:1740 M5:7f1d544cca143be6dd353cf3efb80028 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000433v1_decoy LN:1736 M5:18493fcfd6ea161acd237867aa7337cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000434v1_decoy LN:1735 M5:afe0292acad0a1460fbad00971606090 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000435v1_decoy LN:1732 M5:5bba5da58b43755bdc14ab286a8a5cee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000436v1_decoy LN:1732 M5:680818b10726c68c5917f48456528d0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000437v1_decoy LN:1730 M5:836c13c8ad60355227f91a1b5308ea33 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000438v1_decoy LN:1727 M5:f5fb0c58f9b4fa60b1eeccee56f0cd56 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000439v1_decoy LN:1722 M5:9a47086cf6334392302ea1713fb68c57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000440v1_decoy LN:1718 M5:dcc0114d2cbd5f165da52b4610aeb6b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000441v1_decoy LN:1716 M5:59cfde6a838acc68c55e5a781f1308fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000442v1_decoy LN:1710 M5:cf384ae5b546344ace5aa4d662c6ac0a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000443v1_decoy LN:1708 M5:4df6e9cabebe481359ac95881b277f74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000444v1_decoy LN:1707 M5:971971b7547432d52662e516989b1596 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000445v1_decoy LN:1706 M5:9c926b3b414cdf578a7af119dc3d32bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000446v1_decoy LN:1705 M5:91d17f22298838daf727563421004b33 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000447v1_decoy LN:1704 M5:64c4b3b7b16fb06e268d70c576c18be7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000448v1_decoy LN:1699 M5:e50192f7290b158ee82f04623e78180f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000449v1_decoy LN:1698 M5:938f5fb6e35906afc6601c756e85684e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000450v1_decoy LN:1697 M5:670cd517d0cef208acfe5f83f4f08e40 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000451v1_decoy LN:1697 M5:29b287f217fd519ac38852bf9f3b89cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000452v1_decoy LN:1695 M5:42ba5d9b4331876409b5509b694d32f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000453v1_decoy LN:1695 M5:a98d7b845be68d05f42b70b19d87ecbf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000454v1_decoy LN:1693 M5:bda60eb625bdf4d5f8b0cb6ccb975c1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000455v1_decoy LN:1687 M5:27bc09a272621c3414cbe34cd809347d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000456v1_decoy LN:1686 M5:6f0aa7beab754a13ff566057d0641ae0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000457v1_decoy LN:1680 M5:8cba844ac8cc6321dba7652815bbd94d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000458v1_decoy LN:1679 M5:e2f908a05a86ddbda11acd668b7487e6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000459v1_decoy LN:1679 M5:5a0c260602a6ab3fa76f49157966cf4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000460v1_decoy LN:1678 M5:54a34fdfb08cb07c1f51c8be679c6339 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000461v1_decoy LN:1674 M5:ced48cb3354e7f24d532fefc85a96319 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000462v1_decoy LN:1674 M5:4467091f25a983fc0f7d9d88bd351993 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000463v1_decoy LN:1671 M5:7cbbe8ba7b64b120b467c953851a7eb4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000464v1_decoy LN:1669 M5:a3cdd6c546af035a3c9830a67c0bb056 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000465v1_decoy LN:1665 M5:1e245fa1bc113bab6305d0fc3cad2112 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000466v1_decoy LN:1663 M5:b1a1b5888971729811d7fcf9b06665e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000467v1_decoy LN:1657 M5:8a989e9803993317d80157778c71da54 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000468v1_decoy LN:1653 M5:bc73c770766d2b8deb017d234f5d7387 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000469v1_decoy LN:1652 M5:9559e20eaa71db947eb9645779c2c2e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000470v1_decoy LN:1650 M5:60a6f98d6f706aa9554c7b6ed3de2716 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000471v1_decoy LN:1649 M5:ce3eddf63b3aea572dd8e0b762b90829 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000472v1_decoy LN:1649 M5:aeab25a6fcaf97cdcb319dff1550df0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000473v1_decoy LN:1640 M5:7a4f3084ac2ed72ea4f5e60260c77948 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000474v1_decoy LN:1638 M5:5c4753a4d69db9ff02e858c8ddbb8911 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000475v1_decoy LN:1636 M5:8970166c6ade7a2f8106159d5ee5c857 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000476v1_decoy LN:1632 M5:67037d44662f2487a2e39e76ea3fef94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000477v1_decoy LN:1631 M5:3455484eacb9d4eaa7ed63b96b087c85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000478v1_decoy LN:1630 M5:c20fcc553e42922058f9f0e839f527ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000479v1_decoy LN:1627 M5:cf02dff4c16e81e47d1cc5ffdbf1b4ae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000480v1_decoy LN:1624 M5:93392bdc58b6376d5da876bae65be9e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000481v1_decoy LN:1617 M5:e8add50c6a06030a1dca84968a89d4b2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000482v1_decoy LN:1616 M5:6d496ad94b5cd40c72f5362e446e22c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000483v1_decoy LN:1615 M5:bcc4bc611bdb483f2f925df072d50a41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000484v1_decoy LN:1611 M5:19f0a56814e718041b51733abc55a44c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000485v1_decoy LN:1611 M5:771186a23da9b9c2081773c5a6d73812 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000486v1_decoy LN:1606 M5:f6dc33d2578fb0ce6a560d5ee7b9b5cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000487v1_decoy LN:1605 M5:440c7d94624635647d771ce7f3833416 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000488v1_decoy LN:1605 M5:7e6682db43f2445cfc3b18ddecb786c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000489v1_decoy LN:1600 M5:1b3265b9aa7cae61d843ae0b09e2f3a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000490v1_decoy LN:1598 M5:8ef2cd8ef0749e5d753b552c1f2fc3d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000491v1_decoy LN:1598 M5:9bfcb4215c94e812ae4ead4fc804a63f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000492v1_decoy LN:1597 M5:8c06a1c635581dd76469e431bda358b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000493v1_decoy LN:1596 M5:9880ad7b13fdc3af8d8c81e3adf8ba43 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000494v1_decoy LN:1595 M5:ec1ac1310cc7d4432ced7724829cbdba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000495v1_decoy LN:1592 M5:f2d436516525e67ce3aa61ec5273dcb5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000496v1_decoy LN:1589 M5:201a121b6775880be8593d2a9cef12cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000497v1_decoy LN:1585 M5:491aed38b1a89a77be7b2d1d30bd4fa4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000498v1_decoy LN:1579 M5:2e63f3a1cf01e023c443b4478459db64 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000499v1_decoy LN:1578 M5:f9223dc0eaf125b8226c386bbca18647 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000500v1_decoy LN:1577 M5:3c9bc60202ddedaa3894d11a96f5429b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000501v1_decoy LN:1577 M5:c367b54edc2b83cb15946ac3c975ccfd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000502v1_decoy LN:1577 M5:d7d24f1188f1d67db7215729a5c5b8d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000503v1_decoy LN:1576 M5:229d2aa7ab158e9b4bad158972029e55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000504v1_decoy LN:1575 M5:c8f35742cdde94078de3c3d84c130c42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000505v1_decoy LN:1574 M5:d0367db77d5a6bff49f54d4acd3d01e1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000506v1_decoy LN:1572 M5:06b66d904a7902fb764a3e661b9c8bea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000507v1_decoy LN:1571 M5:e3187302e0771a467d4e7d2b31669e7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000508v1_decoy LN:1563 M5:78aa7cd4461790084af50b1b80e1838b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000509v1_decoy LN:1561 M5:abcdf15d561b447b0bdedb366fb77d72 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000510v1_decoy LN:1561 M5:f9a7e72f7e382fa59a1d2c0c4d6edc53 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000511v1_decoy LN:1560 M5:bbfe4f1e02f2fdcc9d20e65e8d3da35d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000512v1_decoy LN:1560 M5:538f38f8d5e6495a85b6bfecf487ecc6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000513v1_decoy LN:1554 M5:8ae2f8b5f30a6c1762de005819965ec7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000514v1_decoy LN:1552 M5:392885482ea57d0e3f1311c3be95c89b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000515v1_decoy LN:1548 M5:1310bfff4743d36d7f8153b6663f2249 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000516v1_decoy LN:1546 M5:629769b2550c48e2a73115da95946951 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000517v1_decoy LN:1541 M5:76f0c1d1779803feb107f253ea555df7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000518v1_decoy LN:1536 M5:686a5b0fc214ac36df8da7605ffae4ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000519v1_decoy LN:1533 M5:e2bf8fa01d69d0ec7c7e1f6d040912c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000520v1_decoy LN:1532 M5:0c23895ba0df7ad7ea8f2b58313a0cdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000521v1_decoy LN:1532 M5:c9515245780a66ef482674755d38c592 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000522v1_decoy LN:1530 M5:5caa4ec6f260d2f960770b368909d78c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000523v1_decoy LN:1527 M5:b05daa30b4f2c9167aac9fde662de4c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000524v1_decoy LN:1526 M5:cfcd1e358a225fc7c2354b1bad52cccc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000525v1_decoy LN:1524 M5:08ec33c06085eb399a1e56f43d1d222e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000526v1_decoy LN:1523 M5:74f16c21c5a2372050d2f61595d52eea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000527v1_decoy LN:1523 M5:e7cf8c07771c8fa37bf4b6fbca555113 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000528v1_decoy LN:1522 M5:8f754d63b65c3c7a1e9a1ad5e439d2d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000529v1_decoy LN:1522 M5:51530101930cfdb66060d0686c4fed16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000530v1_decoy LN:1519 M5:dced229b77a1ea722aed13b4eb4e5b79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000531v1_decoy LN:1513 M5:dc49162a2d904001541bef4c7f7cd54f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000532v1_decoy LN:1508 M5:c183c701388b1a11f3cbf31ba2d84f41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000533v1_decoy LN:1508 M5:0d9b9c8ca5a3b58a13369e0a097f25cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000534v1_decoy LN:1505 M5:4e806d8438bd8512d22e24a026640d66 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000535v1_decoy LN:1503 M5:0b9c580f3d47c52b031cb00b9741c1a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000536v1_decoy LN:1496 M5:ebce7ee144631f93b7001740bff968ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000537v1_decoy LN:1491 M5:191de45ffda752707ef5b22c780675b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000538v1_decoy LN:1490 M5:2b8af44ac46088badbdffea0c0c3d368 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000539v1_decoy LN:1490 M5:378e070f5556e26fd1e89f1f21e2c35a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000540v1_decoy LN:1487 M5:7c84677ee13bffaac6c5c623f317619f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000541v1_decoy LN:1486 M5:501226e799037a04ea73a3be5bde460b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000542v1_decoy LN:1485 M5:8ec76a3f62b296d50ccff9ce4a9aa072 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000543v1_decoy LN:1484 M5:34e4860b41e4db3fe4ec16fdba4cb85a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000544v1_decoy LN:1483 M5:ca6b3496195a36f5f1a5a1de26bd9655 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000545v1_decoy LN:1479 M5:902f04a9f4b960cef80039434d00e63f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000546v1_decoy LN:1479 M5:16692f78928924e255aeb5b72a97ab21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000547v1_decoy LN:1476 M5:e765f1919b45a51913ed7d2f4c9a7491 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000548v1_decoy LN:1475 M5:fa46ec2fd14b9d99852d4d30568593ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000549v1_decoy LN:1472 M5:d03e8e717a38f0178037af0ca86aafb4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000550v1_decoy LN:1469 M5:8ee65cdf657a82a381d7cb6caa4f3f5d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000551v1_decoy LN:1468 M5:bc6f74a7c8ffab037e3eab5ea88037a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000552v1_decoy LN:1467 M5:7d64a0f8c6675f07e9dec9b70a0afdd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000553v1_decoy LN:1465 M5:2e3b43fdc0d1784a2518dfe255384519 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000554v1_decoy LN:1464 M5:df762923ca57a0113032d663d3c97bea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000555v1_decoy LN:1463 M5:11aada1e695fe5177d9540b02a2d432b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000556v1_decoy LN:1463 M5:d3ab1903d41ac470157b0c4d4ed61933 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000557v1_decoy LN:1459 M5:bbadf4ad4f9a1ee8da95612868cfb018 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000558v1_decoy LN:1459 M5:bcd6dabc3d1399c379f3adf1cdeae332 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000559v1_decoy LN:1458 M5:1781d0b5245fdca60eb63e40b293194d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000560v1_decoy LN:1458 M5:46a7c1c5c2e823abe406cf459179bfde AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000561v1_decoy LN:1454 M5:a7a571b77c5a922ca842288fc6734696 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000562v1_decoy LN:1449 M5:cc0f411395c55cc332ad0889e75eca80 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000563v1_decoy LN:1449 M5:184e7321ea1fcdc47df967c7c5d879f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000564v1_decoy LN:1448 M5:9cc22c1be7f706f6789fc994e46ddc95 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000565v1_decoy LN:1446 M5:2be7af38d4e11bbf45397add5e8b29bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000566v1_decoy LN:1442 M5:7badb67269751abbac8f46b5704299b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000567v1_decoy LN:1441 M5:ee8162f4c41a8b15758b34b01d87e2d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000568v1_decoy LN:1440 M5:d4b0ebe0d4c6d4d270b5a5b7d1a5d7ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000569v1_decoy LN:1439 M5:ec8779a6ca200bbe41de6dd3630da10e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000570v1_decoy LN:1437 M5:3d29e003ab19ba610718173d23d26b37 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000571v1_decoy LN:1436 M5:a7261a67e8f0dd3de7bb37e12ed74c3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000572v1_decoy LN:1429 M5:d9b8501a054b0ba4229f7ae1e74bf2c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000573v1_decoy LN:1429 M5:ddc6caafb94fef7d6209cdff64795226 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000574v1_decoy LN:1427 M5:9aca197fbaf212c69feea234780489a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000575v1_decoy LN:1426 M5:1e4c043b8c89e6c193c519db2531e6b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000576v1_decoy LN:1425 M5:846748418b1797e21e540d92fd794495 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000577v1_decoy LN:1424 M5:4fd0c37d4a586150a9301f2009c5c1e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000578v1_decoy LN:1424 M5:54ac14d019ced5f6bfe22948074afa9e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000579v1_decoy LN:1423 M5:3fdf802f805e746ac56f30d6d1a68708 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000580v1_decoy LN:1423 M5:7237c88f6ea636176c0287d0432a9732 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000581v1_decoy LN:1423 M5:e9eaf98ae51879086e24b98bea88df0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000582v1_decoy LN:1414 M5:34272cd5beb57237fb7a193f798cc2d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000583v1_decoy LN:1414 M5:9060d1ca5fe447374bc2a1e69f4e3224 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000584v1_decoy LN:1413 M5:3298b158d1b1f933a0e2a292a1529e10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000585v1_decoy LN:1413 M5:59c1a460224d4414afdea6e15bd8b2e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000586v1_decoy LN:1410 M5:64228ed4ae27b3994019d9e0038f55a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000587v1_decoy LN:1409 M5:4d845a6ec097602753d860feddf23e58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000588v1_decoy LN:1409 M5:a000b425fd931ce6015497afb22efd88 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000589v1_decoy LN:1406 M5:0c059afc9f69018ba9da0b23aa8b9b75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000590v1_decoy LN:1405 M5:0c586f3eb4883fc1918171f471f5e5f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000591v1_decoy LN:1405 M5:cd72088875313abb75d2a891e35b7d4d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000592v1_decoy LN:1404 M5:abf874737ff5cfa8f718112f32beb985 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000593v1_decoy LN:1404 M5:eb8f0a5cc692b80655ef58e2547a4cec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000594v1_decoy LN:1402 M5:6ee2ff095b70b42cd9c9b4e0efabca4c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000595v1_decoy LN:1402 M5:f4d8da8a43b238c8e0646f5f0b52f89c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000596v1_decoy LN:1402 M5:8c7872a37fea0f290dc1bc82d975b894 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000597v1_decoy LN:1402 M5:d0d9fdcbf88b68b1dec6f806c72fed32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000598v1_decoy LN:1400 M5:6634e5294042b88996256c18dfedb84d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000599v1_decoy LN:1398 M5:fd8634e8ef145e4987e4520f150aa3f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000600v1_decoy LN:1396 M5:25350d57a6af0ff5c2c4c9c49b44ce71 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000601v1_decoy LN:1395 M5:6aedeed255c7942bf7499cf1627f8cbb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000602v1_decoy LN:1394 M5:535e79d7dc446b1c3d57759eee6e4f79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000603v1_decoy LN:1393 M5:300693e040f4152f622506cde18980f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000604v1_decoy LN:1391 M5:8a946b3527d782026e0dc90559017170 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000605v1_decoy LN:1389 M5:7a9e96381bae2eb52e9e340616f3d40f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000606v1_decoy LN:1389 M5:b6ee1b27e065ac10608cc2a75f23b552 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000607v1_decoy LN:1388 M5:ff5370f5970d37597e705a08fca533b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000608v1_decoy LN:1387 M5:445d8c03bad3cc26e6adeb0047d18078 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000609v1_decoy LN:1384 M5:e885e52d68b2de3b4a858205e3e642ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000610v1_decoy LN:1381 M5:56708189f55fba9d8406fbd9eee51424 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000611v1_decoy LN:1381 M5:c7791c86ba8e059389aaa3919f1ed24b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000612v1_decoy LN:1379 M5:040a6029ad56ae20245dd1757c313f19 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000613v1_decoy LN:1377 M5:cc1f3e1b6fbcf7cf33ba399c84ff0fd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000614v1_decoy LN:1376 M5:73782073ee88b30e5184f8c58b162395 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000615v1_decoy LN:1376 M5:b49adf2ce996df0a067aa5afccc4d593 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000616v1_decoy LN:1375 M5:ebef890f7fb5122bf631a5489d6d46a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000617v1_decoy LN:1374 M5:d165c7fd94b756243531a20cd030e7f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000618v1_decoy LN:1372 M5:99bb1f26eea260757df2246652e20ce0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000619v1_decoy LN:1371 M5:fdc45233952efe3a4444e4fc118e9bd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000620v1_decoy LN:1370 M5:023468d3dca8b3726de68eb85c7d2301 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000621v1_decoy LN:1370 M5:fb5072d4c89ac94df7141cacd9701034 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000622v1_decoy LN:1366 M5:5aee91a1f323fd56c65017a1878fae17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000623v1_decoy LN:1363 M5:6b6ecc4a02c37b540c86cd51299d13da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000624v1_decoy LN:1360 M5:06cd979553eb7045f14feac8e6f2e2bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000625v1_decoy LN:1356 M5:d4cf98566c01e8715f3f2d3883ee0960 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000626v1_decoy LN:1355 M5:1dfb4921c6f707d06505f67e59849603 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000627v1_decoy LN:1355 M5:0d374e2ae6601c90f80dad8772daeec6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000628v1_decoy LN:1352 M5:474bb6fe17aa82dbe052602181e2c342 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000629v1_decoy LN:1345 M5:be38a1cda1a6e1ae5e323c69f41169ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000630v1_decoy LN:1344 M5:5f167804d39afced5ca6f11bdfc4e79e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000631v1_decoy LN:1344 M5:a8c1265cc335c37e42363c32f7004283 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000632v1_decoy LN:1342 M5:7aad5f98492b8fca78e060b6be39462a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000633v1_decoy LN:1342 M5:f3ffd07c1b2dd961b6182008cc89dca9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000634v1_decoy LN:1336 M5:64e80f53b6b20fe69e1f570c4bf46bdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000635v1_decoy LN:1334 M5:49441fe73d5a6c1424175db5c183d5f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000636v1_decoy LN:1334 M5:7d75d91acde1b12b627eec4355428b3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000637v1_decoy LN:1333 M5:e4ece619ebb5ab86de6fab33b38d5481 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000638v1_decoy LN:1332 M5:7135701f246e43df19f5aba147d6ffe4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000639v1_decoy LN:1328 M5:fbb7b0f582ebca6f3cef730730d1ba0a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000640v1_decoy LN:1328 M5:62be463086e26b1df7d57735080ccdad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000641v1_decoy LN:1328 M5:14eb9b729a7e8e201661d1337b6c986d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000642v1_decoy LN:1327 M5:7758f1665792870c0c087b3c3dfa6f6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000643v1_decoy LN:1325 M5:4e1088e1aa76be60fab929e87bddd522 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000644v1_decoy LN:1322 M5:af3b1f03c49d83adafa3d8f2d6874c24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000645v1_decoy LN:1320 M5:446dcf62ddc2538c64ec6aa731ea150b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000646v1_decoy LN:1319 M5:56748fdfa4712830c7af4c68f4759228 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000647v1_decoy LN:1318 M5:8eaa0a6e0ed839c74aab55d260c6fc46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000648v1_decoy LN:1315 M5:56712d4e2ff952bae0ab0ddd610f253d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000649v1_decoy LN:1314 M5:d3e12fcc460574d688e5bae5d2442b1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000650v1_decoy LN:1313 M5:b547545a4b0358b765cecfc76a24f5c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000651v1_decoy LN:1313 M5:6b644257e459efb9331cbf248eb360a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000652v1_decoy LN:1312 M5:49650bf9d34993f3734ff8be22a21d8c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000653v1_decoy LN:1310 M5:a4ce42eeaf93dc12fd2c1d548ecb8ec1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000654v1_decoy LN:1309 M5:b6aa3601c472a96642590f2556fd60f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000655v1_decoy LN:1309 M5:86d4783a9574d129cdf2d96b81899a69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000656v1_decoy LN:1307 M5:f7f361b3f660b392044fad24ffae29fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000657v1_decoy LN:1307 M5:754ff5c46ace6aa00b6225c1395948bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000658v1_decoy LN:1305 M5:93cb281ea84aef36a85cb9950604dd0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000659v1_decoy LN:1304 M5:12d269dc2ce62735236ae94e1f20075b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000660v1_decoy LN:1303 M5:48fbe06e5f32a0378e9bb9f94280b087 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000661v1_decoy LN:1302 M5:21449d3d68824fc9c13706be068c9b2d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000662v1_decoy LN:1302 M5:8b61707178e6e8435c171f9af9103412 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000663v1_decoy LN:1301 M5:00401a0950f66bdb8079810e7cd7ea17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000664v1_decoy LN:1301 M5:da9b6adf8123090f1132c9b33c3aa8e1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000665v1_decoy LN:1300 M5:a6e3addcf5e77b6d35b918c3d4b07184 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000666v1_decoy LN:1299 M5:74108c185dba89f41809a3192d33baec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000667v1_decoy LN:1297 M5:4aa3c2f67ac1c8f495575e8560808f7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000668v1_decoy LN:1295 M5:c0e3f662ea9b92faded08da52ec79ba1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000669v1_decoy LN:1294 M5:acb9567104820929d7f17199b614c243 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000670v1_decoy LN:1293 M5:d58180a24710ca20cd90857426fba9cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000671v1_decoy LN:1291 M5:0021de79f69c7e6f7be872209251d8a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000672v1_decoy LN:1291 M5:ec57c06e1967b151af9716613687bf06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000673v1_decoy LN:1289 M5:9e48e5eb17a1e58951e1b652dd9f44d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000674v1_decoy LN:1288 M5:93d19765c9dd00919c6cfa7d93347c46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000675v1_decoy LN:1288 M5:71235a1d58334d223edcaa90fefacfdd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000676v1_decoy LN:1287 M5:a76f2f42317a6ab2cb892a72174adb45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000677v1_decoy LN:1287 M5:f334340b46a994fa73de757843dce680 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000678v1_decoy LN:1287 M5:e2d24061f1801ed1293ec0b863363b3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000679v1_decoy LN:1286 M5:23647de37c2ff39cd67aaef8a5580814 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000680v1_decoy LN:1283 M5:1dbcdc4ac713f81604583fa6b6106bb4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000681v1_decoy LN:1281 M5:bb3d85c707984bea66a348264a710aa3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000682v1_decoy LN:1277 M5:5c2e53fdc0f5cd26c68ab66f14416b3b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000683v1_decoy LN:1274 M5:f1d20984b2bcf2b2b0e005c54fff514a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000684v1_decoy LN:1270 M5:0e776546d49756c788dae25d1787fb00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000685v1_decoy LN:1267 M5:e52038740e15a18dd9b464342630faed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000686v1_decoy LN:1266 M5:9b437657983b2138524382ca0130b93b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000687v1_decoy LN:1260 M5:0a5f065c6de74f1ae3424582269c48da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000688v1_decoy LN:1259 M5:78788ef8ba3807f9a105d4a9a55a3c65 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000689v1_decoy LN:1258 M5:4860c125f57848f7afe40d583f7477ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000690v1_decoy LN:1258 M5:2713e855b2f8f1734239f0523b6200ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000691v1_decoy LN:1258 M5:619c058b99f936b291f949550793c9f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000692v1_decoy LN:1256 M5:c21ff94783721fb59f3db81a80c1e0d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000693v1_decoy LN:1255 M5:8c83cfffa25879e35ab28858fa33d70a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000694v1_decoy LN:1254 M5:b0caa977dfdfb73b5e1a58b423ff4a8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000695v1_decoy LN:1254 M5:e2dd86e353ba1cebb9ee6ed4e35b54f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000696v1_decoy LN:1253 M5:5036e5442498d2a7fdb0f573f258cd60 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000697v1_decoy LN:1250 M5:a082ce0af37351135354a3448f4e1e21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000698v1_decoy LN:1249 M5:d47b3d78169ea825e882ac16b3117146 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000699v1_decoy LN:1248 M5:208d107183937e7c221f38693342e39d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000700v1_decoy LN:1248 M5:0f92b053b9f7b2d596ce45e73486fe32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000701v1_decoy LN:1247 M5:38be4b2a0f1e5aa9c09b662eee046034 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000702v1_decoy LN:1242 M5:05cde0965d9330b1048d4d3c3d3d700c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000703v1_decoy LN:1242 M5:0861806c0301513ad259fe070d39e0dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000704v1_decoy LN:1241 M5:364bee56428db3836e130cf7a18b713d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000705v1_decoy LN:1241 M5:854cf124e49f41012ddbad98fa6676d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000706v1_decoy LN:1241 M5:1f8ca7e72524d4e37948801d7b5a8afe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000707v1_decoy LN:1239 M5:f24cb34121b984ca68855edd34574629 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000708v1_decoy LN:1238 M5:d209df786f3b1d1ad941874631548588 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000709v1_decoy LN:1237 M5:b4a98205bda995826a33cefc257ca695 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000710v1_decoy LN:1236 M5:e889a8feacb30e59ab4f4b36b7d9c1e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000711v1_decoy LN:1235 M5:1d00a257b98ad31640bb5ba492b84179 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000712v1_decoy LN:1234 M5:33721b9972767397365deed771dbf073 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000713v1_decoy LN:1234 M5:036d24e0ed6b0b50f1cfbd3f587c4cc2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000714v1_decoy LN:1234 M5:a7ddd63607d708a84ae2b88906989e89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000715v1_decoy LN:1233 M5:9eac1d4d910f6c899ce66d778f2f1151 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000716v1_decoy LN:1232 M5:0b8643f1a24c79b3ecdd1a67db0cc86a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000717v1_decoy LN:1232 M5:c5a5a989ac7252d8392936662ea77847 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000718v1_decoy LN:1231 M5:ac3030bfebae64338eb50915e6c8bd90 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000719v1_decoy LN:1230 M5:57901862b298a5add08f5cca114254dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000720v1_decoy LN:1228 M5:425fcf156dc340ca958e76e678b5b1e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000721v1_decoy LN:1227 M5:8202dba5ecf55e01c2eaa23654a65b28 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000722v1_decoy LN:1227 M5:84410313c42ed3e74a0db6afd68aea27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000723v1_decoy LN:1226 M5:abbfddc0795df55c6e15788256752132 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000724v1_decoy LN:1224 M5:a62c3a744a6da312ddb499103c0e5dd1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000725v1_decoy LN:1224 M5:8de8180c87074519ebeedefce23a5bd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000726v1_decoy LN:1220 M5:f04fd8bfac48f74f1ba90d5f1730840b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000727v1_decoy LN:1220 M5:f0dfe089c3f7b049c98dc63e934ff352 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000728v1_decoy LN:1219 M5:e7c7be67e8022eceeb1748e1bc896244 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000729v1_decoy LN:1217 M5:d54b84b201adc65a8f6c321c0a9b82b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000730v1_decoy LN:1216 M5:2a49da07788e874c277958962ecb0df3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000731v1_decoy LN:1215 M5:c382bd37421a81163d88288a6f7cde1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000732v1_decoy LN:1214 M5:2987b50923434c160ee2c370f1a0665f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000733v1_decoy LN:1214 M5:2cef32c11c190dec442c6760ce3b95d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000734v1_decoy LN:1214 M5:3320cf99748892c60e02c948326286eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000735v1_decoy LN:1213 M5:ed1d21ad71609ae43a9b6bcebb49639f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000736v1_decoy LN:1212 M5:b586f3157d6a08d059ff88c2a8b09110 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000737v1_decoy LN:1209 M5:7ba7bce4d6531a5524c73a86b5bedbb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000738v1_decoy LN:1208 M5:04bd45b790033b8311ed85dea3015e01 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000739v1_decoy LN:1207 M5:347ce8f1f6a746892189ab8494e8aaa8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000740v1_decoy LN:1207 M5:707de4a5497ea34c4e4f0bc0c85de3fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000741v1_decoy LN:1207 M5:be1fcf2149a75c654ccdcd7bdf0f6fbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000742v1_decoy LN:1206 M5:4e1effd0109053a328e58366f9f97082 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000743v1_decoy LN:1206 M5:9f9dfe453260eb10828d18745f7f5dcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000744v1_decoy LN:1205 M5:855e900b59e0654686ce1a3d9955d650 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000745v1_decoy LN:1205 M5:137e80b53681aa0957f4489dc3bebca5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000746v1_decoy LN:1204 M5:d5ccfc0afa0a8ffeb39566a3edbd5831 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000747v1_decoy LN:1204 M5:2d8e3051fce1f6364064a61a1015f902 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000748v1_decoy LN:1204 M5:4ae1aece0937c17d93e0b54aab43444f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000749v1_decoy LN:1203 M5:108a33f55fef0274c3265bbadc509de9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000750v1_decoy LN:1201 M5:6ca12ea72ce31843c3a72b1519b0f252 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000751v1_decoy LN:1201 M5:85e6c0c98d00cefe52487084168379f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000752v1_decoy LN:1200 M5:6db13990bde5be0862c8524915fea770 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000753v1_decoy LN:1200 M5:e2708863bd36e41c2e8ea5a6b3ec5110 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000754v1_decoy LN:1199 M5:beae786e8598f79032fc8c16208aeb00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000755v1_decoy LN:1198 M5:0a56caad49417b3587e394dcf70fb6f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000756v1_decoy LN:1197 M5:7f43dc6c55686b78a0ca14bb83eaf8c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000757v1_decoy LN:1196 M5:ed9e0446d6bb51755db408158805d507 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000758v1_decoy LN:1195 M5:cbb14c85e5696a49ce697e346634e422 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000759v1_decoy LN:1194 M5:af5aad17aff7705f0fd96e58a32a59d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000760v1_decoy LN:1194 M5:b1a7eab6e2cc0e62933274443fed0a24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000761v1_decoy LN:1191 M5:23fae8306c0b4a5bf7d0941294736058 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000762v1_decoy LN:1189 M5:5b7ba9e9888da831b0aa4565b412bcc6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000763v1_decoy LN:1186 M5:b39edd9fdfea3b1d9644fa805f33a2b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000764v1_decoy LN:1186 M5:ad284b4b4daf92a4456309e77375468a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000765v1_decoy LN:1184 M5:98516b9021a46bcc79d7386ac6dc34c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000766v1_decoy LN:1183 M5:64d3e55e37f2e86e15c96ef1d879bba1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000767v1_decoy LN:1183 M5:bb4656c8fbc2436252c45a1da9ec9583 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000768v1_decoy LN:1182 M5:fef2856f46d2c7724e666eafdd402ebc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000769v1_decoy LN:1181 M5:987931dd2bf6bac95e341d207f146623 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000770v1_decoy LN:1181 M5:eac4c9bfba221a54e6f9e50cbda276fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000771v1_decoy LN:1181 M5:cf5eee43e4ec7820ecca7ad7864f52ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000772v1_decoy LN:1181 M5:0b58fd78215049a25bf9904c8d82de05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000773v1_decoy LN:1179 M5:bbff47313bf9094c388338d41292f0da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000774v1_decoy LN:1178 M5:0e47d0853364f93c33da6738f79bd494 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000775v1_decoy LN:1178 M5:f12f849bba7e72b4f1f60d7aad6a21a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000776v1_decoy LN:1177 M5:1b10327e63ec134bcc76d1d55f9e78d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000777v1_decoy LN:1177 M5:c87caf65afb409c1775c034ed6b2c791 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000778v1_decoy LN:1171 M5:d25c5de51ec9619b03cce2f95298e8a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000779v1_decoy LN:1171 M5:3e4f5e7a0753a3239b3bc0d49eeaf461 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000780v1_decoy LN:1171 M5:b988438edbb2bbad2f8c1dd32c116f59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000781v1_decoy LN:1170 M5:41b5e67b7143e5bf81dbb61b81a230a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000782v1_decoy LN:1170 M5:ac3de3666d0730b5fb7f44a84f9c4d1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000783v1_decoy LN:1167 M5:7187d1e3ed138db9f1610a9c4dbefeb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000784v1_decoy LN:1167 M5:a1f7192900c80cfabbb39df8dc8d3c48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000785v1_decoy LN:1167 M5:80ff0c82d9a5bc156c3c0bf340bd68ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000786v1_decoy LN:1165 M5:688f5bf8eb90c874eda7108fcf283889 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000787v1_decoy LN:1165 M5:f768117d9e7c2526c123ea228e2cafe9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000788v1_decoy LN:1162 M5:039765c983a107557b8c3ec0a025e44c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000789v1_decoy LN:1157 M5:220dbbeab5a5d61415cdfde9f50b5766 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000790v1_decoy LN:1156 M5:23d66ea0a7a7d160c9413d93f5ad0162 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000791v1_decoy LN:1156 M5:5cb979a509d0b6052c6e0a55be36cc00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000792v1_decoy LN:1154 M5:b0ee554cec6a7fca1a6556932643d8a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000793v1_decoy LN:1154 M5:0370a3a0105a0683cbd802403418f170 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000794v1_decoy LN:1151 M5:8e0e1ffe5b02de8878bd4d564bb6323c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000795v1_decoy LN:1151 M5:7bd0473f38ad03caa52a001a9fbb7354 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000796v1_decoy LN:1150 M5:5a37e3660ee2c75c170b2b5b40e9fb6b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000797v1_decoy LN:1150 M5:490b01f6455790bd5df9ffc337520f37 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000798v1_decoy LN:1147 M5:20582882471f3bed3cd0120b82323ac3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000799v1_decoy LN:1147 M5:0e5917e383190727d973a070137a2fbc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000800v1_decoy LN:1146 M5:4bd3ad205dd76c8fb5e52879cad2ae96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000801v1_decoy LN:1144 M5:b97e8d5a835434eb2a718b9e61b8108e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000802v1_decoy LN:1144 M5:2df1004e75f2e124d3578d82432b9495 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000803v1_decoy LN:1143 M5:f38f2b568b969edfffe4cb768ffbf1f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000804v1_decoy LN:1142 M5:9aab8eca5e4d310eded1b7375ddc7cf6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000805v1_decoy LN:1141 M5:9d60d12e15605e5bdc4e95d5507c5fbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000806v1_decoy LN:1141 M5:ed137b8aa6491c9545e9486d7412e617 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000807v1_decoy LN:1140 M5:153c981d613562052e1fb0b115c4534f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000808v1_decoy LN:1138 M5:0338a9928d761051eb989aba5a478df1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000809v1_decoy LN:1134 M5:58756cfdfe491443b22624377976b379 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000810v1_decoy LN:1134 M5:684bc9fdb4e26e632a8183d8802beedf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000811v1_decoy LN:1132 M5:cbe47496e2df2406ca4e66332ba1ec10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000812v1_decoy LN:1131 M5:4408dcacff9d3e25b64da0a9935a7bc3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000813v1_decoy LN:1131 M5:58cc2832c5530babe80d72360b82afcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000814v1_decoy LN:1130 M5:c537aaab4d2fffc792fff332ba26df17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000815v1_decoy LN:1127 M5:c10ad449537826ed9790a8e7a91cc9f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000816v1_decoy LN:1126 M5:43067a55481ed1a3a07a02ad65eaa2df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000817v1_decoy LN:1124 M5:68a35e6dd8db1522069b2a5cee954207 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000818v1_decoy LN:1122 M5:488cfcbe81f47dcfda704c5c28ebbe03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000819v1_decoy LN:1122 M5:de91661f937117bf675c5f21a54ab668 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000820v1_decoy LN:1121 M5:5e6a5620500506981d3ab73624f63d9e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000821v1_decoy LN:1119 M5:fb748af1360cb775a390f0e931dd02b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000822v1_decoy LN:1119 M5:6b4f3cf5f29db2ef1bddb02c5828ce30 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000823v1_decoy LN:1119 M5:90f491e70c191edb78a37852f165ac39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000824v1_decoy LN:1119 M5:53358ae1c3833697bd5f0eb0f8ac79d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000825v1_decoy LN:1118 M5:e36d0f228ae617024efb91c918776dbc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000826v1_decoy LN:1116 M5:28d254c1b706d0bf3b10df07746930cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000827v1_decoy LN:1116 M5:08d17cf8bbbea61863d1111ebec35b21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000828v1_decoy LN:1115 M5:6ab6da5d7d22274a6ed522846b55ebc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000829v1_decoy LN:1115 M5:798a4b9e0b964f40d8c23e5cc3336db7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000830v1_decoy LN:1115 M5:9cbd8613556330a85d27a64185ea84cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000831v1_decoy LN:1114 M5:83cc1a5967022f8e841c81fe75d58ffd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000832v1_decoy LN:1113 M5:01c1108b447f8fc1ac66a83a185cf320 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000833v1_decoy LN:1113 M5:7f89f5d60ad86ff56b75b22948d678c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000834v1_decoy LN:1110 M5:5a70b2a58e433469ccb66822189128d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000835v1_decoy LN:1110 M5:1e38e29d6d62fd249bf64655d6f81862 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000836v1_decoy LN:1109 M5:96a1d9adc17f059b56e67cfb6937a345 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000837v1_decoy LN:1108 M5:45ea81c798eb106c5436246caa66b2ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000838v1_decoy LN:1107 M5:1814f68b7f841bfe03b315aa32382c00 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000839v1_decoy LN:1107 M5:48441754ca4953c7e3a4a0c8d47ee1e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000840v1_decoy LN:1107 M5:7f28434a41e01b99a0d611c226b8dae7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000841v1_decoy LN:1107 M5:d18ae976cb8e092b2164fb5cf8e96c57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000842v1_decoy LN:1106 M5:7d6bf428559a5a4c3e493b755ebe5524 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000843v1_decoy LN:1103 M5:c32717ad22315f9c16c5ec2cc21c930d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000844v1_decoy LN:1103 M5:a1754553d128a5a63a67e63de2fd3738 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000845v1_decoy LN:1103 M5:39f91ddc96023a6c28b74bce8ab2612c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000846v1_decoy LN:1100 M5:82964c295c4313b285a6149d3c1566a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000847v1_decoy LN:1099 M5:b6ad0bd8376da6c84aad8cf5fe7bc6d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000848v1_decoy LN:1098 M5:e14ec564d8038b588e7bbcc8b2ec0a9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000849v1_decoy LN:1097 M5:7307c9a55c6540dd0e2d41858ae31cbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000850v1_decoy LN:1096 M5:a2998a406a8123e41e824e2ede54ed2b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000851v1_decoy LN:1096 M5:e62b4e85fecea83baffc447a08ca6785 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000852v1_decoy LN:1094 M5:6e5c8b4b68744e944eab55ecb8fb5844 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000853v1_decoy LN:1093 M5:24331159404d19f94c9138da50577e51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000854v1_decoy LN:1090 M5:2929cff1249a75eefb4cfffd96d62464 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000855v1_decoy LN:1088 M5:fbb037cbafc5f686b9ab73e07f0ffcfe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000856v1_decoy LN:1087 M5:211034f9737003efb857df7e977d5277 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000857v1_decoy LN:1086 M5:368e68935f97965228ac78bb2aae203c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000858v1_decoy LN:1085 M5:ce2ac36f0b0097282b1bff60c135f74e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000859v1_decoy LN:1084 M5:3418f70e7ae002b97228bff0e077080b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000860v1_decoy LN:1084 M5:b8e4715e539923de16e145b5eac6191e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000861v1_decoy LN:1084 M5:fc5500f691a93bcad35796e610743159 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000862v1_decoy LN:1084 M5:e59c0bee43efc00f925e98deafcb1339 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000863v1_decoy LN:1083 M5:3f45413c28190577d1c4837a73d4a27a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000864v1_decoy LN:1083 M5:5e5b283ed71b787f5a90e2a85cae8fcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000865v1_decoy LN:1082 M5:50f12f0b974f354351bb88c197b21126 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000866v1_decoy LN:1082 M5:d678f152fcc7e46daafe921a0a41337d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000867v1_decoy LN:1081 M5:b861e354b7da07ac9ff8f421b6caf341 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000868v1_decoy LN:1081 M5:0eb25de463e630b62cb8c32bb42f6ad5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000869v1_decoy LN:1079 M5:47743f7eabd8f065bf223bf5327dc730 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000870v1_decoy LN:1076 M5:43ee859a8e75e455f0f1bdbfb155b6c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000871v1_decoy LN:1074 M5:8de0f0af578c623d46ac53461a51a3cc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000872v1_decoy LN:1073 M5:788f48af377f20246f7f9a21e90b0e0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000873v1_decoy LN:1073 M5:45c2f5e2b5413134f6030f49be58ba4f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000874v1_decoy LN:1071 M5:86a4e6ad2956475caac9b348e6e7f8b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000875v1_decoy LN:1069 M5:22ee1b95d0dcca48ee2f77ec8135e0d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000876v1_decoy LN:1067 M5:3f76ce94efafe5dd1634e6d51aa6d1d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000877v1_decoy LN:1067 M5:5bc259606f224eb610c64d5e5d55321b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000878v1_decoy LN:1067 M5:9449555579bbe1f92046e6c9b1d6eb4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000879v1_decoy LN:1066 M5:2777151312e10fd89af514515090fcca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000880v1_decoy LN:1065 M5:ae8283b9a8386e65951be3f19e3b7006 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000881v1_decoy LN:1065 M5:79e7ca97d9a943a065f8d902b9b01244 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000882v1_decoy LN:1065 M5:0991862c1ee6015ab6ba1008ec3ff69d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000883v1_decoy LN:1065 M5:d68bf7942659eebe8f4973154fd1da22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000884v1_decoy LN:1065 M5:dd08ea8e4c5ee4d1f942b2dce2296cbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000885v1_decoy LN:1064 M5:a5179394ece1fe9e2392cac1241bcacf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000886v1_decoy LN:1064 M5:5ad23055bdc140edb211af99bf7d76e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000887v1_decoy LN:1064 M5:5fb9770dcbf52d1a7f41c9d235a9ceeb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000888v1_decoy LN:1063 M5:68844d1f612bcae36302b17758f78e86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000889v1_decoy LN:1062 M5:844d181d05473e9b6d06b5defabf50d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000890v1_decoy LN:1062 M5:224848a8b0947ecc656065423b7862ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000891v1_decoy LN:1062 M5:de33c1fe76fea17846a96ea7bc9e91f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000892v1_decoy LN:1061 M5:919160e2c6fec7a7c92d823d76b66027 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000893v1_decoy LN:1060 M5:f79c0acfc167625b085df24f5058e8f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000894v1_decoy LN:1057 M5:6cae16f687b6453bea4343f3a72ea5d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000895v1_decoy LN:1057 M5:7b95591d319231c96c2db2ab196e568c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000896v1_decoy LN:1056 M5:59477a60f18aa435be9cd8e8cb8958fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000897v1_decoy LN:1055 M5:ef9e2ac86b6dc21510af5a157ffdd9a7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000898v1_decoy LN:1055 M5:8a426cfbaa95d3a4ff9de0b8cc401ed0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000899v1_decoy LN:1055 M5:071ea5ccf103c1e5bc64476b69297cae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000900v1_decoy LN:1055 M5:a0183c0c525e9830c2487ba397d48984 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000901v1_decoy LN:1054 M5:fbc0b340afbabfc63b03b8ec4caf77ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000902v1_decoy LN:1051 M5:5f5a077b53495abe7fc001c49c8b9306 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000903v1_decoy LN:1050 M5:69420a1791c126a89681a6620ca82d48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000904v1_decoy LN:1050 M5:9c4f6e5286d911f86ede7780174ee24a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000905v1_decoy LN:1049 M5:0940c85e47df41bd6052ec8f8ca76da3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000906v1_decoy LN:1048 M5:d1bb56cbbe04f366cb8b9e00e16c0292 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000907v1_decoy LN:1047 M5:b1bfe8c8a961d7d57914f4d7c4244100 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000908v1_decoy LN:1046 M5:e48424ce325e8f78e32af41d56e93243 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000909v1_decoy LN:1046 M5:2b08cbae6f429b208c980cf721fc1a43 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000910v1_decoy LN:1046 M5:43dfe59c93ea059ca8557bb58d0d3e39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000911v1_decoy LN:1045 M5:4a62b434c567f91554aba4fe9d29bee5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000912v1_decoy LN:1045 M5:9dda9f1dca0f324d3ec28a2f95399b6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000913v1_decoy LN:1045 M5:f7d06c828a959e093ca5c4fefcaed79d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000914v1_decoy LN:1044 M5:9565e8a0c6d2b4911f44a2dec3319fec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000915v1_decoy LN:1042 M5:63910bd693964213823ca9ff1e270883 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000916v1_decoy LN:1041 M5:9350358a6726a178c8e3c5c038a58b5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000917v1_decoy LN:1039 M5:1c73f73eb55cd6290be7beede9ad10f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000918v1_decoy LN:1039 M5:95035075514c5d5ad7852ba2c1b2b649 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000919v1_decoy LN:1038 M5:f8b064906cddf6b316b6aee040120925 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000920v1_decoy LN:1036 M5:510d0277b9afc44d0f3a07b3327a111d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000921v1_decoy LN:1036 M5:d7a9e2e36d916e57d735f657035a9829 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000922v1_decoy LN:1035 M5:318ac9befd9a2449cae3c371dec8e628 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000923v1_decoy LN:1035 M5:6af821ff48f6593ccd322ce697bdc253 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000924v1_decoy LN:1033 M5:bdd1f96a69f748c2a2fc4b21e31c2f06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000925v1_decoy LN:1032 M5:5b23ae1b5786a5a5eadc92b69bd836c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000926v1_decoy LN:1031 M5:b06aa5a4fb487a467429373242a18923 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000927v1_decoy LN:1031 M5:6fd21c6cec0c8086aa77d26c6d200aeb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000928v1_decoy LN:1031 M5:196c591c8593f2c090224ae6cec80358 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000929v1_decoy LN:1027 M5:b7eb33328daf9d0ae316619a61384cec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000930v1_decoy LN:1027 M5:a1112db1101bde90d172ceb0b455adc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000931v1_decoy LN:1026 M5:42be32c5547cde39b2ccc77ac8e41c3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000932v1_decoy LN:1026 M5:62f5a154eeb5e3613de4f255efe75565 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000933v1_decoy LN:1024 M5:69e6c66e0db5f669e7762df739c9bba6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000934v1_decoy LN:1024 M5:f2b5de034be298d37051f37061d1748a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000935v1_decoy LN:1022 M5:d81ab37920ea303d70fec80162569190 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000936v1_decoy LN:1022 M5:08f1fd0b0e3cb4204a68c0bd7c5c57a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000937v1_decoy LN:1021 M5:4c13817a5ba74eee0c03aada914a0243 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000938v1_decoy LN:1020 M5:e4ef90447f68425ac775770584c2ac6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000939v1_decoy LN:1019 M5:d7d108b06883f65ce1ec9f6a55b4842e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000940v1_decoy LN:1018 M5:3e1e177644a21aa70ff44fba9753313c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000941v1_decoy LN:1018 M5:6bff6cc8151a99c46a864ea703c2f8b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000942v1_decoy LN:1018 M5:e7f0466b453823ed7d075d4a2ede4a7b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000943v1_decoy LN:1016 M5:3d62e68db3dcf0e169c55174dcbd79c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000944v1_decoy LN:1010 M5:7b808bb60e41db8c1149f10d7bd5465e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000945v1_decoy LN:1010 M5:8f606e0943101b0656668a2ae35e055f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000946v1_decoy LN:1009 M5:5af16ec72873d3cf402dd411e1bbaafa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000947v1_decoy LN:1008 M5:ccfac7e6bd5f5a5fb98e773922be5b3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000948v1_decoy LN:1007 M5:d5e4ec92647dc97d7ca5c479effc5698 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000949v1_decoy LN:1006 M5:53c640d8a27c49f44643fa6cff64c7bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000950v1_decoy LN:1005 M5:4f20464a0e34b4c139f58567dac67a9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000951v1_decoy LN:1005 M5:47b4982ddfd84f1b626e9ea7b0859169 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000952v1_decoy LN:1004 M5:77403eb0765e6a6422307122ee3a0544 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000953v1_decoy LN:1004 M5:74caf00415bd1b5764ea6082c0945b27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000954v1_decoy LN:1003 M5:811dd1c7e02a779772cb0adcd330822d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000955v1_decoy LN:1003 M5:b217fa3505a5024cd26ddcf42d514a4d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000956v1_decoy LN:1003 M5:c90b2e71160e8f5cd6d23a740a17841b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000957v1_decoy LN:1003 M5:3bf126803f3335d9227e753cb43060dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000958v1_decoy LN:1002 M5:3904df1efaf5438d8e060141cf4dd6a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000959v1_decoy LN:1002 M5:ab5ef802456142b25705723663909e35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000960v1_decoy LN:1000 M5:ff514a3d2ae42b584daf88b9a9a8751d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000961v1_decoy LN:1000 M5:eb02c1a37ede0d1a737a6c8c984eb06e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000962v1_decoy LN:8358 M5:567a758298b590bb1f4a159d81b84283 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000963v1_decoy LN:7932 M5:fd0a26e270577d3a6cc4cb9256e21cc2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000964v1_decoy LN:6846 M5:4fd9f0f9e88fcd125702c11dfc2c4efc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000965v1_decoy LN:4591 M5:31483ec110747cfcac4dc1e36e8758ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000966v1_decoy LN:4041 M5:f4f7ba029902c50fa77ed2b9966eb1a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000967v1_decoy LN:3841 M5:00a9379bf89f4556f66988ab0193b4c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000968v1_decoy LN:3754 M5:bb2217ed56094a266a3fb1b82e6c6a23 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000969v1_decoy LN:3743 M5:5332a570edd08ee710cafaec398e0156 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000970v1_decoy LN:3702 M5:2b25e772f95c73582eacc01e9a048d9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000971v1_decoy LN:3625 M5:44cc5ae081c41e1c77f2043b88c70e0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000972v1_decoy LN:3529 M5:9c1927ed8f09b5ddff51f2f25450a4a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000973v1_decoy LN:3508 M5:04e36a548c184b404c00b7841ba45394 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000974v1_decoy LN:3359 M5:43e1fbfc042ef8b79879bd53c3b27521 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000975v1_decoy LN:3320 M5:4c9cce705cc18e643a96d433b0f0d80d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000976v1_decoy LN:3231 M5:090a5929ce6079dacc5408a9a7212f91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000977v1_decoy LN:3220 M5:b353222bd8f3e04b305911608d5b8b16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000978v1_decoy LN:3212 M5:d21eaa3001500aa078c0457aa0ecb160 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000979v1_decoy LN:3192 M5:87ce752d8b9611f39e6371d84b00dd68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000980v1_decoy LN:3092 M5:51fba58b7e482359134618d7115ef0b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000981v1_decoy LN:3087 M5:86e1c20fe0c0fc2ee5a4627c9dc91dde AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000982v1_decoy LN:3048 M5:0f4f9a676207d67aa7b835ec767daa3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000983v1_decoy LN:3005 M5:8cf60855c69aaa947ecffc2d85f7b836 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000984v1_decoy LN:3004 M5:1fe6d0e0f45dd1c103c83d965f4d065f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000985v1_decoy LN:2959 M5:5734404ace148ab496a0589c177d68d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000986v1_decoy LN:2934 M5:6091b4163a2558a3b376861ba46e49b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000987v1_decoy LN:2933 M5:867d88d0d6a7b4576b5f40df8aee32a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000988v1_decoy LN:2827 M5:fc01429a43e70e9f45d2e9b183f1cbb5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000989v1_decoy LN:2794 M5:8c97ce716667af6e7bf7b16598a2d1a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000990v1_decoy LN:2749 M5:460d8510eb2de1d5521b6303183eca65 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000991v1_decoy LN:2745 M5:bcb193217c039f3d327b106f7bbb1eb2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000992v1_decoy LN:2733 M5:38d3109378fc051e0d6d30c9c768c361 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000993v1_decoy LN:2698 M5:7909dcbf170e075fd5ae77f2de6658bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000994v1_decoy LN:2665 M5:90d637dd87631542f98b8a2fb31e45d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000995v1_decoy LN:2634 M5:a5125437bf818a2f4ece1a2cb7ad4e5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000996v1_decoy LN:2492 M5:82de7c0346b508963d47eaef107ba2ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000997v1_decoy LN:2489 M5:904eab4180cdf8accc4e926f65892e16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000998v1_decoy LN:2468 M5:5a16ed756cd3e8451225c0c89c299ac3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01000999v1_decoy LN:2414 M5:a7f82c5206197f2b60bf6e21e8406ff1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001000v1_decoy LN:2395 M5:fa87a3decbc163bd5c4be47f26ce4c72 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001001v1_decoy LN:2356 M5:c1764faa777d0cb7e6d10ff41a7f4d46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001002v1_decoy LN:2339 M5:a71335121d2395b90f88701d0d395b28 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001003v1_decoy LN:2310 M5:e7727f2a6ea39391478a70b270b9a4c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001004v1_decoy LN:2288 M5:27c3653c8e9470329db519a7e855887b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001005v1_decoy LN:2285 M5:07a062d63e1175496ade57cb4924ac86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001006v1_decoy LN:2269 M5:da22a2b66c30d77f9c75ac5543b82df4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001007v1_decoy LN:2253 M5:521007d0a98d89311d4fef1f850e5c3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001008v1_decoy LN:2203 M5:efd830cbd9f13d6f2e59621b80df1cc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001009v1_decoy LN:2176 M5:35223579474d332cd9c25530d391cb37 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001010v1_decoy LN:2159 M5:c6451a9867c60bb9414b9f531733227b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001011v1_decoy LN:2155 M5:c9a15197997fcc229a4ba16daaef7ab9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001012v1_decoy LN:2149 M5:8fc79f00adb9b9876fc0c760212279a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001013v1_decoy LN:2129 M5:e0053f5c6a91ee7561e587740719a89a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001014v1_decoy LN:2116 M5:c4594c9954ddda6bf892d1221deb1f5a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001015v1_decoy LN:2113 M5:a604e6df460c882c18dd0b761e7da09a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001016v1_decoy LN:2098 M5:1e7f643633169955a530300b89b41499 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001017v1_decoy LN:2066 M5:95e88f3c4f847fe97ff528408aee9885 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001018v1_decoy LN:2066 M5:50eb710c12d63d96710eead27936dbd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001019v1_decoy LN:2059 M5:80e50b65d76c95f06a65b213d6e22e3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001020v1_decoy LN:2047 M5:1e5494b45601a7dacb84814da24724db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001021v1_decoy LN:2040 M5:0fd285ea19d36ac7fbfeb49f98d0e3fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001022v1_decoy LN:2030 M5:4d3b39f0ab2f0f051d917cc94faeae9d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001023v1_decoy LN:2024 M5:a4cef27d7ccd380794cbff4dd6eb41e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001024v1_decoy LN:2001 M5:e6821e55e6dbf96dd5ab53b59be17ce5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001025v1_decoy LN:1992 M5:dda157c4b492e3c1a4e277e1dab4aa7e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001026v1_decoy LN:1981 M5:4166a173f0411e5579f9d3ed8aacd959 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001027v1_decoy LN:1979 M5:88e1e86ee00ad030c8e1f25e49ad569a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001028v1_decoy LN:1957 M5:26727871d8918ce12f1e7fa8f5914c7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001029v1_decoy LN:1953 M5:9b38c1ef5a1efb5065c9f3dc102ff199 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001030v1_decoy LN:1944 M5:85264a3258514a27228a82bcec9ea08d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001031v1_decoy LN:1936 M5:a7347a7344187fa04690bfdffc33512e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001032v1_decoy LN:1932 M5:4030d4f8fc378be7ab110a327a3a7f7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001033v1_decoy LN:1882 M5:ca4279d8b8d3f3b766ec81b34c402aa0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001034v1_decoy LN:1878 M5:e5d3efe3296f7f5ffb2193bd5be2aead AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001035v1_decoy LN:1870 M5:1c898a94d86446ff18aeae6c9836d2cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001036v1_decoy LN:1821 M5:8f2121509d8a9d3e95e78ceeaca8db95 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001037v1_decoy LN:1813 M5:1111c9f5ecffa495ea2a9408094b8fb6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001038v1_decoy LN:1809 M5:0ef16d8e23134785f99146b8b3cada3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001039v1_decoy LN:1804 M5:11e7f4e8d60fef86d7fbefca0fabf5df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001040v1_decoy LN:1797 M5:42437cf6fa6210fd9b127e7487d14e4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001041v1_decoy LN:1791 M5:1b98bd8020f173b5205948481dd39658 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001042v1_decoy LN:1781 M5:7460d29d17ba264f4358d5876a383fac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001043v1_decoy LN:1766 M5:1599e276d124e4a9aa2f66a6300f8a3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001044v1_decoy LN:1764 M5:fba6f4c5474d22767649a8328d8f3670 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001045v1_decoy LN:1743 M5:8b83d468225e1a45cb1846dc726f2562 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001046v1_decoy LN:1741 M5:8adc2f7bd9e61fde6e9824026c0a2430 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001047v1_decoy LN:1709 M5:7363ff9bc2e506ad5041f70fc083e7fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001048v1_decoy LN:1706 M5:ef2492257bbf08783a4db0aecad49550 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001049v1_decoy LN:1701 M5:9c322f81502c32f0c8f405ee752a4f44 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001050v1_decoy LN:1689 M5:5fe371c4096ae41150f76981d68dacd2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001051v1_decoy LN:1646 M5:ed85a7af0713ab3b3bcdf61bafeedea5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001052v1_decoy LN:1641 M5:97b84c347da74fc7614b6363ba4f28e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001053v1_decoy LN:1639 M5:dc79cb73595caf151cffe0be4286ce1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001054v1_decoy LN:1636 M5:221da4dd1119306af9f8fa1bc567f6fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001055v1_decoy LN:1632 M5:6f572e5698e138bf1e7b1edba75588f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001056v1_decoy LN:1629 M5:fd6f43c6fc2542ce63298bdd465a38a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001057v1_decoy LN:1623 M5:4a44475e85813d0b54e2afdd3aa8315b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001058v1_decoy LN:1622 M5:d30e3342b06bd2428d574ef50226a9b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001059v1_decoy LN:1622 M5:0e6aaefcfab75455e8f59e751c8d44a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001060v1_decoy LN:1619 M5:e91e56fee1ae99144354eba8e5ec571c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001061v1_decoy LN:1606 M5:e266b715eded02faa272225186a213dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001062v1_decoy LN:1593 M5:74d3a9f8a38387de10a759100154372c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001063v1_decoy LN:1592 M5:efcf64c62b2233135f5794d7b9e2f4cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001064v1_decoy LN:1558 M5:bbc8fdfa71746e3e396e745a1fc9d63d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001065v1_decoy LN:1545 M5:fc836522e323b4779fcc5b16f2d28505 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001066v1_decoy LN:1542 M5:6fe808dc84087dc7d8418eced9744173 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001067v1_decoy LN:1540 M5:9c582e02bbde278105b2764116a44ef6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001068v1_decoy LN:1529 M5:9f25be63cbf7cc5da1d1bc6fe23db799 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001069v1_decoy LN:1518 M5:772df05b40eabe6b084af8cac402aef4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001070v1_decoy LN:1515 M5:bda033712d93ab6c918ec5b0fa58f343 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001071v1_decoy LN:1513 M5:faf46f2a8ea7b8d1d0282aaf9e10141b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001072v1_decoy LN:1507 M5:12e6bce1a4e70c91a764227eafe6d229 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001073v1_decoy LN:1504 M5:c757ce71d69487d184714bb6bf879036 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001074v1_decoy LN:1499 M5:d6645febc4c0e7fef261124c74ecff8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001075v1_decoy LN:1495 M5:adf3668dcf991b59a38c281c3d7b5647 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001076v1_decoy LN:1495 M5:2edd8f2a644a90e4ca21826bb31402dd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001077v1_decoy LN:1492 M5:3dc6cc3ffd2a9b7966ca3e8ea12dc81f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001078v1_decoy LN:1492 M5:308ce742886a73a84ab8cb90370451ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001079v1_decoy LN:1489 M5:39d5f26be15da228d1d38b408e0a392c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001080v1_decoy LN:1485 M5:2a52bf85b6a45c79c92a6c6027abf122 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001081v1_decoy LN:1483 M5:d22840c21eb279736a5a8262ec8a66b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001082v1_decoy LN:1473 M5:d6b57113fdeadd16b92fed725a02d12d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001083v1_decoy LN:1470 M5:5b5ff1a6c8fff55ac6ebd1d9bda4fd80 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001084v1_decoy LN:1463 M5:80030f88512ee394cc4e9a81b032e17a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001085v1_decoy LN:1460 M5:2587132a077227d0b8742ec9439f95b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001086v1_decoy LN:1458 M5:5366ad05ba9fe3bdfbc51dee8759c348 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001087v1_decoy LN:1456 M5:1d39f2ea075eca983ca23f12efc47f22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001088v1_decoy LN:1453 M5:020a82dc938b6e53e904f477268c7d5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001089v1_decoy LN:1443 M5:541cab251db4f8356953dfc20e8cb327 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001090v1_decoy LN:1441 M5:a563ca647fc20b65ba7baf52e3eb4648 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001091v1_decoy LN:1426 M5:d096cb367c98d6804b4a1b205054c9ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001092v1_decoy LN:1425 M5:4c1a5daffb2303c754e4383ec3bff31f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001093v1_decoy LN:1418 M5:5305c46f4221a62f8001b24ced994801 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001094v1_decoy LN:1413 M5:8d8667fd137515e7c5d31b0b942a7525 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001095v1_decoy LN:1413 M5:e38f0eb475fa6f2aee1b51ea785af3f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001096v1_decoy LN:1412 M5:88ee82e753efc8d4fbd5f1e02ddff9e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001097v1_decoy LN:1407 M5:732666474ada2d4fe1316edd249b2f5d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001098v1_decoy LN:1406 M5:f63dbabd25745821024183fe0082257b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001099v1_decoy LN:1396 M5:0102bc3c8078cc16bddfa125f005370a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001100v1_decoy LN:1390 M5:181bb8fe5095e667506c66e213f3b51d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001101v1_decoy LN:1382 M5:545aae1204533fcf75e6c622471d3061 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001102v1_decoy LN:1376 M5:a69102cf73d82bc4298048ee7eb0aa85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001103v1_decoy LN:1375 M5:61f67b4a0c7573bf583ae5a051e7aaf3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001104v1_decoy LN:1371 M5:4b33e5f1a51a79cdc62fd070cf874f91 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001105v1_decoy LN:1367 M5:4286f9ebcff872815a9246b3a2596781 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001106v1_decoy LN:1364 M5:9a3f9b88cf1926d9c75b673647ff46c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001107v1_decoy LN:1356 M5:b54b34217f1c3efb1ba9d4477a0f2045 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001108v1_decoy LN:1355 M5:c49fb7670582bf2f81413071056f61ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001109v1_decoy LN:1352 M5:32abeff50bcab272795c72f7b7edd46e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001110v1_decoy LN:1350 M5:9660451ad55da2148a00b49a126176d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001111v1_decoy LN:1346 M5:c6722a471b0e8cb1384d59ff72cc732a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001112v1_decoy LN:1345 M5:6ffb665540f55661d5ccf40795cebd35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001113v1_decoy LN:1340 M5:e0ba11f5404075a40b0072d19c2bced2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001114v1_decoy LN:1330 M5:ccb7f39ff649bf360b5b4186cf18c01f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001115v1_decoy LN:1329 M5:c52f3a9196ca3b03d2a02680f15419e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001116v1_decoy LN:1324 M5:f07d0c07c8951023331599b2df20380d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001117v1_decoy LN:1316 M5:8195f619c45e8d571a25264aa6e7a65c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001118v1_decoy LN:1307 M5:49f9986c45cac526b89e5520a9baa4dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001119v1_decoy LN:1304 M5:fdbf4160ba84788b20bd855b64cea30f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001120v1_decoy LN:1304 M5:edc34fe61ae9a3b15bc5a4ad8d291271 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001121v1_decoy LN:1303 M5:6aea0ad92108bcebca7f7886b75bf9b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001122v1_decoy LN:1301 M5:ccf0d28aa2b30e1d8e7ef2eafe01e849 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001123v1_decoy LN:1300 M5:8bce51ab0470cf3f210d3b25582c2297 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001124v1_decoy LN:1297 M5:01e9ba63de5b8b6e1a07efb0b1179f20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001125v1_decoy LN:1296 M5:dd2148d2b631c1a7e61a18155b56698f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001126v1_decoy LN:1290 M5:9e7639e4c222198ef6503cc2e1c7577d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001127v1_decoy LN:1284 M5:1ed6768a3d0449e96d3939d08102f424 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001128v1_decoy LN:1282 M5:a8d94de0900b31bf20f7c16fa5eb29c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001129v1_decoy LN:1281 M5:30eded62211ca354db518348aab06f6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001130v1_decoy LN:1280 M5:35b60389b57134465f6d190d5955cf46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001131v1_decoy LN:1279 M5:448c65a5e874d8959bde564141823daa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001132v1_decoy LN:1272 M5:aeacf07664f294565febc34b1f8f640b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001133v1_decoy LN:1267 M5:df7730fbbc24afefb2749741f708f001 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001134v1_decoy LN:1267 M5:eb717a13171c7390c1c2e91a50473c32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001135v1_decoy LN:1266 M5:76896544c6b4b9c8bc2be23ce31fbe4f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001136v1_decoy LN:1264 M5:f3195b89752559a8a693e50e17a9d0c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001137v1_decoy LN:1264 M5:73ff474a35189bec700ddd7f25a140a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001138v1_decoy LN:1264 M5:b090d99b3c28f2a84a801018d5843220 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001139v1_decoy LN:1263 M5:a0baed3aa07a676a4fded91fd8edca4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001140v1_decoy LN:1249 M5:0e81abee1c989a0f1ceebfa48b5eacee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001141v1_decoy LN:1240 M5:ddced69f19f82a08186fb39c0354eff3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001142v1_decoy LN:1239 M5:43ea2140da380099332cf0cb0490293d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001143v1_decoy LN:1235 M5:fe6e8b59583fb141e7b203df304e688e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001144v1_decoy LN:1235 M5:7051b4e9e0386119d27af1cbe5a2c633 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001145v1_decoy LN:1233 M5:703871732eddddd1c5ade422c3a7e105 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001146v1_decoy LN:1232 M5:a281258df9fd861e7ca6bdb869fd27d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001147v1_decoy LN:1230 M5:d0939ee2b936624fd9dc5f0bb2a0cff5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001148v1_decoy LN:1226 M5:21f414046e47b5e9c13d47b9b073c6cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001149v1_decoy LN:1223 M5:6e73b42728119fe2041f6c920248ed9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001150v1_decoy LN:1214 M5:44865e67b99f28cb3bf0d5d89d259a99 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001151v1_decoy LN:1213 M5:062e3bbeb41213d0e68f944e1911f058 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001152v1_decoy LN:1211 M5:75ee5d3d8230d6db22a735709fd78e40 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001153v1_decoy LN:1209 M5:8ea8e29581777bdb7e7e2435b43a9123 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001154v1_decoy LN:1202 M5:5e4321979f4ad7f0e0630deaf3292360 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001155v1_decoy LN:1199 M5:de05fbc3c15237ca2c8d5c37f3f66dad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001156v1_decoy LN:1197 M5:81532092e3b56c94488f88b7b40525f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001157v1_decoy LN:1193 M5:ebc3be993ac1b9ab8acddc283066d160 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001158v1_decoy LN:1191 M5:9bb2ea3006a7f808a16cf62efac3d39c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001159v1_decoy LN:1187 M5:c5586dfb4606cba7d04c9bdb9b970ca3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001160v1_decoy LN:1186 M5:8ac59cbe50a76ddb4315fa75de02a202 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001161v1_decoy LN:1184 M5:1acac09b845dc4ff431c33916e819c87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001162v1_decoy LN:1184 M5:b3d7d809b498912a66c53542f6164aa9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001163v1_decoy LN:1182 M5:a06ad4e450a32bf31e43fa9794e6c635 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001164v1_decoy LN:1179 M5:2fa76b3fa2caedda0d3aa46b0071fd03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001165v1_decoy LN:1173 M5:ba3aca12cb0c76e77a2ab28a3366cc21 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001166v1_decoy LN:1169 M5:7eaa353b323f8eadf6cafe90fce641bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001167v1_decoy LN:1167 M5:61d674b4fcb995535cf94aa7ee127946 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001168v1_decoy LN:1166 M5:38aa98ae17ee349012bee80c9828adfe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001169v1_decoy LN:1165 M5:bbd8f8056d59712fd77f6bbaddca57b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001170v1_decoy LN:1164 M5:807bdf141f9ae4103c56e43d949f531e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001171v1_decoy LN:1163 M5:cd8efaef0aa61647e740aa2b0e22ecd4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001172v1_decoy LN:1158 M5:3e53721e66305f3f2b4da98d998268d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001173v1_decoy LN:1158 M5:8ba71ae4bcbf61a48eabeee68296f62e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001174v1_decoy LN:1157 M5:b99ae11f6934e857cb9399ae6c41824f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001175v1_decoy LN:1157 M5:bbc9020c1846bb053b237d5b0478531d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001176v1_decoy LN:1157 M5:52700c360bd82baf97d7bc5fd70a9825 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001177v1_decoy LN:1155 M5:8e366717b85c08e01d0acc612724c6b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001178v1_decoy LN:1154 M5:53cfcde178b82cf94450e6ecc610ef24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001179v1_decoy LN:1149 M5:857f173eae9d86a6ed33b462c9607c5e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001180v1_decoy LN:1148 M5:ea231418525b44371f390a8a2a11af78 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001181v1_decoy LN:1148 M5:5a71efd43a930d44ebcb3574bb9cc031 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001182v1_decoy LN:1146 M5:c8f128dd7893d4ec3036e468d8bd6522 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001183v1_decoy LN:1144 M5:3cc0de0dd79e700a3369cf024230bc41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001184v1_decoy LN:1140 M5:fe4503df1d12b851a419140fa4b4173f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001185v1_decoy LN:1136 M5:224b91af2e2925de5d844cccabcf05ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001186v1_decoy LN:1134 M5:cfbd851609b789f2899a3be61d9127c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001187v1_decoy LN:1133 M5:463b232f53f888f5d3bf049f131ebba1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001188v1_decoy LN:1129 M5:1e9b1998943db973b5af6f8d3f8cc934 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001189v1_decoy LN:1127 M5:e780622b257020939988b4785d91218a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001190v1_decoy LN:1127 M5:7efc9fb11679f19ad35fe9371a9dbb1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001191v1_decoy LN:1118 M5:911cf50162dfce9f1bec2ae5f5ffcd74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001192v1_decoy LN:1110 M5:e8f80a36c02331c337e0b327ff8faf9f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001193v1_decoy LN:1104 M5:807ca6abca6229d97d8e363a0d01228f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001194v1_decoy LN:1104 M5:0f010a7025fef93df6efa5c5bf5a0f20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001195v1_decoy LN:1101 M5:1c2dc8ff99f4cc1ff11ad3d16b9f272a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001196v1_decoy LN:1098 M5:cb8ee97689963848f0ab08fab52ac3a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001197v1_decoy LN:1096 M5:0724eae831018e8ab18798c02eaa4f1a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001198v1_decoy LN:1094 M5:fefb3d4308c57ce507d9c50c88eaae9f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001199v1_decoy LN:1091 M5:a86fb31cc351320639079ba611824352 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001200v1_decoy LN:1089 M5:b75ffa24b8714c207a1d8de82e0812f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001201v1_decoy LN:1086 M5:0fcd8b558e0ab2ccf0b0d8bc3db23d07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001202v1_decoy LN:1085 M5:9e3b81bef0ba768284fd5cdc7b7ccf13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001203v1_decoy LN:1084 M5:35268d23224ae41608aa13bd7fdc7fdd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001204v1_decoy LN:1083 M5:a74077cc79c0fe324530f49b263b3307 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001205v1_decoy LN:1083 M5:cc88bb09f7a6ad37d5d5bf95400fc329 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001206v1_decoy LN:1079 M5:35f5a907b81ef8dbf77ec725790583dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001207v1_decoy LN:1076 M5:de787959b71e3c620c8ef7e41f6bf5b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001208v1_decoy LN:1069 M5:062313b0d5e67fee9d60100c7938397d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001209v1_decoy LN:1068 M5:93480c74c7540c0e7af8c2576e2b9dac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001210v1_decoy LN:1067 M5:8f8b744585f712f3e0f83707464cf886 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001211v1_decoy LN:1067 M5:929d9dd00e1ad8454c70511ea362a4e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001212v1_decoy LN:1067 M5:24aa3c508b845b2b1048334ce78332c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001213v1_decoy LN:1063 M5:29f3cd44f918aff7d3164e28bfddb98c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001214v1_decoy LN:1062 M5:12f432068dd357613e770c93cafe0452 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001215v1_decoy LN:1059 M5:47cb3f694ffe2d6ce654ed3b6cb5e3f7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001216v1_decoy LN:1058 M5:f49ebea87cb9479f2d50f484c3217850 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001217v1_decoy LN:1058 M5:4828d8055dbb4bfe4f703bb55a2ba1f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001218v1_decoy LN:1055 M5:6feebb18b6b36dd7c31078b901101e23 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001219v1_decoy LN:1054 M5:bbd43557ef56c3c1b056aa213470e130 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001220v1_decoy LN:1054 M5:135c9383230d02f4fa50cd9ef42c51d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001221v1_decoy LN:1053 M5:bf3402855155585fef154c6f26c2f42f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001222v1_decoy LN:1053 M5:55f5597ffafbca066600c886b78932ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001223v1_decoy LN:1052 M5:777b4dde14fe0e0c5aff39ba12f25d7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001224v1_decoy LN:1051 M5:f46bdaf70049d1b5dcdcf4d9bb8bb616 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001225v1_decoy LN:1049 M5:a1ecf64987c3a271019ca2bcf6dfb797 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001226v1_decoy LN:1047 M5:c2548a36b128c6216d1689299d9bc6e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001227v1_decoy LN:1044 M5:57aaa99e04236628ee2e2c48688a28e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001228v1_decoy LN:1043 M5:8ab15ca1a985afa87ec7a9cf048505ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001229v1_decoy LN:1043 M5:ad851f750b29642813387f1b00a09791 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001230v1_decoy LN:1042 M5:794f6bbb5ddfaa81ad10c9f97e460d93 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001231v1_decoy LN:1042 M5:a88fd0ab44445757ce49b2886b3483dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001232v1_decoy LN:1041 M5:16cfe1e6b786b55e14e1c23b0010abd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001233v1_decoy LN:1040 M5:03f3627a2f7242721c8ba740808d67d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001234v1_decoy LN:1039 M5:2bd140282d454fa86b3d845400c68456 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001235v1_decoy LN:1038 M5:44928251b94a7ba7b6d78cfdc7b74903 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001236v1_decoy LN:1037 M5:0021932312a252327115aef207a22260 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001237v1_decoy LN:1037 M5:7ff32784d45f4a2b9d90d895152d8586 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001238v1_decoy LN:1035 M5:cafb9e327ae844419f531cc74ad34c2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001239v1_decoy LN:1027 M5:87b6d1b7895e0e98849ddb847f85e535 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001240v1_decoy LN:1021 M5:9f34ec8f23890b5c5ec129f3aa55fb28 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001241v1_decoy LN:1021 M5:52f88af4a5a6b8a7171df7143c99cec1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001242v1_decoy LN:1019 M5:093ab05e7ea2f698daf568af4a5f9314 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001243v1_decoy LN:1019 M5:322f96479243e771eb980526832e662f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001244v1_decoy LN:1016 M5:cf6212ddc0a137e657fec0764722dcad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001245v1_decoy LN:1014 M5:21eab5ad8f971f8753d0aee1004c1335 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001246v1_decoy LN:1013 M5:3c7ad60ac9394211fb081912b61e0f03 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001247v1_decoy LN:1009 M5:09f86dc178eeb4ecffafd9734a2afd5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001248v1_decoy LN:1008 M5:43929eb34efd2bbaf9f730d06a1e4799 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001249v1_decoy LN:1007 M5:494ad809a7d99f4147c2398821be92a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001250v1_decoy LN:1004 M5:589a72200353f7537edc3a9acccfe913 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001251v1_decoy LN:1004 M5:183d62e7208aff9604bbbf27702052f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001252v1_decoy LN:1003 M5:8f62a1d759dfd3a68b63b88c50e5fa85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001253v1_decoy LN:1001 M5:0bae6492e6a77abd67b50475fa94a80d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001254v1_decoy LN:1000 M5:6c3e8a079341eb05dd337a0413754070 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001255v1_decoy LN:1000 M5:39444bfd408b4e184afe6e0476041965 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001256v1_decoy LN:1000 M5:44d266b549830722a7a161606171afd9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001257v1_decoy LN:17929 M5:329d6c2a67aaff331fd020d0c9627310 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001258v1_decoy LN:9749 M5:446c5fb7d2e7af681df8773fae61fb27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001259v1_decoy LN:8053 M5:83998e69640a5925a4a86054bce5f2ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001260v1_decoy LN:7826 M5:30c34924be761a9b459c27c08f1f85e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001261v1_decoy LN:7768 M5:32d54ea636150f497c9484a714b37b8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001262v1_decoy LN:5691 M5:ed6cb5bb44a3cfa13f40e14e70bd5fda AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001263v1_decoy LN:5444 M5:40da5cd1840a6368532eaf7e9e4dbe8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001264v1_decoy LN:5077 M5:ea25764cf81ce3030520b86de80c9758 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001265v1_decoy LN:4990 M5:be003e2c8206a15f2159483f284c898a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001266v1_decoy LN:4545 M5:f2f37f70dde8161d632cee33ff5ba435 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001267v1_decoy LN:4544 M5:2b0987b0fb64b16ed454eaff1b74be84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001268v1_decoy LN:4202 M5:78643a9f481cc635295ad076fe1e82bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001269v1_decoy LN:4195 M5:eb3537b9b9d637c74f1d3b43e5fd06c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001270v1_decoy LN:3807 M5:dc3d4eca4636d838ee52fe920bbffbfe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001271v1_decoy LN:3741 M5:dc2e137e3cac9a5093030c34fa68c2ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001272v1_decoy LN:3699 M5:db44a6f6dcd56edde16009cdfc186ccb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001273v1_decoy LN:3640 M5:5bda6902f082f2b4a6823836d5d0b48c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001274v1_decoy LN:3531 M5:2740aeab0828fa2d4f2789d353a40b8c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001275v1_decoy LN:3455 M5:03cdb0fa6bc0f56dc7266334229fca85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001276v1_decoy LN:3411 M5:2127857d57a589d739a30316547e9447 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001277v1_decoy LN:3387 M5:6b2e8c2f953822e034c233e94c710473 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001278v1_decoy LN:3358 M5:61be95906f76f332c029bcaaca590c79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001279v1_decoy LN:3285 M5:3c9976ca87f24507e195746c96cd0b4f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001280v1_decoy LN:3273 M5:8e25e50d38f8fb4cbe34cb3c83f14fc5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001281v1_decoy LN:3262 M5:c1e6634aa95f817084fc1e1eced2abad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001282v1_decoy LN:3259 M5:eded84ead1eb3b92edb6b77f27f8c4f6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001283v1_decoy LN:3222 M5:08c79b1d017ddd4136c42b4cb8c16e5c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001284v1_decoy LN:3127 M5:78f9666a13abcf03877f434199528e58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001285v1_decoy LN:3110 M5:19e028e80d77e35d088ea23eb52c9f68 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001286v1_decoy LN:3104 M5:7f7ac2759ee408d0324f4841b60eb208 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001287v1_decoy LN:3071 M5:cea9d8679bb3eacfb8b04f6ebbf1d4da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001288v1_decoy LN:3063 M5:52b2d8ce5acdb6c47cd5cf7924b1bc24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001289v1_decoy LN:3059 M5:8f356c7dd57f009b249e5147f708ff1a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001290v1_decoy LN:2990 M5:5ef88696d7bd42f40685d222c13e3750 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001291v1_decoy LN:2986 M5:5e39db2cc6d246fa9083dae9ffacda96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001292v1_decoy LN:2928 M5:09a5226cdb11c4ba418a8bdf844de126 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001293v1_decoy LN:2922 M5:0b5455a2f20844d83c853abef966cffa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001294v1_decoy LN:2875 M5:82e9fdbdba365f9449c25c473beabbcd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001295v1_decoy LN:2859 M5:f0957c602b216d5ed18be6c38733aaf1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001296v1_decoy LN:2850 M5:183158b1e867bb90712701171e344b1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001297v1_decoy LN:2813 M5:cad265dba180a6379fe3ff72f3874c51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001298v1_decoy LN:2785 M5:b2dea38e300ff000f19f2ed7c17637ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001299v1_decoy LN:2736 M5:75d2dcbfc2388d15030e0f3414952222 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001300v1_decoy LN:2688 M5:0a109d9d73d2f16494f280419a294b45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001301v1_decoy LN:2658 M5:3d83558c586ec81407c8717d1bcf07f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001302v1_decoy LN:2643 M5:c91faf6dba1b10dadf69cfb999d96386 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001303v1_decoy LN:2618 M5:10b7e187737a04307d41acec7960dffe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001304v1_decoy LN:2605 M5:3385ffd5cef2e207dd33adbc369436c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001305v1_decoy LN:2583 M5:4906d3167051868d21d54e95faccf81d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001306v1_decoy LN:2534 M5:b315ca81b05ca7fa9b615787a3b18066 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001307v1_decoy LN:2512 M5:fa1111a29692e4566683516ee2cb9829 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001308v1_decoy LN:2500 M5:51a81bda9467ea2f1691f1136a69d3a7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001309v1_decoy LN:2481 M5:66e34aaf92c2486bd4c11db6543995e6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001310v1_decoy LN:2478 M5:c4ac4ca4a4312da763c265a008380d31 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001311v1_decoy LN:2473 M5:464b136e01802236f8fcd38d3f548eb8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001312v1_decoy LN:2467 M5:b4c84cee8bcb72c5b5260d702510937f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001313v1_decoy LN:2442 M5:9d63b837b16220bf689f455bdc1d96c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001314v1_decoy LN:2430 M5:56acbbe636fd49946581fc122c6688d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001315v1_decoy LN:2417 M5:8082a8e6410572af77ebb845f8c1df94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001316v1_decoy LN:2408 M5:9a55c9ad04d332fd58a9914422f7d836 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001317v1_decoy LN:2395 M5:c6c6115fb6941b48dc5a0abc409f5eac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001318v1_decoy LN:2352 M5:755f704f0ecbfcbbfd31d8f375c83c5b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001319v1_decoy LN:2337 M5:666a5906da91f80774c953543fb9c2c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001320v1_decoy LN:2322 M5:0f19d9949679348751b92e237ed27888 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001321v1_decoy LN:2307 M5:439c6600d966bee934ed52a2139c4687 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001322v1_decoy LN:2306 M5:27db03ab4ca9e14af33b697876aaa754 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001323v1_decoy LN:2292 M5:5fe69547ba8f4b03aaa8e71c2608fe14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001324v1_decoy LN:2271 M5:69ed4113a87f0c964d9f7515adb0dfeb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001325v1_decoy LN:2265 M5:78e3664d88395ed413c3de96d0b6aa0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001326v1_decoy LN:2260 M5:ccac0591cbfd65e9a8d51f8e05d34f2a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001327v1_decoy LN:2240 M5:bc9efb2dbf8706ae63a9da56f74a5940 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001328v1_decoy LN:2238 M5:a0265d5b1e9532d8f124c363fe675206 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001329v1_decoy LN:2228 M5:422f2cb811b961c3513bb155a4a0fed0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001330v1_decoy LN:2215 M5:0d7e0facbdb02ac5cbe36bcb3f1683a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001331v1_decoy LN:2205 M5:8aeb5e1e49ad042e60fd97cbe3bd36b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001332v1_decoy LN:2191 M5:bc35b989cffe895e99e6a2fc45b7f65e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001333v1_decoy LN:2191 M5:b1ccfad8f6bde8d9d40c0b7199e30cc5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001334v1_decoy LN:2190 M5:0ae32cfb78573ddb9929745e2e7a0313 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001335v1_decoy LN:2184 M5:08a18a9ad801c228f5de34b35b58ce5f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001336v1_decoy LN:2166 M5:95badad6f81c843868ebb07d1f2d7911 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001337v1_decoy LN:2165 M5:e10a87e41dccb3ec25e99df332d5a560 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001338v1_decoy LN:2162 M5:7973da1851b09e72b47bf83450c468dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001339v1_decoy LN:2146 M5:e8939fd820d746a8792b356c04e54cce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001340v1_decoy LN:2116 M5:b67c09bdf1ed2f6a0ddd972711b36104 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001341v1_decoy LN:2112 M5:90340b9fb118df304042bb73e83ec202 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001342v1_decoy LN:2108 M5:465277293cdb0bf1897d5a17e266d354 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001343v1_decoy LN:2106 M5:ddc350523aba6f1c4b90f820904cd233 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001344v1_decoy LN:2106 M5:8c726624d2d1347ec079d4a89d25759e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001345v1_decoy LN:2106 M5:4b1887bbf69131a205c5cc1a4303c860 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001346v1_decoy LN:2097 M5:6dc99a12532b35dedef60dc2cfae35b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001347v1_decoy LN:2081 M5:12316554f4811e33853508ac262465d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001348v1_decoy LN:2058 M5:b1935843fbea95bed6588d9d700d9936 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001349v1_decoy LN:2055 M5:b013f57c784235eb32f6871dd01e5e13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001350v1_decoy LN:2054 M5:c6835412045762a4c54200ada23f30b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001351v1_decoy LN:2037 M5:50c1358c2b24fd59d5a286bbaa57818b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001352v1_decoy LN:2032 M5:45ee3ea9d4de3859645f9b51f0ca2c67 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001353v1_decoy LN:2032 M5:924e5cc3295232068cf32022f5f7e779 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001354v1_decoy LN:2020 M5:70660abb35fad19ab75c06b301d4163a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001355v1_decoy LN:2018 M5:9126be7c6d2612a65885a2fec496e2a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001356v1_decoy LN:2014 M5:847a7ff01c6682c63ad35fae4dd6f947 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001357v1_decoy LN:2001 M5:71668bc6a710ff919fd32549ee63f1f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001358v1_decoy LN:2001 M5:3288f97535eb71395eaf3b088578bc3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001359v1_decoy LN:1991 M5:b29d731dd150421c4e201d1adc92bd3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001360v1_decoy LN:1990 M5:7e91b8bc1cf2c754f8af12a28921575f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001361v1_decoy LN:1983 M5:71f21061b64aff6e62b116e9384a099a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001362v1_decoy LN:1981 M5:87dba9523601c5cfc29630be31297114 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001363v1_decoy LN:1981 M5:2a3b4956ecd118211708b9d7c428818f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001364v1_decoy LN:1979 M5:eb8501b5022cd696a32a2bff2acbbb3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001365v1_decoy LN:1963 M5:87a0635cbf78d7359208e0d29a3b9596 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001366v1_decoy LN:1932 M5:42a66b3579061c6333cfeec8e7bc7b0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001367v1_decoy LN:1929 M5:95db3317d465876b900ca9167ec31b73 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001368v1_decoy LN:1881 M5:31fb7324b8669148c367ef667ff3c928 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001369v1_decoy LN:1874 M5:bb9c6a2d6ec56835ea520c45a854e8eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001370v1_decoy LN:1849 M5:8f83bc8528784a67dd64f10d89331d81 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001371v1_decoy LN:1849 M5:aadeed33b6077b0febbd1f61c186805c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001372v1_decoy LN:1833 M5:155c69774a39a66871981c66bb0f0535 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001373v1_decoy LN:1832 M5:2677f37d4424e092deaaf6c2371defb9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001374v1_decoy LN:1826 M5:4dbca21467f25692d20f062b08c3238d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001375v1_decoy LN:1814 M5:208039e11c53bf03a11d83b417fe5920 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001376v1_decoy LN:1814 M5:8ef785587310c1f2d2226b740e7e4553 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001377v1_decoy LN:1791 M5:ab8270aa2cc7626669c77a954b338953 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001378v1_decoy LN:1789 M5:3ac762e7071f807dda31f5513d9624cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001379v1_decoy LN:1786 M5:9149be02831b6a76a57da93d45460920 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001380v1_decoy LN:1778 M5:a17c5b0d2e1771a62091b6705cfbf5a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001381v1_decoy LN:1776 M5:2ebb9adddc8d21f56ed91c6fbc97cfe1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001382v1_decoy LN:1762 M5:686009ce9e6490069ba0845173cf2c16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001383v1_decoy LN:1758 M5:34dc7958ca4e0be1690c80cce1f048de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001384v1_decoy LN:1757 M5:af98ed1ffd7c4a0166ed1d3bb789d039 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001385v1_decoy LN:1754 M5:80b9896356b85bbe70c7ed49afb616a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001386v1_decoy LN:1752 M5:a7c233ed3f050d44d75a9138231b5384 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001387v1_decoy LN:1751 M5:6e2fe9e7a9951deedb4a39fd837721a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001388v1_decoy LN:1749 M5:5d5cf3896254f422f70ace465b0f820d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001389v1_decoy LN:1738 M5:f8265cae7fb03630effc0fede6811b3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001390v1_decoy LN:1729 M5:48fe4b417655ad69a29770ec6e412fdb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001391v1_decoy LN:1726 M5:01bbe99249b489660daa17fa9f958d10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001392v1_decoy LN:1716 M5:bd9a3ab49b9960e88c2490efe5d8c749 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001393v1_decoy LN:1712 M5:f05c2bfa07a617b06e6a8ebc4efc5022 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001394v1_decoy LN:1711 M5:0f06abd7c321228fa763fb3815140af5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001395v1_decoy LN:1703 M5:09b91ffc2209fd9adc0e0fbac86de4bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001396v1_decoy LN:1702 M5:ff652624b7319ee60f8946d8f751cf16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001397v1_decoy LN:1699 M5:2a71713d93ad2a6a8edc736ddc02907d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001398v1_decoy LN:1686 M5:3bfbf7d5273c5ec692b1907c7c3ff2d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001399v1_decoy LN:1684 M5:6d040733a43c01650e5c098e00d46a62 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001400v1_decoy LN:1680 M5:c353280f0d833806daec83385e95e393 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001401v1_decoy LN:1678 M5:c2edb1379f817a8378d4eb089dcdfc0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001402v1_decoy LN:1678 M5:740b37d2e6785fc699776f93cc872e86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001403v1_decoy LN:1677 M5:6d4b39914847504188d3b9feaf3348fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001404v1_decoy LN:1676 M5:31845da6d4ed6000f50d5122bdef15cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001405v1_decoy LN:1672 M5:0630c8622e65da828a153d66ab29b298 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001406v1_decoy LN:1669 M5:e7d237d72fb65c19aac7bcaca3d86d95 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001407v1_decoy LN:1668 M5:86c9c0f792de2f54f69278df5e3246cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001408v1_decoy LN:1663 M5:481fc7b87114d19302cdde760018a39c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001409v1_decoy LN:1660 M5:ca249c982b9bc0cae8d02ae5a7e497cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001410v1_decoy LN:1660 M5:9a4adc64cf2fd32db34af21df269bfe0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001411v1_decoy LN:1658 M5:9e0ca112ba9edd83dd02ee0a1b977682 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001412v1_decoy LN:1656 M5:30ba767a8335a19ffbb875f109afcac3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001413v1_decoy LN:1656 M5:e77633b957a375847ad25f9b01d08580 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001414v1_decoy LN:1652 M5:33a7cad76ee390036b7d61b167e2b351 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001415v1_decoy LN:1647 M5:904ad5deeeb540a10728c9fabf9e5909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001416v1_decoy LN:1645 M5:378193508f34a25cf912974a4c531bb2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001417v1_decoy LN:1641 M5:fe667f1d920a30b730d27903d4de3610 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001418v1_decoy LN:1638 M5:dd1f1f8b342e987caf5e43ffa4b193ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001419v1_decoy LN:1633 M5:775a347b6935f9e170d809222897833a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001420v1_decoy LN:1626 M5:44b1b569182bce231346586fe77f0651 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001421v1_decoy LN:1614 M5:04a70773f36888dde7766a58c3a92de1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001422v1_decoy LN:1612 M5:0f0f7a8906ae3367b908acc806579e87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001423v1_decoy LN:1605 M5:345b541ac9d588f32be39d15d00f6305 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001424v1_decoy LN:1603 M5:dd25e42a5806fade892f5be6c5517133 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001425v1_decoy LN:1599 M5:42c61caf5957d89e892870d7abb0086a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001426v1_decoy LN:1589 M5:ff1c151f692dba0e79005392390f2639 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001427v1_decoy LN:1588 M5:d409b0b1699f38489ac9b78c9e547b12 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001428v1_decoy LN:1585 M5:549a7c1ad8b79d31a311204a8ce078c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001429v1_decoy LN:1584 M5:21ac82f5d3944ac17a667861fe4eb50c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001430v1_decoy LN:1584 M5:d717e9b20496c0e3cf6f096572904e94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001431v1_decoy LN:1580 M5:4cef86e6f0c85a15667ecccf0ec2e509 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001432v1_decoy LN:1572 M5:83a76ba3b28ab176a0fe0c3932129c1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001433v1_decoy LN:1570 M5:eefbc920c0c274a05ccd03672089bd6a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001434v1_decoy LN:1569 M5:e84f6544b2757c3d68e8333237c05b9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001435v1_decoy LN:1568 M5:085a737d9ac2ce5ad615c127373713e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001436v1_decoy LN:1567 M5:d0cc61096796d51c565e73784c3df91e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001437v1_decoy LN:1565 M5:963645d93472e0f55f70cf30e5541dcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001438v1_decoy LN:1559 M5:6cd647a043602392b10b564ef25b9bfa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001439v1_decoy LN:1559 M5:41e3d96f1e4d9a77d4314fb0c550ddc8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001440v1_decoy LN:1556 M5:f95112abd208efc5ebe4d5529e2537a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001441v1_decoy LN:1554 M5:ff55b1b730eb936e0ffca09b8fff9a89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001442v1_decoy LN:1549 M5:df38873f39fd89b3782d53eb4bd35345 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001443v1_decoy LN:1542 M5:66b6405dd4c7537d3119eeb1dfa81795 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001444v1_decoy LN:1541 M5:ce00bd7a73eab91b6d81729240662ea1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001445v1_decoy LN:1538 M5:96e6001e127eea7213d8378afb6f24d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001446v1_decoy LN:1537 M5:4a49340b952f5a6e1fbcfbe271cbee49 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001447v1_decoy LN:1535 M5:9d30511ff7644e5e501c629d82f97441 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001448v1_decoy LN:1530 M5:ed3d23f4c537a88a36a4a6964bf2d332 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001449v1_decoy LN:1528 M5:e2f85fa47e8361a098aacb0ddfe058e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001450v1_decoy LN:1522 M5:525443cf312658767f3ffb263b1ab40a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001451v1_decoy LN:1514 M5:d378e3b3268d04ee2ed255d9b671404b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001452v1_decoy LN:1509 M5:434a0e69d1dfb2f439fd8c4c6efee812 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001453v1_decoy LN:1507 M5:1c60f6588a6a6fdf49ba74bd4d8844ae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001454v1_decoy LN:1500 M5:4a8517743aa87c3edd4556e876facf8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001455v1_decoy LN:1499 M5:3787c00e3019dc0bd4b019ac8bd677e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001456v1_decoy LN:1499 M5:93e8bbddc43d5e902eaac3b1569c191d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001457v1_decoy LN:1497 M5:cedf6613fedd7bcfb6cf4822d6133393 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001458v1_decoy LN:1496 M5:c6421744963f5f5ef7d06349345f8c11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001459v1_decoy LN:1488 M5:c3d6f0be5c1768c3f4ab357b40330c07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001460v1_decoy LN:1486 M5:cfa272f94abe2b6ea6b8fff9bc2743a0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001461v1_decoy LN:1485 M5:73b05431178ff099c7143b2c3310a8d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001462v1_decoy LN:1481 M5:815cd718fd3524c82596f553bc50c030 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001463v1_decoy LN:1479 M5:3be54176b83f28ddb8402da62d8368c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001464v1_decoy LN:1472 M5:a3d5a1d61c0377010cab585d8f86782b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001465v1_decoy LN:1472 M5:54ed54ed3b16b9482b8bb7a42358e3f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001466v1_decoy LN:1470 M5:957a8cadb7ce3ea0f910acb49b0d28f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001467v1_decoy LN:1466 M5:5f1e18ba047f8e50f57be2e0ec9d7ee0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001468v1_decoy LN:1465 M5:1371b580bc13e98f593106d0c6cc7055 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001469v1_decoy LN:1461 M5:a1e27c8891fb421149591b6254008534 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001470v1_decoy LN:1458 M5:0a299df79227b0b8f9d01b64c1091040 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001471v1_decoy LN:1457 M5:fb81cfbfe3dcf83480d1566dbfb35cdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001472v1_decoy LN:1448 M5:5ccf4c226bbe31dec446e5f2cfb754aa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001473v1_decoy LN:1447 M5:d4e733a5240b77f6521178683ef92f11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001474v1_decoy LN:1444 M5:266aac36179cb1faca5c4a0102fc8ace AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001475v1_decoy LN:1443 M5:6153fa9f83b2dca77912302a435e6783 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001476v1_decoy LN:1443 M5:eadd62062090a328419de772556bec04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001477v1_decoy LN:1438 M5:808b663863cc7b8062a075d60a932ee0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001478v1_decoy LN:1432 M5:3d320a29f829d8b30da651831563b8fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001479v1_decoy LN:1430 M5:d406932c6d2e5cda5d40bd5282612ec8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001480v1_decoy LN:1430 M5:1b514b0604012b9c3bf96dc729d5b570 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001481v1_decoy LN:1429 M5:bba1c32000bf8515723b23e91e3d73d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001482v1_decoy LN:1429 M5:469a525eaccd114705d3876e6497d24c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001483v1_decoy LN:1429 M5:1cab4c8d35aa87cfadcc67327c0cde05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001484v1_decoy LN:1426 M5:7f0b3e31f88382eb1a9d667b4fa5ae8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001485v1_decoy LN:1426 M5:600029364a5faff2a6121c791c26f3b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001486v1_decoy LN:1420 M5:bd2635b8f37ae8d36555126a2efda82f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001487v1_decoy LN:1416 M5:1feda0b1dfda8eb29e804bb83d191350 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001488v1_decoy LN:1416 M5:381713228fbc436ef15eb3fc5ce95526 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001489v1_decoy LN:1415 M5:c7b5a3592ce2955180a8bf93340ce7a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001490v1_decoy LN:1415 M5:8a9071712ed09640282279375c1aab9e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001491v1_decoy LN:1414 M5:ad3849a6c284e0371da519c83c3efd56 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001492v1_decoy LN:1413 M5:1897ebbd3ccc3ed5dfd33e64df6cee2e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001493v1_decoy LN:1410 M5:bbae6ade32694ea4d23d50d382e589ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001494v1_decoy LN:1405 M5:60eac2719276e2c8aed1dd8879086460 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001495v1_decoy LN:1402 M5:560d0b9e5abc45feb134351a94cda358 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001496v1_decoy LN:1398 M5:c87eb09186b0ed776438697cefe49c34 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001497v1_decoy LN:1397 M5:17bdfaf46a6963ba97861fcb9ff9d4ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001498v1_decoy LN:1395 M5:14942812a5a15869999430aa17472a47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001499v1_decoy LN:1392 M5:14d8c0e42dbe62d45491f288a844c263 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001500v1_decoy LN:1388 M5:3535c9f286c4bc12e2fdab3ebd0e4cbd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001501v1_decoy LN:1386 M5:3ed31b85ef3e34d8e053031462c9cc64 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001502v1_decoy LN:1382 M5:370ef584d4cfe29bba430512c01c2d92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001503v1_decoy LN:1381 M5:0d6317f9e8c37b0d588aaf5c404621d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001504v1_decoy LN:1379 M5:15b371e04aee1e2cd7a2c3ad778615cd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001505v1_decoy LN:1376 M5:9e5d443eae0beb889e93d9fec1df500f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001506v1_decoy LN:1374 M5:19e75c42356ec21ffffd6ead1147246d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001507v1_decoy LN:1374 M5:d047841fe73e626cbad1d1a075cc1179 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001508v1_decoy LN:1373 M5:9af5c2bfca12c6e109d87d15a001f382 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001509v1_decoy LN:1373 M5:26c1cdc503f21321bdbbf7184681fd57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001510v1_decoy LN:1372 M5:c08f8502b7b9423df1c4988d25d4e1e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001511v1_decoy LN:1370 M5:51b5c0febc1d93a3ae056b562f29febe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001512v1_decoy LN:1367 M5:84cb97f5fa89889026682a6ddb4e17ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001513v1_decoy LN:1365 M5:9b35f302f4d7104621ee94c9466fcf05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001514v1_decoy LN:1364 M5:d26988a458e184ce67dfdf1494cce818 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001515v1_decoy LN:1361 M5:2be502a9c104f048b5faab19bf6b0c94 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001516v1_decoy LN:1361 M5:a66a14b66c130258ed0f9a2e60b977a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001517v1_decoy LN:1355 M5:f8520c48ea6b728718603ce85ba18832 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001518v1_decoy LN:1355 M5:d16784b4fc04cab4570de94e9753760e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001519v1_decoy LN:1354 M5:226153c1ffcb6ca5cb3a64d124c3b9fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001520v1_decoy LN:1353 M5:36898b58e8fec2ff86a3db37bffcfe2d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001521v1_decoy LN:1349 M5:919f3dc576e969ebb845489e155befd1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001522v1_decoy LN:1345 M5:e1f3dc21c137a83319e95d8cd641953b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001523v1_decoy LN:1344 M5:c7cc4c4587e7e5f69d3afcaca3f62ef6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001524v1_decoy LN:1343 M5:12b492bc7285ab647a13d8ac1efecc61 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001525v1_decoy LN:1338 M5:8d831cbc5a7d72f9a5c05360b502005d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001526v1_decoy LN:1338 M5:89ce2ba0c1414088ff5f502a0908059f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001527v1_decoy LN:1338 M5:ed5c2d0150ddb784f059ca25eb3b32c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001528v1_decoy LN:1336 M5:1dbe3107f4bae73b01853e98084f8f47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001529v1_decoy LN:1333 M5:1d1e9eb7e4182425f8718dc456a8e9bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001530v1_decoy LN:1333 M5:d77e50f1375e757aefd872040ee290b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001531v1_decoy LN:1332 M5:93546f6ce6b44646b5a2d20190054dcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001532v1_decoy LN:1324 M5:bcb215dd97bfb4682fe3d17f99605c5f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001533v1_decoy LN:1323 M5:0c68586edd47761d55b6a127af21b958 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001534v1_decoy LN:1323 M5:8290481e03f0efd3da641df90d6a09f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001535v1_decoy LN:1320 M5:06b5a586c070a38af486a0ae25dac08e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001536v1_decoy LN:1320 M5:aa7f4ccf5b8955783f201e89c6b8b61b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001537v1_decoy LN:1317 M5:5f5c4304240e41a75cdf79d590705a7b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001538v1_decoy LN:1316 M5:2b2e47e474a04b2c5d7538dee74a4520 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001539v1_decoy LN:1304 M5:70b1f3865cf28cf8c3cb6ca89e299e75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001540v1_decoy LN:1304 M5:801a2a35c0eb1ddde4f339fae91bdd02 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001541v1_decoy LN:1303 M5:0013745a3b7f3937b3f0d58b8fb8b96d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001542v1_decoy LN:1302 M5:2e708be5a88bc87556f10487d43af5f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001543v1_decoy LN:1301 M5:9b421120b8e61665a80c2202f9742b11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001544v1_decoy LN:1300 M5:7b6b985d4c9b335dde3369fc8ae75a4f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001545v1_decoy LN:1298 M5:c2c9f5a874990de1d53e53efca362cd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001546v1_decoy LN:1297 M5:8849c9f185b5ae8ed6d60d3b99c6591c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001547v1_decoy LN:1295 M5:134596128a40e4a4c8f40d310152fe2f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001548v1_decoy LN:1284 M5:c943fc593d7c12a3edad870f24db083c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001549v1_decoy LN:1283 M5:de6680db4756a0d685d2f2405be073be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001550v1_decoy LN:1283 M5:a86669f9a78babae5db999b036d712b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001551v1_decoy LN:1279 M5:48d3b7e152913253a1c7749be4542da0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001552v1_decoy LN:1278 M5:6f732db21b1679f66b34145d0d179a57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001553v1_decoy LN:1271 M5:18a0c55016d63414e1a7c9a868d2167b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001554v1_decoy LN:1271 M5:fbb66e8da3ee67360e823061c517c47b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001555v1_decoy LN:1268 M5:668bc50dfcee6830bfd6b8b193cf9aab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001556v1_decoy LN:1264 M5:512e1b52aa8bc91a79e98a21f48fd69a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001557v1_decoy LN:1263 M5:a280a5ddd14400e7a21e262dacba0878 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001558v1_decoy LN:1262 M5:074796c17da27a3ae23b3ab43837eff9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001559v1_decoy LN:1261 M5:f75ff3300dbd75160e935cd46e4511c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001560v1_decoy LN:1260 M5:67884b5403ffc61f67795ef0fcc3b616 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001561v1_decoy LN:1259 M5:778ef716a17f44127ce4648ca3d01437 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001562v1_decoy LN:1259 M5:79561487702e7f87d4c1babb97cbf910 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001563v1_decoy LN:1258 M5:05c2d3d1fe5c9569c6f982e7978b0d6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001564v1_decoy LN:1256 M5:443af4844c7fe05604fbf14d61807faf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001565v1_decoy LN:1253 M5:3ab1b0cbc9dfe5e1b97cc5bbee6ba5d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001566v1_decoy LN:1248 M5:6ca9712ce96adea0a2a178a885e6c403 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001567v1_decoy LN:1248 M5:a9815826b47ba4c29bb0b6f427c91f9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001568v1_decoy LN:1246 M5:847154b1d516e188b5d8b9b6932658a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001569v1_decoy LN:1246 M5:cc8ad8f95e7d72b075ce88fc9fd93560 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001570v1_decoy LN:1244 M5:3df737516c175d1baf5cb57874761a06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001571v1_decoy LN:1238 M5:350c62d6852c839c79bb94399823a7c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001572v1_decoy LN:1238 M5:cf4520e99994e5810535b8e92f1f4764 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001573v1_decoy LN:1236 M5:27e61fe700513169fa02b0a6b9224fb6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001574v1_decoy LN:1234 M5:6af09c7c1feeb50a156ab599d39314f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001575v1_decoy LN:1234 M5:1b1c2b7e28c781322697a77df6b717c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001576v1_decoy LN:1231 M5:24168a14a8a7b0626a75964a5ffa4c06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001577v1_decoy LN:1231 M5:7b5c30f4c44dc17f05a6022490a1b06b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001578v1_decoy LN:1230 M5:7dd3d8aa3ad6ae0467cbb5729a65b7fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001579v1_decoy LN:1230 M5:9838f95ca9d84335f580003e43e0e909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001580v1_decoy LN:1228 M5:40d2f9b81666f0aeaadf3b60d6f00326 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001581v1_decoy LN:1227 M5:b603baea2a6d239b5a0e0482be39ebae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001582v1_decoy LN:1222 M5:592ec40093cfd07fe7ae22531e7ff948 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001583v1_decoy LN:1222 M5:45d2796dafa85ef3ebb8d378ab5c4fe2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001584v1_decoy LN:1221 M5:7171fedcff845d9bf0eed62d8de65582 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001585v1_decoy LN:1221 M5:1919b7c47b361c4925ba7f89f672c639 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001586v1_decoy LN:1220 M5:9b6bee47fab2e16188e112fd219cb63b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001587v1_decoy LN:1218 M5:403153f244f25427f95b761c7e7643f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001588v1_decoy LN:1218 M5:4bdec42af039130bb647f35a1587442e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001589v1_decoy LN:1216 M5:5eb119c85dbdbac20fd9b54ca19e3bb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001590v1_decoy LN:1216 M5:30be84f72824c6a73cb46db0880fca34 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001591v1_decoy LN:1212 M5:a3990c8502d89fd44d2744a7c3b5ec27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001592v1_decoy LN:1210 M5:812ecd7a45c18a1ca8e07d380fa9c7fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001593v1_decoy LN:1209 M5:f3658490a61b9678c62147607e15dd39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001594v1_decoy LN:1208 M5:6ad7956bf60e17b114d96c186021ba22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001595v1_decoy LN:1208 M5:07b45f43574a98e35df01f1b02658afa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001596v1_decoy LN:1206 M5:7ad1a707f9ee83f188f836b84f0ee5de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001597v1_decoy LN:1205 M5:c5fe9e310df6cae87f2d597153392ce3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001598v1_decoy LN:1205 M5:3253a26afa899ec2cde4d0fe80a95557 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001599v1_decoy LN:1202 M5:7eba2ca9a5450bf7c6febae054f41555 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001600v1_decoy LN:1200 M5:00f180d0f4f2be5d3a79232ebf1f4150 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001601v1_decoy LN:1199 M5:06c81b1f3014d187114393c990dbb3d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001602v1_decoy LN:1198 M5:04ad661ad55cf80b26d65b537fa28426 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001603v1_decoy LN:1198 M5:10cec3a4b27c1a9e83dba32c764db1a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001604v1_decoy LN:1198 M5:ca938a555284768f7de4aa5bc45030af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001605v1_decoy LN:1195 M5:6352f3ee72fc500fb234cefdc58d230c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001606v1_decoy LN:1194 M5:7761a04b81c344864c4196c9fa348529 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001607v1_decoy LN:1191 M5:6f495eb0c24a06b146428c8e15145289 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001608v1_decoy LN:1189 M5:7cdef7e7fe5039c26f91054002844a08 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001609v1_decoy LN:1188 M5:8fb25530ab0d6cc405ed3820a00a19b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001610v1_decoy LN:1180 M5:baa36ab5e7d359dcf38de58e0578aa06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001611v1_decoy LN:1180 M5:fbf128a1dc1f9852e12d0f7cc819e220 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001612v1_decoy LN:1179 M5:cb72123adfc2996fb4f8c8023e656377 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001613v1_decoy LN:1172 M5:9a828a68ee9904074c07ecb9b4a66d85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001614v1_decoy LN:1168 M5:47f21c445bb5e0f2901a60313a4b54fe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001615v1_decoy LN:1166 M5:6640bdaa008c2b633f8732710aea42e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001616v1_decoy LN:1157 M5:548cacc169d84926fc794c75c8fe890a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001617v1_decoy LN:1156 M5:ed240ec48dfc49536a05c15b0cf84b32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001618v1_decoy LN:1156 M5:4cf17295af5ac519eeb5b60d65d8d630 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001619v1_decoy LN:1155 M5:7535ed3093386510b39164d7d8c0e75d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001620v1_decoy LN:1154 M5:942a2c1ebc2dcdc44aca71c7998704e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001621v1_decoy LN:1154 M5:172266936a16cb96c0fa51a30de2f617 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001622v1_decoy LN:1149 M5:904c6976a4151582f6e20888f8882b1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001623v1_decoy LN:1143 M5:e146ce9a62548893f8042eb31c9eb73a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001624v1_decoy LN:1143 M5:226937ae596ef9af068232903d42c1f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001625v1_decoy LN:1140 M5:9f8924f0407c98c271d938a89ce0651a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001626v1_decoy LN:1137 M5:e6dc97de94f6ebca61e2afaa11081a24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001627v1_decoy LN:1135 M5:ddc4671e6fc9af479ecc987b65228b89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001628v1_decoy LN:1135 M5:156395c17267dbc279afab948e04d7eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001629v1_decoy LN:1135 M5:b51c39a7e5a4d0f3a185dfe0405d28be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001630v1_decoy LN:1127 M5:eee6cec0d44e913c8909412bdc06fa14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001631v1_decoy LN:1127 M5:e614e251417f03894a86d226643c44b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001632v1_decoy LN:1126 M5:e3d6bcc05df478652842790b2163c80e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001633v1_decoy LN:1123 M5:62a0c3d0311f689e83c69aca70ff1d7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001634v1_decoy LN:1123 M5:4c25a0253e0d7c0aa032a2af4dc159a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001635v1_decoy LN:1123 M5:77f17c8bda201de22cb683529469d159 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001636v1_decoy LN:1122 M5:4716e9809cd6983cc872a801adcfcc46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001637v1_decoy LN:1122 M5:e854813fe411b829feb5122630115359 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001638v1_decoy LN:1121 M5:9ee360ada2996f37f05bc35f51af2274 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001639v1_decoy LN:1121 M5:e9eacf65a91b75a7484d73c0960d1f14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001640v1_decoy LN:1119 M5:115a5a8bf67d2676b18db1fa2cf1fb41 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001641v1_decoy LN:1119 M5:8c12171780de61fb413546e612810679 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001642v1_decoy LN:1119 M5:d36511233c4008330a6ea48f39a48c8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001643v1_decoy LN:1118 M5:49d64211fa0e9269ff0335c106fadf0a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001644v1_decoy LN:1115 M5:d3b2472895f28b7fa60956f7b18c525d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001645v1_decoy LN:1106 M5:14d31945977d0566bc15d63216affa59 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001646v1_decoy LN:1106 M5:954d5725f47430e77ac7a65db6252cb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001647v1_decoy LN:1104 M5:afc20c7775696bfe6b465aa9d8d5a2cb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001648v1_decoy LN:1102 M5:1a699dde289aa62b55f6ac11bb7947e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001649v1_decoy LN:1101 M5:97d8bdd4c01947f81c47b798baa7b71e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001650v1_decoy LN:1098 M5:81be16ab671a23dae662d52a90f53d45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001651v1_decoy LN:1098 M5:849d2fca45af7dd15c549778da256bd5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001652v1_decoy LN:1096 M5:85135079f59c18f32cab3330238996f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001653v1_decoy LN:1096 M5:eeee606c5ce1877c2c17f3c35cee97c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001654v1_decoy LN:1095 M5:a67b439018f9500bd22116207fa78bb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001655v1_decoy LN:1093 M5:45193d6dc28c575afe0a816a04981a13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001656v1_decoy LN:1090 M5:9e9a3deb3fbb62096e9267cf17b4538e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001657v1_decoy LN:1089 M5:2fcd006deec28bc7b3e2ed1c81f6bd69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001658v1_decoy LN:1087 M5:b5ff50152c9932bd5f5c8f6d8f085250 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001659v1_decoy LN:1087 M5:8dc8692a004984e174cae1a798c308ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001660v1_decoy LN:1085 M5:a26ef2777b049efc475e9f983166c858 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001661v1_decoy LN:1085 M5:1d1b538881461819bddec7da548477d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001662v1_decoy LN:1085 M5:a02c26203237d3ab0fdeec3b2226e415 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001663v1_decoy LN:1083 M5:97595ecd8251d05c23a9a1f24c4fc331 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001664v1_decoy LN:1080 M5:bb065f6218181f056b36deb6d5ea3fcf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001665v1_decoy LN:1080 M5:242177401fdbd05a55373745dd7678ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001666v1_decoy LN:1079 M5:aee38ae173783e327db2c83e4636269b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001667v1_decoy LN:1079 M5:eb281bc766d87e3e887aff0c1f473bb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001668v1_decoy LN:1079 M5:b15b982e045772eb4fae4cf61eff32f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001669v1_decoy LN:1075 M5:a0fe4aa8f27e7528a49b7fc241413bcd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001670v1_decoy LN:1074 M5:5a9ee12d6200281af569684e9eb6c44d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001671v1_decoy LN:1073 M5:58e3e1c01c24005c1bf6ecc4081328af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001672v1_decoy LN:1070 M5:6b4eaaed019b55c1445f856fa75748c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001673v1_decoy LN:1068 M5:962507e31477075a1ec295c7f3e4f370 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001674v1_decoy LN:1067 M5:246916ebbed387cdb53894261342b334 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001675v1_decoy LN:1066 M5:45ef97be51801b68eddaf9d903c6569e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001676v1_decoy LN:1066 M5:a1e2a77d7c51fc62c3f1261d96788416 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001677v1_decoy LN:1066 M5:a72df1625ec9a3676769041db2b5db74 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001678v1_decoy LN:1063 M5:63c3ca073be59c038fca2ce8cf57b58f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001679v1_decoy LN:1063 M5:3b4176334e519bf0fc0ea90b5c450256 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001680v1_decoy LN:1063 M5:e0c561be692e2103d216fec5f81a004f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001681v1_decoy LN:1062 M5:a87bd7c0b225c0db2cc82df0e92fd34d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001682v1_decoy LN:1058 M5:bd1fa296d60d2c1447479727889fd06d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001683v1_decoy LN:1056 M5:ec709ad9663274dc4b8d9c95637e6231 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001684v1_decoy LN:1052 M5:4c92b0e2cf0179f74e829358fdd4fd7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001685v1_decoy LN:1051 M5:d301a97b1b34b2cbcd690824430ef873 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001686v1_decoy LN:1051 M5:bbc47709fbd21b2776773a149cc0338a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001687v1_decoy LN:1050 M5:a01a1af5e1a2b7e924af29af696e561c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001688v1_decoy LN:1048 M5:71b188e0ec08d62bcf1e70c1ad5dece1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001689v1_decoy LN:1046 M5:6a0e08e5268e2e656a415ba75e6fd9bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001690v1_decoy LN:1046 M5:59e6b5101b057b8b61117d4e775da1a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001691v1_decoy LN:1045 M5:f09e7737756f026981c00c9f4e4a0fcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001692v1_decoy LN:1043 M5:90cc154008842d098dcd3bfcb288fad9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001693v1_decoy LN:1038 M5:760fd011482ffc7b2972fff26ede08ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001694v1_decoy LN:1036 M5:403a116827eda12cce96c83a442432ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001695v1_decoy LN:1035 M5:aa903a22959e0e71bf9b65e184c98664 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001696v1_decoy LN:1035 M5:c7b013db629c9e53bcc9e5ef6b45ea86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001697v1_decoy LN:1035 M5:b124dac1b39002796762805b01e70939 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001698v1_decoy LN:1033 M5:973b579d06cff1e48883e0c933a40ace AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001699v1_decoy LN:1032 M5:d91e5694037129aa77037d5c631b2c89 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001700v1_decoy LN:1031 M5:26f0a1a25d70795beec266b79ee9872a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001701v1_decoy LN:1026 M5:d895a2e531136b85f91cae9c41bac3eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001702v1_decoy LN:1026 M5:eeaed2987f143706ea90f593db2ee43c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001703v1_decoy LN:1026 M5:201ae22e581315eb83bf1b2a90a376ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001704v1_decoy LN:1023 M5:676723aca3cbe94f5e6fa6e3e677382e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001705v1_decoy LN:1022 M5:079f24ae7a37258e2dcd3e45c2a82dc0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001706v1_decoy LN:1020 M5:0c6c76de07c4a66f7b7c1625990fe97c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001707v1_decoy LN:1020 M5:23b7cef7e53c021320be37e395337a6b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001708v1_decoy LN:1020 M5:442bbaf4d63d7243f581f2a4f3c8713e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001709v1_decoy LN:1019 M5:ead84759fc3d0742886397aa847a8c43 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001710v1_decoy LN:1018 M5:30842e0e30b9626a2db87c8abee99c69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001711v1_decoy LN:1018 M5:85cd9b0b4ac27a135417acad1b49f347 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001712v1_decoy LN:1017 M5:cf02f8f140f6cabc6edaa85f110e6a45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001713v1_decoy LN:1015 M5:a1b077bd6e18faf0ce248051997e87b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001714v1_decoy LN:1015 M5:c108897419126d2b77335084625f756f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001715v1_decoy LN:1015 M5:887e1695f416731637dc46a35b2a9548 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001716v1_decoy LN:1014 M5:f4c888663c13ab55190b9228c5b46bb8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001717v1_decoy LN:1014 M5:be3c4d0d37c5c1c8c88889dede5ba4b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001718v1_decoy LN:1013 M5:2d3c3dfc692750b9b4c716debe8451a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001719v1_decoy LN:1013 M5:c1212f7ba1d00f6f6553fc075e858e42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001720v1_decoy LN:1013 M5:6e854869ecc63cf6e45e7f0fc6eeb9c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001721v1_decoy LN:1012 M5:05b1945756fa1adf0d4547bcd12f01ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001722v1_decoy LN:1011 M5:0ef4eb4aa59e9725d43ed27a2f67d8d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001723v1_decoy LN:1011 M5:b4080ef5ca76b971d7eea5438484ce22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001724v1_decoy LN:1009 M5:34953db0af28061b89bb32262121af7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001725v1_decoy LN:1008 M5:b05c20cc6394423a0e1aef1bac72d0b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001726v1_decoy LN:1008 M5:f2301601e3a88c6be9c38500a9d29685 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001727v1_decoy LN:1007 M5:2ff7ac77e3568eeb2e7772e932dfa819 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001728v1_decoy LN:1007 M5:04fd5dc748b4e7815316b0cccea3cba0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001729v1_decoy LN:1007 M5:957456ba0e3f879860817f3ae6bfca78 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001730v1_decoy LN:1006 M5:8381668c661d255ffbd7498d663acff2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001731v1_decoy LN:1005 M5:92a03e55b43fc40c9c010df225cc650c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001732v1_decoy LN:1003 M5:bc99a37cda9c755b77763c0873a3435d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001733v1_decoy LN:1001 M5:6a123c9c76f9d1c0a35ba3666f861ddd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001734v1_decoy LN:1000 M5:31048d43d8cae8a2c51fe5fcfbfa2462 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001735v1_decoy LN:19311 M5:110c68ef04650368b85e76c55d599fcb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001736v1_decoy LN:11713 M5:392799b68e6e2c6e288f07bc44a3a6b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001737v1_decoy LN:11263 M5:091c74a89bf6767adbc92c7cfd9ab6bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001738v1_decoy LN:9779 M5:fdbeb36b87e966517a30478e8fd55631 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001739v1_decoy LN:9568 M5:3562fa1ff9f4f23377f715895ecd504e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001740v1_decoy LN:9344 M5:7c7fa5c413301e5c71020ee588c0c1cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001741v1_decoy LN:9188 M5:ec88b5a808b4c20414719ba271b7b641 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001742v1_decoy LN:9100 M5:bad4d9e7865b7ef45b00609846739bda AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001743v1_decoy LN:8771 M5:56e67b8b7db6db977411d3485186a095 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001744v1_decoy LN:8690 M5:f01b9132254ca4074ba5ddc5b74c3d1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001745v1_decoy LN:8566 M5:d96c00c236c6c63764d62b50443c448a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001746v1_decoy LN:8058 M5:14979af859f72ff6efa1b0230cb0bbd9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001747v1_decoy LN:7759 M5:57af8f9f3fb38d3eb268e3d82b21e918 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001748v1_decoy LN:7585 M5:332f1fac3f4964c85f80b068cd91e49f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001749v1_decoy LN:7471 M5:a2a4f2f140a6703cfaa11c1a6ca07380 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001750v1_decoy LN:7461 M5:ec2b8f7282528afa2de49ece1a8d3daa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001751v1_decoy LN:7342 M5:328d2146da22838f30adcf361c5a9165 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001752v1_decoy LN:7223 M5:b0e8a99c193409a71f86d373159d576c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001753v1_decoy LN:7064 M5:3c4648b387bc44aaabddf795d6678ca1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001754v1_decoy LN:6916 M5:c57ae49f10014609feff4fe84c91b31c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001755v1_decoy LN:6897 M5:0bd737852eeaf5c723587cbbd74005d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001756v1_decoy LN:6880 M5:e3d30ef79c4983f0fb99ecf9ac1ca7fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001757v1_decoy LN:6857 M5:cfd001bcac96f459ceac7a135a59cb04 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001758v1_decoy LN:6840 M5:6757a710758275b58b95545211e06526 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001759v1_decoy LN:6728 M5:4d8b4b254f60864202e63aa9dba42086 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001760v1_decoy LN:6688 M5:9e056067d1281622858dfe9830f147f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001761v1_decoy LN:6553 M5:9182e4b1d32ec558a3bd3c94a5254ecc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001762v1_decoy LN:6396 M5:23b91febfc6ba054d109596479f66f8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001763v1_decoy LN:6345 M5:f038e6215610b387550c3b50dddd49a5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001764v1_decoy LN:6295 M5:d0f7f5b63499d6efd4d901a757b1cd7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001765v1_decoy LN:6266 M5:95b3fdc4315475b9c0408bc1f1f49202 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001766v1_decoy LN:6173 M5:4db332a6222e767873f0d9c5051b83f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001767v1_decoy LN:6171 M5:399db4ef3a58b54f82a07da4f0d264af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001768v1_decoy LN:6120 M5:399aa8c3cb106b5c685092b0de9313fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001769v1_decoy LN:6105 M5:4990624c065870871ce2bfff6bbd26e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001770v1_decoy LN:6099 M5:2e817dafcd97d49c6dfa1eef14a5e32e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001771v1_decoy LN:5893 M5:c8155a905ca8708a397ff91ea578e41f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001772v1_decoy LN:5829 M5:85146edd3b2fab18762262a7455e00c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001773v1_decoy LN:5793 M5:b72258377a1fd9ccb2a374de66066126 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001774v1_decoy LN:5776 M5:51cdb4aa5438f8b50fb21eb9c0959839 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001775v1_decoy LN:5759 M5:f30e892168c0f735365a13e51c8d0af3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001776v1_decoy LN:5716 M5:c03eea2b4a0bc45e1e7df084b89340ef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001777v1_decoy LN:5708 M5:5aba75f216a07e87387db64ea61a7c17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001778v1_decoy LN:5590 M5:09a93eafef7f433e1d2b0d7f3e4c2857 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001779v1_decoy LN:5566 M5:173109c0f5077facb133a124c11fe44f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001780v1_decoy LN:5558 M5:c7f1155230324ea1ff2ec21957290278 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001781v1_decoy LN:5418 M5:8de9a43d5de5e0bd3fbdc3a8ba79bb3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001782v1_decoy LN:5375 M5:2d96ecf69a27a8876ecd20073def54b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001783v1_decoy LN:5300 M5:07550b4953f67bec7ce4f4a04c493553 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001784v1_decoy LN:5255 M5:5c4536fdcf9b0c8f69b6c13e9c535eb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001785v1_decoy LN:5157 M5:af427140b151e2e892fc9a95aec694f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001786v1_decoy LN:5130 M5:254488c203afc62f6965ed57e0644916 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001787v1_decoy LN:4978 M5:a0d7d65d0e93baf75fd6d6d38c774828 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001788v1_decoy LN:4957 M5:6acbb899137257944298b46317165e69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001789v1_decoy LN:4947 M5:cec51f8ad5909dd8e0d3b01e25acbfd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001790v1_decoy LN:4897 M5:a8c98d6ff4dfa416c2dc12f726057ac0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001791v1_decoy LN:4867 M5:8ad543666fcb2e40d2ce2c0bcb95a150 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001792v1_decoy LN:4845 M5:a4cb8d08b6f399bd75e5d3edc40320f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001793v1_decoy LN:4678 M5:02de644cfd20b00dbf3730793f839102 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001794v1_decoy LN:4641 M5:5326e7bd1418a6bd8475fc0cf9383333 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001795v1_decoy LN:4592 M5:bd9741fa5a5eaf10cb939a6822ac9473 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001796v1_decoy LN:4543 M5:465f55fb7df07a219d9cb52c8d369e8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001797v1_decoy LN:4532 M5:4956e33b08cf6f8939a8053da18b8b4e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001798v1_decoy LN:4503 M5:1fe8c217b537b8ff77877f684728af90 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001799v1_decoy LN:4495 M5:317fc278049d65e36b6b4ac9ea865e2c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001800v1_decoy LN:4444 M5:1815e62f1fb46ebe5a8f20ca027f5e3b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001801v1_decoy LN:4414 M5:7911ec2b81df531fe586719cf18f339f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001802v1_decoy LN:4409 M5:65257f0e3c59604d1b9d1534d2e05cc2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001803v1_decoy LN:4302 M5:dd3519a759d8fb2773d3ce4e05d2e0c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001804v1_decoy LN:4300 M5:1baabb53ab93bc883f297c4fd3313726 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001805v1_decoy LN:4277 M5:a93c3da31dbc626ca07c7a5bb2ae1fce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001806v1_decoy LN:4173 M5:ad4dbde798fb8814acca378a14f36ef4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001807v1_decoy LN:4169 M5:5e7896feb74a66cdf343257968e26128 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001808v1_decoy LN:4136 M5:bb27f7b565373b54a90878f371ecb315 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001809v1_decoy LN:4101 M5:cc0696dc2c3a1cf86aa2bcf3be4fea1c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001810v1_decoy LN:4089 M5:84d4249370d2ab227a405c59d78a49e5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001811v1_decoy LN:4015 M5:13a4dd160518b12fd8900d058ae24627 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001812v1_decoy LN:4000 M5:0d5607a998bac1719a3842db4b2ac324 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001813v1_decoy LN:3973 M5:c54b9de7f485ab7729a4b35a122e5676 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001814v1_decoy LN:3732 M5:0b810e5685d52453ea3c4c3c15f4ab46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001815v1_decoy LN:3709 M5:41dc92336fe91882541594fefae1b397 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001816v1_decoy LN:3686 M5:23342688bf37b8caa294e20464135302 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001817v1_decoy LN:3676 M5:9d214925d90fe222b09cbc3b862d4be5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001818v1_decoy LN:3673 M5:c4bbe25da86730cc4e55c74636296210 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001819v1_decoy LN:3672 M5:3365257914847acb537ffb644b32f6fc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001820v1_decoy LN:3633 M5:9af0a5d44c112d976299f598083354bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001821v1_decoy LN:3633 M5:276e5a73fe80f25706975973fca81151 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001822v1_decoy LN:3613 M5:96044e09be5ba69252a13d71123ac546 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001823v1_decoy LN:3605 M5:2402d86c44cceab83a438a4af0e24939 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001824v1_decoy LN:3592 M5:8e4cc1d20a97fbddc8d430158ab2f8a9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001825v1_decoy LN:3586 M5:b0cc5444bffc7aec1c01a855b52ec3a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001826v1_decoy LN:3584 M5:9b94b86d924e51adbe1fa241e9eb4980 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001827v1_decoy LN:3577 M5:2ed768998d7e36315f9b21917eff299e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001828v1_decoy LN:3537 M5:b9fb044a6692c6bc7dfdca8fcb811f79 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001829v1_decoy LN:3510 M5:27176699c6daad8aa9991c140bb4dceb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001830v1_decoy LN:3509 M5:dab9d17bab4efaf2e54273afe4017807 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001831v1_decoy LN:3488 M5:cc824ab2de05f959425033f7d1b34c54 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001832v1_decoy LN:3473 M5:05d718c7b92a89c2a4b961ee6c0b008c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001833v1_decoy LN:3445 M5:c374915181a1f43da7688151fad2c609 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001834v1_decoy LN:3427 M5:fea3edb105a855523da01bbac633b515 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001835v1_decoy LN:3395 M5:9323a036098595da4ac07b2de10ef332 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001836v1_decoy LN:3367 M5:19070dba7b35a5d94fffb7a4c9bc41d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001837v1_decoy LN:3337 M5:21d6bebf3b38b8e623684b9e0e707909 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001838v1_decoy LN:3324 M5:445cf21cdd79290b7e69a748db3691c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001839v1_decoy LN:3315 M5:f1f38a814378ad3f53ab744d03c6faec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001840v1_decoy LN:3313 M5:943531134a853079b30be3d92c9a37ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001841v1_decoy LN:3283 M5:aa33f6f89273b5d970d09f46c4acffc4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001842v1_decoy LN:3250 M5:6c7e5a0af5d65078902e7369e77c3eca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001843v1_decoy LN:3247 M5:a40dde4dacd9b3af8d1346af020f3826 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001844v1_decoy LN:3237 M5:19c321a618697df2f90bf2623e39e09a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001845v1_decoy LN:3235 M5:858d4ef2c5182eec9a3af185040447c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001846v1_decoy LN:3200 M5:5198826fed1230b23329839aa0fe293b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001847v1_decoy LN:3195 M5:bc41aa22979bdd3975774235ac080c4c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001848v1_decoy LN:3175 M5:e3cf116e22c63b9ca8f5f83ef00c9227 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001849v1_decoy LN:3158 M5:2c546de8c11c8b020271c0a602c8e914 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001850v1_decoy LN:3143 M5:b114278cb76d8a47cd1ea131b6b01c46 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001851v1_decoy LN:3139 M5:836cf9f277e7abe51f821eea4e72f9da AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001852v1_decoy LN:3138 M5:99ec6bed7ebdeb700737347dbb987feb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001853v1_decoy LN:3136 M5:3ce9684d466895b5b1ebc7b730c1a22d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001854v1_decoy LN:3132 M5:4133dd5a44f06f0676fd2c8f8f2e532a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001855v1_decoy LN:3132 M5:1d73546845d822a91cbc6d9f4e78688c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001856v1_decoy LN:3095 M5:318534fba07d7da9181de4e227a5ddf1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001857v1_decoy LN:3094 M5:bb93d34eb9f7a80b575056a9785171f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001858v1_decoy LN:3093 M5:b4c67202f6c2cd5231bdf62ec60bf138 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001859v1_decoy LN:3059 M5:80bd25131b27cbfb7222fb139cdc03f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001860v1_decoy LN:2985 M5:3b138424ffa05470fbaf4e81e0b11722 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001861v1_decoy LN:2975 M5:128ceb0f1b4c41d3107868af22cbd590 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001862v1_decoy LN:2967 M5:f0bd303b1446335f781e0c2f74d28de3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001863v1_decoy LN:2961 M5:562fe7159c1f06d7750af9ef9c3d3e6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001864v1_decoy LN:2955 M5:8028d9a1447473820a8c0b0e88325ffb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001865v1_decoy LN:2935 M5:2fb53f3d6f706d8f5738f63429c8de36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001866v1_decoy LN:2933 M5:a22cdeb6c078d85e19e089f7f9efb045 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001867v1_decoy LN:2909 M5:1fd7abd65c5be9c9dc924daa280f43be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001868v1_decoy LN:2904 M5:5e863959002b0c580d4820a7cebdbf48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001869v1_decoy LN:2892 M5:662acc47cf615cef44478309a902b41b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001870v1_decoy LN:2886 M5:b83662f3f83e28d70a9133675fbe1b1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001871v1_decoy LN:2885 M5:0734ed3f7e1aed9828f22b347664e98e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001872v1_decoy LN:2878 M5:2246626d2530d2260b223f28a96a624a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001873v1_decoy LN:2875 M5:a306eed4bf0048509612220ddfca4dca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001874v1_decoy LN:2861 M5:45f856116b6642c701e0671967fb8bfe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001875v1_decoy LN:2856 M5:a35e380dc9bcacbbc7a29692f039feb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001876v1_decoy LN:2838 M5:e010e81c2ae154a12105872faac2d033 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001877v1_decoy LN:2801 M5:c830abeee2c0527ca00ee4004e2f26f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001878v1_decoy LN:2797 M5:9f0b46d448ffe81f55a61311b72408d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001879v1_decoy LN:2788 M5:ff37de9e839a483b85b9978f165e2aa4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001880v1_decoy LN:2773 M5:45df0f07d5235217631f54d4decf8ce9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001881v1_decoy LN:2755 M5:22fbad6b463ff553fbe7482783018f9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001882v1_decoy LN:2754 M5:f5751d68ef59013dd8a924405b61c766 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001883v1_decoy LN:2743 M5:68564eee42e550492f0bf366f22345f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001884v1_decoy LN:2725 M5:c4477959c12bb115614ea504cf712579 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001885v1_decoy LN:2722 M5:d221c4dd4b764a3cf767ae2f408cd855 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001886v1_decoy LN:2682 M5:6a91b1b63b686c713c6daaa9a5b28c48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001887v1_decoy LN:2669 M5:176039ee6f1d1ae8eaf240056ad7e1ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001888v1_decoy LN:2663 M5:ac2fb1176f2733ad7fcdd03cc15e919d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001889v1_decoy LN:2652 M5:f14b36f702c6db220606dd6696067369 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001890v1_decoy LN:2647 M5:82b5cfe2b5ccc5d14445809aefc4acee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001891v1_decoy LN:2635 M5:fa2959b22afb179b2e6b195f5bba68bc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001892v1_decoy LN:2633 M5:62d8ae1cef408d715d22ae3ba3dfb9c6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001893v1_decoy LN:2629 M5:cb667e2bdb9486da5a227dbd50803c45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001894v1_decoy LN:2612 M5:923dfb32d8271c70d8e8cd9288621481 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001895v1_decoy LN:2599 M5:691f294fc31908fd910ca9dac0cd4362 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001896v1_decoy LN:2566 M5:9cce036b1dc05a82d7a2bd677688b7a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001897v1_decoy LN:2556 M5:975e1058290d80f4ab2cf207313135aa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001898v1_decoy LN:2551 M5:e52be60ead1084c5dbd6851964b3d575 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001899v1_decoy LN:2551 M5:71028cef766fc1dc75684dc127ec3f73 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001900v1_decoy LN:2538 M5:e180467b2632a688c6d3b1e58b17892d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001901v1_decoy LN:2538 M5:bcaea2754972af50dff62993504801c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001902v1_decoy LN:2525 M5:647f59f3a4ad408b803a4c971db5651a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001903v1_decoy LN:2498 M5:80be471faeb22fb67458b7bb8e00ea3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001904v1_decoy LN:2496 M5:be7e3722d3c1a45b98f79cf89cfc235f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001905v1_decoy LN:2483 M5:609856bcc6aeb799c0a57773bccc7598 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001906v1_decoy LN:2475 M5:e64a6fb38d225decae7e079ea7b9732b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001907v1_decoy LN:2469 M5:e2b450a085ac14eec02539b8c1bd6bed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001908v1_decoy LN:2455 M5:0b0b3b8bce8db6dc091b3429802919bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001909v1_decoy LN:2444 M5:6a091545fa77d96dc253bedeaccb6692 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001910v1_decoy LN:2437 M5:ad77fbca3fa49f1c970e8c64b58391d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001911v1_decoy LN:2435 M5:233e3f635c3bd0fae9ed04c155c799a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001912v1_decoy LN:2427 M5:e22283fea810c2cc4c92cc5ac5ead914 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001913v1_decoy LN:2419 M5:ea7d2ed4522c0ecea6389a3b9fb7bcfd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001914v1_decoy LN:2413 M5:953de10ba34733832f5bbcb37e12c5fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001915v1_decoy LN:2412 M5:ea8ef9ae0476686a6cbd488a0202b2bd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001916v1_decoy LN:2400 M5:0198ad2dfad702357fb849a43500deaa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001917v1_decoy LN:2399 M5:d566d3ebbd937aa7ba415298188a1c93 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001918v1_decoy LN:2396 M5:536fac7c509791bd524e9da425d7fd93 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001919v1_decoy LN:2393 M5:522e11044a40018a2f755d9d4fd8103b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001920v1_decoy LN:2386 M5:aa9e69c6d5f6d04b4030be6b3226964c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001921v1_decoy LN:2384 M5:b4d05aabf35963906d1861ef966a4709 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001922v1_decoy LN:2382 M5:97749df462ddf825702a260f9aa2f021 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001923v1_decoy LN:2382 M5:3c0d3376e16a20d57497a815d2475873 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001924v1_decoy LN:2367 M5:e76216aa8c58c6949a9c04cfa9b95995 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001925v1_decoy LN:2366 M5:4b4ae46d37a4f45b63c4b8c3cb63294c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001926v1_decoy LN:2362 M5:589965b553dd53d631ae9970b0c65403 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001927v1_decoy LN:2361 M5:aaac326f62cef7cc31b28e60534d0a3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001928v1_decoy LN:2353 M5:2c60f763bb39af3328df40c97b8e4f0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001929v1_decoy LN:2349 M5:5e3aee054d3451ec9e4e18ee277b5efb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001930v1_decoy LN:2348 M5:c885bcc19373dca31580a65ec6fc7e48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001931v1_decoy LN:2340 M5:b36f2e5330d409cd8ba0973000358c52 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001932v1_decoy LN:2339 M5:63104b56d2278c3cb82c3d6f23d8977c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001933v1_decoy LN:2336 M5:2c7518f9e4ed0d994be4698762511cf3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001934v1_decoy LN:2333 M5:308cac07c79336f8162a8c2e855f7762 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001935v1_decoy LN:2330 M5:bb4702fc9e6227387e8ce3498109d998 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001936v1_decoy LN:2327 M5:ddad50424c1114dd98bc0202ac1cd9fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001937v1_decoy LN:2318 M5:28804e3d50bf7764ac6b1897b1128790 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001938v1_decoy LN:2293 M5:2aa344c0d737b4d9042325fb5a858bee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001939v1_decoy LN:2292 M5:22b000d9737a411cb3844951ebc17b87 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001940v1_decoy LN:2287 M5:44ec350c3d506da4df5a5c6c60683796 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001941v1_decoy LN:2274 M5:c2d8c7fed619477a490f674da302b98c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001942v1_decoy LN:2274 M5:bae016f221de9bcae9788e26dee71d3a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001943v1_decoy LN:2267 M5:88696dc559363af860e8828eed45eb07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001944v1_decoy LN:2260 M5:be18f9c08c02b23d6bc3e38f71843b69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001945v1_decoy LN:2257 M5:bc65d96f85bac2cf76e5db2847c7c723 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001946v1_decoy LN:2240 M5:98c67c23fdf01dd3a05e1213470d56d5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001947v1_decoy LN:2239 M5:0ec5d58555d46a257ce56425c730f4d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001948v1_decoy LN:2232 M5:b8901c5291103859cc240e5d6c96c4ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001949v1_decoy LN:2230 M5:976e267cf6d42bc3c67a345bb56e707f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001950v1_decoy LN:2230 M5:f179f9db12db687102c9a63bacaf36ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001951v1_decoy LN:2222 M5:f5a5058d6f869ae64c9a4b69439d4114 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001952v1_decoy LN:2216 M5:63f1d3d20deaabfeeb68d11879debd0d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001953v1_decoy LN:2214 M5:b09d559a9d44f7eb887d75fd192524ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001954v1_decoy LN:2210 M5:7d0a884bf7fd09ebc9175286c058635f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001955v1_decoy LN:2203 M5:6005c464e19405b659d2d2e09778b06b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001956v1_decoy LN:2197 M5:a15768dc613354cb73ec09a4c5c814ee AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001957v1_decoy LN:2196 M5:cd06502f93b8e17fd05511c84cf6c523 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001958v1_decoy LN:2196 M5:c315413cc7a46460c67bde0cd8e78b71 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001959v1_decoy LN:2179 M5:708d5a6db13c3ac37d5e90e0cc2a8c32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001960v1_decoy LN:2178 M5:e217486e375bc7a5925ec6cc7fa9e003 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001961v1_decoy LN:2178 M5:dd793d59199c7f60817d549e0c149b15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001962v1_decoy LN:2172 M5:aff6ab00ffade197cf1c12f043e2cbe5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001963v1_decoy LN:2170 M5:2cf0f6c81889758a8dadc195f7928b09 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001964v1_decoy LN:2167 M5:c20e5ca2be0e106f7d0694f9e67a3ea2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001965v1_decoy LN:2167 M5:df1f17762d17818e216feee97299c37b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001966v1_decoy LN:2157 M5:071891675e2ba4476534e0035ef13cef AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001967v1_decoy LN:2153 M5:59ad2443710d81ac651620a8f216e7c0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001968v1_decoy LN:2151 M5:2c5f2ad4a6812000584bf131c918c3f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001969v1_decoy LN:2147 M5:e6458e552c51be648c8cc8ca7c01ac98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001970v1_decoy LN:2145 M5:408a6d5ea59519609696b4228f0cbf97 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001971v1_decoy LN:2142 M5:90b747485a6b12433a92fb55202869fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001972v1_decoy LN:2142 M5:7de080d8181d8066e63905fc22a7ee14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001973v1_decoy LN:2136 M5:b611d1ca78ef211201bfc0b6a68e74df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001974v1_decoy LN:2130 M5:5f1f983972aaf38be9f2fd9fbcef8a9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001975v1_decoy LN:2128 M5:0323f4f5194c96dc1bcb919f06960a20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001976v1_decoy LN:2126 M5:c142de1e2c1924e545f116a373abafc1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001977v1_decoy LN:2126 M5:6ec3293375949e50d082d3f5639ba434 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001978v1_decoy LN:2119 M5:e1eeff28afd215be837a02bfe59d8294 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001979v1_decoy LN:2107 M5:eee07feaf8a44d69317e6b46e8eee089 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001980v1_decoy LN:2091 M5:ea5e9165f2f579567e1addc7de1a7a6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001981v1_decoy LN:2087 M5:635626092c6f01e77135d2798172beb8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001982v1_decoy LN:2086 M5:269d34f32d02129323bbc21d6336cc6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001983v1_decoy LN:2083 M5:5aadd7636d45bda287185de4cefac8d9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001984v1_decoy LN:2075 M5:ae2d128f1ba2ba34942dffebf4b7905f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001985v1_decoy LN:2075 M5:0f195e7dde4153887f4f0615cbd730e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001986v1_decoy LN:2072 M5:b236a0d4a67c91d699b3cdf5adc47a71 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001987v1_decoy LN:2068 M5:2e34944b2779f309285d9db7a20b69ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001988v1_decoy LN:2067 M5:233b964d4a2e5bab26b7b996dc46d4b8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001989v1_decoy LN:2055 M5:795ffd63a0e2d97ac00ca57cdab045eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001990v1_decoy LN:2051 M5:5e69880a7e6f7bf744cf4b305624a7e7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001991v1_decoy LN:2050 M5:abba4241716dcac69b95e887f8358859 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001992v1_decoy LN:2033 M5:096ca0754d9f8f4cf7a582f57c5fc083 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001993v1_decoy LN:2024 M5:288495a36e0f4b1fc8e90cff6d4734eb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001994v1_decoy LN:2016 M5:96d95a271cf5d103433921842ead9915 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001995v1_decoy LN:2011 M5:cb8560d292475a0fd481b0e794ed0186 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001996v1_decoy LN:2009 M5:a6503ea36c1b69162d3eda87c4f33922 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001997v1_decoy LN:2003 M5:d3a1bed41244634725882235662d11a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:chrUn_JTFH01001998v1_decoy LN:2001 M5:35916d4135a2a9db7bc0749955d7161a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:01:01:01 LN:3503 M5:01cd0df602495b044b2c214d69a60aa2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:01:01:02N LN:3291 M5:743d9f66c77fc21b964a681e0c6de2ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:01:38L LN:3374 M5:dd27b7fe617e92bb77eea00fede6fd15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:02 LN:3374 M5:3ba47a11a8a5b47ccb855308e26a2f4a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:03 LN:3503 M5:554d43de8f2a97cae068169fe3d8462e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:04N LN:3136 M5:072ea3e53c79f3d00e1f1a7b492b0a8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:09 LN:3105 M5:68176666a98582ea361a9181d69679af AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:11N LN:3374 M5:b9ad3338cc73e2a99888a36e04c29f75 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:14 LN:3095 M5:0385be87eb49df4c59d7487495e3b1b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:16N LN:2985 M5:10150ad21301a29f92e1521530fdd3f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*01:20 LN:3105 M5:05dc0384da2f751afe549a9bfdbc3037 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:01:01:01 LN:3517 M5:174a8ac24d2e6625c1e7589219d6fb84 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:01:01:02L LN:3287 M5:96a6b1f55c41a7da24857ab8844a7a22 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:01:01:03 LN:3023 M5:0ac19a55ed1a22389a2d667c42ba1218 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:01:01:04 LN:3516 M5:f6a0bed71d059f8387d9d22e2b0c46b2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:02:01 LN:2917 M5:a99f213073198aa5a532f950135f6d1d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:03:01 LN:3517 M5:8a795bfd81ee3440e8d0fa3e5d09cd35 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:03:03 LN:3148 M5:6ec792b8a5944a6edb0c1acc18ee1418 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:05:01 LN:3517 M5:dbb2cf4bd26ccd1d7c17327d2cbc119f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:06:01 LN:3517 M5:00a663d257ac9d4d6eabae95f6fb6d8d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:07:01 LN:3517 M5:2833baebca84548dd4e37d79642db779 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:10 LN:3517 M5:61bf8d00643229eaec4eb8def24f1a98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:251 LN:3517 M5:d39aa010841e51a5fc857e82a3378d96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:259 LN:2978 M5:fcedee868a44319f80c453cf7b833abc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:264 LN:3002 M5:6cc807b0948af0b655ad0265629b7906 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:265 LN:3148 M5:5e00ac7ffc401cd5f866e17cd6b7d76b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:266 LN:3084 M5:fe25829d3992130e1ca423e98507b843 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:269 LN:3101 M5:724d76a112c0b557ae52e35dcc2973dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:279 LN:3103 M5:0aef01822ccf2bada1e9a2ce8c771711 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:32N LN:3517 M5:02ae1b32f6268509dbfab828c8339a36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:376 LN:3104 M5:79dba7660c7fa948d23f2703e80eab7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:43N LN:3218 M5:68aa8847e8ec55dce252be3812b03bac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:455 LN:3118 M5:6903220f41d0f8754d6cc3ff6fb3fbba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:48 LN:3517 M5:2947ea9bc4c28b64abba44002460a38f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:51 LN:3109 M5:84c0d488e0a5f95cb3587efd6c84b00c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:533 LN:3217 M5:34bc003a99760f4ec928572b3a747094 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:53N LN:3305 M5:108696b83e605fa59b435cfb8406edf4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:57 LN:3054 M5:bc22083129551a34dbbdfd07e36f763b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:60:01 LN:3112 M5:b58aed6de00585e7f185bf3eb573cb45 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:65 LN:3387 M5:03702f960713a7c42469b033b7ef05ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:68 LN:3109 M5:74777150832f351162301c7d04a64d48 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:77 LN:3371 M5:9e5ec638d0de688fc20aaf00b74b5a9c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:81 LN:3309 M5:2cbf6e9f368ea4387632204bbdcba76f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:89 LN:3371 M5:782c923ac311a590d29e9e85b6a6b5e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*02:95 LN:3388 M5:36b421cc1baeb1cc37291f98566cc5f9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:01:01:01 LN:3502 M5:bc204fec41a0219e8044aae1c5a3a6ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:01:01:02N LN:3373 M5:c9d431f34db1cf123c6dec89ae7075f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:01:01:03 LN:3094 M5:4744e9f0617b3715ed23779866c2e1ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:02:01 LN:3502 M5:d54cdfb5d7a25804bc3b5a3711d1e42c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:11N LN:3404 M5:fb87c0184303005cf961e7e6bc65a3f5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:21N LN:3095 M5:665152840dba04b1bdbfefaf3d4913ac AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*03:36N LN:3142 M5:c5889d985a6d5ac0f86ee9a5f1449762 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:01:01 LN:3503 M5:1b32d51d3415a99c68971d21b686744a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:01:18 LN:3503 M5:3283d7a24c7ad61f9024a8f7d76d5bd6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:02:01 LN:3503 M5:fd13f748ca0c574e318250f8dc0f147e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:05 LN:3373 M5:78f70065b11cbfb3f502af9802ae3b7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:110 LN:2903 M5:ca7ce57dc961032a37af87fc26cb626e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:25 LN:3073 M5:e1ba0819b77d173c0a9c6697f76f3e50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:50Q LN:3362 M5:ec1d5f53ad6427e623c41a11393bc518 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:60 LN:3241 M5:6815ddd990a7231bc8dc40a414cba309 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:69N LN:3500 M5:dd8ce51ba7bb514b56ffcb5d7566dcae AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:74 LN:3227 M5:057f5c85ad1f09e82b0f04bbc54f9283 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:75 LN:3184 M5:9975bcb416ee87f54025f71692bbc1ce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*11:77 LN:3233 M5:615353e3ceac5a04cb381339a800ad9a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*23:01:01 LN:3502 M5:edf8a55a69faad1aab25516e1126b0c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*23:09 LN:3104 M5:fbcac94109d55d95b94b869fd6e42705 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*23:38N LN:3020 M5:83381147ae6889a0af532bcb7af83e6a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:01:01 LN:3502 M5:95495e041aa53313d12032c49baa1b1e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:01:02L LN:3502 M5:d91ba7d36f6472faec4c54d1f476c9f8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:01:03 LN:3075 M5:a89ed5d11db1d882965e052a6a049217 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:03Q LN:3247 M5:d55685eded22f07791df08b502ad3872 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:02:10 LN:3356 M5:739b4ee3c4a555c2b699fa358ad07744 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:03:01 LN:3502 M5:d866111fbc6e2ea2cf086915b28442b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:07:01 LN:3502 M5:872c7be9ec525309cd91d949580a87e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:08 LN:3502 M5:f0bbd52535d5ef86e21c4486e1761207 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:09N LN:3502 M5:9d122834f5117a876ff9ef768a61672e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:10:01 LN:3502 M5:035534e6b4f7a7b2b20506a41290b8de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:11N LN:3503 M5:bb7085dbbd00c565896a17505dbd06c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:152 LN:3176 M5:6d81297ebe64b08f9ec9e8adedcde902 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:20 LN:3502 M5:eb4b55e730512095c889a1c36a7fb51d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:215 LN:3116 M5:f6c6ec83d1c70ef4bdc483abf45a141c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:61 LN:3043 M5:8ae770b761bfdf718a8cf382b54fc71a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*24:86N LN:3415 M5:0e1108b26db8b22f177b460c8a34c017 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*25:01:01 LN:2917 M5:2e22cd0725822e29d3f0df6844339714 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*26:01:01 LN:3517 M5:51cabb4c3149d169568609c1906d969a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*26:11N LN:3091 M5:112419eeaa846213785eadd7380308a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*26:15 LN:3217 M5:2a2c8f5ba64eb0110f2de0d8b74a5d98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*26:50 LN:3141 M5:9a1a6cdedaef2a3c66ca98f77622fe50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:01:01:01 LN:3518 M5:6a6e4c826d8743d5f327d8906a311270 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:01:01:02N LN:3303 M5:497a11cff2fde28a5c500d529581c57b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:02:01:01 LN:3518 M5:77d1ca0d5ea97ccf052d85d9515117ed AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:02:01:02 LN:3518 M5:53bad80334b21427430686d44dbda04d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*29:46 LN:3310 M5:b4635ec707263c634b27769afb46323a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:01:01 LN:3503 M5:c6b537ed485b72a6b78cf527493d8ca4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:02:01:01 LN:2903 M5:65d618ee20ba439ef5ae408a182e25df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:02:01:02 LN:3374 M5:4031b0ca00a39d4d076dcdc2808f590d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:04:01 LN:3503 M5:21f4d62eb6e85f6257661e4c94b68aa4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*30:89 LN:2903 M5:694bc9c1c804f437646697ba9d968bc5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:01:02 LN:3518 M5:6e24e36ceae5a9c0dfa1cbe4520b4425 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:01:23 LN:2918 M5:61060b6e397e85fd905668b5876d8c50 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:04 LN:2918 M5:2d4a59604c2d3d795f3647a186685ad9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:14N LN:3090 M5:afc943d7553ef55e21a855f5e266c8a8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*31:46 LN:3075 M5:ae87be36c211dbf040022ade7713d2c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*32:01:01 LN:3518 M5:d3a7f1fb642659538a431ee2c1d8113e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*32:06 LN:3389 M5:06c6aff700dd7ddd935fd83f2def16e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*33:01:01 LN:3518 M5:f1f4a4e1fd2e774e4003c4f94c67b36a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*33:03:01 LN:3518 M5:4e7abd41072e8f3c62c49c683497d39c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*33:07 LN:3389 M5:4ed7b17c57b32199660f285b9e53bdd8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*34:01:01 LN:3517 M5:c79f20a6bd41e2e41b6e067222b4af42 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*34:02:01 LN:3096 M5:a3a26d9b6292599851c207c193d92b23 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*36:01 LN:2903 M5:a923a3fb762fa22c7956888b6634dbcf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*43:01 LN:3388 M5:a5e6a04ac5537f379e03956d57cefe3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*66:01:01 LN:3517 M5:787d6cacbda41669a942dc4b54c4f7e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*66:17 LN:3075 M5:5f0734606934302fccb508a2f5d3b915 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:01:01:01 LN:2930 M5:93bb5b64ccd0bab2bc0478d6bd0e8854 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:01:01:02 LN:3517 M5:957d09385dbaaadcf87f85227a2a43d2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:01:02:01 LN:3517 M5:0e43acd52311b6485d4542edf7c6d286 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:01:02:02 LN:3388 M5:fbfbf3067287661249f797a0701cbb58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:02:01:01 LN:3517 M5:21b71bd572d6dda388a4d60211edba0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:02:01:02 LN:3506 M5:00fd36e8b22143b0adfbe025e2d5d2b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:02:01:03 LN:2909 M5:df913a8914cc697da83538a7b8e1898e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:02:02 LN:2916 M5:a34e21e7b4de5c05f67281bf68bdeb66 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:03:01 LN:2917 M5:9eaaf636f6b7bcb8557a2b843eda3b60 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:08:01 LN:3120 M5:c2e72d05d212b232f180c5020ad652ba AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:113 LN:3070 M5:474b432629b8d4cc0486021e71e3dabd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:17 LN:3134 M5:f44b78e8df335a94b8ba2ee62214ed82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:18N LN:3237 M5:250389f8d56a86c0037d9e10ce88aad4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:22 LN:3119 M5:5a8b2633f1fb32860f4d5df30e8677ca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*68:71 LN:3198 M5:dd6320e01a52a1aaa9224cd4c39807e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*69:01 LN:2917 M5:02bd84b3d7b9d16ec8546efc41b4d0c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*74:01 LN:2918 M5:948aa5c51d96d4ecbe3fc862f0214a3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*74:02:01:01 LN:2918 M5:4b972360085a8e764c52f0a30ff47673 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*74:02:01:02 LN:3518 M5:97a7f1d63575aaadaff78b53c7bdd231 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*80:01:01:01 LN:3263 M5:5405ef04524037ea84ce1fc83dc9ac20 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-A*80:01:01:02 LN:3055 M5:5cc77fd13bd6123b7300d6da19ae5c13 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:02:01 LN:3323 M5:5eba87e3d51a0b86a498f97022e5714a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:05:01 LN:2676 M5:d41a7c05ac284e89b86b658d33564b3d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:06 LN:2676 M5:a5d7749f86004926ffe9fc104b1e99c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:156 LN:2967 M5:8cc8227691836b87823ff2228f9b25a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:33:01 LN:3239 M5:6ab184ee1fa9167f8857a4d6a7b33da6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:41 LN:3266 M5:9b52773dd0c042b641ea254944e932d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:44 LN:3270 M5:03ee83997251cdeeec6269f547238122 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*07:50 LN:3323 M5:e369192a36b773e819b37507a823343d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:01:01 LN:3322 M5:4ed3fc74f9934e922cc8345b00459784 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:08N LN:3035 M5:3d8eb010a8cb9c3da8d4eb759dee63f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:132 LN:2675 M5:a863b21bd08f28404b8b991486beec56 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:134 LN:2959 M5:cd3c81892d9127631465bd4454169e3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:19N LN:3322 M5:c64401d837f2f4eb51a6f89375d02401 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:20 LN:3322 M5:87e42f5c7d6c6b2f1990fb2477271f14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:33 LN:3322 M5:704bdddcfc1c52e4181d4c12a4e25e54 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*08:79 LN:2676 M5:f08c9b4724eaaedae63d87b79af851de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:01:01 LN:3324 M5:6a8fa9ecf6d7b7a57c77b21c908740b0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:02:01 LN:3324 M5:120d59fa894b11fe23dce75e3f4869f2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:02:03 LN:3323 M5:d52345523e7897e545fffd4718dcccf4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:02:09 LN:2919 M5:ef118f2b15e542e80c1b9c162ad69345 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:08 LN:3324 M5:11f30cc59a8a4b6d4b43144c294440c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:15 LN:3323 M5:0684fd43ee5428bc529561b33db2f2d0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*13:25 LN:2689 M5:dbbc5af54a1289ade5eb273e2f7aee7e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*14:01:01 LN:3312 M5:3764a48b755f8e31055b0e861e4c74e3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*14:02:01 LN:3312 M5:26b567e4c01ece594ca1d0f0b18ae0c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*14:07N LN:3255 M5:74dd725f56e8dad2652028bd0b496125 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:01:01:01 LN:3336 M5:b00240fd0143d1f67ee96b53a30adcfa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:01:01:02N LN:1208 M5:1c5acd964349055939ac8654093dde0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:01:01:03 LN:3026 M5:dcd416dc1f3d5d91d7374096d09a68ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:02:01 LN:3335 M5:25973b11c58535f98da0dae1d36e1ce7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:03:01 LN:2689 M5:bc488eabb3f7519b04b6a795acdf81c8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:04:01 LN:3052 M5:6ccb4f7a3eeb9e8ed44236b5092c2bd9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:07:01 LN:3336 M5:7630abd7e06b6d17b3542a0efdb6c780 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:108 LN:3283 M5:80b9c94caa804a2bd7f2447b9d24cf82 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:10:01 LN:2689 M5:c0699fd2bce33c66fbad3066177f17db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:11:01 LN:3336 M5:c3971913c6e6b41e2f1bbb56026c60b0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:13:01 LN:2688 M5:a5d9251e2d32c20001b7845134141a39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:16:01 LN:2688 M5:fc7d48526274847fbb255137159d9d47 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:17:01:01 LN:3051 M5:fbfa24d81ff319e1c9a77eb23a5c5af6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:17:01:02 LN:3051 M5:547e0689ef02b1b497deaa785f374c32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:18:01 LN:3336 M5:79c954404a5e1b10f46264fbb3c6b32a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:220 LN:2878 M5:a87213c0fe840a0cac742fc92c4a203c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:25:01 LN:3335 M5:316c1666b4ee7ffb47f4922157d121c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:27:01 LN:2689 M5:e01a2e586f79a078cc425bfca6367182 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:32:01 LN:3336 M5:4411f20a66f0e08032144115799b7530 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:42 LN:3333 M5:e6b197d6c9397d8de0ea8de14a814b05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:58 LN:3336 M5:1c0d71c98a79449eabd99e163692bd6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:66 LN:2902 M5:a5186448b35a7b3923ccdae5bdf4bd8c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:77 LN:3336 M5:a4984835f8285fd5518e523394749864 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*15:83 LN:3337 M5:322d07dc63950f70a35cd4a6cb9ba2ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:01:01:01 LN:3323 M5:b0017c6a0823ba043caa28c260a41b12 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:01:01:02 LN:3323 M5:a51373cbff28c2af5ebec8fac8e33cca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:02 LN:2686 M5:ba01be9495db45e331f731023378e599 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:03 LN:3323 M5:207b298dc49c700b8a16865a72eb7c7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:17N LN:2979 M5:01b001b48d8d89f7671231f8cd45ca05 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:26 LN:3323 M5:655b4f8cf9b575997c39e45df3664c8e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*18:94N LN:2970 M5:67c613fbd0339031dc79fc91e294348a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:04:01 LN:3325 M5:4380eeb25545f28b8d6a8bf602e7c2f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:05:02 LN:3325 M5:f60437ab7a86bf431ed0854fd2641cdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:05:18 LN:3321 M5:ff2e5f34be64b46f1e15d1091ea54645 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:06 LN:3325 M5:4c3f65501973406722a9c66c6f129061 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:07:01 LN:2677 M5:61c1b2092f60d8b21a413b8e6846c58d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:131 LN:3325 M5:08dcdc60c6c29f52d100af9900b30e39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:24 LN:2677 M5:c0e3b858ba702a5959d35e51b8b75406 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:25 LN:2677 M5:f1a1a745dc082e0c0a91813d3f12e52d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*27:32 LN:3325 M5:ef9b650861b7081940788ef1618a074c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:01:01:01 LN:3327 M5:72eabdc1286e5f8faec021e4c3fbd212 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:01:01:02 LN:3327 M5:8d6dd73094fd1458c95866fab0bccfb3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:01:22 LN:2806 M5:198a61b3d4b83cfed1fa018f0b5313e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:02:01 LN:3327 M5:69e50f2988b92d745c93ebc9877eace7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:03:01 LN:2689 M5:866f05a4324734d3cca067f98354488e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:05:01 LN:2690 M5:c6cc89ecf3130ee79cefb981dd362f0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:08:01 LN:2689 M5:6baeeca7110354530934af4af0cccd8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:14:02 LN:3327 M5:99db27c20c358808c9e75b090eb54d06 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:241 LN:3042 M5:9fd1849b96ef49c7b705acfdfb430e8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*35:41 LN:3327 M5:8526562f5800fb5180e418bdf4b6e56b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*37:01:01 LN:3324 M5:8e4396d6b7c04761713fc800437312bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*37:01:05 LN:2687 M5:c4312bfb5ca6f84d1c4b2c444107b844 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*38:01:01 LN:3312 M5:205bcc2884f405305b551c58c25d7232 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*38:02:01 LN:3312 M5:501fd25edfcd87eeda45de0caa78e1de AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*38:14 LN:2738 M5:7639a6e735e55ac574403a7970e113b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:01:01 LN:3155 M5:eee292da1356cc9c3bf1b333e89661d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:01:02L LN:3153 M5:cd343572a20faec9ea375660b4b08feb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:01:03 LN:3312 M5:e3fff974f234f099f66e0fe53a93ef2c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:03 LN:3155 M5:2e520e3148dcdf7d8fc7763872d61957 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:16 LN:3155 M5:cb333cf3f06cf66b86f11654c941690f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:01:21 LN:3312 M5:6e1fb83beab576ba8c39ff0237d40277 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:05:01 LN:2675 M5:bf2d7c62a16bf00c2559565daeb0538d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:06:02 LN:2674 M5:77758f231bef5ff95e5a4be58d38dde1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:10:01 LN:3027 M5:fb13d6eeb084ecb4d241e45485ef36e8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:13:02 LN:3255 M5:5836ea0fc7935bd208b6caa597934b98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:14 LN:2765 M5:76c31f2b103685de65a25008bf484f11 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:34 LN:3254 M5:840ee3b914f83a21f98cde71f89d77d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*39:38Q LN:2675 M5:55571273ba2d1a50d1f87b47ae59d9aa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:01:01 LN:2676 M5:afc20b1efd5b1b479db2e62fb8b88337 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:01:02 LN:3323 M5:e80885c2e036b557e2bd1ca6c2b6667f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:02:01 LN:3258 M5:e6e0e85a0fab0b1e17686742e0ace0e4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:03 LN:2677 M5:a4f89215e2d83f162c338ac822bfb46e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:06:01:01 LN:3325 M5:9a238e4bba71b906acf8c46254a9bc31 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:06:01:02 LN:3299 M5:ee4804e6a27f57a5c37e372dc6daa312 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:10:01 LN:3304 M5:5d4db1b120369dcee6c52764f69bfb3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:150 LN:2800 M5:f889007857633aee1ffcdf1fc924ca96 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:40 LN:2677 M5:549008522cb77878ea5c2cf5bd048064 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:72:01 LN:3283 M5:7d61179ccd5e3f1fe4b4976456960d02 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*40:79 LN:3257 M5:521e3a50ed37f445b431b465b0d4ed77 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*41:01:01 LN:3322 M5:17390ad33a3efae3617d3a175671902c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*41:02:01 LN:3322 M5:c886279897cd7e75a357ac3218a1be5f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*42:01:01 LN:3322 M5:154e1df41ca09b47ebd7e365545f6e6d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*42:02 LN:2675 M5:59d27bea1d07ea5695101e714f65812c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*42:08 LN:3165 M5:d860761be3a99c6724146e606a28aac9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:01:01 LN:3323 M5:477ac3a92e88828aa579f38ac0fc39d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:01:02S LN:3152 M5:05fc8de1a02c971099db853c790d3fca AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:01:03 LN:3152 M5:2202501e60f1d3e547cfe4e814c7f877 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:17 LN:3323 M5:3af3bf43df87b594bc20bc5f791785b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:02:27 LN:2872 M5:6ca96787a367bd1ce0838f941140cb81 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:03:01 LN:3323 M5:83f22de8d085ea321aad42dbf25a571a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:03:02 LN:2676 M5:9fcac4fbbe8fd92d125550cd06db12c1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:04 LN:3239 M5:9b24c6a9a01dea4a6bcdb76824470e3e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:09 LN:3317 M5:5ed7833ec37da80387b4a86c6b2a2040 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:138Q LN:3043 M5:1088ef8207c18405bc0b180f0226dab0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:150 LN:2676 M5:0290d7c3b24a19eefc6a89bc41146c39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:23N LN:3323 M5:f1ec2e8fa319def50d20ce89e0b80d5a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:26 LN:2804 M5:174005655892f2cff1ad41bb64927506 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:46 LN:3323 M5:4b352ce812b6c8a65a2e45741d805d7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:49 LN:3039 M5:cb75887e3f845944c90cdf5315369b16 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*44:56N LN:2676 M5:4da8a161653ca5951070a765b2070b3f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*45:01:01 LN:3338 M5:86f5f0263cbccdf31fc646079fce98d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*45:04 LN:3339 M5:bba751b5e3727ad2af0a8cb343a94d57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*46:01:01 LN:3336 M5:7ab2f1273efeb3a770ca80b5d0d078b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*46:01:05 LN:2891 M5:314e19fc403d8ea017669e53723aead0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*47:01:01:01 LN:3041 M5:3107f208d002db7e36cf098ebbb8516c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*47:01:01:02 LN:3041 M5:9f6a5f1290f5f00afcc6b1e732a37b14 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*48:01:01 LN:3323 M5:105f81689cb818d76fe1effd3d150157 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*48:03:01 LN:2676 M5:874fcca35339a027ede1021bb682c5b9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*48:04 LN:2676 M5:77accce2b51d36c34cfae7d7f77a0644 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*48:08 LN:3323 M5:f6f1a40b586aa5025bb2ed56a890ac8c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*49:01:01 LN:3340 M5:7da4db3c2933e38871dde7de2cdf0131 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*49:32 LN:3340 M5:1a762b6501a216624feb498212c99a07 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*50:01:01 LN:3340 M5:9d8a8957807527e6413e745a8fd4e068 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:01:01 LN:3327 M5:263006da7f87d352df017a5efcc6a2ad AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:01:02 LN:3043 M5:d0a5d20ecc047c9db286860c217ffe57 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:02:01 LN:3327 M5:0f09e1d79fda822bb499e29d59e7dfb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:07:01 LN:3327 M5:63b4b6ba9c4049e98e44399a1b1ad03c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*51:42 LN:2962 M5:8253b5b1e485378dfeedfa598e677579 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*52:01:01:01 LN:3327 M5:bb94101c60541202c4b844e21b640a92 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*52:01:01:02 LN:3327 M5:ff0ebc333c63692ac07e7b95c6febbd0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*52:01:01:03 LN:3327 M5:9e6abe5b1d3205aed3a8b62d580f5c6c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*52:01:02 LN:3327 M5:d7fde559163710e8a22f5497902dee7b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*53:01:01 LN:3327 M5:0e08f9e5e5ee052f077c388fe43ed672 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*53:11 LN:3274 M5:9d84a07be4be471551bc6c8cd89ddfa0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*54:01:01 LN:3332 M5:7621d4b27eef76b4b57df91eee3bd38c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*54:18 LN:2813 M5:ecf8408d4379ee7e2467c784e51ea2bb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:01:01 LN:3332 M5:b19860ce7d3e3feec3da15d850ffaf83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:01:03 LN:3332 M5:17fe5fcacdc35ec18448d04e206578e2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:02:01 LN:3333 M5:fe9cf4bfff80e738fa573a1e4336621c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:12 LN:3332 M5:570fdcabb0ff55d30de3a319b09b2da2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:24 LN:3332 M5:0194f66b5128ba6d3eb9fec43ee985c7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*55:48 LN:2980 M5:b8cd7ebdabaea8025fe0b0308b1c500f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*56:01:01 LN:2688 M5:8ea679a7f814ff4b104970fc3363591c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*56:03 LN:2688 M5:13a5b854a9c6cf607e0758dd8977a136 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*56:04 LN:2688 M5:52674e8d83e65bf23b0b36f2cee3b279 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:01:01 LN:3337 M5:435c90dcaa816e70a0a07c23d2f363b7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:03:01 LN:2689 M5:b412ccacf520ef015be9010e88d13fd6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:06 LN:3284 M5:14711544ed455ec1aa9a55bae251514e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:11 LN:3306 M5:66b4e723563c1e4a79cc9233cbc2d5fb AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*57:29 LN:3337 M5:ae6a6681ba3a2ed0efeceafc6ac41fb7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*58:01:01 LN:3336 M5:89112836a876c731a21d3e2357e297d6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*58:31N LN:3004 M5:8507d0acf3a65b125d7ff5bd6c4d1e8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*59:01:01:01 LN:3333 M5:23fda5090f014267db805d001c7c3add AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*59:01:01:02 LN:3332 M5:c4602c638fb61927261e08d529f2898f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*67:01:01 LN:3312 M5:87814da89393ae312125f9b36af8bb77 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*67:01:02 LN:2675 M5:390a5500664173ba6708dbeed0e360dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*67:02 LN:3307 M5:ca5872a8e8c8fe4b920ba96e1542cf58 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*73:01 LN:3323 M5:0136d8cfbbe9fd393a1e699753f7f7a3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*78:01:01 LN:3327 M5:81fbcef3edbbc1e8df879a12d817a9b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*81:01 LN:2676 M5:06b880357cb8d04e7715100462e6e58d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-B*82:02:01 LN:3050 M5:7f0f011b72e32064bdeab6fc9d15df0f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:02:01 LN:3349 M5:0071e65ee429afd318ef699ad315c4b4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:02:11 LN:3057 M5:b9f8c9b73140b44e888ca0d3cb97a51a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:02:29 LN:3349 M5:daaad7b0fa23883b6f6a74c29b218154 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:02:30 LN:3333 M5:f72ada7c617959035065509827004c55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:03 LN:3349 M5:1dfba36de6a84343e0f1bc21f4290dd1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:06 LN:2895 M5:707a109a70808774faabaa9f20fc9c2d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:08 LN:3349 M5:d84d29f8412f7bc25c6faa02ce1e8027 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:14 LN:2895 M5:6184a7ce778825a8d3dbbdca08425352 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:21 LN:2895 M5:7c3c33a8a09cf7ab14dfb252dbb028be AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:30 LN:3349 M5:e7dc7b0b79ca3fba89e46935c2f6f53a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*01:40 LN:2968 M5:1f1ff8df1d52ca176768c131fa0dfd1b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:02:02:01 LN:3347 M5:7d432e207af5901819172d943367ab85 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:02:02:02 LN:3347 M5:3b927e5396f09d7b73cebc3cf7894022 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:10 LN:2893 M5:bc3caf3cb6c08beee025921ea8ab2c2b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:11 LN:3320 M5:86a83cd46a667da7f75c104e6964997a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:16:02 LN:3029 M5:117c55e59cdf735f8e4600c677295e86 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:69 LN:2933 M5:8fb20dc7ab2383635eb05c7b6aa75585 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:85 LN:3347 M5:19bc16298211d1df9285935c0e74349e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:86 LN:3347 M5:1a839f0d783dd916f4c4d85314fb33d3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*02:87 LN:3064 M5:efb30bed21ab99dd6db7b5aec573702f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:02:01 LN:2894 M5:df3f967e88fe534c02bfad024b8c887a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:02:02:01 LN:3348 M5:7ca03d45f7f1fd27eac518520148daa3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:02:02:02 LN:2896 M5:6d6e1775bedec2a59fa4d0bd7c94f4c5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:02:02:03 LN:3348 M5:22fe2d580ec4460d1b085eba87d9aac0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:03:01 LN:3348 M5:4e9e631972020eda52a012a3bcce4cd5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:04:01:01 LN:3348 M5:df0eaa78940580a0f21395f9387cc32d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:04:01:02 LN:3348 M5:d13c9657f578e20631d54771581b5204 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:04:02 LN:2877 M5:be42038dd5348757a9c683918b1db4f0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:04:04 LN:2966 M5:deeefe05be47eaf45bb483add4913ffc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:05 LN:2894 M5:bb0c05e7fd6c15d9d6593a4f3bbe783f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:06 LN:2894 M5:21c18b0c0ff10700610d7f1a50b1c899 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:100 LN:3034 M5:99e13ee46eceaa60fe5084f320894a2d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:13:01 LN:3065 M5:3981907aafcbb510b01423d7f323477c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:20N LN:3321 M5:b3a7cb20db02d1256c2106d420e765fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:219 LN:3070 M5:2f9e694079fd1378d796e05baa51889c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:261 LN:3348 M5:3248cc886e5d3793ba099f0ab1a05d66 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:40:01 LN:2894 M5:93c62f86d2dfc6633dbd2c975908da1a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:41:02 LN:3328 M5:f5752e34d19b00f37d306621c38909a2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:46 LN:2997 M5:0ea8327e0b67ad6f90e5a44c1629c7d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*03:61 LN:2894 M5:6d712f749acb251535e2ae8c3c617413 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:01 LN:3349 M5:3efce3936c70251730ad6b287f7d110e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:02 LN:3349 M5:5d4e1f36ad16f12cbf6447e60f24081c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:03 LN:3349 M5:9e9f6956c08e23d56266b6fa217efd7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:04 LN:3012 M5:2579591d3a321b72379ecd8a51d7edd7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:01:05 LN:2931 M5:64ad58c15cabe00bc7528c32341c0878 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:01:62 LN:3329 M5:43792d77155a7b8f48cd4c57e217997e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:03:01 LN:3349 M5:0ccb8d21235af6c2aff22aa6afbc6732 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:06 LN:3349 M5:63b57fd97300edc439359a50449974db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:09N LN:2991 M5:0fbbbf7cb8fddeb130cf9e967404f973 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:128 LN:3086 M5:e6d5cc6672b9d7e2050ce659e5ed35b6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:161 LN:3237 M5:5bf40c2edbc86b4e13300af3d685dc1b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:177 LN:3349 M5:8547dcf17572b7586eec8ec28cbb8792 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:70 LN:3058 M5:5f1c7d679cd5c3f3110db5fe628cd613 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*04:71 LN:3086 M5:02b46fcce463bf80c626c51f5d36bab3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:01:01:01 LN:3349 M5:c6d922fe90d58a4380b338ce33a098db AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:01:01:02 LN:3349 M5:a7b54d490750d2723ab72f5eab4de589 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:08 LN:3059 M5:1560938f348bbf8027a77fe08ce4b46f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:09:01 LN:3322 M5:bb8835a101a1bd226ba1cf04e30c8298 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*05:93 LN:2946 M5:8163cb61a36ebacb034b44d4537e3ccd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:02:01:01 LN:3349 M5:e2d2d51306ffa6a15072abc9e218afa3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:02:01:02 LN:3349 M5:289ade2a84e2a669f4950d905de18ef3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:02:01:03 LN:3349 M5:541d1cf5b93596d04882fdcea98fdb24 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:23 LN:3349 M5:f90da72a0371a17e345090ee35ced67e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:24 LN:3349 M5:8416842ec1691954a14211e9b178951b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*06:46N LN:2987 M5:1276d9ecb257086ba85fb1dff231b2d1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:01:01 LN:3354 M5:718bc83515052da25d2aa2cf1017aa8d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:01:02 LN:3093 M5:e45eed48ec341cc12ae10b917381d885 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:02 LN:3352 M5:d7dd73d1eb5b9a25c83e84ef950dd44b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:19 LN:3354 M5:db13dc42d8ac6f58daa4d04dd21e0296 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:27 LN:3195 M5:53fc59605c057f246aa7cb06caa3523c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:01:45 LN:3354 M5:7b104b85dc1b908764ff4904a903c90a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:01 LN:3354 M5:00b5a7cce8e5acc98b508e4d39091f15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:02 LN:3074 M5:152f1c93813d70470aa3a116478c5a69 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:03 LN:3354 M5:b854cfa857b40775c2ad6e6ded4b848a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:04 LN:3353 M5:7de039797ea7911c70f4fa82c658366e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:01:05 LN:3354 M5:00709b8f2f15aa3aa482a992d1d87b60 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:05 LN:2903 M5:c7cbc76d1fb0114a55ee635afdb0cd15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:06 LN:3354 M5:1d0e73f11030eece15f033cab7216c51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:02:64 LN:3354 M5:7f780958705ae801a5814f2471cb59f4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:04:01 LN:3354 M5:7aa1a4c1a413aca4e232a2e7dce8ee4d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:04:02 LN:3343 M5:b44a66a5ff9ba711c465dc629d4336e9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:06 LN:3354 M5:3ac9135bdf1975f31d5f501cb5b62c98 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:149 LN:3098 M5:df315cb1e89fca70587836e750b11737 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:18 LN:3353 M5:fa6f988acdf9509ba3790814e29ef79c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:19 LN:3222 M5:2597c84fe3afb1831211a4c9ad6427ec AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:26 LN:3069 M5:705cb7c1e6112114a894aab34b391fdf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:30 LN:2903 M5:e5947b700176aabf378cf29e78c17084 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:32N LN:3334 M5:fe7d565923067a8248624f41f45c79df AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:384 LN:3349 M5:90a8a5267a890ccd78717e88de59232d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:385 LN:3354 M5:20b5d8a093d1e81d1e6b9e56b6d4ad17 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:386 LN:3183 M5:b5524ee2cc10b5a45e99af42e190f5f3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:391 LN:3354 M5:de98c716203e1ca551130af6affe2199 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:392 LN:3354 M5:1a509719976de84a60b59343364e4b51 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:49 LN:2935 M5:45a4d818fffa2d2428658489af9e98b1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:56:02 LN:3354 M5:e4c99b9226de6adbf587934d835048d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:66 LN:3354 M5:a822c754dee47e720af532f5f5bb1ef4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*07:67 LN:3354 M5:2ba41a6538775c77f84b648069196d70 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:01:01 LN:3349 M5:96d5d92a1f9a605bb014f058b767ecfd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:01:03 LN:2998 M5:585c1deb75a38ddadc48575546be3772 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:02:01:01 LN:3349 M5:734e931f1481380f2d0bf98c7925ee2f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:02:01:02 LN:3349 M5:8f2c108d077649a22ae5df5fb42fe265 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:03:01 LN:3349 M5:633f446c1fba5006f49dd2bbddb3ce5e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:04:01 LN:2895 M5:0d4f700e3c6bb58e12ab10c1c85f1bcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:112 LN:3178 M5:ad581d3ae2ddf7d3895c8bda459221c3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:20 LN:3349 M5:de321b1690b9ce4e07c6f6f1c838ba7c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:21 LN:3349 M5:574d8b3a969397fe0d6168a851acac10 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:22 LN:3349 M5:c4fc4ff7544492d91fc221e274b790a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:24 LN:2895 M5:9cc0d743f4c6cea3a61dd94cf81e8782 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:27 LN:3349 M5:3ab94e3b0cb8b613e8cc644c6dc715d4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:36N LN:3097 M5:5e4997d79367c75ea3301d1222f70938 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:40 LN:2978 M5:e8013eaab611499b1827191279b34223 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:41 LN:3019 M5:bf7ecc6786f26c3740e9291e7fdd990e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*08:62 LN:3086 M5:a3f951c6e67ba7b5d43b4678504ceb8f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:02:02 LN:3349 M5:6f12358794b5c624b6948b27722c0d4d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:03:01:01 LN:3349 M5:a5f9f1324e2a617a08c5bcbc275608b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:03:01:02 LN:3348 M5:ff3c56a68534ef6adbf0622ea691498c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:08 LN:3066 M5:5800471074ab27c8bea70d68c5e225d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:13 LN:3058 M5:807b94f9d89314085415b5578b24a778 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:19 LN:3349 M5:3f11cc62c9ed887231ac88ad834d72c9 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:22 LN:2895 M5:9ba9eb10b465c567357944d23d28cb83 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*12:99 LN:3349 M5:6bc65113a76be4e417061df97ec9323e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*14:02:01 LN:3349 M5:8707b7806173ec4a4c61b1d405f1aae3 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*14:03 LN:3349 M5:833afc09e1ba23f97925580cbd67b077 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*14:21N LN:3099 M5:360ab26c5e5b147d6195bcdff0c92871 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*14:23 LN:2976 M5:e5e65cbe62521c667b3ed587aaa762e0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:02:01 LN:3349 M5:95c60c535112b121a9e6ee900399d619 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:05:01 LN:3349 M5:d59cc60db3e774256fafc8cb4e13702e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:05:02 LN:3349 M5:e4ecf0c60d3ee668e494d70c54964c29 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:13 LN:2895 M5:a7312985b9c4182c9232eb0ffdc57ed0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:16 LN:3066 M5:35043b5832829f2204f9418cc925e19b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:17 LN:3349 M5:82cd4aaf3336e9d3414b28f0d7286e9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*15:96Q LN:3349 M5:42133cdaef4b18738bc26fa5695f8f65 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*16:01:01 LN:3349 M5:0c9b3216f1f00e1a3201ea90fb49bd61 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*16:02:01 LN:2895 M5:cf1da0837be9b9302b0fb7158fc5396d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*16:04:01 LN:3349 M5:aefc6289675459afe38397002b7451c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*17:01:01:01 LN:3368 M5:aafe636c5bfce4449d6eed73eefa3a9f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*17:01:01:02 LN:3368 M5:d3cbf8067c1957eaeb80c6a399477245 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*17:01:01:03 LN:3368 M5:f2cc1e59a91a4f102f9ab5fdf4d3c1ff AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*17:03 LN:3197 M5:a94688722b11045bbf7ef13dfc7d34a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-C*18:01 LN:3346 M5:d53dd9ee731f0437bbbffc584867b0b5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:01:02 LN:6489 M5:d0d728fb8e62a0b0366517669b0e4164 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:02:01:01 LN:6484 M5:823632b556203973124fe9c35cb13a3b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:02:01:02 LN:6485 M5:6d2b0b5b4de67207756f9a9ca9132232 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:02:01:03 LN:6485 M5:df8eab835a0677224be043db0196865c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:02:01:04 LN:6492 M5:1e79553d8e925c6243368db955220c7d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:03:01:01 LN:6485 M5:705ec2d75d9d349a7e4d1b2df73073d7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:03:01:02 LN:6492 M5:dc4b199889931d13d1522358a9a01f3c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:04:01:01 LN:6484 M5:f9a28fc80725b04a807c1a7fa37786bf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:04:01:02 LN:6485 M5:da201e2fb04103e9cfa1eaecab78b098 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:05:01 LN:6485 M5:a13023aaec38d48c163c5fe5996596d8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:07 LN:5959 M5:1af58658f072dc6319086af52c3d5f6f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:10 LN:5790 M5:52685ee8463a30a3909841a38e4b9d8b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*01:11 LN:5926 M5:18894dd38987f5ffd32b9896a4a7f732 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*02:01 LN:6403 M5:14bb0fb46e443150199a75018f001115 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*03:01:01 LN:6437 M5:75b42b5c4fb93885ab4fdb6a312d690f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*03:02 LN:6437 M5:caaf9e4318294ebd0c262db0018d88fa AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*03:03:01 LN:6437 M5:c0908bb87356f6cad982be1acb618dcc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*04:01:02:01 LN:5853 M5:dc7c3223c9df7e828a1c8f22c4cc89c4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*04:01:02:02 LN:5666 M5:6548c257283705fae841fe89148efc1f AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*04:02 LN:6210 M5:6d9b8e4e332e7e398b831c81a6179e76 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:01:01:01 LN:5806 M5:72dbcba71cbed79962e1fcb9efa94824 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:01:01:02 LN:6529 M5:b129bfcbf4b80c10ffab12eb652ba5a1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:03 LN:6121 M5:38e52c5a505ee662100c0789cfe884a7 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:05:01:01 LN:6593 M5:f4020b6d26ac50eed22026f28371f610 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:05:01:02 LN:6597 M5:456ddd5aaccb336023a80f2ae5abbbdd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:05:01:03 LN:6393 M5:39e340eb675634315a0f9aa27e8fdb32 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*05:11 LN:6589 M5:a47aa87bace1ec4da327ee121bceac36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQA1*06:01:01 LN:5878 M5:cd02d6c8bd4c86f9abb999bab52820cf AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*02:01:01 LN:7480 M5:0b0031da03392e56acd208fc67ae6e39 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*02:02:01 LN:7471 M5:69337da3c9bd0a6048d1a1144aabbdb0 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:01:01:01 LN:7231 M5:78802163e98cdc6f909438b62e0cfab4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:01:01:02 LN:7230 M5:e8f01ef987d6dd2a878f94e6d97be1f1 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:01:01:03 LN:7231 M5:2423aebb09fea4369cab41a1ea47afc8 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:02:01 LN:7126 M5:2218c10eeaa7f39f94ed3f0309605510 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:03:02:01 LN:7126 M5:ffa1cdc44c405e284e6f51859e1c2b36 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:03:02:02 LN:7126 M5:739f0c7c0c72cf31a975aebe2109f11c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:03:02:03 LN:6800 M5:2dd9cf67abbc473a663d6d559694616b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*03:05:01 LN:6934 M5:0de7b3ac9974b084f8db58e416c25eb5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*05:01:01:01 LN:7090 M5:38570713e3fcfe831cc045e479f65e9b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*05:01:01:02 LN:7090 M5:0f304adf7acf3bd4b7c54c1394c85a4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*05:03:01:01 LN:7089 M5:618b80618d0a6750a82d9caf5b2b01ea AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*05:03:01:02 LN:7089 M5:198d06518fff03b2dafc0bb113efc008 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*06:01:01 LN:7111 M5:231c9c7d1321a266933777181a2761a4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*06:02:01 LN:7102 M5:739d56a7e8c44823d1a11bd4ff13f465 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*06:03:01 LN:7103 M5:1bfde4e12c5bac5e9e5e7e6b84582b0b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DQB1*06:09:01 LN:7102 M5:805267e877e03b8ec95319888e38c5dc AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*01:01:01 LN:10741 M5:91618decb1b3933c623070b2ccbe52a6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*01:02:01 LN:11229 M5:9efa1a8356e55f6be83b4ddb84833e4b AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*03:01:01:01 LN:13908 M5:411919f8128149a1f5099cdd22d276ab AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*03:01:01:02 LN:13426 M5:869ae29cc3f279d7fc43e27249a53e8a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*04:03:01 LN:15246 M5:ce0de8afd561fb1fb0d3acce94386a27 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*07:01:01:01 LN:16110 M5:4063054a8189fbc81248b0f37b8273fd AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*07:01:01:02 LN:16120 M5:a4b1a49cfe8fb2c98c178c02b6c64ed4 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*08:03:02 LN:13562 M5:dc6eb484555ba796b15b9b91aa1a9ec6 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*09:21 LN:16039 M5:cad793cbc22699d1cca3101b5a55437d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*10:01:01 LN:13501 M5:91dcd8c149b00a3edb1afa43a1cc6346 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*11:01:01 LN:13921 M5:07cefc23572c21731a2804c5d44fcf55 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*11:01:02 LN:13931 M5:f47cd478ee5be3ff048069adbbb5c101 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*11:04:01 LN:13919 M5:fc86714e3d7b9503d74e40d92f08cd7a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*12:01:01 LN:13404 M5:31f08980f62b68be96334f3cafc3e7c2 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*12:17 LN:11260 M5:b0b7bea536479c8e61164e1475203038 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*13:01:01 LN:13935 M5:937994edc4b4760eb13cbf451c3f3bbe AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*13:02:01 LN:13941 M5:6a124566ab0a103d525d2fcf1292ce15 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*14:05:01 LN:13933 M5:10890137f738be0861b6ba128cfb953d AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*14:54:01 LN:13936 M5:2b67be4ed005b3f3040e3c72bfc65c0c AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:01:01:01 LN:11080 M5:d22cd7f323b0e51abb025a4dec827aa5 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:01:01:02 LN:11571 M5:5e3280587aa6f38dd9a282e9bf21287e AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:01:01:03 LN:11056 M5:d548f5e5798e09c869571ea8c660c983 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:01:01:04 LN:11056 M5:3bb2753595aaf099a490a7ce1e042fce AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:02:01 LN:10313 M5:2deab6035ce8cc2e09db20698cf1f117 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:03:01:01 LN:11567 M5:e6a26b767a62b282e0db211bbc9a7363 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*15:03:01:02 LN:11569 M5:4e0d459b9bd15bff8645de84334e3d25 AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +@SQ SN:HLA-DRB1*16:02:01 LN:11005 M5:4a972df76bd3ee2857b87bd5be5ea00a AS:20 UR:/seq/references/kendrix/v0/kendrix.fasta SP:Homo sapiens +chrY 1 57227415 + . From 4c392efdc7fe57c25f7fa659f2cfea4cb503d626 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 25 Nov 2022 14:19:56 +0100 Subject: [PATCH 0854/1169] Added interval list files --- conf/genomes.config | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/genomes.config b/conf/genomes.config index 9e456cfc..96eac4c5 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -19,6 +19,8 @@ params { gnomad_vcf = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" gnomad_af = "" gnomad_af_idx = "" + intervals_wgs = "${projectDir}/assets/1-22XYMT_grch37.interval_list" + intervals_y = "${projectDir}/assets/Y_grch37.interval_list" known_dbsnp = "" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" @@ -52,6 +54,8 @@ params { gnomad_vcf = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" gnomad_af_idx = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" + intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" + intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" known_dbsnp_tbi = "" ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" From 6dab3f4d69f765fa539a3920323ba7d7918188f3 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 25 Nov 2022 14:24:20 +0100 Subject: [PATCH 0855/1169] Save output from wgsmetrics --- conf/modules.config | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 9c762723..196e045f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -469,6 +469,37 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + + withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS' { + path: { "${params.outdir}/bamqc_collectwgsmetrics" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS_Y' { + publishDir = [ + path: { "${params.outdir}/bamqc_collectwgsmetrics" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { + publishDir = [ + path: { "${params.outdir}/bamqc_collectwgsmetrics" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { + publishDir = [ + path: { "${params.outdir}/bamqc_collectwgsmetrics" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } } // From 86166bc99a9bf85962a12edaab4a079a2425b62b Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 25 Nov 2022 14:33:39 +0100 Subject: [PATCH 0856/1169] Added wgsmetrics --- subworkflows/local/qc_bam.nf | 40 ++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 550ed3e8..75b213a9 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -2,12 +2,16 @@ // A quality check subworkflow for processed bams. // -include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/picard/collectmultiplemetrics/main' -include { PICARD_COLLECTHSMETRICS } from '../../modules/nf-core/picard/collecthsmetrics/main' -include { QUALIMAP_BAMQC } from '../../modules/nf-core/qualimap/bamqc/main' -include { TIDDIT_COV } from '../../modules/nf-core/tiddit/cov/main' -include { MOSDEPTH } from '../../modules/nf-core/mosdepth/main' -include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/ucsc/wigtobigwig/main' +include { PICARD_COLLECTMULTIPLEMETRICS } from '../../modules/nf-core/picard/collectmultiplemetrics/main' +include { PICARD_COLLECTHSMETRICS } from '../../modules/nf-core/picard/collecthsmetrics/main' +include { QUALIMAP_BAMQC } from '../../modules/nf-core/qualimap/bamqc/main' +include { TIDDIT_COV } from '../../modules/nf-core/tiddit/cov/main' +include { MOSDEPTH } from '../../modules/nf-core/mosdepth/main' +include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/ucsc/wigtobigwig/main' +include { PICARD_COLLECTWGSMETRICS } from '../../modules/nf-core/modules/picard/collectwgsmetrics/main' +include { PICARD_COLLECTWGSMETRICS as PICARD_COLLECTWGSMETRICS_Y } from '../../modules/nf-core/modules/picard/collectwgsmetrics/main' +include { SENTIEON_WGSMETRICSALGO as SENTIEON_WGSMETRICS } from '../../modules/local/sentieon/wgsmetricsalgo' +include { SENTIEON_WGSMETRICSALGO as SENTIEON_WGSMETRICS_Y } from '../../modules/local/sentieon/wgsmetricsalgo' workflow QC_BAM { @@ -19,6 +23,9 @@ workflow QC_BAM { bait_intervals // path: bait.intervals_list target_intervals // path: target.intervals_list chrom_sizes // path: chrom.sizes + intervals_wgs // path: genome.intervals_wgs + intervals_y // path: genome.intervals_y + aligner // string: params.aligner main: ch_versions = Channel.empty() @@ -47,6 +54,25 @@ workflow QC_BAM { MOSDEPTH (mosdepth_input_bams,[],[]) ch_versions = ch_versions.mix(MOSDEPTH.out.versions.first()) + // COLLECT WGS METRICS + if ( aligner == "bwamem2" ) { + PICARD_COLLECTWGSMETRICS ( bam, fasta, intervals_wgs ) + ch_cov = PICARD_COLLECTWGSMETRICS.out.metrics + ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS.out.versions) + PICARD_COLLECTWGSMETRICS_Y ( bam, fasta, intervals_y ) + ch_cov_y = PICARD_COLLECTWGSMETRICS_Y.out.metrics + ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions) + } else if ( aligner == "sentieon" ) { + SENTIEON_WGSMETRICS ( bam, fasta ) + ch_cov = SENTIEON_WGSMETRICS.out.metrics + ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS.out.versions) + SENTIEON_WGSMETRICS_Y ( bam, fasta ) + ch_cov_y = SENTIEON_WGSMETRICS_Y.out.metrics + ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS_Y.out.versions) + } else { + exit 1, 'Please provide a valid aligner!' + } + emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] hs_metrics = PICARD_COLLECTHSMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] @@ -54,6 +80,8 @@ workflow QC_BAM { tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] d4 = MOSDEPTH.out.per_base_d4 // channel: [ val(meta), path(*.d4) ] + cov = ch_cov // channel: [ val(meta), path(metrics) ] + cov_y = ch_cov_y // channel: [ val(meta), path(metrics) ] versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From c188c5600e94215bb65f76d407a899f595706200 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 25 Nov 2022 14:35:16 +0100 Subject: [PATCH 0857/1169] Added intervals for Sentieon wgsmetricsalgo --- conf/modules.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 196e045f..149079f7 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -486,6 +486,7 @@ process { } withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { + ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics" }, mode: params.publish_dir_mode, @@ -494,6 +495,7 @@ process { } withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { + ext.args = { (params.genome == "GRCh37") ? "--interval Y" : "--interval chrY" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics" }, mode: params.publish_dir_mode, From 7417b168fdfe1c8dcb2555df70db77f5430f3bce Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 25 Nov 2022 16:10:19 +0100 Subject: [PATCH 0858/1169] Add collectwgsmetrics module --- modules.json | 4 ++ .../nf-core/picard/collectwgsmetrics/main.nf | 56 +++++++++++++++++++ .../nf-core/picard/collectwgsmetrics/meta.yml | 47 ++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 modules/nf-core/picard/collectwgsmetrics/main.nf create mode 100644 modules/nf-core/picard/collectwgsmetrics/meta.yml diff --git a/modules.json b/modules.json index 5c871d01..b96d476b 100644 --- a/modules.json +++ b/modules.json @@ -185,6 +185,10 @@ "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, + "picard/collectwgsmetrics": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, "picard/liftovervcf": { "branch": "master", "git_sha": "3d5d18db1b39e1133505ae2fa2a062b0073c8a6a" diff --git a/modules/nf-core/picard/collectwgsmetrics/main.nf b/modules/nf-core/picard/collectwgsmetrics/main.nf new file mode 100644 index 00000000..2b0aeefe --- /dev/null +++ b/modules/nf-core/picard/collectwgsmetrics/main.nf @@ -0,0 +1,56 @@ +process PICARD_COLLECTWGSMETRICS { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::picard=2.27.4 r::r-base" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + + input: + tuple val(meta), path(bam) + path fasta + + output: + tuple val(meta), path("*_metrics"), emit: metrics + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard CollectWgsMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + CollectWgsMetrics \\ + $args \\ + --INPUT $bam \\ + --OUTPUT ${prefix}.CollectWgsMetrics.coverage_metrics \\ + --REFERENCE_SEQUENCE ${fasta} + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard CollectWgsMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.CollectWgsMetrics.coverage_metrics + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard CollectWgsMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/picard/collectwgsmetrics/meta.yml b/modules/nf-core/picard/collectwgsmetrics/meta.yml new file mode 100644 index 00000000..d6c3d012 --- /dev/null +++ b/modules/nf-core/picard/collectwgsmetrics/meta.yml @@ -0,0 +1,47 @@ +name: picard_collectwgsmetrics +description: Collect metrics about coverage and performance of whole genome sequencing (WGS) experiments. +keywords: + - alignment + - metrics + - statistics + - quality + - bam +tools: + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam}" + - fasta: + type: file + description: Genome fasta file +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - metrics: + type: file + description: Alignment metrics files generated by picard + pattern: "*_{metrics}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@flowuenne" + - "@lassefolkersen" From ed7d06a33ecfe7c06fb5ebfb403cf2e980ad5cc2 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Mon, 28 Nov 2022 13:31:17 +0100 Subject: [PATCH 0859/1169] Updated collectwgsmetrics module --- modules.json | 2 +- modules/nf-core/picard/collectwgsmetrics/main.nf | 9 ++++++--- modules/nf-core/picard/collectwgsmetrics/meta.yml | 3 +++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index b96d476b..888da1e7 100644 --- a/modules.json +++ b/modules.json @@ -187,7 +187,7 @@ }, "picard/collectwgsmetrics": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "9c92f40092d7a9112953b7571f7021f65740bf7f" }, "picard/liftovervcf": { "branch": "master", diff --git a/modules/nf-core/picard/collectwgsmetrics/main.nf b/modules/nf-core/picard/collectwgsmetrics/main.nf index 2b0aeefe..62074d40 100644 --- a/modules/nf-core/picard/collectwgsmetrics/main.nf +++ b/modules/nf-core/picard/collectwgsmetrics/main.nf @@ -10,6 +10,7 @@ process PICARD_COLLECTWGSMETRICS { input: tuple val(meta), path(bam) path fasta + path intervallist output: tuple val(meta), path("*_metrics"), emit: metrics @@ -19,9 +20,10 @@ process PICARD_COLLECTWGSMETRICS { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def avail_mem = 3 + def interval = intervallist ? "--INTERVALS ${intervallist}" : '' if (!task.memory) { log.info '[Picard CollectWgsMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { @@ -34,7 +36,8 @@ process PICARD_COLLECTWGSMETRICS { $args \\ --INPUT $bam \\ --OUTPUT ${prefix}.CollectWgsMetrics.coverage_metrics \\ - --REFERENCE_SEQUENCE ${fasta} + --REFERENCE_SEQUENCE ${fasta} \\ + $interval cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/picard/collectwgsmetrics/meta.yml b/modules/nf-core/picard/collectwgsmetrics/meta.yml index d6c3d012..b9dc37af 100644 --- a/modules/nf-core/picard/collectwgsmetrics/meta.yml +++ b/modules/nf-core/picard/collectwgsmetrics/meta.yml @@ -27,6 +27,9 @@ input: - fasta: type: file description: Genome fasta file + - intervallist: + type: file + description: Picard Interval List. Defines which contigs to include. Can be generated from a BED file with GATK BedToIntervalList. output: - meta: type: map From ded88590bbcf03c9c9248ecc44d1de644eee42a6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 28 Nov 2022 14:53:30 +0100 Subject: [PATCH 0860/1169] update config --- conf/modules.config | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 9c762723..3675ee6e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -484,7 +484,7 @@ process { ] } - withName: STRANGER { + withName: '.*CALL_REPEAT_EXPANSIONS:STRANGER' { publishDir = [ path: { "${params.outdir}/stranger" }, mode: params.publish_dir_mode, @@ -500,6 +500,7 @@ process { process { withName: '.*CALL_SNV_DEEPVARIANT:DEEPVARIANT' { + ext.when = { params.variant_caller.equals("deepvariant") } ext.args = { "--model_type=${params.analysis_type.toUpperCase()}" } ext.prefix = { "${meta.id}_deepvar" } publishDir = [ @@ -510,6 +511,7 @@ process { } withName: '.*CALL_SNV_DEEPVARIANT:GLNEXUS' { + ext.when = { params.variant_caller.equals("deepvariant") } ext.args = '--config DeepVariant_unfiltered' publishDir = [ enabled: false @@ -517,6 +519,7 @@ process { } withName: '.*CALL_SNV_DEEPVARIANT:SPLIT_MULTIALLELICS_GL' { + ext.when = { params.variant_caller.equals("deepvariant") } ext.args = '--output-type z --multiallelics -both' publishDir = [ enabled: false @@ -524,6 +527,7 @@ process { } withName: '.*CALL_SNV_DEEPVARIANT:REMOVE_DUPLICATES_GL' { + ext.when = { params.variant_caller.equals("deepvariant") } ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ @@ -534,6 +538,7 @@ process { } withName: '.*CALL_SNV_DEEPVARIANT:TABIX_GL' { + ext.when = { params.variant_caller.equals("deepvariant") } publishDir = [ path: { "${params.outdir}/glnexus" }, mode: params.publish_dir_mode, @@ -631,18 +636,21 @@ process { process { withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:SVDB_QUERY' { + ext.when = { params.annotate_sv_switch } publishDir = [ enabled: false, ] } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:PICARD_SORTVCF' { + ext.when = { params.annotate_sv_switch } publishDir = [ enabled: false, ] } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:BCFTOOLS_VIEW' { + ext.when = { params.annotate_sv_switch } ext.prefix = { "${meta.id}_view" } publishDir = [ enabled: false, @@ -650,6 +658,7 @@ process { } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:ENSEMBLVEP_SV' { + ext.when = { params.annotate_sv_switch } ext.args = [ '--plugin LoFtool,vep_cache/LoFtool_scores.txt', '--distance 5000', @@ -674,16 +683,19 @@ process { process { withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE' { + ext.when = { params.annotate_sv_switch } ext.args = { (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' } } withName: '.*RANK_VARIANTS_SV:GENMOD_SCORE' { + ext.when = { params.annotate_sv_switch } ext.args = " --rank_results " } withName: '.*RANK_VARIANTS_SV:GENMOD_COMPOUND' { + ext.when = { params.annotate_sv_switch } publishDir = [ path: { "${params.outdir}/genmod" }, mode: params.publish_dir_mode, @@ -698,6 +710,7 @@ process { process { withName: '.*ANNOTATE_SNVS:VCFANNO' { + ext.when = { params.annotate_snv_switch } publishDir = [ path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, @@ -706,6 +719,7 @@ process { } withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { + ext.when = { params.annotate_snv_switch } ext.args = { "--samples ${meta.id} --skip-indels " } publishDir = [ path: { "${params.outdir}/snv_annotation" }, @@ -715,6 +729,7 @@ process { } withName: '.*ANNOTATE_SNVS:RHOCALL_ANNOTATE' { + ext.when = { params.annotate_snv_switch } ext.args = { "--v14 " } publishDir = [ path: { "${params.outdir}/snv_annotation" }, @@ -724,6 +739,7 @@ process { } withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { + ext.when = { params.annotate_snv_switch } ext.prefix = { "${meta.id}_view" } ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70 | INFO/SWEGENAF > 0.70" ' } publishDir = [ @@ -734,6 +750,7 @@ process { } withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { + ext.when = { params.annotate_snv_switch } ext.prefix = { "${meta.id}_${intervals.simpleName}" } ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} publishDir = [ @@ -745,6 +762,7 @@ process { } withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { + ext.when = { params.annotate_snv_switch } ext.prefix = { "${vcf.simpleName}_vep" } ext.args = [ '--plugin LoFtool,vep_cache/LoFtool_scores.txt', @@ -764,6 +782,7 @@ process { } withName: '.*ANNOTATE_SNVS:ZIP_TABIX_VEP' { + ext.when = { params.annotate_snv_switch } ext.prefix = { "${input.simpleName}" } publishDir = [ path: { "${params.outdir}/snv_annotation" }, @@ -778,20 +797,24 @@ process { process { withName: '.*RANK_VARIANTS_SNV:GENMOD_ANNOTATE' { + ext.when = { params.annotate_snv_switch } ext.args = { (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' } } withName: '.*RANK_VARIANTS_SNV:GENMOD_MODELS' { + ext.when = { params.annotate_snv_switch } ext.args = " --whole_gene " } withName: '.*RANK_VARIANTS_SNV:GENMOD_SCORE' { + ext.when = { params.annotate_snv_switch } ext.args = " --rank_results " } withName: '.*RANK_VARIANTS_SNV:GENMOD_COMPOUND' { + ext.when = { params.annotate_snv_switch } publishDir = [ path: { "${params.outdir}/genmod" }, mode: params.publish_dir_mode, From a2bc096c817426509c5b5a72b099f0e707066b1e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 30 Nov 2022 17:13:20 +0100 Subject: [PATCH 0861/1169] update svdb --- modules.json | 14 +++++++------- modules/nf-core/svdb/merge/main.nf | 6 +++--- modules/nf-core/svdb/query/main.nf | 8 ++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/modules.json b/modules.json index 5c871d01..218f9c2b 100644 --- a/modules.json +++ b/modules.json @@ -35,7 +35,7 @@ }, "bwamem2/mem": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" + "git_sha": "653588be2a4aadab487b530643dbc9baf7a485c4" }, "cat/cat": { "branch": "master", @@ -75,7 +75,7 @@ }, "fastqc": { "branch": "master", - "git_sha": "3dd73937b084b547f9272bc901e0f120a7913fd8" + "git_sha": "810e8f2603ec38401d49a4aaed06f6d058745552" }, "gatk4/bedtointervallist": { "branch": "master", @@ -99,7 +99,7 @@ }, "gatk4/mergevcfs": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "c25943553f62be5f907e3c12c42eaf0a1b40746d" }, "gatk4/mutect2": { "branch": "master", @@ -179,11 +179,11 @@ }, "picard/collecthsmetrics": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2" }, "picard/collectmultiplemetrics": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2" }, "picard/liftovervcf": { "branch": "master", @@ -231,11 +231,11 @@ }, "svdb/merge": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7" }, "svdb/query": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7" }, "tabix/bgziptabix": { "branch": "master", diff --git a/modules/nf-core/svdb/merge/main.nf b/modules/nf-core/svdb/merge/main.nf index 477dbb0d..7dd92653 100644 --- a/modules/nf-core/svdb/merge/main.nf +++ b/modules/nf-core/svdb/merge/main.nf @@ -1,10 +1,10 @@ process SVDB_MERGE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.6.1 bioconda::samtools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::svdb=2.8.1 bioconda::samtools=1.16.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:56d0a468970fbb474d92f0591abcf677757fb370-0': - 'quay.io/biocontainers/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:56d0a468970fbb474d92f0591abcf677757fb370-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:af6f8534cd538a85ff43a2eae1b52b143e7abd05-0': + 'quay.io/biocontainers/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:af6f8534cd538a85ff43a2eae1b52b143e7abd05-0' }" input: tuple val(meta), path(vcfs) diff --git a/modules/nf-core/svdb/query/main.nf b/modules/nf-core/svdb/query/main.nf index dbab5259..aee9aad1 100644 --- a/modules/nf-core/svdb/query/main.nf +++ b/modules/nf-core/svdb/query/main.nf @@ -2,10 +2,10 @@ process SVDB_QUERY { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.6.1" : null) + conda (params.enable_conda ? "bioconda::svdb=2.8.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.6.1--py39h5371cbf_0': - 'quay.io/biocontainers/svdb:2.6.1--py39h5371cbf_0' }" + 'https://depot.galaxyproject.org/singularity/svdb:2.8.1--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.8.1--py39h5371cbf_0' }" input: tuple val(meta), path(vcf) @@ -16,7 +16,7 @@ process SVDB_QUERY { path (vcf_dbs) output: - tuple val(meta), path("*_query.vcf"), emit: vcf + tuple val(meta), path("*_query.vcf") , emit: vcf path "versions.yml" , emit: versions when: From efe969468a4fce61602c6288de78e4c1e954ca96 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Dec 2022 00:01:05 +0100 Subject: [PATCH 0862/1169] update modules --- main.nf | 1 + modules.json | 16 ++++++------ modules/nf-core/bwamem2/mem/main.nf | 2 +- modules/nf-core/fastqc/main.nf | 10 ++++++-- modules/nf-core/gatk4/mergevcfs/main.nf | 2 +- modules/nf-core/gatk4/mergevcfs/meta.yml | 9 ++++--- .../nf-core/picard/collecthsmetrics/main.nf | 6 ++--- .../nf-core/picard/collecthsmetrics/meta.yml | 20 ++++++++++++--- .../picard/collectmultiplemetrics/main.nf | 6 ++--- .../picard/collectmultiplemetrics/meta.yml | 18 +++++++++++-- modules/nf-core/svdb/merge/main.nf | 6 ++--- modules/nf-core/svdb/query/main.nf | 8 +++--- modules/nf-core/vcfanno/main.nf | 13 +++++----- modules/nf-core/vcfanno/meta.yml | 16 ++++++------ nextflow_schema.json | 8 ++++++ subworkflows/local/analyse_MT.nf | 14 ++++++----- subworkflows/local/annotate_snvs.nf | 4 ++- .../local/mitochondria/merge_annotate_MT.nf | 17 +++++++------ subworkflows/local/prepare_references.nf | 1 + subworkflows/local/qc_bam.nf | 5 ++-- workflows/raredisease.nf | 25 ++++++++++++------- 21 files changed, 135 insertions(+), 72 deletions(-) diff --git a/main.nf b/main.nf index c2b9c872..5143e530 100644 --- a/main.nf +++ b/main.nf @@ -48,6 +48,7 @@ params.variant_catalog = WorkflowMain.getGenomeAttribute(params, params.vep_filters = WorkflowMain.getGenomeAttribute(params, 'vep_filters') params.vcfanno_resources = WorkflowMain.getGenomeAttribute(params, 'vcfanno_resources') params.vcfanno_toml = WorkflowMain.getGenomeAttribute(params, 'vcfanno_toml') +params.vcfanno_lua = WorkflowMain.getGenomeAttribute(params, 'vcfanno_lua') params.vep_cache = WorkflowMain.getGenomeAttribute(params, 'vep_cache') params.vep_cache_version = WorkflowMain.getGenomeAttribute(params, 'vep_cache_version') params.gens_interval_list = WorkflowMain.getGenomeAttribute(params, 'gens_interval_list') diff --git a/modules.json b/modules.json index 5c871d01..90dd0004 100644 --- a/modules.json +++ b/modules.json @@ -35,7 +35,7 @@ }, "bwamem2/mem": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" + "git_sha": "653588be2a4aadab487b530643dbc9baf7a485c4" }, "cat/cat": { "branch": "master", @@ -75,7 +75,7 @@ }, "fastqc": { "branch": "master", - "git_sha": "3dd73937b084b547f9272bc901e0f120a7913fd8" + "git_sha": "810e8f2603ec38401d49a4aaed06f6d058745552" }, "gatk4/bedtointervallist": { "branch": "master", @@ -99,7 +99,7 @@ }, "gatk4/mergevcfs": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "c25943553f62be5f907e3c12c42eaf0a1b40746d" }, "gatk4/mutect2": { "branch": "master", @@ -179,11 +179,11 @@ }, "picard/collecthsmetrics": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2" }, "picard/collectmultiplemetrics": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2" }, "picard/liftovervcf": { "branch": "master", @@ -231,11 +231,11 @@ }, "svdb/merge": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7" }, "svdb/query": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7" }, "tabix/bgziptabix": { "branch": "master", @@ -263,7 +263,7 @@ }, "vcfanno": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "3a15c72f700eacc8f2cdb3b85e8b5311420437bd" } } } diff --git a/modules/nf-core/bwamem2/mem/main.nf b/modules/nf-core/bwamem2/mem/main.nf index f8bad4b9..84b99dfa 100644 --- a/modules/nf-core/bwamem2/mem/main.nf +++ b/modules/nf-core/bwamem2/mem/main.nf @@ -25,7 +25,7 @@ process BWAMEM2_MEM { def prefix = task.ext.prefix ?: "${meta.id}" def samtools_command = sort_bam ? 'sort' : 'view' """ - INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` + INDEX=`find -L ./ -name "*.amb" | sed 's/\\.amb\$//'` bwa-mem2 \\ mem \\ diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 3bebb240..47fd0e58 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -21,9 +21,15 @@ process FASTQC { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + // Make list of old name and new name pairs to use for renaming in the bash while loop + def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } + def rename_to = old_new_pairs*.join(' ').join(' ') + def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') """ - printf "%s\\n" $reads | while read f; do [[ \$f =~ ^${prefix}.* ]] || ln -s \$f ${prefix}_\$f ; done - fastqc $args --threads $task.cpus ${prefix}* + printf "%s %s\\n" $rename_to | while read old_name new_name; do + [ -f "\${new_name}" ] || ln -s \$old_name \$new_name + done + fastqc $args --threads $task.cpus $renamed_files cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/gatk4/mergevcfs/main.nf b/modules/nf-core/gatk4/mergevcfs/main.nf index 0b065b5b..08fb3969 100644 --- a/modules/nf-core/gatk4/mergevcfs/main.nf +++ b/modules/nf-core/gatk4/mergevcfs/main.nf @@ -9,7 +9,7 @@ process GATK4_MERGEVCFS { input: tuple val(meta), path(vcf) - path dict + tuple val(meta2), path(dict) output: tuple val(meta), path('*.vcf.gz'), emit: vcf diff --git a/modules/nf-core/gatk4/mergevcfs/meta.yml b/modules/nf-core/gatk4/mergevcfs/meta.yml index 3ebce0b9..db8c4cb0 100644 --- a/modules/nf-core/gatk4/mergevcfs/meta.yml +++ b/modules/nf-core/gatk4/mergevcfs/meta.yml @@ -23,13 +23,16 @@ input: type: list description: Two or more VCF files pattern: "*.{vcf,vcf.gz}" + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome'] - ref_dict: type: file description: Optional Sequence Dictionary as input pattern: "*.dict" - - use_ref_dict: - type: boolean - description: Specify whether or not to use a given reference dictionary + output: - vcf: type: file diff --git a/modules/nf-core/picard/collecthsmetrics/main.nf b/modules/nf-core/picard/collecthsmetrics/main.nf index 6cc04dbf..d2414cc6 100644 --- a/modules/nf-core/picard/collecthsmetrics/main.nf +++ b/modules/nf-core/picard/collecthsmetrics/main.nf @@ -8,9 +8,9 @@ process PICARD_COLLECTHSMETRICS { 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: - tuple val(meta), path(bam) - path fasta - path fai + tuple val(meta), path(bam), path(bai) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) path bait_intervals path target_intervals diff --git a/modules/nf-core/picard/collecthsmetrics/meta.yml b/modules/nf-core/picard/collecthsmetrics/meta.yml index dc9d647a..7e045c05 100644 --- a/modules/nf-core/picard/collecthsmetrics/meta.yml +++ b/modules/nf-core/picard/collecthsmetrics/meta.yml @@ -26,14 +26,28 @@ input: e.g. [ id:'test', single_end:false ] - bam: type: file - description: An aligned BAM/SAM file - pattern: "*.{bam,sam}" + description: An aligned BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: Optional aligned BAM/CRAM/SAM file index + pattern: "*.{bai,crai,sai}" + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] - fasta: type: file description: | A reference file to calculate dropout metrics measuring reduced representation of reads. Optional input. - pattern: "*.fasta" + pattern: "*.{fa,fasta,fna}" + - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] - fai: type: file description: Index of FASTA file. Only needed when fasta is supplied. diff --git a/modules/nf-core/picard/collectmultiplemetrics/main.nf b/modules/nf-core/picard/collectmultiplemetrics/main.nf index 63f4e872..6f5e6f1e 100644 --- a/modules/nf-core/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/picard/collectmultiplemetrics/main.nf @@ -8,9 +8,9 @@ process PICARD_COLLECTMULTIPLEMETRICS { 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: - tuple val(meta), path(bam) - path fasta - path fai + tuple val(meta) , path(bam), path(bai) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) output: tuple val(meta), path("*_metrics"), emit: metrics diff --git a/modules/nf-core/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/picard/collectmultiplemetrics/meta.yml index c11b02cf..22656080 100644 --- a/modules/nf-core/picard/collectmultiplemetrics/meta.yml +++ b/modules/nf-core/picard/collectmultiplemetrics/meta.yml @@ -23,11 +23,25 @@ input: e.g. [ id:'test', single_end:false ] - bam: type: file - description: BAM file - pattern: "*.{bam}" + description: SAM/BAM/CRAM file + pattern: "*.{sam,bam,cram}" + - bai: + type: file + description: Optional SAM/BAM/CRAM file index + pattern: "*.{sai,bai,crai}" + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome'] - fasta: type: file description: Genome fasta file + - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome'] - fai: type: file description: Index of FASTA file. Only needed when fasta is supplied. diff --git a/modules/nf-core/svdb/merge/main.nf b/modules/nf-core/svdb/merge/main.nf index 477dbb0d..7dd92653 100644 --- a/modules/nf-core/svdb/merge/main.nf +++ b/modules/nf-core/svdb/merge/main.nf @@ -1,10 +1,10 @@ process SVDB_MERGE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.6.1 bioconda::samtools=1.15.1" : null) + conda (params.enable_conda ? "bioconda::svdb=2.8.1 bioconda::samtools=1.16.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:56d0a468970fbb474d92f0591abcf677757fb370-0': - 'quay.io/biocontainers/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:56d0a468970fbb474d92f0591abcf677757fb370-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:af6f8534cd538a85ff43a2eae1b52b143e7abd05-0': + 'quay.io/biocontainers/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:af6f8534cd538a85ff43a2eae1b52b143e7abd05-0' }" input: tuple val(meta), path(vcfs) diff --git a/modules/nf-core/svdb/query/main.nf b/modules/nf-core/svdb/query/main.nf index dbab5259..aee9aad1 100644 --- a/modules/nf-core/svdb/query/main.nf +++ b/modules/nf-core/svdb/query/main.nf @@ -2,10 +2,10 @@ process SVDB_QUERY { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.6.1" : null) + conda (params.enable_conda ? "bioconda::svdb=2.8.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/svdb:2.6.1--py39h5371cbf_0': - 'quay.io/biocontainers/svdb:2.6.1--py39h5371cbf_0' }" + 'https://depot.galaxyproject.org/singularity/svdb:2.8.1--py39h5371cbf_0': + 'quay.io/biocontainers/svdb:2.8.1--py39h5371cbf_0' }" input: tuple val(meta), path(vcf) @@ -16,7 +16,7 @@ process SVDB_QUERY { path (vcf_dbs) output: - tuple val(meta), path("*_query.vcf"), emit: vcf + tuple val(meta), path("*_query.vcf") , emit: vcf path "versions.yml" , emit: versions when: diff --git a/modules/nf-core/vcfanno/main.nf b/modules/nf-core/vcfanno/main.nf index 6f264af2..72a96490 100644 --- a/modules/nf-core/vcfanno/main.nf +++ b/modules/nf-core/vcfanno/main.nf @@ -10,10 +10,11 @@ process VCFANNO { input: tuple val(meta), path(vcf), path(tbi) path toml - path resource_dir + path lua + path resources output: - tuple val(meta), path("*_annotated.vcf"), emit: vcf + tuple val(meta), path("*.vcf"), emit: vcf path "versions.yml" , emit: versions when: @@ -22,15 +23,15 @@ process VCFANNO { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def lua_cmd = lua ? "--lua ${lua}" : "" """ - ln -sf $resource_dir/* \$(pwd) - vcfanno \\ -p $task.cpus \\ $args \\ + $lua \\ $toml \\ $vcf \\ - > ${prefix}_annotated.vcf + > ${prefix}.vcf cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -41,7 +42,7 @@ process VCFANNO { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_annotated.vcf + touch ${prefix}.vcf cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/vcfanno/meta.yml b/modules/nf-core/vcfanno/meta.yml index 1c6893ea..ea4dacce 100644 --- a/modules/nf-core/vcfanno/meta.yml +++ b/modules/nf-core/vcfanno/meta.yml @@ -14,7 +14,7 @@ tools: documentation: https://github.com/brentp/vcfanno#vcfanno tool_dev_url: https://github.com/brentp/vcfanno doi: "10.1186/s13059-016-0973-5" - licence: ["MIT"] + license: ["MIT"] input: - meta: @@ -32,14 +32,15 @@ input: pattern: "*.vcf.gz.tbi" - toml: type: file - description: configuration file + description: configuration file with reference file basenames pattern: "*.toml" - - resource_dir: + - lua: type: file - description: | - This directory contains referenced files in the TOML config, - and the corresponding indicies e.g. exac.vcf.gz + exac.vcf.gz.tbi, - with exception to the lua file. + description: Lua file for custom annotations + pattern: "*.lua" + - resources: + type: list + description: List of reference files defined in toml config, must also include indices. output: - meta: @@ -58,3 +59,4 @@ output: authors: - "@projectoriented" + - "@matthdsm" diff --git a/nextflow_schema.json b/nextflow_schema.json index 54bb1213..27efb54c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -297,6 +297,14 @@ "fa_icon": "fas fa-file-csv", "hidden": true }, + "vcfanno_lua": { + "type": "string", + "description": "Path to the vcfanno lua file.", + "pattern": "^\\S+\\.lua$", + "help_text": "Custom operations file (lua). For use when the built-in ops don't supply the needed reduction.", + "fa_icon": "fas fa-file-code", + "hidden": true + }, "vep_cache": { "type": "string", "description": "Path to vep's cache directory.", diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 1ae3259a..ad1d0c3c 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -11,9 +11,10 @@ workflow ANALYSE_MT { take: bam // channel: [ val(meta), file(bam), file(bai) ] genome_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] - genome_fasta_no_meta // channel: [ genome.fasta ] genome_fasta_meta // channel: [ [], genome.fasta ] - genome_dict // channel: [ genome.dict ] + genome_fasta_no_meta // channel: [ genome.fasta ] + genome_dict_meta // channel: [ genome.dict ] + genome_dict_no_meta // channel: [ genome.dict ] genome_fai // channel: [ genome.fai ] mt_intervals // channel: [ file(non_control_region.chrM.interval_list) ] shift_mt_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] @@ -31,7 +32,7 @@ workflow ANALYSE_MT { ch_versions = Channel.empty() // STEP 1: PREPARING MT ALIGNMENT - CONVERT_MT_BAM_TO_FASTQ ( bam , genome_fasta_meta, genome_fai, genome_dict, ) + CONVERT_MT_BAM_TO_FASTQ ( bam , genome_fasta_meta, genome_fai, genome_dict_no_meta, ) ch_versions = ch_versions.mix(CONVERT_MT_BAM_TO_FASTQ.out.versions)// Outputs bam files //STEP 2.1: MT ALIGNMENT AND VARIANT CALLING @@ -40,7 +41,7 @@ workflow ANALYSE_MT { CONVERT_MT_BAM_TO_FASTQ.out.bam, genome_bwamem2_index, genome_fasta_no_meta, - genome_dict, + genome_dict_no_meta, genome_fai, mt_intervals ) @@ -60,7 +61,7 @@ workflow ANALYSE_MT { // STEP 2.3: PICARD_LIFTOVERVCF PICARD_LIFTOVERVCF ( ALIGN_AND_CALL_MT_SHIFT.out.vcf, - genome_dict, + genome_dict_no_meta, shift_mt_backchain, genome_fasta_no_meta) ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions.first()) @@ -70,7 +71,8 @@ workflow ANALYSE_MT { ALIGN_AND_CALL_MT.out.vcf, PICARD_LIFTOVERVCF.out.vcf_lifted, genome_fasta_no_meta, - genome_dict, + genome_dict_meta, + genome_dict_no_meta, genome_fai, vep_genome, vep_cache_version, diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 4f1bfb6a..52fd683d 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -19,6 +19,7 @@ workflow ANNOTATE_SNVS { take: vcf vcfanno_resource_dir + vcfanno_lua vcfanno_toml vep_genome vep_cache_version @@ -31,6 +32,7 @@ workflow ANNOTATE_SNVS { main: ch_versions = Channel.empty() ch_toml = Channel.fromPath(vcfanno_toml) + ch_lua = Channel.fromPath(vcfanno_lua) ch_vcf_scatter_in = Channel.empty() ch_vep_in = Channel.empty() @@ -71,7 +73,7 @@ workflow ANNOTATE_SNVS { // // annotate vcfanno // - VCFANNO (ZIP_TABIX_ROHCALL.out.gz_tbi, ch_toml, vcfanno_resource_dir) + VCFANNO (ZIP_TABIX_ROHCALL.out.gz_tbi, ch_toml, ch_lua, vcfanno_resource_dir) ch_versions = ch_versions.mix(VCFANNO.out.versions) ZIP_TABIX_VCFANNO (VCFANNO.out.vcf) diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 15adaba5..7946f681 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -17,15 +17,16 @@ include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../. workflow MERGE_ANNOTATE_MT { take: - vcf1 // channel: [ val(meta), path('*.vcf.gz') ] - vcf2 // channel: [ val(meta), path('*.vcf.gz') ] - genome_fasta // channel: [ genome.fasta ] - genome_dict // channel: [ genome.dict ] - genome_fai // channel: [ genome.fai ] + vcf1 // channel: [ val(meta), path('*.vcf.gz') ] + vcf2 // channel: [ val(meta), path('*.vcf.gz') ] + genome_fasta // channel: [ genome.fasta ] + genome_dict_meta // channel: [ genome.dict ] + genome_dict_no_meta // channel: [ genome.dict ] + genome_fai // channel: [ genome.fai ] vep_genome vep_cache_version vep_cache - case_info // channel: [ val(case_info) ] + case_info // channel: [ val(case_info) ] main: ch_versions = Channel.empty() @@ -36,7 +37,7 @@ workflow MERGE_ANNOTATE_MT { [meta, [vcf1, vcf2]] } - GATK4_MERGEVCFS_LIFT_UNLIFT_MT( ch_vcfs, genome_dict) + GATK4_MERGEVCFS_LIFT_UNLIFT_MT( ch_vcfs, genome_dict_meta) ch_versions = ch_versions.mix(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.versions.first()) // Filtering Variants @@ -44,7 +45,7 @@ workflow MERGE_ANNOTATE_MT { GATK4_VARIANTFILTRATION_MT(ch_filt_vcf, genome_fasta, genome_fai, - genome_dict ) + genome_dict_no_meta ) ch_versions = ch_versions.mix(GATK4_VARIANTFILTRATION_MT.out.versions.first()) // Spliting multiallelic calls diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index d3186d7f..e998e750 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -108,6 +108,7 @@ workflow PREPARE_REFERENCES { gnomad_vcf = CHECK_VCF.out.vcf.collect() known_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect() sequence_dict = GATK_SD.out.dict.collect() + sequence_dict_meta = GATK_SD.out.dict.map {it -> [[id:it[0].simpleName], it]}.collect() sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict.collect() target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi).collect() target_intervals = GATK_BILT.out.interval_list.collect{it[1]}.collect() diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 550ed3e8..f19ff111 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -14,6 +14,7 @@ workflow QC_BAM { take: bam // channel: [ val(meta), path(bam) ] bai // channel: [ val(meta), path(bai) ] + bam_bai fasta // path: genome.fasta fai // path: genome.fasta.fai bait_intervals // path: bait.intervals_list @@ -24,11 +25,11 @@ workflow QC_BAM { ch_versions = Channel.empty() // COLLECT MULTIPLE METRICS - PICARD_COLLECTMULTIPLEMETRICS ( bam, fasta, fai ) + PICARD_COLLECTMULTIPLEMETRICS ( bam_bai, fasta, fai ) ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) // COLLECT HS METRICS - PICARD_COLLECTHSMETRICS ( bam, fasta, fai, bait_intervals, target_intervals ) + PICARD_COLLECTHSMETRICS ( bam_bai, fasta, fai, bait_intervals, target_intervals ) ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions.first()) // QUALIMAP BAMQC diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 1c1601e3..74d43281 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -44,6 +44,7 @@ def checkPathParamList = [ params.svdb_query_dbs, params.variant_catalog, params.vep_filters, + params.vcfanno_lua, params.vcfanno_resources, params.vcfanno_toml, params.vep_cache @@ -209,7 +210,7 @@ workflow RAREDISEASE { ch_genome_fai_no_meta = params.fasta_fai ? Channel.fromPath(params.fasta_fai).collect() : ( ch_references.fasta_fai ?: Channel.empty() ) ch_genome_fai_meta = params.fasta_fai ? Channel.fromPath(params.fasta_fai).map {it -> [[id:it[0].simpleName], it]}.collect() - : ( ch_references.fasta_fai_meta ?: Channel.empty() ) + : ( ch_references.fasta_fai_meta ?: Channel.empty() ) ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift).collect() : ( ch_references.fasta_fai_mt_shift ?: Channel.empty() ) ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx).collect() @@ -220,8 +221,10 @@ workflow RAREDISEASE { : Channel.value([]) ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi).collect() : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) - ch_sequence_dictionary = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).collect() + ch_sequence_dictionary_no_meta = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).collect() : ( ch_references.sequence_dict ?: Channel.empty() ) + ch_sequence_dictionary_meta = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).map {it -> [[id:it[0].simpleName], it]}.collect() + : ( ch_references.sequence_dict_meta ?: Channel.empty() ) ch_sequence_dictionary_mt_shift = params.mt_sequence_dictionary_shift ? Channel.fromPath(params.mt_sequence_dictionary_shift).collect() : ( ch_references.sequence_dict_mt_shift ?: Channel.empty() ) ch_target_bed = ch_references.target_bed @@ -230,9 +233,10 @@ workflow RAREDISEASE { : Channel.fromPath(params.vcfanno_resources).collect() ch_versions = ch_versions.mix(ch_references.versions) + ch_sequence_dictionary_meta.view() // CREATE CHROMOSOME BED AND INTERVALS SCATTER_GENOME ( - ch_sequence_dictionary, + ch_sequence_dictionary_no_meta, ch_genome_fai_meta, ch_genome_fai_no_meta, ch_genome_fasta_no_meta @@ -260,8 +264,9 @@ workflow RAREDISEASE { QC_BAM ( ch_mapped.marked_bam, ch_mapped.marked_bai, - ch_genome_fasta_no_meta, - ch_genome_fai_no_meta, + ch_mapped.bam_bai, + ch_genome_fasta_meta, + ch_genome_fai_meta, ch_bait_intervals, ch_target_intervals, ch_chrom_sizes @@ -315,7 +320,7 @@ workflow RAREDISEASE { file(params.gens_pon), file(params.gens_gnomad_pos), CHECK_INPUT.out.case_info, - ch_sequence_dictionary + ch_sequence_dictionary_no_meta ) ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) } @@ -328,7 +333,7 @@ workflow RAREDISEASE { params.vep_cache_version, ch_vep_cache, ch_genome_fasta_no_meta, - ch_sequence_dictionary + ch_sequence_dictionary_no_meta ).set {ch_sv_annotate} ch_versions = ch_versions.mix(ch_sv_annotate.versions) @@ -357,9 +362,10 @@ workflow RAREDISEASE { ANALYSE_MT ( ch_mapped.bam_bai, ch_bwamem2_index, - ch_genome_fasta_no_meta, ch_genome_fasta_meta, - ch_sequence_dictionary, + ch_genome_fasta_no_meta, + ch_sequence_dictionary_meta, + ch_sequence_dictionary_no_meta, ch_genome_fai_no_meta, ch_mt_intervals, ch_bwamem2_index_mt_shift, @@ -382,6 +388,7 @@ workflow RAREDISEASE { ANNOTATE_SNVS ( ch_vcf, ch_vcfanno_resources, + params.vcfanno_lua, params.vcfanno_toml, params.genome, params.vep_cache_version, From fb370fc84d5a0384f3518dcf431e03c275a2b783 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Dec 2022 00:12:24 +0100 Subject: [PATCH 0863/1169] update config --- conf/modules.config | 1 + workflows/raredisease.nf | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index b411785c..037cff3b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -736,6 +736,7 @@ process { process { withName: '.*ANNOTATE_SNVS:VCFANNO' { + ext.prefix = { "${meta.id}_vcfanno" } ext.when = { params.annotate_snv_switch } publishDir = [ path: { "${params.outdir}/snv_annotation" }, diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 74d43281..69630725 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -233,7 +233,6 @@ workflow RAREDISEASE { : Channel.fromPath(params.vcfanno_resources).collect() ch_versions = ch_versions.mix(ch_references.versions) - ch_sequence_dictionary_meta.view() // CREATE CHROMOSOME BED AND INTERVALS SCATTER_GENOME ( ch_sequence_dictionary_no_meta, From a5340e02c6f85daceec5c61a4bc376d657a26c26 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Dec 2022 02:54:42 +0100 Subject: [PATCH 0864/1169] vcfanno fix --- subworkflows/local/prepare_references.nf | 7 ------- workflows/raredisease.nf | 7 ++----- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index e998e750..2de97607 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -19,7 +19,6 @@ include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modul include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/tabix/tabix/main' include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/tabix/tabix/main' include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/tabix/tabix/main' -include { UNTAR as UNTAR_VCFANNO } from '../../modules/nf-core/untar/main' workflow PREPARE_REFERENCES { @@ -33,7 +32,6 @@ workflow PREPARE_REFERENCES { gnomad_vcf_in known_dbsnp target_bed - vcfanno_resources // [mandatory] vcfanno resource file main: ch_versions = Channel.empty() @@ -72,9 +70,6 @@ workflow PREPARE_REFERENCES { .set { ch_bait_intervals_cat_in } CAT_CAT_BAIT ( ch_bait_intervals_cat_in ) - // Untar vcfanno - UNTAR_VCFANNO ( vcfanno_resources ) - // Gather versions ch_versions = ch_versions.mix(BWA_INDEX.out.versions) ch_versions = ch_versions.mix(BWAMEM2_INDEX_GENOME.out.versions) @@ -92,7 +87,6 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(TABIX_PBT.out.versions) ch_versions = ch_versions.mix(GATK_BILT.out.versions) ch_versions = ch_versions.mix(GATK_ILT.out.versions) - ch_versions = ch_versions.mix(UNTAR_VCFANNO.out.versions) emit: bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() @@ -112,7 +106,6 @@ workflow PREPARE_REFERENCES { sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict.collect() target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi).collect() target_intervals = GATK_BILT.out.interval_list.collect{it[1]}.collect() - vcfanno_resources = UNTAR_VCFANNO.out.untar.map { id, resources -> [resources] }.collect() versions = ch_versions } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 69630725..c4ad6d44 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -168,7 +168,7 @@ workflow RAREDISEASE { : Channel.value([]) ch_variant_consequences = Channel.fromPath("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true).collect() - ch_vcfanno_resources_unprocessed = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).map{ it -> [[id:it[0].simpleName], it] }.collect() + ch_vcfanno_resources = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources+'/*').collect() : Channel.value([]) ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache).collect() : Channel.value([]) @@ -193,8 +193,7 @@ workflow RAREDISEASE { ch_gnomad_af_tab, ch_gnomad_vcf_unprocessed, ch_known_dbsnp, - ch_target_bed_unprocessed, - ch_vcfanno_resources_unprocessed + ch_target_bed_unprocessed ) .set { ch_references } @@ -229,8 +228,6 @@ workflow RAREDISEASE { : ( ch_references.sequence_dict_mt_shift ?: Channel.empty() ) ch_target_bed = ch_references.target_bed ch_target_intervals = ch_references.target_intervals - ch_vcfanno_resources = params.vcfanno_resources.endsWith('.tar.gz') ? ch_references.vcfanno_resources - : Channel.fromPath(params.vcfanno_resources).collect() ch_versions = ch_versions.mix(ch_references.versions) // CREATE CHROMOSOME BED AND INTERVALS From 67c5b5711b902cc8b3b5f519c7521b2e5fc43657 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:14:49 +0100 Subject: [PATCH 0865/1169] update vcfanno --- modules.json | 2 +- modules/nf-core/vcfanno/main.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index 90dd0004..27a894ab 100644 --- a/modules.json +++ b/modules.json @@ -263,7 +263,7 @@ }, "vcfanno": { "branch": "master", - "git_sha": "3a15c72f700eacc8f2cdb3b85e8b5311420437bd" + "git_sha": "2edbd10f12f7d3d681d2196707f15140d0e4d463" } } } diff --git a/modules/nf-core/vcfanno/main.nf b/modules/nf-core/vcfanno/main.nf index 72a96490..c8b432f6 100644 --- a/modules/nf-core/vcfanno/main.nf +++ b/modules/nf-core/vcfanno/main.nf @@ -14,8 +14,8 @@ process VCFANNO { path resources output: - tuple val(meta), path("*.vcf"), emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf") , emit: vcf + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -28,7 +28,7 @@ process VCFANNO { vcfanno \\ -p $task.cpus \\ $args \\ - $lua \\ + $lua_cmd \\ $toml \\ $vcf \\ > ${prefix}.vcf From 15efc7ee38af0374ea48be94aedc8d972fbcd76e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:22:59 +0100 Subject: [PATCH 0866/1169] remove vcfanno --- conf/modules.config | 10 ------ modules.json | 4 --- modules/nf-core/untar/main.nf | 64 ---------------------------------- modules/nf-core/untar/meta.yml | 40 --------------------- 4 files changed, 118 deletions(-) delete mode 100644 modules/nf-core/untar/main.nf delete mode 100644 modules/nf-core/untar/meta.yml diff --git a/conf/modules.config b/conf/modules.config index 037cff3b..9fdbdf90 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -150,16 +150,6 @@ process { ] } - withName: '.*PREPARE_REFERENCES:UNTAR_VCFANNO' { - ext.when = { params.vcfanno_resources && params.vcfanno_resources.endsWith('.tar.gz') } - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - ] - } - withName: '.*PREPARE_REFERENCES:TABIX_DBSNP' { ext.when = {params.known_dbsnp && !params.known_dbsnp_tbi} publishDir = [ diff --git a/modules.json b/modules.json index 27a894ab..519add00 100644 --- a/modules.json +++ b/modules.json @@ -257,10 +257,6 @@ "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" }, - "untar": { - "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" - }, "vcfanno": { "branch": "master", "git_sha": "2edbd10f12f7d3d681d2196707f15140d0e4d463" diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf deleted file mode 100644 index 71eea7b2..00000000 --- a/modules/nf-core/untar/main.nf +++ /dev/null @@ -1,64 +0,0 @@ -process UNTAR { - tag "$archive" - label 'process_single' - - conda (params.enable_conda ? "conda-forge::sed=4.7" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'ubuntu:20.04' }" - - input: - tuple val(meta), path(archive) - - output: - tuple val(meta), path("$untar"), emit: untar - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - untar = archive.toString() - '.tar.gz' - - """ - mkdir output - - ## Ensures --strip-components only applied when top level of tar contents is a directory - ## If just files or multiple directories, place all in output - if [[ \$(tar -tzf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then - tar \\ - -C output --strip-components 1 \\ - -xzvf \\ - $args \\ - $archive \\ - $args2 - else - tar \\ - -C output \\ - -xzvf \\ - $args \\ - $archive \\ - $args2 - fi - - mv output ${untar} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS - """ - - stub: - untar = archive.toString() - '.tar.gz' - """ - touch $untar - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml deleted file mode 100644 index ea7a3f38..00000000 --- a/modules/nf-core/untar/meta.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: untar -description: Extract files. -keywords: - - untar - - uncompress -tools: - - untar: - description: | - Extract tar.gz files. - documentation: https://www.gnu.org/software/tar/manual/ - licence: ["GPL-3.0-or-later"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - archive: - type: file - description: File to be untar - pattern: "*.{tar}.{gz}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - untar: - type: directory - description: Directory containing contents of archive - pattern: "*/" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@joseespinosa" - - "@drpatelh" - - "@matthdsm" - - "@jfy133" From 1dad1dc58d7f0ac67d28f3a57b05e1c9cab9a9f2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:26:46 +0100 Subject: [PATCH 0867/1169] fix CI --- conf/test.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/test.config b/conf/test.config index 17834747..de69c031 100644 --- a/conf/test.config +++ b/conf/test.config @@ -33,6 +33,7 @@ params { // Variant annotation vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_grch38_small_test.tar.gz' vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' + vcfanno_lua = "" target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' mt_intervals = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' From 0d2c69e1191729cb9bf24e1809a7071257492684 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:39:02 +0100 Subject: [PATCH 0868/1169] move channels around --- subworkflows/local/annotate_snvs.nf | 6 ++---- workflows/raredisease.nf | 8 ++++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 52fd683d..d2269f93 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -18,7 +18,7 @@ workflow ANNOTATE_SNVS { take: vcf - vcfanno_resource_dir + vcfanno_resources vcfanno_lua vcfanno_toml vep_genome @@ -31,8 +31,6 @@ workflow ANNOTATE_SNVS { main: ch_versions = Channel.empty() - ch_toml = Channel.fromPath(vcfanno_toml) - ch_lua = Channel.fromPath(vcfanno_lua) ch_vcf_scatter_in = Channel.empty() ch_vep_in = Channel.empty() @@ -73,7 +71,7 @@ workflow ANNOTATE_SNVS { // // annotate vcfanno // - VCFANNO (ZIP_TABIX_ROHCALL.out.gz_tbi, ch_toml, ch_lua, vcfanno_resource_dir) + VCFANNO (ZIP_TABIX_ROHCALL.out.gz_tbi, vcfanno_toml, vcfanno_lua, vcfanno_resources) ch_versions = ch_versions.mix(VCFANNO.out.versions) ZIP_TABIX_VCFANNO (VCFANNO.out.vcf) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c4ad6d44..2be1f5b9 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -170,6 +170,10 @@ workflow RAREDISEASE { ch_vcfanno_resources = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources+'/*').collect() : Channel.value([]) + ch_vcfanno_lua = params.vcfanno_lua ? Channel.fromPath(vcfanno_lua).collect() + : Channel.value([]) + ch_vcfanno_toml = params.vcfanno_toml ? Channel.fromPath(vcfanno_toml).collect() + : Channel.value([]) ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache).collect() : Channel.value([]) ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters).collect() @@ -384,8 +388,8 @@ workflow RAREDISEASE { ANNOTATE_SNVS ( ch_vcf, ch_vcfanno_resources, - params.vcfanno_lua, - params.vcfanno_toml, + ch_vcfanno_lua, + ch_vcfanno_toml, params.genome, params.vep_cache_version, ch_vep_cache, From 06e9beedf847505ec836cb7cff95243e2cc995cc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:42:25 +0100 Subject: [PATCH 0869/1169] fix ci error --- workflows/raredisease.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 2be1f5b9..99678bb1 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -170,9 +170,9 @@ workflow RAREDISEASE { ch_vcfanno_resources = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources+'/*').collect() : Channel.value([]) - ch_vcfanno_lua = params.vcfanno_lua ? Channel.fromPath(vcfanno_lua).collect() + ch_vcfanno_lua = params.vcfanno_lua ? Channel.fromPath(params.vcfanno_lua).collect() : Channel.value([]) - ch_vcfanno_toml = params.vcfanno_toml ? Channel.fromPath(vcfanno_toml).collect() + ch_vcfanno_toml = params.vcfanno_toml ? Channel.fromPath(params.vcfanno_toml).collect() : Channel.value([]) ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache).collect() : Channel.value([]) From a9935b8f038229071f22434fd8622a8787917b9b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Dec 2022 23:46:01 +0100 Subject: [PATCH 0870/1169] vcfanno fix --- conf/test.config | 2 +- nextflow_schema.json | 4 ++-- workflows/raredisease.nf | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/test.config b/conf/test.config index de69c031..a20cf450 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,7 +31,7 @@ params { variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' // Variant annotation - vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_grch38_small_test.tar.gz' + vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_resources.txt' vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' vcfanno_lua = "" target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' diff --git a/nextflow_schema.json b/nextflow_schema.json index 27efb54c..d35ae8b6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -284,8 +284,8 @@ }, "vcfanno_resources": { "type": "string", - "description": "Directory path or tar.gz archive that holds resources defined within the vcfanno toml file.", - "help_text": "If no directory path is passed, default configurations will be used according to genome build within the context of the pipeline.", + "description": "Text file containing the absolute paths to resources defined within the vcfanno toml file. One line per resource.", + "help_text": "If no file is passed, default configurations will be used according to genome build within the context of the pipeline.", "fa_icon": "fas fa-folder-open", "hidden": true }, diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 99678bb1..5957a410 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -168,7 +168,7 @@ workflow RAREDISEASE { : Channel.value([]) ch_variant_consequences = Channel.fromPath("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true).collect() - ch_vcfanno_resources = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources+'/*').collect() + ch_vcfanno_resources = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).splitText().map{it -> it.trim()}.collect() : Channel.value([]) ch_vcfanno_lua = params.vcfanno_lua ? Channel.fromPath(params.vcfanno_lua).collect() : Channel.value([]) From 43764ad996a9a89cfd15c71a8a0ce3cb4b91e6b0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 2 Dec 2022 04:25:07 +0100 Subject: [PATCH 0871/1169] format --- subworkflows/local/analyse_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index ad1d0c3c..b351476b 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -32,7 +32,7 @@ workflow ANALYSE_MT { ch_versions = Channel.empty() // STEP 1: PREPARING MT ALIGNMENT - CONVERT_MT_BAM_TO_FASTQ ( bam , genome_fasta_meta, genome_fai, genome_dict_no_meta, ) + CONVERT_MT_BAM_TO_FASTQ ( bam, genome_fasta_meta, genome_fai, genome_dict_no_meta ) ch_versions = ch_versions.mix(CONVERT_MT_BAM_TO_FASTQ.out.versions)// Outputs bam files //STEP 2.1: MT ALIGNMENT AND VARIANT CALLING From 63343f9e80523c9f629b9c72040a73dc6b454b2a Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 13:42:30 +0100 Subject: [PATCH 0872/1169] Fixed syntax --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index f592667b..6f1787e9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -487,6 +487,7 @@ process { } withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS' { + publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, From b8718180ddb88001b341138981b951068ab9f658 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 13:48:47 +0100 Subject: [PATCH 0873/1169] Fixed path to module --- subworkflows/local/qc_bam.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 8bd44117..23b34c05 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -8,8 +8,8 @@ include { QUALIMAP_BAMQC } from '../../m include { TIDDIT_COV } from '../../modules/nf-core/tiddit/cov/main' include { MOSDEPTH } from '../../modules/nf-core/mosdepth/main' include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/ucsc/wigtobigwig/main' -include { PICARD_COLLECTWGSMETRICS } from '../../modules/nf-core/modules/picard/collectwgsmetrics/main' -include { PICARD_COLLECTWGSMETRICS as PICARD_COLLECTWGSMETRICS_Y } from '../../modules/nf-core/modules/picard/collectwgsmetrics/main' +include { PICARD_COLLECTWGSMETRICS } from '../../modules/nf-core/picard/collectwgsmetrics/main' +include { PICARD_COLLECTWGSMETRICS as PICARD_COLLECTWGSMETRICS_Y } from '../../modules/nf-core/picard/collectwgsmetrics/main' include { SENTIEON_WGSMETRICSALGO as SENTIEON_WGSMETRICS } from '../../modules/local/sentieon/wgsmetricsalgo' include { SENTIEON_WGSMETRICSALGO as SENTIEON_WGSMETRICS_Y } from '../../modules/local/sentieon/wgsmetricsalgo' From b6886cf0b8e1d8550659f26bcb1cc52b2d533d45 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 14:11:29 +0100 Subject: [PATCH 0874/1169] Modified declaration of processes --- subworkflows/local/qc_bam.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 23b34c05..400cedb4 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -8,7 +8,7 @@ include { QUALIMAP_BAMQC } from '../../m include { TIDDIT_COV } from '../../modules/nf-core/tiddit/cov/main' include { MOSDEPTH } from '../../modules/nf-core/mosdepth/main' include { UCSC_WIGTOBIGWIG } from '../../modules/nf-core/ucsc/wigtobigwig/main' -include { PICARD_COLLECTWGSMETRICS } from '../../modules/nf-core/picard/collectwgsmetrics/main' +include { PICARD_COLLECTWGSMETRICS as PICARD_COLLECTWGSMETRICS } from '../../modules/nf-core/picard/collectwgsmetrics/main' include { PICARD_COLLECTWGSMETRICS as PICARD_COLLECTWGSMETRICS_Y } from '../../modules/nf-core/picard/collectwgsmetrics/main' include { SENTIEON_WGSMETRICSALGO as SENTIEON_WGSMETRICS } from '../../modules/local/sentieon/wgsmetricsalgo' include { SENTIEON_WGSMETRICSALGO as SENTIEON_WGSMETRICS_Y } from '../../modules/local/sentieon/wgsmetricsalgo' From e857a67c5baecc9907ef5affc620088bd6350d34 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 14:14:55 +0100 Subject: [PATCH 0875/1169] Added interval files --- conf/test.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/test.config b/conf/test.config index a20cf450..41e4a2a4 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,6 +26,8 @@ params { // Genome references fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' mt_fasta_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' + intervals_wgs = '${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list' + intervals_y = '${projectDir}/assets/chrY_grch38.interval_list' // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' From b01aedd2612e3e7e2f453b0170106394200d6be6 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 14:29:37 +0100 Subject: [PATCH 0876/1169] Added params --- workflows/raredisease.nf | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5957a410..c9634655 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -23,6 +23,8 @@ def checkPathParamList = [ params.gnomad_af_idx, params.gnomad_vcf, params.input, + params.intervals_wgs, + params.intervals_y, params.known_dbsnp, params.known_dbsnp_tbi, params.known_indels, @@ -142,6 +144,10 @@ workflow RAREDISEASE { : Channel.value([[],[]]) ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() : Channel.empty() + ch_intervals_wgs = params.interval_wgs ? Channel.fromPath(params.interval_wgs).collect() + : Channel.empty() + ch_intervals_y = params.interval_y ? Channel.fromPath(params.interval_y).collect() + : Channel.empty() ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() @@ -269,7 +275,10 @@ workflow RAREDISEASE { ch_genome_fai_meta, ch_bait_intervals, ch_target_intervals, - ch_chrom_sizes + ch_chrom_sizes, + ch_intervals_wgs, + ch_intervals_y, + params.aligner ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) From 22e35fddf2592ab19b8517efaf554edf4d24a669 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 14:30:45 +0100 Subject: [PATCH 0877/1169] Fixed typo --- workflows/raredisease.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c9634655..586b4e1b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -144,9 +144,9 @@ workflow RAREDISEASE { : Channel.value([[],[]]) ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() : Channel.empty() - ch_intervals_wgs = params.interval_wgs ? Channel.fromPath(params.interval_wgs).collect() + ch_intervals_wgs = params.intervals_wgs ? Channel.fromPath(params.intervals_wgs).collect() : Channel.empty() - ch_intervals_y = params.interval_y ? Channel.fromPath(params.interval_y).collect() + ch_intervals_y = params.intervals_y ? Channel.fromPath(params.intervals_y).collect() : Channel.empty() ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) From 939dcf7b2dd2dcb4ee3266e8e8adb6de0262c962 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 14:34:50 +0100 Subject: [PATCH 0878/1169] added interval file lists --- main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.nf b/main.nf index 5143e530..d617807c 100644 --- a/main.nf +++ b/main.nf @@ -26,6 +26,8 @@ params.call_interval = WorkflowMain.getGenomeAttribute(params, params.gnomad_af = WorkflowMain.getGenomeAttribute(params, 'gnomad_af') params.gnomad_af_idx = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_idx') params.gnomad_vcf = WorkflowMain.getGenomeAttribute(params, 'gnomad_vcf') +params.intervals_wgs = WorkflowMain.getGenomeAttribute(params, 'intervals_wgs') +params.intervals_y = WorkflowMain.getGenomeAttribute(params, 'intervals_y') params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') params.known_dbsnp_tbi = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp_tbi') params.known_indels = WorkflowMain.getGenomeAttribute(params, 'known_indels') From bd75c433a20a4297889ace684a3d6af01f1e889b Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 14:43:28 +0100 Subject: [PATCH 0879/1169] Changed syntax --- conf/test.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index 41e4a2a4..bde530bc 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,8 +26,8 @@ params { // Genome references fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' mt_fasta_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' - intervals_wgs = '${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list' - intervals_y = '${projectDir}/assets/chrY_grch38.interval_list' + intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" + intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" // Variant catalog file variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' From 110071d6f4e60b7156fff238f433a12c83d4dab4 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 14:50:19 +0100 Subject: [PATCH 0880/1169] Added interval files --- nextflow_schema.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index d35ae8b6..f5451d2f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -126,6 +126,22 @@ "pattern": "^\\S+\\.bed(\\.gz)?\\.idx$", "description": "Path to the index file for the gnomad tab file with allele frequencies.", "help_text": "Path to the index of gnomad tab file with CHR/START/REF,ALT/AF" + } + "intervals_wgs": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-file", + "pattern": "^\\S+\\.intervals?(_list)?$", + "description": "Path to the interval list of the genome (autosomes, sex chromosomes, and mitochondria).", + "help_text": "Path to the interval list of the genome. This is used to calculate genome-wide coverage statistics." + }, + "intervals_y": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-file", + "pattern": "^\\S+\\.intervals?(_list)?$", + "description": "Path to the interval list of the Y chromosome.", + "help_text": "Path to the interval list of the Y chromosome. This is used to calculate coverage statistics for the Y chromosome." }, "mt_intervals": { "type": "string", From b18e77ce3312d11d247b9f4a62111e4fe4626bfb Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 2 Dec 2022 14:53:51 +0100 Subject: [PATCH 0881/1169] Fixed syntax --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index f5451d2f..fc8cae4f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -126,7 +126,7 @@ "pattern": "^\\S+\\.bed(\\.gz)?\\.idx$", "description": "Path to the index file for the gnomad tab file with allele frequencies.", "help_text": "Path to the index of gnomad tab file with CHR/START/REF,ALT/AF" - } + }, "intervals_wgs": { "type": "string", "format": "path", From 8f9e18735350b2832eef983de3f717f4320f5330 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 2 Dec 2022 15:20:59 +0100 Subject: [PATCH 0882/1169] feat added test config with 2 samples --- .github/workflows/awstest.yml | 30 +++++++++++++++++++++++ conf/test2.config | 46 +++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 conf/test2.config diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 87d5182f..99d7b56d 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -27,3 +27,33 @@ jobs: with: name: Tower debug log file path: tower_action_*.log + +name: nf-core AWS test 2 samples +# This workflow can be triggered manually with the GitHub actions workflow dispatch button. +# It runs the -profile 'test2' on AWS batch + +on: + workflow_dispatch: +jobs: + run-tower: + name: Run AWS tests 2 samples + if: github.repository == 'nf-core/raredisease' + runs-on: ubuntu-latest + steps: + # Launch workflow using Tower CLI tool action + - name: Launch workflow via tower + uses: nf-core/tower-action@v3 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test-${{ github.sha }}" + } + profiles: test2,aws_tower + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log \ No newline at end of file diff --git a/conf/test2.config b/conf/test2.config new file mode 100644 index 00000000..54e98638 --- /dev/null +++ b/conf/test2.config @@ -0,0 +1,46 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running minimal tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a fast and simple pipeline test. + + Use as follows: + nextflow run nf-core/raredisease -profile test2, --outdir + +---------------------------------------------------------------------------------------- +*/ + +params { + config_profile_name = 'Test profile 2 samples' + config_profile_description = 'Minimal test dataset to check pipeline function' + + // Limit resources so that this can run on GitHub Actions + max_cpus = 2 + max_memory = '6.GB' + max_time = '2.h' + + // Input data + // TODO nf-core: Give any required params for the test so that command line flags are not needed + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_2_samples.csv' + + // Genome references + fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' + mt_fasta_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' + + // Variant catalog file + variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' + + // Variant annotation + vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_resources.txt' + vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' + vcfanno_lua = "" + target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' + + mt_intervals = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' + mt_intervals_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/control_region_shifted.chrM.interval_list' + mt_backchain_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' + + genome = 'GRCh38' + vep_cache_version = 107 +} + From 27e9ca0dc3fbefc59130b8fa3d98d9949e61dff4 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 2 Dec 2022 15:50:13 +0100 Subject: [PATCH 0883/1169] feat added aws test --- .github/workflows/awstest.yml | 30 ------------------------------ .github/workflows/awstest2.yml | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/awstest2.yml diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 99d7b56d..87d5182f 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -27,33 +27,3 @@ jobs: with: name: Tower debug log file path: tower_action_*.log - -name: nf-core AWS test 2 samples -# This workflow can be triggered manually with the GitHub actions workflow dispatch button. -# It runs the -profile 'test2' on AWS batch - -on: - workflow_dispatch: -jobs: - run-tower: - name: Run AWS tests 2 samples - if: github.repository == 'nf-core/raredisease' - runs-on: ubuntu-latest - steps: - # Launch workflow using Tower CLI tool action - - name: Launch workflow via tower - uses: nf-core/tower-action@v3 - with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} - parameters: | - { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test-${{ github.sha }}" - } - profiles: test2,aws_tower - - uses: actions/upload-artifact@v3 - with: - name: Tower debug log file - path: tower_action_*.log \ No newline at end of file diff --git a/.github/workflows/awstest2.yml b/.github/workflows/awstest2.yml new file mode 100644 index 00000000..11c87bde --- /dev/null +++ b/.github/workflows/awstest2.yml @@ -0,0 +1,30 @@ +name: nf-core AWS test 2 samples +# This workflow can be triggered manually with the GitHub actions workflow dispatch button. +# It runs the -profile 'test2' on AWS batch + +on: + workflow_dispatch: +jobs: + run-tower: + name: Run AWS tests 2 samples + if: github.repository == 'nf-core/raredisease' + runs-on: ubuntu-latest + steps: + # Launch workflow using Tower CLI tool action + - name: Launch workflow via tower + uses: nf-core/tower-action@v3 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test-${{ github.sha }}" + } + profiles: test2,aws_tower + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log + \ No newline at end of file From a528d185041aee2a9a69d4d5d5b5ca90a35963ff Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 2 Dec 2022 15:51:27 +0100 Subject: [PATCH 0884/1169] feat added aws test --- .github/workflows/awstest2.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/awstest2.yml b/.github/workflows/awstest2.yml index 11c87bde..bdd091a6 100644 --- a/.github/workflows/awstest2.yml +++ b/.github/workflows/awstest2.yml @@ -20,11 +20,10 @@ jobs: workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test2-${{ github.sha }}" } profiles: test2,aws_tower - uses: actions/upload-artifact@v3 with: name: Tower debug log file path: tower_action_*.log - \ No newline at end of file From 8b8c770b177bea41f5f88cc43162a5c9fcc9de50 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 2 Dec 2022 16:04:34 +0100 Subject: [PATCH 0885/1169] feat added aws test --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a64a034..086c44e2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,3 +37,4 @@ jobs: # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker -stub --outdir ./results + nextflow run ${GITHUB_WORKSPACE} -profile test2,docker -stub --outdir ./results2 From 55272f8eae2af800f5cc8a054ca6498885c87029 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 2 Dec 2022 16:12:14 +0100 Subject: [PATCH 0886/1169] feat added aws test --- .github/workflows/ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 086c44e2..e76fc7e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,4 +37,10 @@ jobs: # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker -stub --outdir ./results + + - name: Run pipeline with test data + # TODO nf-core: You can customise CI pipeline run tests as required + # For example: adding multiple test runs with different parameters + # Remember that you can parallelise this by using strategy.matrix + run: | nextflow run ${GITHUB_WORKSPACE} -profile test2,docker -stub --outdir ./results2 From 745c7c07ab9c34a73e122183f06887357495ecc1 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 2 Dec 2022 16:13:18 +0100 Subject: [PATCH 0887/1169] feat added aws test --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e76fc7e1..87c2c2f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker -stub --outdir ./results - - name: Run pipeline with test data + - name: Run pipeline with test data 2 samples # TODO nf-core: You can customise CI pipeline run tests as required # For example: adding multiple test runs with different parameters # Remember that you can parallelise this by using strategy.matrix From e997d7978bbc027b591577f8788e4d6081d6adaa Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 2 Dec 2022 16:20:38 +0100 Subject: [PATCH 0888/1169] bwa index fixes --- conf/modules.config | 13 +++++++++++-- modules/local/sentieon/bwamemindex.nf | 4 ++-- subworkflows/local/prepare_references.nf | 8 +++++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 61f269b7..f295063b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -91,7 +91,7 @@ process { } withName: '.*PREPARE_REFERENCES:BWA_INDEX' { - ext.when = {!params.bwa_index} + ext.when = {!params.bwa_index && params.aligner == "bwamem2"} publishDir = [ path: { "${params.outdir}/references" }, mode: 'copy', @@ -150,6 +150,16 @@ process { ] } + withName: '.*PREPARE_REFERENCES:UNTAR_VCFANNO' { + ext.when = { params.vcfanno_resources && params.vcfanno_resources.endsWith('.tar.gz') } + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + ] + } + withName: '.*PREPARE_REFERENCES:TABIX_DBSNP' { ext.when = {params.known_dbsnp && !params.known_dbsnp_tbi} publishDir = [ @@ -737,7 +747,6 @@ process { process { withName: '.*ANNOTATE_SNVS:VCFANNO' { - ext.prefix = { "${meta.id}_vcfanno" } ext.when = { params.annotate_snv_switch } publishDir = [ path: { "${params.outdir}/snv_annotation" }, diff --git a/modules/local/sentieon/bwamemindex.nf b/modules/local/sentieon/bwamemindex.nf index 2dae1b09..09d3eb1a 100644 --- a/modules/local/sentieon/bwamemindex.nf +++ b/modules/local/sentieon/bwamemindex.nf @@ -9,8 +9,8 @@ process SENTIEON_BWAINDEX { tuple val(meta), path(fasta) output: - tuple val(meta), path("bwa"), emit: index - path "versions.yml" , emit: versions + tuple val(meta), path("bwa/"), emit: index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 2de97607..13c5b413 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -37,12 +37,14 @@ workflow PREPARE_REFERENCES { ch_versions = Channel.empty() ch_tbi = Channel.empty() ch_bgzip_tbi = Channel.empty() + ch_bwa = Channel.empty() + ch_sentieonbwa= Channel.empty() // Genome indices - BWA_INDEX(fasta_meta) + BWA_INDEX(fasta_meta).index.set{ch_bwa} BWAMEM2_INDEX_GENOME(fasta_meta) BWAMEM2_INDEX_SHIFT_MT(mt_fasta_shift_meta) - SENTIEON_BWAINDEX(fasta_meta) + SENTIEON_BWAINDEX(fasta_meta).index.set{ch_sentieonbwa} SAMTOOLS_FAIDX_GENOME(fasta_meta) SAMTOOLS_FAIDX_SHIFT_MT(mt_fasta_shift_meta) GATK_SD(fasta_no_meta) @@ -90,7 +92,7 @@ workflow PREPARE_REFERENCES { emit: bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() - bwa_index = BWA_INDEX.out.index.collect() ?: SENTIEON_BWAINDEX.out.index.collect() + bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() From 5272c222c34b2a8660188da3508e133ebe343a5d Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 2 Dec 2022 16:34:55 +0100 Subject: [PATCH 0889/1169] removed untar_vcfanno module from modules config --- conf/modules.config | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f295063b..7442ee5f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -150,16 +150,6 @@ process { ] } - withName: '.*PREPARE_REFERENCES:UNTAR_VCFANNO' { - ext.when = { params.vcfanno_resources && params.vcfanno_resources.endsWith('.tar.gz') } - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - ] - } - withName: '.*PREPARE_REFERENCES:TABIX_DBSNP' { ext.when = {params.known_dbsnp && !params.known_dbsnp_tbi} publishDir = [ From 8d4db9068507ab8850a43d0d32e4f2c7e91cc4d4 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 2 Dec 2022 16:35:46 +0100 Subject: [PATCH 0890/1169] review suggestions --- nextflow.config | 4 ++-- subworkflows/local/call_snv.nf | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/nextflow.config b/nextflow.config index bcc8ef2c..fc1bf1e5 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,12 +13,12 @@ params { input = null // References - genome = 'GRCh37' + genome = 'GRCh38' igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false local_genomes = null save_reference = false - mt_contig_name = 'MT' + mt_contig_name = 'chrM' // Main options analysis_type = 'wgs' diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index 61d9c1c4..4d4475a6 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -27,8 +27,7 @@ workflow CALL_SNV { ch_vcf = CALL_SNV_DEEPVARIANT.out.vcf ch_tabix = CALL_SNV_DEEPVARIANT.out.tabix ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) - - } else if ( variant_caller == "sentieon" ) { + } else if ( variant_caller == "sentieon" ) { CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, call_interval, ml_model, case_info ) ch_vcf = CALL_SNV_SENTIEON.out.vcf ch_tabix = CALL_SNV_SENTIEON.out.tabix From 93b9bb5aed4ac3261617f2f4ffc63b647dbbb415 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 2 Dec 2022 16:38:03 +0100 Subject: [PATCH 0891/1169] fixes --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 7442ee5f..6e46b3c2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -737,6 +737,7 @@ process { process { withName: '.*ANNOTATE_SNVS:VCFANNO' { + ext.prefix = { "${meta.id}_vcfanno" } ext.when = { params.annotate_snv_switch } publishDir = [ path: { "${params.outdir}/snv_annotation" }, From 726c8be7592f9c6f320e0bb6c8d2a54a5c4f6c1b Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 2 Dec 2022 16:39:20 +0100 Subject: [PATCH 0892/1169] fixed spaces --- subworkflows/local/prepare_references.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 13c5b413..7c067b97 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -92,7 +92,7 @@ workflow PREPARE_REFERENCES { emit: bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() - bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() + bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() From caec1187e97480fd43b1f447709581b78f006bbb Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 4 Dec 2022 01:27:54 +0100 Subject: [PATCH 0893/1169] for local work --- subworkflows/local/align.nf | 30 +++++++--- subworkflows/local/alignment/align_bwamem2.nf | 44 +++++++------- .../local/alignment/align_sentieon.nf | 23 ++++---- subworkflows/local/analyse_MT.nf | 36 ++++++----- .../local/annotate_consequence_pli.nf | 11 ++-- subworkflows/local/annotate_snvs.nf | 59 +++++++------------ .../local/annotate_structural_variants.nf | 31 ++++------ subworkflows/local/call_repeat_expansions.nf | 7 ++- subworkflows/local/call_snv.nf | 40 +++++++++---- .../local/call_structural_variants.nf | 19 +++--- subworkflows/local/gens.nf | 11 ++-- .../local/mitochondria/align_and_call_MT.nf | 57 ++++++++---------- .../mitochondria/convert_mt_bam_to_fastq.nf | 5 +- .../local/mitochondria/merge_annotate_MT.nf | 28 ++++----- .../local/preprocessing/prepare_vcf.nf | 7 ++- subworkflows/local/qc_bam.nf | 44 ++++++-------- subworkflows/local/rank_variants.nf | 14 +++-- subworkflows/local/scatter_genome.nf | 3 +- .../variant_calling/call_cnv_cnvpytor.nf | 9 +-- .../variant_calling/call_snv_deepvariant.nf | 9 +-- .../variant_calling/call_snv_sentieon.nf | 7 ++- .../local/variant_calling/call_sv_manta.nf | 1 + .../local/variant_calling/call_sv_tiddit.nf | 3 +- workflows/raredisease.nf | 15 ++--- 24 files changed, 262 insertions(+), 251 deletions(-) diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index b8f9adc8..54bd2f24 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -20,18 +20,32 @@ workflow ALIGN { main: ch_versions = Channel.empty() - ALIGN_BWAMEM2 ( reads_input, index_bwamem2, fasta, fai, platform ) - ALIGN_SENTIEON ( reads_input, fasta, fai, index_bwa, known_dbsnp, known_dbsnp_tbi, platform ) + ALIGN_BWAMEM2 ( + reads_input, + index_bwamem2, + fasta, + fai, + platform + ) + + ALIGN_SENTIEON ( + reads_input, + fasta, + fai, + index_bwa, + known_dbsnp, + known_dbsnp_tbi, + platform + ) ch_marked_bam = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bam, ALIGN_SENTIEON.out.marked_bam) ch_marked_bai = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bai, ALIGN_SENTIEON.out.marked_bai) + ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) ch_versions = Channel.empty().mix(ALIGN_BWAMEM2.out.versions, ALIGN_SENTIEON.out.versions) - ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) - emit: - marked_bam = ch_marked_bam // channel: [ val(meta), [ marked_bam ] ] - marked_bai = ch_marked_bai // channel: [ val(meta), [ marked_bai ] ] - bam_bai = ch_bam_bai // channel: [ val(meta), [ marked_bam, marked_bai ] ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + marked_bam = ch_marked_bam + marked_bai = ch_marked_bai + bam_bai = ch_bam_bai + versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 3bb0c5a2..e6e288ec 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -23,47 +23,47 @@ workflow ALIGN_BWAMEM2 { // Map, sort, and index BWAMEM2_MEM ( reads_input, index, true ) - ch_versions = ch_versions.mix(BWAMEM2_MEM.out.versions.first()) SAMTOOLS_INDEX_ALIGN ( BWAMEM2_MEM.out.bam ) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX_ALIGN.out.versions.first()) - // Join the mapped bam + bai paths by their keys for stats // Get stats for each demultiplexed read pair. bam_sorted_indexed = BWAMEM2_MEM.out.bam.join(SAMTOOLS_INDEX_ALIGN.out.bai) SAMTOOLS_STATS ( bam_sorted_indexed, [] ) - ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions.first()) // Merge multiple lane samples and index BWAMEM2_MEM.out.bam - .map{ meta, bam -> - new_meta = meta.clone() // clone to avoid overriding the global meta - new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename - new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + platform + "\\tSM:" + new_meta.id + "\'" - [new_meta, bam]} // end the closure to return newly modified channel - .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] - .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list - single: it[1].size() == 1 - multiple: it[1].size() > 1 - } - .set{ bams } // create a new multi-channel named bams + .map{ meta, bam -> + new_meta = meta.clone() + new_meta.id = new_meta.id.split('_')[0] + new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + platform + "\\tSM:" + new_meta.id + "\'" + [new_meta, bam] + } + .groupTuple(by: 0) + .branch{ + single: it[1].size() == 1 + multiple: it[1].size() > 1 + } + .set{ bams } // If there are no samples to merge, skip the process SAMTOOLS_MERGE ( bams.multiple, fasta, fai ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) - ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions.first()) // Marking duplicates MARKDUPLICATES ( prepared_bam , fasta, fai ) SAMTOOLS_INDEX_MARKDUP ( MARKDUPLICATES.out.bam ) + + ch_versions = ch_versions.mix(BWAMEM2_MEM.out.versions.first()) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX_ALIGN.out.versions.first()) + ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions.first()) + ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions.first()) ch_versions = ch_versions.mix(MARKDUPLICATES.out.versions.first()) ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MARKDUP.out.versions.first()) emit: - stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] - metrics = MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] - marked_bam = MARKDUPLICATES.out.bam // channel: [ val(meta), [ marked_bam ] ] - marked_bai = SAMTOOLS_INDEX_MARKDUP.out.bai // channel: [ val(meta), [ marked_bai ] ] - - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + stats = SAMTOOLS_STATS.out.stats + metrics = MARKDUPLICATES.out.metrics + marked_bam = MARKDUPLICATES.out.bam + marked_bai = SAMTOOLS_INDEX_MARKDUP.out.bai + versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index 6c5914d9..e45cdbb5 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -26,18 +26,18 @@ workflow ALIGN_SENTIEON { ch_bqsr_csv = Channel.empty() SENTIEON_BWAMEM ( reads_input, fasta, fai, index ) - ch_versions = ch_versions.mix(SENTIEON_BWAMEM.out.versions.first()) SENTIEON_BWAMEM.out .bam .join(SENTIEON_BWAMEM.out.bai) .map{ meta, bam, bai -> - new_meta = meta.clone() // clone to avoid overriding the global meta - new_meta.id = new_meta.id.split('_')[0] // access the .id attribute of meta to split samplename_lane into samplename + new_meta = meta.clone() + new_meta.id = new_meta.id.split('_')[0] new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + platform + "\\tSM:" + new_meta.id + "\'" - [new_meta, bam, bai]} // end the closure to return newly modified channel - .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] - .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list + [new_meta, bam, bai] + } + .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] + .branch{ single: it[1].size() == 1 multiple: it[1].size() > 1 } @@ -45,11 +45,10 @@ workflow ALIGN_SENTIEON { SENTIEON_READWRITER (merge_bams_in.multiple) ch_bam_bai = merge_bams_in.single.mix(SENTIEON_READWRITER.out.bam_bai) + SENTIEON_DATAMETRICS (ch_bam_bai, fasta, fai ) - ch_versions = ch_versions.mix(SENTIEON_DATAMETRICS.out.versions.first()) SENTIEON_LOCUSCOLLECTOR ( ch_bam_bai ) - ch_versions = ch_versions.mix(SENTIEON_LOCUSCOLLECTOR.out.versions.first()) ch_bam_bai .join(SENTIEON_LOCUSCOLLECTOR.out.score) @@ -57,7 +56,6 @@ workflow ALIGN_SENTIEON { .set { ch_bam_bai_score } SENTIEON_DEDUP ( ch_bam_bai_score, fasta, fai ) - ch_versions = ch_versions.mix(SENTIEON_DEDUP.out.versions.first()) if (params.variant_caller == "sentieon") { SENTIEON_DEDUP.out.bam @@ -70,6 +68,11 @@ workflow ALIGN_SENTIEON { ch_versions = ch_versions.mix(SENTIEON_BQSR.out.versions.first()) } + ch_versions = ch_versions.mix(SENTIEON_BWAMEM.out.versions.first()) + ch_versions = ch_versions.mix(SENTIEON_DATAMETRICS.out.versions.first()) + ch_versions = ch_versions.mix(SENTIEON_LOCUSCOLLECTOR.out.versions.first()) + ch_versions = ch_versions.mix(SENTIEON_DEDUP.out.versions.first()) + emit: marked_bam = SENTIEON_DEDUP.out.bam marked_bai = SENTIEON_DEDUP.out.bai @@ -82,5 +85,5 @@ workflow ALIGN_SENTIEON { gc_summary = SENTIEON_DATAMETRICS.out.gc_summary.ifEmpty(null) aln_metrics = SENTIEON_DATAMETRICS.out.aln_metrics.ifEmpty(null) is_metrics = SENTIEON_DATAMETRICS.out.is_metrics.ifEmpty(null) - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index b351476b..d61fb852 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -31,11 +31,15 @@ workflow ANALYSE_MT { main: ch_versions = Channel.empty() - // STEP 1: PREPARING MT ALIGNMENT - CONVERT_MT_BAM_TO_FASTQ ( bam, genome_fasta_meta, genome_fai, genome_dict_no_meta ) - ch_versions = ch_versions.mix(CONVERT_MT_BAM_TO_FASTQ.out.versions)// Outputs bam files + // PREPARING READS FOR MT ALIGNMENT + CONVERT_MT_BAM_TO_FASTQ ( + bam, + genome_fasta_meta, + genome_fai, + genome_dict_no_meta + ) - //STEP 2.1: MT ALIGNMENT AND VARIANT CALLING + // MT ALIGNMENT AND VARIANT CALLING ALIGN_AND_CALL_MT ( CONVERT_MT_BAM_TO_FASTQ.out.fastq, CONVERT_MT_BAM_TO_FASTQ.out.bam, @@ -44,8 +48,7 @@ workflow ANALYSE_MT { genome_dict_no_meta, genome_fai, mt_intervals - ) - ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT.out.versions) + ) ALIGN_AND_CALL_MT_SHIFT ( CONVERT_MT_BAM_TO_FASTQ.out.fastq, @@ -55,18 +58,17 @@ workflow ANALYSE_MT { shift_mt_dict, shift_mt_fai, shift_mt_intervals - ) - ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT_SHIFT.out.versions) + ) - // STEP 2.3: PICARD_LIFTOVERVCF + // LIFTOVER VCF FROM REFERENCE MT TO SHIFTED MT PICARD_LIFTOVERVCF ( ALIGN_AND_CALL_MT_SHIFT.out.vcf, genome_dict_no_meta, shift_mt_backchain, - genome_fasta_no_meta) - ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions.first()) + genome_fasta_no_meta + ) - // STEP 3: MT MERGE AND ANNOTATE VARIANTS + // MT MERGE AND ANNOTATE VARIANTS MERGE_ANNOTATE_MT( ALIGN_AND_CALL_MT.out.vcf, PICARD_LIFTOVERVCF.out.vcf_lifted, @@ -77,7 +79,13 @@ workflow ANALYSE_MT { vep_genome, vep_cache_version, vep_cache, - case_info) + case_info + ) + + ch_versions = ch_versions.mix(CONVERT_MT_BAM_TO_FASTQ.out.versions) + ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT.out.versions) + ch_versions = ch_versions.mix(ALIGN_AND_CALL_MT_SHIFT.out.versions) + ch_versions = ch_versions.mix(PICARD_LIFTOVERVCF.out.versions.first()) ch_versions = ch_versions.mix(MERGE_ANNOTATE_MT.out.versions) emit: @@ -93,5 +101,5 @@ workflow ANALYSE_MT { html = ALIGN_AND_CALL_MT.out.html txt_sh = ALIGN_AND_CALL_MT_SHIFT.out.txt html_sh = ALIGN_AND_CALL_MT_SHIFT.out.html - versions = ch_versions // channel: [ versions.yml ] + versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/annotate_consequence_pli.nf b/subworkflows/local/annotate_consequence_pli.nf index 1913b1b6..a414516c 100644 --- a/subworkflows/local/annotate_consequence_pli.nf +++ b/subworkflows/local/annotate_consequence_pli.nf @@ -13,13 +13,10 @@ workflow ANNOTATE_CSQ_PLI { main: ch_versions = Channel.empty() - ADD_MOST_SEVERE_CSQ ( - vcf, - variant_consequences - ) - ADD_MOST_SEVERE_PLI ( - ADD_MOST_SEVERE_CSQ.out.vcf, - ) + ADD_MOST_SEVERE_CSQ (vcf, variant_consequences) + + ADD_MOST_SEVERE_PLI (ADD_MOST_SEVERE_CSQ.out.vcf) + ch_versions = ch_versions.mix(ADD_MOST_SEVERE_CSQ.out.versions) ch_versions = ch_versions.mix(ADD_MOST_SEVERE_PLI.out.versions) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 6bdcc77f..e4d22c7d 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -35,24 +35,9 @@ workflow ANNOTATE_SNVS { ch_vcf_scatter_in = Channel.empty() ch_vep_in = Channel.empty() - // - // annotate rhocall - // - vcf.map { meta, vcf, idx -> - return [ vcf, idx ] - } - .set { ch_roh_vcfs} - - samples - .branch { it -> - affected: it.phenotype == "2" - unaffected: it.phenotype == "1" - } - .set {ch_phenotype} - - ch_phenotype.affected - .combine(ch_roh_vcfs) - .set { ch_roh_input } + vcf.map { meta, vcf, idx -> return [vcf, idx] }.set { ch_roh_vcfs } + samples.map { it -> it.phenotype == "2" ?: it }.set { ch_phenotype } + ch_phenotype.affected.combine(ch_roh_vcfs).set { ch_roh_input } BCFTOOLS_ROH (ch_roh_input, gnomad_af, [], [], [], []) @@ -62,62 +47,60 @@ workflow ANNOTATE_SNVS { new_meta.id = meta.case_id return [new_meta, roh] } - .set { ch_roh_rhocall} + .set { ch_roh_rhocall } RHOCALL_ANNOTATE (vcf, ch_roh_rhocall, []) ZIP_TABIX_ROHCALL (RHOCALL_ANNOTATE.out.vcf) - ch_versions = ch_versions.mix(ZIP_TABIX_ROHCALL.out.versions) - // - // annotate vcfanno - // VCFANNO (ZIP_TABIX_ROHCALL.out.gz_tbi, vcfanno_toml, vcfanno_lua, vcfanno_resources) - ch_versions = ch_versions.mix(VCFANNO.out.versions) ZIP_TABIX_VCFANNO (VCFANNO.out.vcf) - ch_versions = ch_versions.mix(ZIP_TABIX_VCFANNO.out.versions) - BCFTOOLS_VIEW(ZIP_TABIX_VCFANNO.out.gz_tbi,[],[],[]).vcf.set { ch_vep_in } - ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) + BCFTOOLS_VIEW(ZIP_TABIX_VCFANNO.out.gz_tbi, [], [], []) // filter on frequencies TABIX_BCFTOOLS_VIEW (BCFTOOLS_VIEW.out.vcf) - ch_versions = ch_versions.mix(TABIX_BCFTOOLS_VIEW.out.versions) BCFTOOLS_VIEW.out.vcf.join(TABIX_BCFTOOLS_VIEW.out.tbi).collect().set { ch_vcf_scatter_in } GATK4_SELECTVARIANTS (ch_vcf_scatter_in.combine(split_intervals)).vcf.set { ch_vep_in } - ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions.first()) - // - // annotate vep - // - ENSEMBLVEP_SNV(ch_vep_in, + ENSEMBLVEP_SNV( + ch_vep_in, vep_genome, "homo_sapiens", vep_cache_version, vep_cache, fasta, [] - ) - ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions.first()) + ) ZIP_TABIX_VEP (ENSEMBLVEP_SNV.out.vcf) - ch_versions = ch_versions.mix(ZIP_TABIX_VEP.out.versions.first()) ZIP_TABIX_VEP.out.gz_tbi .groupTuple() .map { meta, vcfs, tbis -> def sortedvcfs = vcfs.sort() def sortedtbis = tbis.sort() - return [ meta, sortedvcfs, sortedtbis ] + return [ meta, sortedvcfs, sortedtbis ] } .set { ch_vep_ann } BCFTOOLS_CONCAT (ch_vep_ann) - ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) TABIX_BCFTOOLS_CONCAT (BCFTOOLS_CONCAT.out.vcf) + + ch_versions = ch_versions.mix(BCFTOOLS_RHO.out.versions) + ch_versions = ch_versions.mix(RHOCALL_ANNOTATE.out.versions) + ch_versions = ch_versions.mix(ZIP_TABIX_ROHCALL.out.versions) + ch_versions = ch_versions.mix(VCFANNO.out.versions) + ch_versions = ch_versions.mix(ZIP_TABIX_VCFANNO.out.versions) + ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) + ch_versions = ch_versions.mix(TABIX_BCFTOOLS_VIEW.out.versions) + ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions.first()) + ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions.first()) + ch_versions = ch_versions.mix(ZIP_TABIX_VEP.out.versions.first()) + ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) emit: diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 0d71639a..5f140508 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -32,40 +32,35 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { } .set { ch_svdb_dbs } - SVDB_QUERY(vcf, + SVDB_QUERY( + vcf, ch_svdb_dbs.in_occs.toList(), ch_svdb_dbs.in_frqs.toList(), ch_svdb_dbs.out_occs.toList(), ch_svdb_dbs.out_frqs.toList(), ch_svdb_dbs.vcf_dbs.toList() - ) - ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) - - PICARD_SORTVCF(SVDB_QUERY.out.vcf, - fasta, - seq_dict ) - ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) - PICARD_SORTVCF.out.vcf - .map { meta, vcf -> - return [meta,vcf,[]] - } - .set { ch_sortvcf } + PICARD_SORTVCF(SVDB_QUERY.out.vcf, fasta, seq_dict) - BCFTOOLS_VIEW(ch_sortvcf,[],[],[]) - ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) + PICARD_SORTVCF.out.vcf.map { meta, vcf -> return [meta,vcf,[]] }.set { ch_sortvcf } + + BCFTOOLS_VIEW(ch_sortvcf, [], [], []) - ENSEMBLVEP_SV(BCFTOOLS_VIEW.out.vcf, + ENSEMBLVEP_SV( + BCFTOOLS_VIEW.out.vcf, vep_genome, "homo_sapiens", vep_cache_version, vep_cache, fasta, [] - ) - ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) + ) + ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) + ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) + ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) + ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) emit: vcf_ann = ENSEMBLVEP_SV.out.vcf diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 3c551168..cca75d00 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -14,10 +14,11 @@ workflow CALL_REPEAT_EXPANSIONS { main: ch_versions = Channel.empty() - EXPANSIONHUNTER( bam, fasta, variant_catalog ) - ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions.first()) + EXPANSIONHUNTER (bam, fasta, variant_catalog) + + STRANGER (EXPANSIONHUNTER.out.vcf, variant_catalog) - STRANGER ( EXPANSIONHUNTER.out.vcf, variant_catalog ) + ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions.first()) ch_versions = ch_versions.mix(STRANGER.out.versions.first()) emit: diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index 4d4475a6..23e94ed0 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -21,26 +21,40 @@ workflow CALL_SNV { main: ch_versions = Channel.empty() + ch_vcf = Channel.empty() + ch_tabix = Channel.empty() - if (variant_caller == "deepvariant") { - CALL_SNV_DEEPVARIANT ( input, fasta, fai, case_info ) - ch_vcf = CALL_SNV_DEEPVARIANT.out.vcf - ch_tabix = CALL_SNV_DEEPVARIANT.out.tabix - ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) - } else if ( variant_caller == "sentieon" ) { - CALL_SNV_SENTIEON( input, fasta, fai, known_dbsnp, known_dbsnp_tbi, call_interval, ml_model, case_info ) - ch_vcf = CALL_SNV_SENTIEON.out.vcf - ch_tabix = CALL_SNV_SENTIEON.out.tabix - ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) - } else { - exit 1, 'Please provide a valid variant caller!' - } + CALL_SNV_DEEPVARIANT ( + input, + fasta, + fai, + case_info + ) + + CALL_SNV_SENTIEON( + input, + fasta, + fai, + known_dbsnp, + known_dbsnp_tbi, + call_interval, + ml_model, + case_info + ) + + ch_vcf = Channel.empty().mix(CALL_SNV_DEEPVARIANT.out.vcf, CALL_SNV_SENTIEON.out.vcf) + ch_tabix = Channel.empty().mix(CALL_SNV_DEEPVARIANT.out.tabix, CALL_SNV_SENTIEON.out.tabix) ch_vcf.join(ch_tabix) .map { meta, vcf, tbi -> return [meta, vcf, tbi, []]} .set { ch_selvar_in } + GATK4_SELECTVARIANTS(ch_selvar_in) + ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) + ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) + ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions) + emit: vcf = GATK4_SELECTVARIANTS.out.vcf tabix = GATK4_SELECTVARIANTS.out.tbi diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index 0b457b63..d77be31a 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -12,6 +12,7 @@ workflow CALL_STRUCTURAL_VARIANTS { take: bam // channel: [ val(meta), path(bam) ] bai // channel: [ val(meta), path(bai) ] + bam_bai // channel: [ val(meta), path(bam), path(bai) ] bwa_index // channel: [ val(meta), path(bwa_index)] fasta_no_meta // channel: [ path(genome.fasta) ] fasta_meta // channel: [ val(meta), path(genome.fasta) ] @@ -23,27 +24,21 @@ workflow CALL_STRUCTURAL_VARIANTS { main: ch_versions = Channel.empty() - //manta - CALL_SV_MANTA ( bam, bai, fasta_no_meta, fai, case_info, target_bed ) + CALL_SV_MANTA (bam, bai, fasta_no_meta, fai, case_info, target_bed) .diploid_sv_vcf .collect{it[1]} .set{ manta_vcf } - ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) - //tiddit - ch_tiddit_bam = bam.join(bai) - CALL_SV_TIDDIT ( ch_tiddit_bam, fasta_meta, bwa_index, case_info ) + CALL_SV_TIDDIT (bam_bai, fasta_meta, bwa_index, case_info) .vcf .collect{it[1]} .set { tiddit_vcf } - ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) //cnvpytor // CALL_CNV_CNVPYTOR ( bam, bai, case_info, cnvpytor_bins, fasta_no_meta, fai) // .candidate_cnvs_vcf // .collect{it[1]} // .set {cnvpytor_vcf } - // ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) // //merge // tiddit_vcf @@ -58,12 +53,16 @@ workflow CALL_STRUCTURAL_VARIANTS { .toList() .set { vcf_list } - case_info.combine(vcf_list) + case_info + .combine(vcf_list) .set { merge_input_vcfs } // SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta","cnvpytor"] ) - SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta"] ) + SVDB_MERGE (merge_input_vcfs, ["tiddit","manta"]) + ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) + ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) + // ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) emit: vcf = SVDB_MERGE.out.vcf diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 222600fb..dd63842d 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -21,13 +21,14 @@ workflow GENS { main: ch_versions = Channel.empty() - COLLECTREADCOUNTS ( bam, fasta, fai, seq_dict, interval_list ) - ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions.first()) + COLLECTREADCOUNTS (bam, fasta, fai, seq_dict, interval_list) - DENOISEREADCOUNTS ( COLLECTREADCOUNTS.out.read_counts, pon ) - ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions.first()) + DENOISEREADCOUNTS (COLLECTREADCOUNTS.out.read_counts, pon) + + GENS_GENERATE (DENOISEREADCOUNTS.out.standardized_read_counts, vcf.map { meta, vcf -> vcf }, gnomad_pos) - GENS_GENERATE ( DENOISEREADCOUNTS.out.standardized_read_counts, vcf.map { meta, vcf -> vcf }, gnomad_pos ) + ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions.first()) + ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions.first()) ch_versions = ch_versions.mix(GENS_GENERATE.out.versions.first()) emit: diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 83c065ba..22787366 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -27,55 +27,48 @@ workflow ALIGN_AND_CALL_MT { ch_versions = Channel.empty() // Outputs bam files - BWAMEM2_MEM_MT ( fastq , genome_index, true) - ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) - ch_mt_bam = BWAMEM2_MEM_MT.out.bam + BWAMEM2_MEM_MT (fastq , genome_index, true) + ch_mt_bam = BWAMEM2_MEM_MT.out.bam ch_fastq_ubam = ch_mt_bam.join(ubam, by: [0]) - // Merges bam files - GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, genome_fasta, genome_dict ) - ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) + GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, genome_fasta, genome_dict) - // Add read group to merged bam file - PICARD_ADDORREPLACEREADGROUPS_MT ( GATK4_MERGEBAMALIGNMENT_MT.out.bam ) - ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) + PICARD_ADDORREPLACEREADGROUPS_MT (GATK4_MERGEBAMALIGNMENT_MT.out.bam) - // Marks duplicates - PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam, genome_fasta, genome_fai ) - ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) + PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam, genome_fasta, genome_fai) - // Sort bam file SAMTOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) - ch_versions = ch_versions.mix(SAMTOOLS_SORT_MT.out.versions.first()) - // Index bam file SAMTOOLS_INDEX_MT(SAMTOOLS_SORT_MT.out.bam) - ch_sort_index_bam = SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) - ch_sort_index_bam_intervals_mt = ch_sort_index_bam.combine(intervals_mt) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MT.out.versions.first()) + ch_sort_index_bam = SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) + ch_sort_index_bam_int_mt = ch_sort_index_bam.combine(intervals_mt) - // Calls variants with Mutect2 - GATK4_MUTECT2_MT (ch_sort_index_bam_intervals_mt, genome_fasta, genome_fai, genome_dict, [], [], [],[]) - ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) + GATK4_MUTECT2_MT (ch_sort_index_bam_int_mt, genome_fasta, genome_fai, genome_dict, [], [], [],[]) // Haplocheck // TODO: probably it will be outside this subworkflow as we want to run // with the VCF with the variants from the shifted alignment (to solve the mt circularity issue) - HAPLOCHECK_MT ( GATK4_MUTECT2_MT.out.vcf ) - ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) + HAPLOCHECK_MT (GATK4_MUTECT2_MT.out.vcf) // Filter Mutect2 calls ch_mutect_vcf = GATK4_MUTECT2_MT.out.vcf.join(GATK4_MUTECT2_MT.out.tbi, by: [0]) ch_mutect_out = ch_mutect_vcf.join(GATK4_MUTECT2_MT.out.stats, by: [0]) - ch_to_filt = ch_mutect_out.map { - meta, vcf, tbi, stats -> - return [meta, vcf, tbi, stats, [], [], [], []]} - GATK4_FILTERMUTECTCALLS_MT( ch_to_filt, - genome_fasta, - genome_fai, - genome_dict ) - ch_versions = ch_versions.mix(GATK4_FILTERMUTECTCALLS_MT.out.versions.first()) + ch_to_filt = ch_mutect_out.map { + meta, vcf, tbi, stats -> + return [meta, vcf, tbi, stats, [], [], [], []] + } + + GATK4_FILTERMUTECTCALLS_MT (ch_to_filt, genome_fasta, genome_fai, genome_dict) + ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) + ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) + ch_versions = ch_versions.mix(PICARD_ADDORREPLACEREADGROUPS_MT.out.versions.first()) + ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES_MT.out.versions.first()) + ch_versions = ch_versions.mix(SAMTOOLS_SORT_MT.out.versions.first()) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MT.out.versions.first()) + ch_versions = ch_versions.mix(GATK4_MUTECT2_MT.out.versions.first()) + ch_versions = ch_versions.mix(HAPLOCHECK_MT.out.versions.first()) + ch_versions = ch_versions.mix(GATK4_FILTERMUTECTCALLS_MT.out.versions.first()) emit: vcf = GATK4_FILTERMUTECTCALLS_MT.out.vcf @@ -84,5 +77,5 @@ workflow ALIGN_AND_CALL_MT { filt_sats = GATK4_FILTERMUTECTCALLS_MT.out.stats txt = HAPLOCHECK_MT.out.txt html = HAPLOCHECK_MT.out.html - versions = ch_versions + versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf index 128b1e81..81de9d19 100644 --- a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf +++ b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf @@ -18,14 +18,15 @@ workflow CONVERT_MT_BAM_TO_FASTQ { // Outputs bam containing only MT GATK4_PRINTREADS_MT ( bam, genome_fasta_meta, genome_fai, genome_dict ) - ch_versions = ch_versions.mix(GATK4_PRINTREADS_MT.out.versions.first()) // Removes alignment information GATK4_REVERTSAM_MT ( GATK4_PRINTREADS_MT.out.bam ) - ch_versions = ch_versions.mix(GATK4_REVERTSAM_MT.out.versions.first()) // Outputs fastq files GATK4_SAMTOFASTQ_MT ( GATK4_REVERTSAM_MT.out.bam ) + + ch_versions = ch_versions.mix(GATK4_PRINTREADS_MT.out.versions.first()) + ch_versions = ch_versions.mix(GATK4_REVERTSAM_MT.out.versions.first()) ch_versions = ch_versions.mix(GATK4_SAMTOFASTQ_MT.out.versions.first()) emit: diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 7946f681..766ccef9 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -36,30 +36,21 @@ workflow MERGE_ANNOTATE_MT { .map{ meta, vcf1, vcf2 -> [meta, [vcf1, vcf2]] } - GATK4_MERGEVCFS_LIFT_UNLIFT_MT( ch_vcfs, genome_dict_meta) - ch_versions = ch_versions.mix(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.versions.first()) // Filtering Variants - ch_filt_vcf = GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.vcf.join(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.tbi, by:[0]) - GATK4_VARIANTFILTRATION_MT(ch_filt_vcf, - genome_fasta, - genome_fai, - genome_dict_no_meta ) - ch_versions = ch_versions.mix(GATK4_VARIANTFILTRATION_MT.out.versions.first()) + GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.vcf.join(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.tbi, by:[0]).set { ch_filt_vcf } + GATK4_VARIANTFILTRATION_MT (ch_filt_vcf, genome_fasta, genome_fai, genome_dict_no_meta) // Spliting multiallelic calls - ch_in_split = GATK4_VARIANTFILTRATION_MT.out.vcf.join(GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]) + GATK4_VARIANTFILTRATION_MT.out.vcf.join(GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]).set { ch_in_split } SPLIT_MULTIALLELICS_MT (ch_in_split, genome_fasta) - ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_MT.out.versions.first()) - TABIX_TABIX_MT(SPLIT_MULTIALLELICS_MT.out.vcf) - ch_in_remdup = SPLIT_MULTIALLELICS_MT.out.vcf.join(TABIX_TABIX_MT.out.tbi) // Removing duplicates and merging if there is more than one sample + SPLIT_MULTIALLELICS_MT.out.vcf.join(TABIX_TABIX_MT.out.tbi).set { ch_in_remdup } REMOVE_DUPLICATES_MT(ch_in_remdup, genome_fasta) TABIX_TABIX_MT2(REMOVE_DUPLICATES_MT.out.vcf) - ch_versions = ch_versions.mix(REMOVE_DUPLICATES_MT.out.versions.first()) REMOVE_DUPLICATES_MT.out.vcf .collect{it[1]} @@ -91,11 +82,9 @@ workflow MERGE_ANNOTATE_MT { genome_fasta, genome_fai) ch_merged_vcf = BCFTOOLS_MERGE_MT.out.merged_variants - ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) CHANGE_NAME_VCF_MT(ch_case_vcf.single) ch_vcf_changed_name = CHANGE_NAME_VCF_MT.out.file - ch_versions = ch_versions.mix(CHANGE_NAME_VCF_MT.out.versions) ch_in_vep = ch_merged_vcf.mix(ch_vcf_changed_name) @@ -111,11 +100,18 @@ workflow MERGE_ANNOTATE_MT { vep_cache, genome_fasta, []) - ch_versions = ch_versions.mix(ENSEMBLVEP_MT.out.versions) // Running haplogrep2 TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf_gz) HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") + + ch_versions = ch_versions.mix(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.versions.first()) + ch_versions = ch_versions.mix(GATK4_VARIANTFILTRATION_MT.out.versions.first()) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_MT.out.versions.first()) + ch_versions = ch_versions.mix(REMOVE_DUPLICATES_MT.out.versions.first()) + ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) + ch_versions = ch_versions.mix(CHANGE_NAME_VCF_MT.out.versions) + ch_versions = ch_versions.mix(ENSEMBLVEP_MT.out.versions) ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) emit: diff --git a/subworkflows/local/preprocessing/prepare_vcf.nf b/subworkflows/local/preprocessing/prepare_vcf.nf index 21876592..91293964 100644 --- a/subworkflows/local/preprocessing/prepare_vcf.nf +++ b/subworkflows/local/preprocessing/prepare_vcf.nf @@ -30,20 +30,21 @@ workflow CHECK_VCF { return [['id':id],filepath] } .set { ch_vcfs_norm } - ch_versions = ch_versions.mix(CHECK_INPUT_VCF.out.versions) SPLIT_MULTIALLELICS_PV (ch_vcfs_norm.unprocessed, fasta) - ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_PV.out.versions) REMOVE_DUPLICATES_PV (SPLIT_MULTIALLELICS_PV.out.vcf, fasta) .vcf .set { ch_vcfs_rmdup } - ch_versions = ch_versions.mix(REMOVE_DUPLICATES_PV.out.versions) vcf_out = ch_vcfs_rmdup.mix( ch_vcfs_norm.processed ) TABIX_PV (vcf_out) + ch_versions = ch_versions.mix(CHECK_INPUT_VCF.out.versions) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_PV.out.versions) + ch_versions = ch_versions.mix(REMOVE_DUPLICATES_PV.out.versions) + emit: vcf = vcf_out // path: normalized_vcf index = TABIX_PV.out.tbi diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index f19ff111..e21557f0 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -24,37 +24,31 @@ workflow QC_BAM { main: ch_versions = Channel.empty() - // COLLECT MULTIPLE METRICS - PICARD_COLLECTMULTIPLEMETRICS ( bam_bai, fasta, fai ) - ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) + PICARD_COLLECTMULTIPLEMETRICS (bam_bai, fasta, fai) - // COLLECT HS METRICS - PICARD_COLLECTHSMETRICS ( bam_bai, fasta, fai, bait_intervals, target_intervals ) - ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions.first()) + PICARD_COLLECTHSMETRICS (bam_bai, fasta, fai, bait_intervals, target_intervals) - // QUALIMAP BAMQC - gff = [] - QUALIMAP_BAMQC ( bam, gff ) - ch_versions = ch_versions.mix(QUALIMAP_BAMQC.out.versions.first()) + QUALIMAP_BAMQC (bam, []) + + TIDDIT_COV (bam, []) // 2nd pos. arg is req. only for cram input + + UCSC_WIGTOBIGWIG (TIDDIT_COV.out.wig, chrom_sizes) - // TIDDIT COVERAGE - TIDDIT_COV ( bam, [] ) // 2nd pos. arg is req. only for cram input - UCSC_WIGTOBIGWIG ( TIDDIT_COV.out.wig, chrom_sizes ) + MOSDEPTH (bam_bai, [], []) + + ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) + ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions.first()) + ch_versions = ch_versions.mix(QUALIMAP_BAMQC.out.versions.first()) ch_versions = ch_versions.mix(TIDDIT_COV.out.versions.first()) ch_versions = ch_versions.mix(UCSC_WIGTOBIGWIG.out.versions.first()) - - // MOSDEPTH - mosdepth_input_bams = bam.join(bai, by: [0]) - MOSDEPTH (mosdepth_input_bams,[],[]) ch_versions = ch_versions.mix(MOSDEPTH.out.versions.first()) emit: - multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] - hs_metrics = PICARD_COLLECTHSMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] - qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] - tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] - bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] - d4 = MOSDEPTH.out.per_base_d4 // channel: [ val(meta), path(*.d4) ] - - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics + hs_metrics = PICARD_COLLECTHSMETRICS.out.metrics + qualimap_results = QUALIMAP_BAMQC.out.results + tiddit_wig = TIDDIT_COV.out.wig + bigwig = UCSC_WIGTOBIGWIG.out.bw + d4 = MOSDEPTH.out.per_base_d4 + versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/rank_variants.nf b/subworkflows/local/rank_variants.nf index f7e821c0..7b13094d 100644 --- a/subworkflows/local/rank_variants.nf +++ b/subworkflows/local/rank_variants.nf @@ -19,15 +19,19 @@ workflow RANK_VARIANTS { ch_versions = Channel.empty() GENMOD_ANNOTATE(vcf) - ch_versions = ch_versions.mix(GENMOD_ANNOTATE.out.versions) + GENMOD_MODELS(GENMOD_ANNOTATE.out.vcf, ped, reduced_penetrance) - ch_versions = ch_versions.mix(GENMOD_MODELS.out.versions) + GENMOD_SCORE(GENMOD_MODELS.out.vcf, ped, score_config) - ch_versions = ch_versions.mix(GENMOD_SCORE.out.versions) + GENMOD_COMPOUND(GENMOD_SCORE.out.vcf) + + ch_versions = ch_versions.mix(GENMOD_ANNOTATE.out.versions) + ch_versions = ch_versions.mix(GENMOD_MODELS.out.versions) + ch_versions = ch_versions.mix(GENMOD_SCORE.out.versions) ch_versions = ch_versions.mix(GENMOD_COMPOUND.out.versions) emit: - vcf = GENMOD_COMPOUND.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf = GENMOD_COMPOUND.out.vcf + versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/scatter_genome.nf b/subworkflows/local/scatter_genome.nf index 2ae43b03..8adb7349 100644 --- a/subworkflows/local/scatter_genome.nf +++ b/subworkflows/local/scatter_genome.nf @@ -17,9 +17,10 @@ workflow SCATTER_GENOME { ch_versions = Channel.empty() BUILD_BED (fai_meta) - ch_versions = ch_versions.mix(BUILD_BED.out.versions) GATK4_SPLITINTERVALS(BUILD_BED.out.bed, fasta_no_meta, fai_no_meta, dict) + + ch_versions = ch_versions.mix(BUILD_BED.out.versions) ch_versions = ch_versions.mix(GATK4_SPLITINTERVALS.out.versions) emit: diff --git a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf index f956799a..38c420b2 100644 --- a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf +++ b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf @@ -22,16 +22,12 @@ workflow CALL_CNV_CNVPYTOR { ch_versions = Channel.empty() GENERATE_PYTOR(bam.join(bai, by: [0]), fasta, fai) - ch_versions = ch_versions.mix(GENERATE_PYTOR.out.versions.first()) HISTOGRAMS(GENERATE_PYTOR.out.pytor, binsizes) - ch_versions = ch_versions.mix(HISTOGRAMS.out.versions.first()) PARTITIONS(HISTOGRAMS.out.pytor, binsizes) - ch_versions = ch_versions.mix(PARTITIONS.out.versions.first()) CALL_CNVS(PARTITIONS.out.pytor, binsizes) - ch_versions = ch_versions.mix(CALL_CNVS.out.versions.first()) CALL_CNVS.out .pytor @@ -44,6 +40,11 @@ workflow CALL_CNV_CNVPYTOR { .set { ch_pytor } VIEW(ch_pytor, binsizes, "vcf") + + ch_versions = ch_versions.mix(GENERATE_PYTOR.out.versions.first()) + ch_versions = ch_versions.mix(HISTOGRAMS.out.versions.first()) + ch_versions = ch_versions.mix(PARTITIONS.out.versions.first()) + ch_versions = ch_versions.mix(CALL_CNVS.out.versions.first()) ch_versions = ch_versions.mix(VIEW.out.versions.first()) emit: diff --git a/subworkflows/local/variant_calling/call_snv_deepvariant.nf b/subworkflows/local/variant_calling/call_snv_deepvariant.nf index 3fab61b6..e965ffe8 100644 --- a/subworkflows/local/variant_calling/call_snv_deepvariant.nf +++ b/subworkflows/local/variant_calling/call_snv_deepvariant.nf @@ -28,28 +28,29 @@ workflow CALL_SNV_DEEPVARIANT { .collect{it[1]} .toList() .set { file_list } - ch_versions = ch_versions.mix(DEEPVARIANT.out.versions.first()) case_info .combine(file_list) .set { ch_gvcfs } GLNEXUS ( ch_gvcfs ) - ch_versions = ch_versions.mix(GLNEXUS.out.versions) ch_split_multi_in = GLNEXUS.out.bcf .map{meta, bcf -> return [meta, bcf, []]} SPLIT_MULTIALLELICS_GL (ch_split_multi_in, fasta) - ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_GL.out.versions) ch_remove_dup_in = SPLIT_MULTIALLELICS_GL.out.vcf .map{meta, vcf -> return [meta, vcf, []]} REMOVE_DUPLICATES_GL (ch_remove_dup_in, fasta) - ch_versions = ch_versions.mix(REMOVE_DUPLICATES_GL.out.versions) TABIX_GL (REMOVE_DUPLICATES_GL.out.vcf) + + ch_versions = ch_versions.mix(DEEPVARIANT.out.versions.first()) + ch_versions = ch_versions.mix(GLNEXUS.out.versions) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_GL.out.versions) + ch_versions = ch_versions.mix(REMOVE_DUPLICATES_GL.out.versions) ch_versions = ch_versions.mix(TABIX_GL.out.versions) emit: diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 39d21c08..11e6ae17 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -26,7 +26,6 @@ workflow CALL_SNV_SENTIEON { SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, call_interval, ml_model ) ch_vcf = SENTIEON_DNASCOPE.out.vcf ch_index = SENTIEON_DNASCOPE.out.vcf_index - ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions.first()) if ( ml_model ) { @@ -60,6 +59,12 @@ workflow CALL_SNV_SENTIEON { REMOVE_DUPLICATES_SEN(ch_remove_dup_in, fasta) TABIX_SEN(REMOVE_DUPLICATES_SEN.out.vcf) + ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions.first()) + ch_versions = ch_versions.mix(BCFTOOLS_MERGE.out.versions.first()) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_SEN.out.versions.first()) + ch_versions = ch_versions.mix(REMOVE_DUPLICATES_SEN.out.versions.first()) + ch_versions = ch_versions.mix(TABIX_SEN.out.versions.first()) + emit: vcf = REMOVE_DUPLICATES_SEN.out.vcf tabix = TABIX_SEN.out.tbi diff --git a/subworkflows/local/variant_calling/call_sv_manta.nf b/subworkflows/local/variant_calling/call_sv_manta.nf index 6653aa4a..e1da4896 100644 --- a/subworkflows/local/variant_calling/call_sv_manta.nf +++ b/subworkflows/local/variant_calling/call_sv_manta.nf @@ -40,6 +40,7 @@ workflow CALL_SV_MANTA { .set { manta_input } MANTA ( manta_input, fasta, fai ) } + ch_versions = MANTA.out.versions emit: diff --git a/subworkflows/local/variant_calling/call_sv_tiddit.nf b/subworkflows/local/variant_calling/call_sv_tiddit.nf index 99094f1c..51d8f77c 100644 --- a/subworkflows/local/variant_calling/call_sv_tiddit.nf +++ b/subworkflows/local/variant_calling/call_sv_tiddit.nf @@ -14,7 +14,6 @@ workflow CALL_SV_TIDDIT { main: TIDDIT_SV ( bam, fasta, index ) - ch_versions = TIDDIT_SV.out.versions.first() TIDDIT_SV.out .vcf @@ -27,6 +26,8 @@ workflow CALL_SV_TIDDIT { .set { merge_input_vcfs } SVDB_MERGE_TIDDIT ( merge_input_vcfs, [] ) + + ch_versions = TIDDIT_SV.out.versions.first() ch_versions = ch_versions.mix(SVDB_MERGE_TIDDIT.out.versions) emit: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index d299fcd6..369b8db8 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -106,9 +106,6 @@ include { QC_BAM } from '../subworkflows/local/qc include { RANK_VARIANTS as RANK_VARIANTS_SNV } from '../subworkflows/local/rank_variants' include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/local/rank_variants' include { SCATTER_GENOME } from '../subworkflows/local/scatter_genome' -// -// SUBWORKFLOW: Consists entirely of nf-core/modules -// /* @@ -261,7 +258,7 @@ workflow RAREDISEASE { .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) - // STEP 1.5: BAM QUALITY CHECK + // BAM QUALITY CHECK QC_BAM ( ch_mapped.marked_bam, ch_mapped.marked_bai, @@ -274,7 +271,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) - // STEP 1.6: EXPANSIONHUNTER AND STRANGER + // EXPANSIONHUNTER AND STRANGER CALL_REPEAT_EXPANSIONS ( ch_mapped.bam_bai, ch_genome_fasta_no_meta, @@ -283,7 +280,6 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 2: VARIANT CALLING - // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV ( params.variant_caller, ch_mapped.bam_bai, @@ -300,6 +296,7 @@ workflow RAREDISEASE { CALL_STRUCTURAL_VARIANTS ( ch_mapped.marked_bam, ch_mapped.marked_bai, + ch_mapped.bam_bai, ch_bwa_index, ch_genome_fasta_no_meta, ch_genome_fasta_meta, @@ -310,7 +307,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) - // STEP 2.1: GENS + // GENS if (params.gens_switch) { GENS ( ch_mapped.bam_bai, @@ -382,7 +379,7 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) - // STEP 3: VARIANT ANNOTATION + // VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) if (params.annotate_snv_switch) { @@ -409,8 +406,8 @@ workflow RAREDISEASE { .concat(ANALYSE_MT.out.vcf) .groupTuple() .set { ch_merged_vcf } - ch_merged_vcf.join(ch_merged_tbi).set {ch_concat_in} + BCFTOOLS_CONCAT (ch_concat_in) ANN_CSQ_PLI_SNV ( BCFTOOLS_CONCAT.out.vcf, From b3f2d54dcabe915146f6005fe989889df13ae7b5 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 5 Dec 2022 15:34:01 +0100 Subject: [PATCH 0894/1169] fix add profile test2 --- conf/test2.config | 4 ++-- nextflow.config | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/test2.config b/conf/test2.config index 54e98638..17b7a014 100644 --- a/conf/test2.config +++ b/conf/test2.config @@ -1,8 +1,8 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running minimal tests + Nextflow config file for running minimal tests2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple pipeline test. + Defines input files and everything required to run a fast and simple pipeline test2. Use as follows: nextflow run nf-core/raredisease -profile test2, --outdir diff --git a/nextflow.config b/nextflow.config index fc1bf1e5..3b6d860e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -165,6 +165,7 @@ profiles { } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } + test2 { includeConfig 'conf/test2.config' } } // Load igenomes.config if required, else load custom genomes.config From 78386e27db2d30a524da77e4ff0a506e12412495 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 5 Dec 2022 16:02:12 +0100 Subject: [PATCH 0895/1169] feat modified PR checklist to add test with 2 samples --- .github/PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ac6e36cd..efb90dc3 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,6 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir -stub`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test2,docker --outdir -stub`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. From 8f981b59a516df7a35326eb07ee1b6a1f8488978 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 8 Dec 2022 13:13:10 +0000 Subject: [PATCH 0896/1169] Template update for nf-core/tools version 2.7.1 --- .devcontainer/devcontainer.json | 27 +++++++++++++ .gitattributes | 1 + .github/CONTRIBUTING.md | 16 ++++++++ .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/workflows/ci.yml | 8 +++- .github/workflows/fix-linting.yml | 6 +-- .github/workflows/linting.yml | 18 +++++---- .github/workflows/linting_comment.yml | 2 +- .prettierignore | 2 + CITATION.cff | 56 --------------------------- README.md | 4 +- assets/slackreport.json | 34 ++++++++++++++++ docs/usage.md | 24 +++++++----- lib/NfcoreSchema.groovy | 1 - lib/NfcoreTemplate.groovy | 41 +++++++++++++++----- lib/WorkflowMain.groovy | 18 ++++++--- modules.json | 9 +++-- modules/local/samplesheet_check.nf | 4 ++ nextflow.config | 12 ++++-- nextflow_schema.json | 8 +++- workflows/raredisease.nf | 11 +++--- 21 files changed, 193 insertions(+), 111 deletions(-) create mode 100644 .devcontainer/devcontainer.json delete mode 100644 CITATION.cff create mode 100644 assets/slackreport.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..ea27a584 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,27 @@ +{ + "name": "nfcore", + "image": "nfcore/gitpod:latest", + "remoteUser": "gitpod", + + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Set *default* container specific settings.json values on container create. + "settings": { + "python.defaultInterpreterPath": "/opt/conda/bin/python", + "python.linting.enabled": true, + "python.linting.pylintEnabled": true, + "python.formatting.autopep8Path": "/opt/conda/bin/autopep8", + "python.formatting.yapfPath": "/opt/conda/bin/yapf", + "python.linting.flake8Path": "/opt/conda/bin/flake8", + "python.linting.pycodestylePath": "/opt/conda/bin/pycodestyle", + "python.linting.pydocstylePath": "/opt/conda/bin/pydocstyle", + "python.linting.pylintPath": "/opt/conda/bin/pylint" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] + } + } +} diff --git a/.gitattributes b/.gitattributes index 050bb120..7a2dabc2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ *.config linguist-language=nextflow +*.nf.test linguist-language=nextflow modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 9d738778..47df952f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -101,3 +101,19 @@ If you are using a new feature from core Nextflow, you may bump the minimum requ ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). + +## GitHub Codespaces + +This repo includes a devcontainer configuration which will create a GitHub Codespaces for Nextflow development! This is an online developer environment that runs in your browser, complete with VSCode and a terminal. + +To get started: + +- Open the repo in [Codespaces](https://github.com/nf-core/raredisease/codespaces) +- Tools installed + - nf-core + - Nextflow + +Devcontainer specs: + +- [DevContainer config](.devcontainer/devcontainer.json) +- [Dockerfile](.devcontainer/Dockerfile) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index ab86047b..46af5c36 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -42,7 +42,7 @@ body: attributes: label: System information description: | - * Nextflow version _(eg. 21.10.3)_ + * Nextflow version _(eg. 22.10.1)_ * Hardware _(eg. HPC, Desktop, Cloud)_ * Executor _(eg. slurm, local, awsbatch)_ * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7028b89c..e83e7cfb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,10 @@ on: env: NXF_ANSI_LOG: false +concurrency: + group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" + cancel-in-progress: true + jobs: test: name: Run pipeline with test data @@ -20,11 +24,11 @@ jobs: strategy: matrix: NXF_VER: - - "21.10.3" + - "22.10.1" - "latest-everything" steps: - name: Check out pipeline code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Nextflow uses: nf-core/setup-nextflow@v1 diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 62912841..8ce8e1e1 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -24,7 +24,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 - name: Install Prettier run: npm install -g prettier @prettier/plugin-php @@ -34,9 +34,9 @@ jobs: id: prettier_status run: | if prettier --check ${GITHUB_WORKSPACE}; then - echo "::set-output name=result::pass" + echo "name=result::pass" >> $GITHUB_OUTPUT else - echo "::set-output name=result::fail" + echo "name=result::fail" >> $GITHUB_OUTPUT fi - name: Run 'prettier --write' diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 8a5ce69b..858d622e 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -4,6 +4,8 @@ name: nf-core linting # that the code meets the nf-core guidelines. on: push: + branches: + - dev pull_request: release: types: [published] @@ -12,9 +14,9 @@ jobs: EditorConfig: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -25,9 +27,9 @@ jobs: Prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 - name: Install Prettier run: npm install -g prettier @@ -38,7 +40,7 @@ jobs: PythonBlack: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Check code lints with Black uses: psf/black@stable @@ -69,12 +71,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Nextflow uses: nf-core/setup-nextflow@v1 - - uses: actions/setup-python@v3 + - uses: actions/setup-python@v4 with: python-version: "3.7" architecture: "x64" @@ -97,7 +99,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 04758f61..39635186 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -18,7 +18,7 @@ jobs: - name: Get PR number id: pr_number - run: echo "::set-output name=pr_number::$(cat linting-logs/PR_number.txt)" + run: echo "name=pr_number::$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment uses: marocchino/sticky-pull-request-comment@v2 diff --git a/.prettierignore b/.prettierignore index eb74a574..437d763d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,6 @@ email_template.html adaptivecard.json +slackreport.json .nextflow* work/ data/ @@ -8,3 +9,4 @@ results/ testing/ testing* *.pyc +bin/ diff --git a/CITATION.cff b/CITATION.cff deleted file mode 100644 index 017666c0..00000000 --- a/CITATION.cff +++ /dev/null @@ -1,56 +0,0 @@ -cff-version: 1.2.0 -message: "If you use `nf-core tools` in your work, please cite the `nf-core` publication" -authors: - - family-names: Ewels - given-names: Philip - - family-names: Peltzer - given-names: Alexander - - family-names: Fillinger - given-names: Sven - - family-names: Patel - given-names: Harshil - - family-names: Alneberg - given-names: Johannes - - family-names: Wilm - given-names: Andreas - - family-names: Garcia - given-names: Maxime Ulysse - - family-names: Di Tommaso - given-names: Paolo - - family-names: Nahnsen - given-names: Sven -title: "The nf-core framework for community-curated bioinformatics pipelines." -version: 2.4.1 -doi: 10.1038/s41587-020-0439-x -date-released: 2022-05-16 -url: https://github.com/nf-core/tools -prefered-citation: - type: article - authors: - - family-names: Ewels - given-names: Philip - - family-names: Peltzer - given-names: Alexander - - family-names: Fillinger - given-names: Sven - - family-names: Patel - given-names: Harshil - - family-names: Alneberg - given-names: Johannes - - family-names: Wilm - given-names: Andreas - - family-names: Garcia - given-names: Maxime Ulysse - - family-names: Di Tommaso - given-names: Paolo - - family-names: Nahnsen - given-names: Sven - doi: 10.1038/s41587-020-0439-x - journal: nature biotechnology - start: 276 - end: 278 - title: "The nf-core framework for community-curated bioinformatics pipelines." - issue: 3 - volume: 38 - year: 2020 - url: https://dx.doi.org/10.1038/s41587-020-0439-x diff --git a/README.md b/README.md index 726f259f..9f6ba61b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/raredisease/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A522.10.1-23aa62.svg)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -31,7 +31,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=22.10.1`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) (you can follow [this tutorial](https://singularity-tutorial.github.io/01-installation/)), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(you can use [`Conda`](https://conda.io/miniconda.html) both to install Nextflow itself and also to manage software within pipelines. Please only use it within pipelines as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_. diff --git a/assets/slackreport.json b/assets/slackreport.json new file mode 100644 index 00000000..043d02f2 --- /dev/null +++ b/assets/slackreport.json @@ -0,0 +1,34 @@ +{ + "attachments": [ + { + "fallback": "Plain-text summary of the attachment.", + "color": "<% if (success) { %>good<% } else { %>danger<%} %>", + "author_name": "sanger-tol/readmapping v${version} - ${runName}", + "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", + "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", + "fields": [ + { + "title": "Command used to launch the workflow", + "value": "```${commandLine}```", + "short": false + } + <% + if (!success) { %> + , + { + "title": "Full error message", + "value": "```${errorReport}```", + "short": false + }, + { + "title": "Pipeline configuration", + "value": "<% out << summary.collect{ k,v -> k == "hook_url" ? "_${k}_: (_hidden_)" : ( ( v.class.toString().contains('Path') || ( v.class.toString().contains('String') && v.contains('/') ) ) ? "_${k}_: `${v}`" : (v.class.toString().contains('DateTime') ? ("_${k}_: " + v.format(java.time.format.DateTimeFormatter.ofLocalizedDateTime(java.time.format.FormatStyle.MEDIUM))) : "_${k}_: ${v}") ) }.join(",\n") %>", + "short": false + } + <% } + %> + ], + "footer": "Completed at <% out << dateComplete.format(java.time.format.DateTimeFormatter.ofLocalizedDateTime(java.time.format.FormatStyle.MEDIUM)) %> (duration: ${duration})" + } + ] +} diff --git a/docs/usage.md b/docs/usage.md index 3b403ead..8ef28997 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -83,9 +83,9 @@ nextflow pull nf-core/raredisease It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. -First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest version number - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. +First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. -This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. +This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. ## Core Nextflow arguments @@ -95,7 +95,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. When using Biocontainers, most of these software packaging methods pull Docker containers from quay.io e.g [FastQC](https://quay.io/repository/biocontainers/fastqc) except for Singularity which directly downloads Singularity images via https hosted by the [Galaxy project](https://depot.galaxyproject.org/singularity/) and Conda which downloads and installs software locally from [Bioconda](https://bioconda.github.io/). +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -104,8 +104,11 @@ The pipeline also dynamically loads configurations from [https://github.com/nf-c Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! They are loaded in sequence, so later profiles can overwrite earlier profiles. -If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. +If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended, since it can lead to different results on different machines dependent on the computer enviroment. +- `test` + - A profile with a complete configuration for automated testing + - Includes links to test data so needs no other parameters - `docker` - A generic configuration profile to be used with [Docker](https://docker.com/) - `singularity` @@ -118,9 +121,6 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) - `conda` - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. -- `test` - - A profile with a complete configuration for automated testing - - Includes links to test data so needs no other parameters ### `-resume` @@ -169,8 +169,14 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` +#### For beginners + +A first step to bypass this error, you could try to increase the amount of CPUs, memory, and time for the whole pipeline. Therefor you can try to increase the resource for the parameters `--max_cpus`, `--max_memory`, and `--max_time`. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of rnaseq](https://nf-co.re/rnaseq/3.9/parameters) and scroll down to the `show hidden parameter` button to get the default value for `--max_memory`. In this case 128GB, you than can try to run your pipeline again with `--max_memory 200GB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. + +#### Advanced option on process level + To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). -We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/software/star/align/main.nf`. +We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. @@ -189,7 +195,7 @@ process { > > If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. -### Updating containers +### Updating containers (advanced users) The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index b3d092f8..33cd4f6e 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -46,7 +46,6 @@ class NfcoreSchema { 'quiet', 'syslog', 'v', - 'version', // Options for `nextflow run` command 'ansi', diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 27feb009..25a0a74a 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -32,6 +32,25 @@ class NfcoreTemplate { } } + // + // Generate version string + // + public static String version(workflow) { + String version_string = "" + + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string + } + // // Construct and send completion email // @@ -61,7 +80,7 @@ class NfcoreTemplate { misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp def email_fields = [:] - email_fields['version'] = workflow.manifest.version + email_fields['version'] = NfcoreTemplate.version(workflow) email_fields['runName'] = workflow.runName email_fields['success'] = workflow.success email_fields['dateComplete'] = workflow.complete @@ -146,10 +165,10 @@ class NfcoreTemplate { } // - // Construct and send adaptive card - // https://adaptivecards.io + // Construct and send a notification to a web server as JSON + // e.g. Microsoft Teams and Slack // - public static void adaptivecard(workflow, params, summary_params, projectDir, log) { + public static void IM_notification(workflow, params, summary_params, projectDir, log) { def hook_url = params.hook_url def summary = [:] @@ -170,7 +189,7 @@ class NfcoreTemplate { misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp def msg_fields = [:] - msg_fields['version'] = workflow.manifest.version + msg_fields['version'] = NfcoreTemplate.version(workflow) msg_fields['runName'] = workflow.runName msg_fields['success'] = workflow.success msg_fields['dateComplete'] = workflow.complete @@ -178,13 +197,16 @@ class NfcoreTemplate { msg_fields['exitStatus'] = workflow.exitStatus msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') msg_fields['errorReport'] = (workflow.errorReport ?: 'None') - msg_fields['commandLine'] = workflow.commandLine + msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") msg_fields['projectDir'] = workflow.projectDir msg_fields['summary'] = summary << misc_fields // Render the JSON template def engine = new groovy.text.GStringTemplateEngine() - def hf = new File("$projectDir/assets/adaptivecard.json") + // Different JSON depending on the service provider + // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format + def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" + def hf = new File("$projectDir/assets/${json_path}") def json_template = engine.createTemplate(hf).make(msg_fields) def json_message = json_template.toString() @@ -209,7 +231,7 @@ class NfcoreTemplate { if (workflow.stats.ignoredCount == 0) { log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" + log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" @@ -297,6 +319,7 @@ class NfcoreTemplate { // public static String logo(workflow, monochrome_logs) { Map colors = logColours(monochrome_logs) + String workflow_version = NfcoreTemplate.version(workflow) String.format( """\n ${dashedLine(monochrome_logs)} @@ -305,7 +328,7 @@ class NfcoreTemplate { ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} + ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} ${dashedLine(monochrome_logs)} """.stripIndent() ) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 967fdb63..d9c25b22 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -19,7 +19,7 @@ class WorkflowMain { } // - // Print help to screen if required + // Generate help string // public static String help(workflow, params, log) { def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" @@ -32,7 +32,7 @@ class WorkflowMain { } // - // Print parameter summary log to screen + // Generate parameter summary log string // public static String paramsSummaryLog(workflow, params, log) { def summary_log = '' @@ -53,15 +53,21 @@ class WorkflowMain { System.exit(0) } - // Validate workflow parameters via the JSON schema - if (params.validate_params) { - NfcoreSchema.validateParameters(workflow, params, log) + // Print workflow version and exit on --version + if (params.version) { + String workflow_version = NfcoreTemplate.version(workflow) + log.info "${workflow.manifest.name} ${workflow_version}" + System.exit(0) } // Print parameter summary log to screen - log.info paramsSummaryLog(workflow, params, log) + // Validate workflow parameters via the JSON schema + if (params.validate_params) { + NfcoreSchema.validateParameters(workflow, params, log) + } + // Check that a -profile or Nextflow config has been provided to run the pipeline NfcoreTemplate.checkConfigProvided(workflow, log) diff --git a/modules.json b/modules.json index 7f84be56..8e3ad86a 100644 --- a/modules.json +++ b/modules.json @@ -7,15 +7,18 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] } } } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index d2c6d889..47f5dddb 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,5 +1,6 @@ process SAMPLESHEET_CHECK { tag "$samplesheet" + label 'process_single' conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -13,6 +14,9 @@ process SAMPLESHEET_CHECK { path '*.csv' , emit: csv path "versions.yml", emit: versions + when: + task.ext.when == null || task.ext.when + script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ """ check_samplesheet.py \\ diff --git a/nextflow.config b/nextflow.config index 241cc210..b706fc57 100644 --- a/nextflow.config +++ b/nextflow.config @@ -35,6 +35,7 @@ params { monochrome_logs = false hook_url = null help = false + version = false validate_params = true show_hidden_params = false schema_ignore_params = 'genomes' @@ -81,6 +82,7 @@ profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { params.enable_conda = true + conda.enabled = true docker.enabled = false singularity.enabled = false podman.enabled = false @@ -89,6 +91,7 @@ profiles { } mamba { params.enable_conda = true + conda.enabled = true conda.useMamba = true docker.enabled = false singularity.enabled = false @@ -104,6 +107,9 @@ profiles { shifter.enabled = false charliecloud.enabled = false } + arm { + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + } singularity { singularity.enabled = true singularity.autoMounts = true @@ -185,11 +191,11 @@ dag { manifest { name = 'nf-core/raredisease' - author = 'Clinical Genomics Stockholm' + author = """Clinical Genomics Stockholm""" homePage = 'https://github.com/nf-core/raredisease' - description = 'call and score variants from WGS/WES of rare disease patients' + description = """call and score variants from WGS/WES of rare disease patients""" mainScript = 'main.nf' - nextflowVersion = '!>=21.10.3' + nextflowVersion = '!>=22.10.1' version = '1.0dev' doi = '' } diff --git a/nextflow_schema.json b/nextflow_schema.json index 37a6908b..2e1e7aa3 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -176,6 +176,12 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, + "version": { + "type": "boolean", + "description": "Display version and exit.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, "publish_dir_mode": { "type": "string", "default": "copy", @@ -217,7 +223,7 @@ "type": "string", "description": "Incoming hook URL for messaging service", "fa_icon": "fas fa-people-group", - "help_text": "Incoming hook URL for messaging service. Currently, only MS Teams is supported.", + "help_text": "Incoming hook URL for messaging service. Currently, MS Teams and Slack are supported.", "hidden": true }, "multiqc_config": { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 32fd703b..c8c9be6c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -82,7 +82,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(FASTQC.out.versions.first()) CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile(name: 'collated_versions.yml') + ch_versions.unique{ it.text }.collectFile(name: 'collated_versions.yml') ) // @@ -102,12 +102,11 @@ workflow RAREDISEASE { MULTIQC ( ch_multiqc_files.collect(), - ch_multiqc_config.collect().ifEmpty([]), - ch_multiqc_custom_config.collect().ifEmpty([]), - ch_multiqc_logo.collect().ifEmpty([]) + ch_multiqc_config.toList(), + ch_multiqc_custom_config.toList(), + ch_multiqc_logo.toList() ) multiqc_report = MULTIQC.out.report.toList() - ch_versions = ch_versions.mix(MULTIQC.out.versions) } /* @@ -122,7 +121,7 @@ workflow.onComplete { } NfcoreTemplate.summary(workflow, params, log) if (params.hook_url) { - NfcoreTemplate.adaptivecard(workflow, params, summary_params, projectDir, log) + NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) } } From afd9563b6f355b4f0c8f9c307b609623e17cc9aa Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 15 Dec 2022 13:46:11 +0100 Subject: [PATCH 0897/1169] linting --- modules.json | 196 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 124 insertions(+), 72 deletions(-) diff --git a/modules.json b/modules.json index 5484d16e..f7416d93 100644 --- a/modules.json +++ b/modules.json @@ -7,271 +7,323 @@ "nf-core": { "bcftools/concat": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "installed_by": ["modules"] }, "bcftools/merge": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "installed_by": ["modules"] }, "bcftools/norm": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "installed_by": ["modules"] }, "bcftools/roh": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "installed_by": ["modules"] }, "bcftools/view": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e" + "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "installed_by": ["modules"] }, "bwa/index": { "branch": "master", - "git_sha": "9518fa4f65f3fb8cde24fde7d40333b39ec8fd65" + "git_sha": "9518fa4f65f3fb8cde24fde7d40333b39ec8fd65", + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "bwamem2/mem": { "branch": "master", - "git_sha": "653588be2a4aadab487b530643dbc9baf7a485c4" + "git_sha": "653588be2a4aadab487b530643dbc9baf7a485c4", + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "cnvpytor/callcnvs": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "cnvpytor/histogram": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "cnvpytor/importreaddepth": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "cnvpytor/partition": { - "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" - }, - "cnvpytor/view": { - "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" - }, - "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", "installed_by": ["modules"] }, - "fastqc": { + "cnvpytor/view": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", "installed_by": ["modules"] }, - "multiqc": { + "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", "installed_by": ["modules"] - "git_sha": "8022c68e7403eecbd8ba9c49496f69f8c49d50f0" }, "deepvariant": { "branch": "master", - "git_sha": "6e58487f28429876b7cad237afbf4685e90c7bd4" + "git_sha": "6e58487f28429876b7cad237afbf4685e90c7bd4", + "installed_by": ["modules"] }, "expansionhunter": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "810e8f2603ec38401d49a4aaed06f6d058745552" + "git_sha": "810e8f2603ec38401d49a4aaed06f6d058745552", + "installed_by": ["modules"] }, "gatk4/bedtointervallist": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "installed_by": ["modules"] }, "gatk4/createsequencedictionary": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "installed_by": ["modules"] }, "gatk4/filtermutectcalls": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "installed_by": ["modules"] }, "gatk4/intervallisttools": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "installed_by": ["modules"] }, "gatk4/mergebamalignment": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "installed_by": ["modules"] }, "gatk4/mergevcfs": { "branch": "master", - "git_sha": "c25943553f62be5f907e3c12c42eaf0a1b40746d" + "git_sha": "c25943553f62be5f907e3c12c42eaf0a1b40746d", + "installed_by": ["modules"] }, "gatk4/mutect2": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "installed_by": ["modules"] }, "gatk4/printreads": { "branch": "master", - "git_sha": "6220bc7d99377159f4cc7f6a421b494f3e2466d6" + "git_sha": "6220bc7d99377159f4cc7f6a421b494f3e2466d6", + "installed_by": ["modules"] }, "gatk4/revertsam": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "installed_by": ["modules"] }, "gatk4/samtofastq": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67" + "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "installed_by": ["modules"] }, "gatk4/selectvariants": { "branch": "master", - "git_sha": "9b7ca0f32e122a0cd1f33689fafbad4112407b42" + "git_sha": "9b7ca0f32e122a0cd1f33689fafbad4112407b42", + "installed_by": ["modules"] }, "gatk4/splitintervals": { "branch": "master", - "git_sha": "f6ee593e77fbb9fb88e506b761611cccb0bf51ac" + "git_sha": "f6ee593e77fbb9fb88e506b761611cccb0bf51ac", + "installed_by": ["modules"] }, "gatk4/variantfiltration": { "branch": "master", - "git_sha": "c95bed5b125e90553814b8720875c8c663524619" + "git_sha": "c95bed5b125e90553814b8720875c8c663524619", + "installed_by": ["modules"] }, "genmod/annotate": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "installed_by": ["modules"] }, "genmod/compound": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "installed_by": ["modules"] }, "genmod/models": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "installed_by": ["modules"] }, "genmod/score": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "installed_by": ["modules"] }, "glnexus": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "haplocheck": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae" + "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "installed_by": ["modules"] }, "haplogrep2/classify": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "hmtnote": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "manta/germline": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "picard/addorreplacereadgroups": { "branch": "master", - "git_sha": "a50554f372baf3e079425e5d3ac4d09dc5ff8bc5" + "git_sha": "a50554f372baf3e079425e5d3ac4d09dc5ff8bc5", + "installed_by": ["modules"] }, "picard/collecthsmetrics": { "branch": "master", - "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2" + "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2", + "installed_by": ["modules"] }, "picard/collectmultiplemetrics": { "branch": "master", - "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2" + "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2", + "installed_by": ["modules"] }, "picard/liftovervcf": { "branch": "master", - "git_sha": "3d5d18db1b39e1133505ae2fa2a062b0073c8a6a" + "git_sha": "3d5d18db1b39e1133505ae2fa2a062b0073c8a6a", + "installed_by": ["modules"] }, "picard/markduplicates": { "branch": "master", - "git_sha": "eca65aa4a5e2e192ac44d6962c8f9260f314ffb8" + "git_sha": "eca65aa4a5e2e192ac44d6962c8f9260f314ffb8", + "installed_by": ["modules"] }, "picard/sortvcf": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "qualimap/bamqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "rhocall/annotate": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "installed_by": ["modules"] }, "samtools/index": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" + "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "installed_by": ["modules"] }, "stranger": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "svdb/merge": { "branch": "master", - "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7" + "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7", + "installed_by": ["modules"] }, "svdb/query": { "branch": "master", - "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7" + "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7", + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "tabix/tabix": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "tiddit/cov": { "branch": "master", - "git_sha": "3a54013f0790674624b77e9a074ce8d22400d4fa" + "git_sha": "3a54013f0790674624b77e9a074ce8d22400d4fa", + "installed_by": ["modules"] }, "tiddit/sv": { "branch": "master", - "git_sha": "89f98091ac9e1653657b9e324e394b158d723a4f" + "git_sha": "89f98091ac9e1653657b9e324e394b158d723a4f", + "installed_by": ["modules"] }, "ucsc/wigtobigwig": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] }, "vcfanno": { "branch": "master", - "git_sha": "2edbd10f12f7d3d681d2196707f15140d0e4d463" + "git_sha": "2edbd10f12f7d3d681d2196707f15140d0e4d463", + "installed_by": ["modules"] } } } From 70bb3eba4706ea06b99bd2f44b626c43ad35006f Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 15 Dec 2022 13:55:02 +0100 Subject: [PATCH 0898/1169] use dev version of nf-core tools --- .github/workflows/linting.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index c7f8f563..a74cead4 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -81,10 +81,11 @@ jobs: python-version: "3.7" architecture: "x64" + # FIXME: Remove this when nf-core modules lint stabilizes and install stable release - name: Install dependencies run: | python -m pip install --upgrade pip - pip install nf-core + python -m pip install --upgrade --force-reinstall git+https://github.com/nf-core/tools.git@dev - name: Run nf-core lint env: From 64e4286270ed881bb3077a5fca6a7f5c040f9e08 Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 15 Dec 2022 15:56:17 +0100 Subject: [PATCH 0899/1169] reverting the collect software version syntax --- workflows/raredisease.nf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 60c0c6ed..230b6246 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -437,8 +437,11 @@ workflow RAREDISEASE { // // MODULE: Pipeline reporting // + + // TODO The template v2.7.1 template update introduced: ch_versions.unique{ it.text }.collectFile(name: 'collated_versions.yml') + // This caused the pipeline to stall CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique{ it.text }.collectFile(name: 'collated_versions.yml') + ch_versions.unique().collectFile(name: 'collated_versions.yml') ) // From 88dd346469f56a3cbb4ed37c093331cb166a2b5e Mon Sep 17 00:00:00 2001 From: peterpru Date: Fri, 16 Dec 2022 11:00:00 +0100 Subject: [PATCH 0900/1169] initial commit add SMNCopyNumberCaller --- CITATIONS.md | 3 ++ conf/modules.config | 16 +++++++ modules.json | 4 ++ modules/nf-core/smncopynumbercaller/main.nf | 40 ++++++++++++++++ modules/nf-core/smncopynumbercaller/meta.yml | 49 ++++++++++++++++++++ workflows/raredisease.nf | 7 +++ 6 files changed, 119 insertions(+) create mode 100644 modules/nf-core/smncopynumbercaller/main.nf create mode 100644 modules/nf-core/smncopynumbercaller/meta.yml diff --git a/CITATIONS.md b/CITATIONS.md index 34d06fe4..f89061cc 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -15,6 +15,9 @@ - [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. +- [SMNCopyNumberCaller] (https://www.nature.com/articles/s41436-020-0754-0) + > Chen X, Sanchis-Juan A, French CE, Connel AJ, Delon I, Kingsbury Z, Chawla A, Halpern AL, Taft RJ, NIHR BioResource, Bentley DR, Butchbach MER, Raymond FL, Eberle MA. Spinal muscular atrophy diagnosis and carrier screening from genome sequencing data. Genet Med. February 2020:1-9. doi:10.1038/s41436-020-0754-0 + ## Software packaging/containerisation tools - [Anaconda](https://anaconda.com) diff --git a/conf/modules.config b/conf/modules.config index 6e46b3c2..709359ab 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -510,6 +510,22 @@ process { } +// +// Smncopynumbercaller options +// + +process { + withName: '.*SMNCOPYNUMBERCALLER' { + ext.args = genome.contains('GRch37') ? '--genome 37' : '--genome 38' + ext.prefix = { "${meta.id}" } + publishDir = [ + path: { "${params.outdir}/smncopynumbercaller" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} + // // SNV calling options // diff --git a/modules.json b/modules.json index 519add00..20d8d056 100644 --- a/modules.json +++ b/modules.json @@ -225,6 +225,10 @@ "branch": "master", "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01" }, + "smncopynumbercaller": { + "branch": "master", + "git_sha": "2bb1f6515962a1559e79544112394d2db03a4302" + }, "stranger": { "branch": "master", "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf new file mode 100644 index 00000000..fec45db0 --- /dev/null +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -0,0 +1,40 @@ +process SMNCOPYNUMBERCALLER { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::smncopynumbercaller=1.1.2" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/smncopynumbercaller:1.1.2--py310h7cba7a3_0' : + 'quay.io/biocontainers/smncopynumbercaller:1.1.2--py310h7cba7a3_0' }" + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path("out/*.tsv"), emit: smncopynumber + tuple val(meta), path("out/*.json"), emit: run_metrics + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + manifest_text = bam.join("\n") + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = "1.1.2" // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. + """ + echo "$manifest_text" >manifest.txt + smn_caller.py \\ + $args \\ + --manifest manifest.txt \\ + --prefix $prefix \\ + --outDir "out" \\ + --threads $task.cpus + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + SMNCopyNumberCaller: $VERSION + END_VERSIONS + """ +} diff --git a/modules/nf-core/smncopynumbercaller/meta.yml b/modules/nf-core/smncopynumbercaller/meta.yml new file mode 100644 index 00000000..21f057fa --- /dev/null +++ b/modules/nf-core/smncopynumbercaller/meta.yml @@ -0,0 +1,49 @@ +name: "smncopynumbercaller" +description: tool to call the copy number of full-length SMN1, full-length SMN2, as well as SMN2Δ7–8 (SMN2 with a deletion of Exon7-8) from a whole-genome sequencing (WGS) BAM file. +keywords: + - copy number, BAM, CRAM, SMN1, SMN2 +tools: + - "smncopynumbercaller": + description: "call copy number of SMN1, SMN2, SMN2Δ7–8 from a bam file" + homepage: "https://github.com/Illumina/SMNCopyNumberCaller" + documentation: "https://github.com/Illumina/SMNCopyNumberCaller" + tool_dev_url: "https://github.com/Illumina/SMNCopyNumberCaller" + doi: "https://doi.org/10.1038/s41436-020-0754-0" + licence: "Apache License Version 2.0" + +input: + - bam: + type: file + description: BAM/CRAM file + pattern: "*.{bam,cram}" + - bai: + type: file + description: BAM/CRAM index file + pattern: "*.{bai,crai}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - run_metrics: + type: file + description: File containing run parameters of SMNCopyNumberCaller + pattern: "*.{json}" + - smncopynumber: + type: file + description: File containing the output of SMNCopyNumberCaller + pattern: "*.{tsv}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@peterpru" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index d299fcd6..15340463 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -85,6 +85,7 @@ include { BCFTOOLS_CONCAT } from '../modules/nf-core/bcfto include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' include { FASTQC } from '../modules/nf-core/fastqc/main' include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { SMNCOPYNUMBERCALLER } from '../modules/nf-core/smncopynumbercaller/main' // // SUBWORKFLOWS @@ -282,6 +283,12 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) + // STEP 1.7: SMNCOPYNUMBERCALLER + CALL_SMNCOPYNUMBERCALLER ( + ch_mapped.bam_bai + ) + ch_versions = ch_versions.mix(SMNCOPYNUMBERCALLER.out.versions) + // STEP 2: VARIANT CALLING // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV ( From d6daadc3948555ca85a6ce47ab11efd4de939b0e Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 16 Dec 2022 15:38:22 +0100 Subject: [PATCH 0901/1169] fix clarified name of test with 2 samples --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/awstest2.yml | 6 +++--- .github/workflows/ci.yml | 2 +- conf/{test2.config => test2samples.config} | 6 +++--- nextflow.config | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) rename conf/{test2.config => test2samples.config} (92%) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index efb90dc3..92b6ee7a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir -stub`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test2,docker --outdir -stub`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test2samples,docker --outdir -stub`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/awstest2.yml b/.github/workflows/awstest2.yml index bdd091a6..26f58bd7 100644 --- a/.github/workflows/awstest2.yml +++ b/.github/workflows/awstest2.yml @@ -1,6 +1,6 @@ name: nf-core AWS test 2 samples # This workflow can be triggered manually with the GitHub actions workflow dispatch button. -# It runs the -profile 'test2' on AWS batch +# It runs the -profile 'test2samples' on AWS batch on: workflow_dispatch: @@ -20,9 +20,9 @@ jobs: workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test2-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test2samples-${{ github.sha }}" } - profiles: test2,aws_tower + profiles: test2samples,aws_tower - uses: actions/upload-artifact@v3 with: name: Tower debug log file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ffaacc89..8e531bcc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,4 +47,4 @@ jobs: # For example: adding multiple test runs with different parameters # Remember that you can parallelise this by using strategy.matrix run: | - nextflow run ${GITHUB_WORKSPACE} -profile test2,docker -stub --outdir ./results2 + nextflow run ${GITHUB_WORKSPACE} -profile test2samples,docker -stub --outdir ./results2 diff --git a/conf/test2.config b/conf/test2samples.config similarity index 92% rename from conf/test2.config rename to conf/test2samples.config index 17b7a014..5cdd9052 100644 --- a/conf/test2.config +++ b/conf/test2samples.config @@ -1,11 +1,11 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running minimal tests2 + Nextflow config file for running 2 samples ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple pipeline test2. + Defines input files and everything required to run a fast and simple pipeline with 2 samples. Use as follows: - nextflow run nf-core/raredisease -profile test2, --outdir + nextflow run nf-core/raredisease -profile test2samples, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/nextflow.config b/nextflow.config index 3ab85baa..90a48cb4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -169,9 +169,9 @@ profiles { executor.cpus = 16 executor.memory = 60.GB } - test { includeConfig 'conf/test.config' } - test_full { includeConfig 'conf/test_full.config' } - test2 { includeConfig 'conf/test2.config' } + test { includeConfig 'conf/test.config' } + test_full { includeConfig 'conf/test_full.config' } + test2samples { includeConfig 'conf/test2samples.config' } } // Load igenomes.config if required, else load custom genomes.config From d39d2e141054e8e3e25db89c4fefd0e7a9b26f47 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 16 Dec 2022 15:45:43 +0100 Subject: [PATCH 0902/1169] Try to add second test as parameter to matrix --- .github/workflows/ci.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8e531bcc..7f441fb4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,6 +26,9 @@ jobs: NXF_VER: - "22.10.1" - "latest-everything" + parameters: + - "-profile test,docker" + - "-profile test2samples,docker" steps: - name: Check out pipeline code uses: actions/checkout@v3 @@ -40,11 +43,11 @@ jobs: # For example: adding multiple test runs with different parameters # Remember that you can parallelise this by using strategy.matrix run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker -stub --outdir ./results + nextflow run ${GITHUB_WORKSPACE} ${{ matrix.parameters }} -stub --outdir ./results - - name: Run pipeline with test data 2 samples - # TODO nf-core: You can customise CI pipeline run tests as required - # For example: adding multiple test runs with different parameters - # Remember that you can parallelise this by using strategy.matrix - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test2samples,docker -stub --outdir ./results2 +# - name: Run pipeline with test data 2 samples +# # TODO nf-core: You can customise CI pipeline run tests as required +# # For example: adding multiple test runs with different parameters +# # Remember that you can parallelise this by using strategy.matrix +# run: | +# nextflow run ${GITHUB_WORKSPACE} -profile test2samples,docker -stub --outdir ./results2 From 284908c41012441112ac90d464efeb571fe9c542 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 16 Dec 2022 16:56:59 +0100 Subject: [PATCH 0903/1169] feat removed commented lines --- .github/workflows/ci.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f441fb4..7f88d7b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,10 +44,3 @@ jobs: # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} ${{ matrix.parameters }} -stub --outdir ./results - -# - name: Run pipeline with test data 2 samples -# # TODO nf-core: You can customise CI pipeline run tests as required -# # For example: adding multiple test runs with different parameters -# # Remember that you can parallelise this by using strategy.matrix -# run: | -# nextflow run ${GITHUB_WORKSPACE} -profile test2samples,docker -stub --outdir ./results2 From 8985ff1d4fb8c4ce9e7ca46c7d60c0b88f58cda7 Mon Sep 17 00:00:00 2001 From: peterpru Date: Mon, 19 Dec 2022 10:36:25 +0100 Subject: [PATCH 0904/1169] fix linting --- CITATIONS.md | 2 +- conf/modules.config | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index f89061cc..92ac8896 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -15,7 +15,7 @@ - [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. -- [SMNCopyNumberCaller] (https://www.nature.com/articles/s41436-020-0754-0) +- [SMNCopyNumberCaller](https://www.nature.com/articles/s41436-020-0754-0) > Chen X, Sanchis-Juan A, French CE, Connel AJ, Delon I, Kingsbury Z, Chawla A, Halpern AL, Taft RJ, NIHR BioResource, Bentley DR, Butchbach MER, Raymond FL, Eberle MA. Spinal muscular atrophy diagnosis and carrier screening from genome sequencing data. Genet Med. February 2020:1-9. doi:10.1038/s41436-020-0754-0 ## Software packaging/containerisation tools diff --git a/conf/modules.config b/conf/modules.config index 709359ab..03600b8c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -516,7 +516,9 @@ process { process { withName: '.*SMNCOPYNUMBERCALLER' { - ext.args = genome.contains('GRch37') ? '--genome 37' : '--genome 38' + ext.args = { + (params.genome == 'GRCh37') ? '--genome 37' : '--genome 38' + } ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/smncopynumbercaller" }, From fafc117dba3b8c18f97eb7f15e1e31402525ff96 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Mon, 19 Dec 2022 12:07:15 +0000 Subject: [PATCH 0905/1169] Template update for nf-core/tools version 2.7.2 --- .github/workflows/fix-linting.yml | 4 +- .github/workflows/linting_comment.yml | 2 +- lib/WorkflowMain.groovy | 2 +- modules.json | 6 +- modules/local/samplesheet_check.nf | 2 +- .../custom/dumpsoftwareversions/main.nf | 2 +- .../templates/dumpsoftwareversions.py | 99 ++++++++++--------- modules/nf-core/fastqc/main.nf | 40 +++----- modules/nf-core/multiqc/main.nf | 2 +- nextflow.config | 3 - nextflow_schema.json | 6 -- workflows/raredisease.nf | 2 +- 12 files changed, 82 insertions(+), 88 deletions(-) mode change 100644 => 100755 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 8ce8e1e1..831e96ca 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -34,9 +34,9 @@ jobs: id: prettier_status run: | if prettier --check ${GITHUB_WORKSPACE}; then - echo "name=result::pass" >> $GITHUB_OUTPUT + echo "result=pass" >> $GITHUB_OUTPUT else - echo "name=result::fail" >> $GITHUB_OUTPUT + echo "result=fail" >> $GITHUB_OUTPUT fi - name: Run 'prettier --write' diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 39635186..0bbcd30f 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -18,7 +18,7 @@ jobs: - name: Get PR number id: pr_number - run: echo "name=pr_number::$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT + run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment uses: marocchino/sticky-pull-request-comment@v2 diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index d9c25b22..9f34c54a 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -72,7 +72,7 @@ class WorkflowMain { NfcoreTemplate.checkConfigProvided(workflow, log) // Check that conda channels are set-up correctly - if (params.enable_conda) { + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { Utils.checkCondaChannels(log) } diff --git a/modules.json b/modules.json index 8e3ad86a..d6c9442c 100644 --- a/modules.json +++ b/modules.json @@ -7,17 +7,17 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] } } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 47f5dddb..4542abb3 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -2,7 +2,7 @@ process SAMPLESHEET_CHECK { tag "$samplesheet" label 'process_single' - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + conda "conda-forge::python=3.8.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.8.3' : 'quay.io/biocontainers/python:3.8.3' }" diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index cebb6e05..3df21765 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,7 +2,7 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) + conda "bioconda::multiqc=1.13" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py old mode 100644 new mode 100755 index 787bdb7b..e55b8d43 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -1,5 +1,9 @@ #!/usr/bin/env python + +"""Provide functions to merge multiple versions.yml files.""" + + import platform from textwrap import dedent @@ -7,6 +11,7 @@ def _make_versions_html(versions): + """Generate a tabular HTML output of all versions for MultiQC.""" html = [ dedent( """\\ @@ -45,47 +50,53 @@ def _make_versions_html(versions): return "\\n".join(html) -versions_this_module = {} -versions_this_module["${task.process}"] = { - "python": platform.python_version(), - "yaml": yaml.__version__, -} - -with open("$versions") as f: - versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module - -# aggregate versions by the module name (derived from fully-qualified process name) -versions_by_module = {} -for process, process_versions in versions_by_process.items(): - module = process.split(":")[-1] - try: - if versions_by_module[module] != process_versions: - raise AssertionError( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) - except KeyError: - versions_by_module[module] = process_versions - -versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", -} - -versions_mqc = { - "id": "software_versions", - "section_name": "${workflow.manifest.name} Software Versions", - "section_href": "https://github.com/${workflow.manifest.name}", - "plot_type": "html", - "description": "are collected at run time from the software output.", - "data": _make_versions_html(versions_by_module), -} - -with open("software_versions.yml", "w") as f: - yaml.dump(versions_by_module, f, default_flow_style=False) -with open("software_versions_mqc.yml", "w") as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - -with open("versions.yml", "w") as f: - yaml.dump(versions_this_module, f, default_flow_style=False) +def main(): + """Load all version files and generate merged output.""" + versions_this_module = {} + versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, + } + + with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + + # aggregate versions by the module name (derived from fully-qualified process name) + versions_by_module = {} + for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + if versions_by_module[module] != process_versions: + raise AssertionError( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + + versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", + } + + versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), + } + + with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) + with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + + with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) + + +if __name__ == "__main__": + main() diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 05730368..9ae58381 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -2,7 +2,7 @@ process FASTQC { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) + conda "bioconda::fastqc=0.11.9" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : 'quay.io/biocontainers/fastqc:0.11.9--0' }" @@ -20,30 +20,22 @@ process FASTQC { script: def args = task.ext.args ?: '' - // Add soft-links to original FastQs for consistent naming in pipeline def prefix = task.ext.prefix ?: "${meta.id}" - if (meta.single_end) { - """ - [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $args --threads $task.cpus ${prefix}.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS - """ - } else { - """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS - """ - } + // Make list of old name and new name pairs to use for renaming in the bash while loop + def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } + def rename_to = old_new_pairs*.join(' ').join(' ') + def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') + """ + printf "%s %s\\n" $rename_to | while read old_name new_name; do + [ -f "\${new_name}" ] || ln -s \$old_name \$new_name + done + fastqc $args --threads $task.cpus $renamed_files + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ stub: def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index a8159a57..68f66bea 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,7 +1,7 @@ process MULTIQC { label 'process_single' - conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) + conda "bioconda::multiqc=1.13" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" diff --git a/nextflow.config b/nextflow.config index b706fc57..bdb92381 100644 --- a/nextflow.config +++ b/nextflow.config @@ -39,7 +39,6 @@ params { validate_params = true show_hidden_params = false schema_ignore_params = 'genomes' - enable_conda = false // Config options @@ -81,7 +80,6 @@ try { profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { - params.enable_conda = true conda.enabled = true docker.enabled = false singularity.enabled = false @@ -90,7 +88,6 @@ profiles { charliecloud.enabled = false } mamba { - params.enable_conda = true conda.enabled = true conda.useMamba = true docker.enabled = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 2e1e7aa3..d6d969ef 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -263,12 +263,6 @@ "description": "Show all params when using `--help`", "hidden": true, "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." - }, - "enable_conda": { - "type": "boolean", - "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", - "hidden": true, - "fa_icon": "fas fa-bacon" } } } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c8c9be6c..f2260629 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -82,7 +82,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(FASTQC.out.versions.first()) CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique{ it.text }.collectFile(name: 'collated_versions.yml') + ch_versions.unique().collectFile(name: 'collated_versions.yml') ) // From f01a1b4266ff377da3637b9228a59161ce4e761f Mon Sep 17 00:00:00 2001 From: peterpru Date: Mon, 19 Dec 2022 14:28:14 +0100 Subject: [PATCH 0906/1169] run prettier and fix typo --- CITATIONS.md | 1 + workflows/raredisease.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CITATIONS.md b/CITATIONS.md index 92ac8896..a8407622 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -13,6 +13,7 @@ - [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. - [SMNCopyNumberCaller](https://www.nature.com/articles/s41436-020-0754-0) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 15340463..7a8e464b 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -284,7 +284,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 1.7: SMNCOPYNUMBERCALLER - CALL_SMNCOPYNUMBERCALLER ( + SMNCOPYNUMBERCALLER ( ch_mapped.bam_bai ) ch_versions = ch_versions.mix(SMNCOPYNUMBERCALLER.out.versions) From 035344ed4675aed1b2cc9b661d6e305b135331f6 Mon Sep 17 00:00:00 2001 From: jemten Date: Mon, 19 Dec 2022 17:34:17 +0100 Subject: [PATCH 0907/1169] updates fastqc --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index f7425869..55fa0e61 100644 --- a/modules.json +++ b/modules.json @@ -92,7 +92,7 @@ }, "fastqc": { "branch": "master", - "git_sha": "810e8f2603ec38401d49a4aaed06f6d058745552", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/bedtointervallist": { From 234e8f08c4c394a16c3e5b8d0e7a677d5b41b547 Mon Sep 17 00:00:00 2001 From: jemten Date: Mon, 19 Dec 2022 17:41:44 +0100 Subject: [PATCH 0908/1169] use release version of nf-core tools in ci linting --- .github/workflows/linting.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index a74cead4..c7f8f563 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -81,11 +81,10 @@ jobs: python-version: "3.7" architecture: "x64" - # FIXME: Remove this when nf-core modules lint stabilizes and install stable release - name: Install dependencies run: | python -m pip install --upgrade pip - python -m pip install --upgrade --force-reinstall git+https://github.com/nf-core/tools.git@dev + pip install nf-core - name: Run nf-core lint env: From 3083af241e668d411f92010ed9e7140e554511a7 Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 10 Jan 2023 10:44:24 +0100 Subject: [PATCH 0909/1169] updated vcfanno-resource input parameter --- conf/genomes.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 9e456cfc..faa55db5 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -37,7 +37,7 @@ params { svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/grch37_vcfanno_resources.txt" vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" vep_cache = "${params.local_genomes}/vep_cache" vep_filters = "${params.local_genomes}/gene_panels.bed" @@ -70,7 +70,7 @@ params { svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/" + vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/grch38_vcfanno_resources.txt" vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" vep_cache = "${params.local_genomes}/vep_cache" vep_filters = "${params.local_genomes}/gene_panels.bed" From f22d6ee2d0e2f109c44c31e9ff33a7519bd3a0c7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 11 Jan 2023 11:15:14 +0100 Subject: [PATCH 0910/1169] annotate_snv --- subworkflows/local/annotate_snvs.nf | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index e4d22c7d..d5120fc2 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -36,7 +36,11 @@ workflow ANNOTATE_SNVS { ch_vep_in = Channel.empty() vcf.map { meta, vcf, idx -> return [vcf, idx] }.set { ch_roh_vcfs } - samples.map { it -> it.phenotype == "2" ?: it }.set { ch_phenotype } + samples + .branch { it -> + affected: it.phenotype == "2" + unaffected: it.phenotype == "1" + }.set { ch_phenotype } ch_phenotype.affected.combine(ch_roh_vcfs).set { ch_roh_input } BCFTOOLS_ROH (ch_roh_input, gnomad_af, [], [], [], []) @@ -90,7 +94,7 @@ workflow ANNOTATE_SNVS { TABIX_BCFTOOLS_CONCAT (BCFTOOLS_CONCAT.out.vcf) - ch_versions = ch_versions.mix(BCFTOOLS_RHO.out.versions) + ch_versions = ch_versions.mix(BCFTOOLS_ROH.out.versions) ch_versions = ch_versions.mix(RHOCALL_ANNOTATE.out.versions) ch_versions = ch_versions.mix(ZIP_TABIX_ROHCALL.out.versions) ch_versions = ch_versions.mix(VCFANNO.out.versions) From 3e5f8d3eefee25ed80c1af417b2f00f39c3fa6d8 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 13 Jan 2023 13:40:29 +0100 Subject: [PATCH 0911/1169] Update qc_bam.nf - changed input --- subworkflows/local/qc_bam.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 400cedb4..7403dd97 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -57,10 +57,10 @@ workflow QC_BAM { // COLLECT WGS METRICS if ( aligner == "bwamem2" ) { - PICARD_COLLECTWGSMETRICS ( bam, fasta, intervals_wgs ) + PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, intervals_wgs ) ch_cov = PICARD_COLLECTWGSMETRICS.out.metrics ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS.out.versions) - PICARD_COLLECTWGSMETRICS_Y ( bam, fasta, intervals_y ) + PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, intervals_y ) ch_cov_y = PICARD_COLLECTWGSMETRICS_Y.out.metrics ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions) } else if ( aligner == "sentieon" ) { From ec2ab4eb4aeccecec0194f5c837474a5af3cf437 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 13 Jan 2023 13:49:42 +0100 Subject: [PATCH 0912/1169] Updated module --- modules.json | 3 ++- .../nf-core/picard/collectwgsmetrics/main.nf | 9 ++++---- .../nf-core/picard/collectwgsmetrics/meta.yml | 21 +++++++++++++++++-- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/modules.json b/modules.json index 6baf8ed1..5857c8f7 100644 --- a/modules.json +++ b/modules.json @@ -232,7 +232,8 @@ }, "picard/collectwgsmetrics": { "branch": "master", - "git_sha": "9c92f40092d7a9112953b7571f7021f65740bf7f" + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] }, "picard/liftovervcf": { "branch": "master", diff --git a/modules/nf-core/picard/collectwgsmetrics/main.nf b/modules/nf-core/picard/collectwgsmetrics/main.nf index 62074d40..b767b99c 100644 --- a/modules/nf-core/picard/collectwgsmetrics/main.nf +++ b/modules/nf-core/picard/collectwgsmetrics/main.nf @@ -1,15 +1,16 @@ process PICARD_COLLECTWGSMETRICS { tag "$meta.id" - label 'process_medium' + label 'process_single' - conda (params.enable_conda ? "bioconda::picard=2.27.4 r::r-base" : null) + conda "bioconda::picard=2.27.4 r::r-base" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: - tuple val(meta), path(bam) - path fasta + tuple val(meta), path(bam), path(bai) + tuple val(meta2), path(fasta) + tuple val(meta2), path(fai) path intervallist output: diff --git a/modules/nf-core/picard/collectwgsmetrics/meta.yml b/modules/nf-core/picard/collectwgsmetrics/meta.yml index b9dc37af..57ab9cfe 100644 --- a/modules/nf-core/picard/collectwgsmetrics/meta.yml +++ b/modules/nf-core/picard/collectwgsmetrics/meta.yml @@ -22,11 +22,28 @@ input: e.g. [ id:'test', single_end:false ] - bam: type: file - description: BAM file - pattern: "*.{bam}" + description: Aligned reads file + pattern: "*.{bam, cram}" + - bai: + type: file + description: (Optional) Aligned reads file index + pattern: "*.{bai,crai}" + - meta2: + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] - fasta: type: file description: Genome fasta file + pattern: "*.{fa,fasta,fna}" + - meta2: + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fai: + type: file + description: Genome fasta file index + pattern: "*.{fai}" - intervallist: type: file description: Picard Interval List. Defines which contigs to include. Can be generated from a BED file with GATK BedToIntervalList. From ec3b5d10d5ffc5e3b324856d5f8553393c2768dc Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 13 Jan 2023 13:54:12 +0100 Subject: [PATCH 0913/1169] Fixed input channel --- subworkflows/local/qc_bam.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 7403dd97..ef206187 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -57,10 +57,10 @@ workflow QC_BAM { // COLLECT WGS METRICS if ( aligner == "bwamem2" ) { - PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, intervals_wgs ) + PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) ch_cov = PICARD_COLLECTWGSMETRICS.out.metrics ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS.out.versions) - PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, intervals_y ) + PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) ch_cov_y = PICARD_COLLECTWGSMETRICS_Y.out.metrics ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions) } else if ( aligner == "sentieon" ) { From f3bb9fc5b6524d4a4e8577472a725a36b48dca16 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 Jan 2023 16:08:17 +0100 Subject: [PATCH 0914/1169] added meta --- workflows/raredisease.nf | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 230b6246..e6ba0902 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -223,7 +223,7 @@ workflow RAREDISEASE { : Channel.empty() ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf : Channel.value([]) - ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi).collect() + ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi).map {it -> [[id:it[0].simpleName], it]}.collect() : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) ch_sequence_dictionary_no_meta = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).collect() : ( ch_references.sequence_dict ?: Channel.empty() ) @@ -260,7 +260,7 @@ workflow RAREDISEASE { ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) - + // STEP 1.5: BAM QUALITY CHECK QC_BAM ( ch_mapped.marked_bam, @@ -286,7 +286,7 @@ workflow RAREDISEASE { // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV ( params.variant_caller, - ch_mapped.bam_bai, + ALIGN.out.bam_bai, ch_genome_fasta_no_meta, ch_genome_fai_no_meta, ch_known_dbsnp, @@ -359,7 +359,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(FILTER_VEP_SV.out.versions) } - +/* ANALYSE_MT ( ch_mapped.bam_bai, ch_bwamem2_index, @@ -433,7 +433,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(FILTER_VEP_SNV.out.versions) } - +*/ // // MODULE: Pipeline reporting // @@ -464,6 +464,7 @@ workflow RAREDISEASE { ch_multiqc_logo.toList() ) multiqc_report = MULTIQC.out.report.toList() + } /* From a1e352d5fbb9868c270936316b934488442df1c4 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 Jan 2023 16:25:28 +0100 Subject: [PATCH 0915/1169] fixed for single and multiple vcfs --- .../local/variant_calling/call_snv_sentieon.nf | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 39d21c08..07d8b3e6 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -45,14 +45,18 @@ workflow CALL_SNV_SENTIEON { case_info .combine(ch_vcf_idx) .groupTuple() - .set{ ch_vcf_idx_case } - - BCFTOOLS_MERGE(ch_vcf_idx_case,[],fasta,fai) + .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list + single: it[1].size() == 1 + multiple: it[1].size() > 1 + } + .set{ ch_vcf_idx_merge_in } + BCFTOOLS_MERGE(ch_vcf_idx_merge_in.multiple,[],fasta,fai) ch_split_multi_in = BCFTOOLS_MERGE.out.merged_variants .map{meta, bcf -> - return [meta, bcf, []]} - SPLIT_MULTIALLELICS_SEN(ch_split_multi_in, fasta) + return [meta, bcf, []]} + ch_vcf_idx_case = ch_vcf_idx_merge_in.single.mix(ch_split_multi_in) + SPLIT_MULTIALLELICS_SEN(ch_vcf_idx_case, fasta) ch_remove_dup_in = SPLIT_MULTIALLELICS_SEN.out.vcf .map{meta, vcf -> From 991575229447edbd422624bebd46706bddc7a167 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 Jan 2023 16:39:55 +0100 Subject: [PATCH 0916/1169] cleaned --- workflows/raredisease.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e6ba0902..ad6202f2 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -286,7 +286,7 @@ workflow RAREDISEASE { // TODO: There should be a conditional to execute certain variant callers (e.g. sentieon, gatk, deepvariant) defined by the user and we need to think of a default caller. CALL_SNV ( params.variant_caller, - ALIGN.out.bam_bai, + ch_mapped.bam_bai, ch_genome_fasta_no_meta, ch_genome_fai_no_meta, ch_known_dbsnp, @@ -359,7 +359,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(FILTER_VEP_SV.out.versions) } -/* + ANALYSE_MT ( ch_mapped.bam_bai, ch_bwamem2_index, @@ -433,7 +433,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(FILTER_VEP_SNV.out.versions) } -*/ + // // MODULE: Pipeline reporting // @@ -482,7 +482,6 @@ workflow.onComplete { NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) } } - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END From 4c32e64e51b78abb3bcbcd84d8cb324cf643eb95 Mon Sep 17 00:00:00 2001 From: sima-r Date: Fri, 13 Jan 2023 16:41:38 +0100 Subject: [PATCH 0917/1169] cleaned --- workflows/raredisease.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index ad6202f2..23eeb5d3 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -260,7 +260,7 @@ workflow RAREDISEASE { ) .set { ch_mapped } ch_versions = ch_versions.mix(ALIGN.out.versions) - + // STEP 1.5: BAM QUALITY CHECK QC_BAM ( ch_mapped.marked_bam, @@ -464,7 +464,6 @@ workflow RAREDISEASE { ch_multiqc_logo.toList() ) multiqc_report = MULTIQC.out.report.toList() - } /* @@ -482,6 +481,7 @@ workflow.onComplete { NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) } } + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END From 3fcd8eeefc4471937ca582d7f2af5140f1e3722c Mon Sep 17 00:00:00 2001 From: sima-r Date: Thu, 26 Jan 2023 16:07:38 +0100 Subject: [PATCH 0918/1169] added missing inputs --- subworkflows/local/qc_bam.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index ef206187..897cf46e 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -64,10 +64,10 @@ workflow QC_BAM { ch_cov_y = PICARD_COLLECTWGSMETRICS_Y.out.metrics ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions) } else if ( aligner == "sentieon" ) { - SENTIEON_WGSMETRICS ( bam, fasta ) + SENTIEON_WGSMETRICS ( bam, fasta, fai) ch_cov = SENTIEON_WGSMETRICS.out.metrics ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS.out.versions) - SENTIEON_WGSMETRICS_Y ( bam, fasta ) + SENTIEON_WGSMETRICS_Y ( bam, fasta, fai) ch_cov_y = SENTIEON_WGSMETRICS_Y.out.metrics ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS_Y.out.versions) } else { From 0d783ccfdd7cab9522952f45ee64109c612292bf Mon Sep 17 00:00:00 2001 From: sima-r Date: Thu, 26 Jan 2023 16:13:05 +0100 Subject: [PATCH 0919/1169] Corrected output channel names --- subworkflows/local/qc_bam.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 897cf46e..d131fd77 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -65,10 +65,10 @@ workflow QC_BAM { ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions) } else if ( aligner == "sentieon" ) { SENTIEON_WGSMETRICS ( bam, fasta, fai) - ch_cov = SENTIEON_WGSMETRICS.out.metrics + ch_cov = SENTIEON_WGSMETRICS.out.wgs_metrics ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS.out.versions) SENTIEON_WGSMETRICS_Y ( bam, fasta, fai) - ch_cov_y = SENTIEON_WGSMETRICS_Y.out.metrics + ch_cov_y = SENTIEON_WGSMETRICS_Y.out.wgs_metrics ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS_Y.out.versions) } else { exit 1, 'Please provide a valid aligner!' From cb7b061620eed99523e33dfa8ec51db30a8fdc93 Mon Sep 17 00:00:00 2001 From: sima-r Date: Thu, 26 Jan 2023 16:20:10 +0100 Subject: [PATCH 0920/1169] corrected the inputs to wgsmetrics functions --- subworkflows/local/qc_bam.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index d131fd77..ffdbc87d 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -64,10 +64,10 @@ workflow QC_BAM { ch_cov_y = PICARD_COLLECTWGSMETRICS_Y.out.metrics ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions) } else if ( aligner == "sentieon" ) { - SENTIEON_WGSMETRICS ( bam, fasta, fai) + SENTIEON_WGSMETRICS ( bam_bai, fasta, fai) ch_cov = SENTIEON_WGSMETRICS.out.wgs_metrics ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS.out.versions) - SENTIEON_WGSMETRICS_Y ( bam, fasta, fai) + SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai) ch_cov_y = SENTIEON_WGSMETRICS_Y.out.wgs_metrics ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS_Y.out.versions) } else { From 1abaa94acb53c6788fe3d7119c0618707cbd40b9 Mon Sep 17 00:00:00 2001 From: sima-r Date: Thu, 26 Jan 2023 16:35:49 +0100 Subject: [PATCH 0921/1169] Matched files with inputs in the qc_bam --- modules/local/sentieon/wgsmetricsalgo.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index f6c25b0e..bce76109 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -7,8 +7,8 @@ process SENTIEON_WGSMETRICSALGO { input: tuple val(meta), path(bam), path(bai) - path fasta - path fai + tuple val(meta2), path(fasta) + tuple val(meta2), path(fai) output: tuple val(meta), path('*wgs_metrics.txt'), emit: wgs_metrics From afdd963c63b2558c17790d6a6cfd911c1c8601a7 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Tue, 31 Jan 2023 15:02:28 +0100 Subject: [PATCH 0922/1169] Differentiated output folders for wg and y --- conf/modules.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f95a3445..1046c095 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -488,7 +488,7 @@ process { withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS' { publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics" }, + path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] @@ -496,7 +496,7 @@ process { withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS_Y' { publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics" }, + path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] @@ -505,7 +505,7 @@ process { withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics" }, + path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] @@ -514,7 +514,7 @@ process { withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { ext.args = { (params.genome == "GRCh37") ? "--interval Y" : "--interval chrY" } publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics" }, + path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] From 9c96516d632024adce834707b4af3b2742f289e4 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Mon, 6 Feb 2023 14:27:16 +0100 Subject: [PATCH 0923/1169] Refactor - replace if-else logic by ext.when --- conf/modules.config | 4 ++++ subworkflows/local/qc_bam.nf | 28 +++++++++++----------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1046c095..80edf200 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -487,6 +487,7 @@ process { } withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS' { + ext.when = params.aligner.equals("bwamem2") publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, mode: params.publish_dir_mode, @@ -495,6 +496,7 @@ process { } withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS_Y' { + ext.when = params.aligner.equals("bwamem2") publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, mode: params.publish_dir_mode, @@ -503,6 +505,7 @@ process { } withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { + ext.when = params.aligner.equals("sentieon") ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, @@ -512,6 +515,7 @@ process { } withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { + ext.when = params.aligner.equals("sentieon") ext.args = { (params.genome == "GRCh37") ? "--interval Y" : "--interval chrY" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index e18c0356..ef41d368 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -51,23 +51,17 @@ workflow QC_BAM { ch_versions = ch_versions.mix(MOSDEPTH.out.versions.first()) // COLLECT WGS METRICS - if ( aligner == "bwamem2" ) { - PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) - ch_cov = PICARD_COLLECTWGSMETRICS.out.metrics - ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS.out.versions) - PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) - ch_cov_y = PICARD_COLLECTWGSMETRICS_Y.out.metrics - ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions) - } else if ( aligner == "sentieon" ) { - SENTIEON_WGSMETRICS ( bam_bai, fasta, fai) - ch_cov = SENTIEON_WGSMETRICS.out.wgs_metrics - ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS.out.versions) - SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai) - ch_cov_y = SENTIEON_WGSMETRICS_Y.out.wgs_metrics - ch_versions = ch_versions.mix(SENTIEON_WGSMETRICS_Y.out.versions) - } else { - exit 1, 'Please provide a valid aligner!' - } + PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) + PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) + + SENTIEON_WGSMETRICS ( bam_bai, fasta, fai) + SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai) + + ch_cov = Channel.empty().mix(PICARD_COLLECTWGSMETRICS.out.metrics, SENTIEON_WGSMETRICS.out.wgs_metrics) + ch_cov_y = Channel.empty().mix(PICARD_COLLECTWGSMETRICS_Y.out.metrics, SENTIEON_WGSMETRICS_Y.out.wgs_metrics) + + ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS.out.versions, SENTIEON_WGSMETRICS.out.versions) + ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions, SENTIEON_WGSMETRICS_Y.out.versions) emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] From e17571c9802105eef6e4a1d7c2697e87efab7da6 Mon Sep 17 00:00:00 2001 From: sima-r Date: Mon, 6 Feb 2023 14:48:15 +0100 Subject: [PATCH 0924/1169] corrections --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 80edf200..b854bbce 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -430,7 +430,7 @@ process { ] } - withName: '.*CALL_SNV_DEEPVARIANT:TABIX_SEN' { + withName: '.*CALL_SNV_SENTIEON:TABIX_SEN' { publishDir = [ path: { "${params.outdir}/sentieon_normvcf" }, mode: params.publish_dir_mode, From 684d3e2265146e22798d82f9115d3d1eb2eeb3af Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Feb 2023 00:08:49 +0100 Subject: [PATCH 0925/1169] fix sentieon error --- conf/modules.config | 2 +- .../local/variant_calling/call_snv_deepvariant.nf | 15 ++++++++------- .../local/variant_calling/call_snv_sentieon.nf | 4 ++-- workflows/raredisease.nf | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 6e46b3c2..9b2b80a4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -430,7 +430,7 @@ process { ] } - withName: '.*CALL_SNV_DEEPVARIANT:TABIX_SEN' { + withName: '.*CALL_SNV_SENTIEON:TABIX_SEN' { publishDir = [ path: { "${params.outdir}/sentieon_normvcf" }, mode: params.publish_dir_mode, diff --git a/subworkflows/local/variant_calling/call_snv_deepvariant.nf b/subworkflows/local/variant_calling/call_snv_deepvariant.nf index e965ffe8..ced5a1f0 100644 --- a/subworkflows/local/variant_calling/call_snv_deepvariant.nf +++ b/subworkflows/local/variant_calling/call_snv_deepvariant.nf @@ -17,17 +17,18 @@ workflow CALL_SNV_DEEPVARIANT { main: ch_versions = Channel.empty() + bam.map { meta, bam, bai -> return [meta, bam, bai, []] } .set { ch_bam } DEEPVARIANT ( ch_bam, fasta, fai ) - DEEPVARIANT.out - .gvcf + DEEPVARIANT.out.gvcf .collect{it[1]} .toList() - .set { file_list } + .collect() + .set { ch_file_list } case_info .combine(file_list) @@ -36,13 +37,13 @@ workflow CALL_SNV_DEEPVARIANT { GLNEXUS ( ch_gvcfs ) ch_split_multi_in = GLNEXUS.out.bcf - .map{meta, bcf -> - return [meta, bcf, []]} + .map{ meta, bcf -> + return [meta, bcf, []] } SPLIT_MULTIALLELICS_GL (ch_split_multi_in, fasta) ch_remove_dup_in = SPLIT_MULTIALLELICS_GL.out.vcf - .map{meta, vcf -> - return [meta, vcf, []]} + .map{ meta, vcf -> + return [meta, vcf, []] } REMOVE_DUPLICATES_GL (ch_remove_dup_in, fasta) TABIX_GL (REMOVE_DUPLICATES_GL.out.vcf) diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 8c6698bd..f451b877 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -47,14 +47,14 @@ workflow CALL_SNV_SENTIEON { .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list single: it[1].size() == 1 multiple: it[1].size() > 1 - } + } .set{ ch_vcf_idx_merge_in } BCFTOOLS_MERGE(ch_vcf_idx_merge_in.multiple,[],fasta,fai) ch_split_multi_in = BCFTOOLS_MERGE.out.merged_variants .map{meta, bcf -> return [meta, bcf, []]} - ch_vcf_idx_case = ch_vcf_idx_merge_in.single.mix(ch_split_multi_in) + ch_vcf_idx_case = ch_vcf_idx_merge_in.single.mix(ch_split_multi_in) SPLIT_MULTIALLELICS_SEN(ch_vcf_idx_case, fasta) ch_remove_dup_in = SPLIT_MULTIALLELICS_SEN.out.vcf diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6007fa37..d80f8c1e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -143,7 +143,7 @@ workflow RAREDISEASE { ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() - : Channel.value([]) + : Channel.empty() ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() : Channel.value([]) ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift).collect() From 0ec8c06a35b923dd91ce7d08f3a3af273de00fa8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Feb 2023 06:05:10 +0100 Subject: [PATCH 0926/1169] update snv sentieon --- conf/modules.config | 3 ++- .../local/variant_calling/call_snv_deepvariant.nf | 2 +- subworkflows/local/variant_calling/call_snv_sentieon.nf | 8 ++++---- workflows/raredisease.nf | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9b2b80a4..179df41f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -59,7 +59,7 @@ process { process { withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_GENOME' { - ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} + ext.when = {!params.bwamem2_index} publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, @@ -405,6 +405,7 @@ process { } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNAMODELAPPLY' { + ext.when = { params.ml_model } publishDir = [ path: { "${params.outdir}/sentieon_dnamodelapply" }, mode: params.publish_dir_mode, diff --git a/subworkflows/local/variant_calling/call_snv_deepvariant.nf b/subworkflows/local/variant_calling/call_snv_deepvariant.nf index ced5a1f0..683cdf66 100644 --- a/subworkflows/local/variant_calling/call_snv_deepvariant.nf +++ b/subworkflows/local/variant_calling/call_snv_deepvariant.nf @@ -31,7 +31,7 @@ workflow CALL_SNV_DEEPVARIANT { .set { ch_file_list } case_info - .combine(file_list) + .combine(ch_file_list) .set { ch_gvcfs } GLNEXUS ( ch_gvcfs ) diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index f451b877..36332160 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -27,14 +27,13 @@ workflow CALL_SNV_SENTIEON { ch_vcf = SENTIEON_DNASCOPE.out.vcf ch_index = SENTIEON_DNASCOPE.out.vcf_index - if ( ml_model ) { + ch_vcf_idx = ch_vcf.join( ch_index ) - ch_vcf_idx = ch_vcf.join( ch_index ) + SENTIEON_DNAMODELAPPLY ( ch_vcf_idx, fasta, fai, ml_model ) - SENTIEON_DNAMODELAPPLY ( ch_vcf_idx, fasta, fai, ml_model ) + if (params.ml_model) { ch_vcf = SENTIEON_DNAMODELAPPLY.out.vcf ch_index = SENTIEON_DNAMODELAPPLY.out.vcf_index - ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions.first()) } ch_vcf.join(ch_index) @@ -64,6 +63,7 @@ workflow CALL_SNV_SENTIEON { TABIX_SEN(REMOVE_DUPLICATES_SEN.out.vcf) ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions.first()) + // ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions.first()) ch_versions = ch_versions.mix(BCFTOOLS_MERGE.out.versions.first()) ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_SEN.out.versions.first()) ch_versions = ch_versions.mix(REMOVE_DUPLICATES_SEN.out.versions.first()) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index d80f8c1e..6007fa37 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -143,7 +143,7 @@ workflow RAREDISEASE { ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() - : Channel.empty() + : Channel.value([]) ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() : Channel.value([]) ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift).collect() From 80d9e3eaaaeded6b831f1bc365f1862e0aa847b0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 8 Feb 2023 06:51:11 +0100 Subject: [PATCH 0927/1169] include versions --- subworkflows/local/variant_calling/call_snv_sentieon.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 36332160..01d4297f 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -63,7 +63,7 @@ workflow CALL_SNV_SENTIEON { TABIX_SEN(REMOVE_DUPLICATES_SEN.out.vcf) ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions.first()) - // ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions.first()) + ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions.first()) ch_versions = ch_versions.mix(BCFTOOLS_MERGE.out.versions.first()) ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_SEN.out.versions.first()) ch_versions = ch_versions.mix(REMOVE_DUPLICATES_SEN.out.versions.first()) From e5e2fc4b22158bb2cff04d2e9a5b1541ebe24dd7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Feb 2023 00:45:45 +0100 Subject: [PATCH 0928/1169] update mitochondrial subworkflow --- conf/modules.config | 36 +++++++++++++++---- main.nf | 1 + nextflow_schema.json | 8 +++++ subworkflows/local/analyse_MT.nf | 4 +++ .../local/mitochondria/align_and_call_MT.nf | 31 +++++++++------- subworkflows/local/prepare_references.nf | 26 ++++++++------ workflows/raredisease.nf | 5 +++ 7 files changed, 80 insertions(+), 31 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 179df41f..8e73bd01 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -59,7 +59,7 @@ process { process { withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_GENOME' { - ext.when = {!params.bwamem2_index} + ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, @@ -70,7 +70,7 @@ process { } withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_SHIFT_MT' { - ext.when = {!params.mt_bwamem2_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} + ext.when = {!params.mt_bwamem2_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes") && params.aligner == "bwamem2"} publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, @@ -80,7 +80,7 @@ process { ] } - withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX' { + withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_GENOME' { ext.when = {!params.bwa_index && params.aligner == "sentieon"} publishDir = [ path: { "${params.outdir}/references" }, @@ -90,8 +90,18 @@ process { ] } - withName: '.*PREPARE_REFERENCES:BWA_INDEX' { - ext.when = {!params.bwa_index && params.aligner == "bwamem2"} + withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_SHIFT_MT' { + ext.when = {!params.mt_bwa_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes") && params.aligner == "sentieon"} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + + withName: '.*PREPARE_REFERENCES:BWA_INDEX_GENOME' { + ext.when = {!params.bwa_index && !(params.aligner == "sentieon")} publishDir = [ path: { "${params.outdir}/references" }, mode: 'copy', @@ -895,10 +905,16 @@ process { process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:BWAMEM2_MEM_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") && params.aligner == "bwamem2" } ext.args = { "-M -K 100000000 -R ${meta.read_group}" } } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:SENTIEON_BWAMEM_MT' { + ext.args = { "-M -K 10000000 -R ${meta.read_group}" } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") && params.aligner == "sentieon" } + ext.prefix = { "${meta.id}.sorted" } + } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MERGEBAMALIGNMENT_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' @@ -943,10 +959,16 @@ process { process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") && params.aligner == "bwamem2" } ext.args = { "-M -K 100000000 -R ${meta.read_group}" } } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SENTIEON_BWAMEM_MT' { + ext.args = { "-M -K 10000000 -R ${meta.read_group}" } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") && params.aligner == "sentieon" } + ext.prefix = { "${meta.id}.sorted" } + } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MERGEBAMALIGNMENT_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' diff --git a/main.nf b/main.nf index 5143e530..fb1ed0ed 100644 --- a/main.nf +++ b/main.nf @@ -32,6 +32,7 @@ params.known_indels = WorkflowMain.getGenomeAttribute(params, params.known_mills = WorkflowMain.getGenomeAttribute(params, 'known_mills') params.ml_model = WorkflowMain.getGenomeAttribute(params, 'ml_model') params.mt_backchain_shift = WorkflowMain.getGenomeAttribute(params, 'mt_backchain_shift') +params.mt_bwa_index_shift = WorkflowMain.getGenomeAttribute(params, 'mt_bwa_index_shift') params.mt_bwamem2_index_shift = WorkflowMain.getGenomeAttribute(params, 'mt_bwamem2_index_shift') params.mt_fasta_shift = WorkflowMain.getGenomeAttribute(params, 'mt_fasta_shift') params.mt_fai_shift = WorkflowMain.getGenomeAttribute(params, 'mt_fai_shift') diff --git a/nextflow_schema.json b/nextflow_schema.json index 0f243e6c..96cfefd9 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -204,6 +204,14 @@ "description": "Path to mitochondrial FASTA genome index file.", "fa_icon": "far fa-file-code" }, + "mt_bwa_index_shift": { + "type": "string", + "format": "directory-path", + "description": "Directory for pre-built bwa index for shifted mitochondrial fasta (used for alignment with sentioen)", + "help_text": "If none provided, will be generated automatically from the FASTA reference.", + "fa_icon": "fas fa-folder-open", + "hidden": true + }, "mt_bwamem2_index_shift": { "type": "string", "format": "directory-path", diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index d61fb852..848d5463 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -10,6 +10,7 @@ include { MERGE_ANNOTATE_MT } from './mitochondria/ workflow ANALYSE_MT { take: bam // channel: [ val(meta), file(bam), file(bai) ] + genome_bwa_index // channel: [ /path/to/bwa/index/ ] genome_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] genome_fasta_meta // channel: [ [], genome.fasta ] genome_fasta_no_meta // channel: [ genome.fasta ] @@ -17,6 +18,7 @@ workflow ANALYSE_MT { genome_dict_no_meta // channel: [ genome.dict ] genome_fai // channel: [ genome.fai ] mt_intervals // channel: [ file(non_control_region.chrM.interval_list) ] + shift_mt_bwa_index // channel: [ /path/to/bwa/index/ ] shift_mt_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] shift_mt_fasta // channel: [ genome.fasta ] shift_mt_dict // channel: [ genome.dict ] @@ -43,6 +45,7 @@ workflow ANALYSE_MT { ALIGN_AND_CALL_MT ( CONVERT_MT_BAM_TO_FASTQ.out.fastq, CONVERT_MT_BAM_TO_FASTQ.out.bam, + genome_bwa_index, genome_bwamem2_index, genome_fasta_no_meta, genome_dict_no_meta, @@ -53,6 +56,7 @@ workflow ANALYSE_MT { ALIGN_AND_CALL_MT_SHIFT ( CONVERT_MT_BAM_TO_FASTQ.out.fastq, CONVERT_MT_BAM_TO_FASTQ.out.bam, + shift_mt_bwa_index, shift_mt_bwamem2_index, shift_mt_fasta, shift_mt_dict, diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 22787366..959ac4aa 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -2,6 +2,7 @@ // Align and call MT // +include { SENTIEON_BWAMEM as SENTIEON_BWAMEM_MT } from '../../../modules/local/sentieon/bwamem' include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../../modules/nf-core/bwamem2/mem/main' include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../../modules/nf-core/gatk4/mergebamalignment/main' include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../../modules/nf-core/picard/addorreplacereadgroups/main' @@ -15,27 +16,31 @@ include { TABIX_TABIX as TABIX_TABIX_MT } fr workflow ALIGN_AND_CALL_MT { take: - fastq // channel: [ val(meta), path('*.fastq.gz') ] - ubam // channel: [ val(meta), path('*.bam') ] - genome_index // channel: [ /path/to/bwamem2/index/ ] - genome_fasta // channel: [ genome.fasta ] - genome_dict // channel: [ genome.dict ] - genome_fai // channel: [ genome.fai ] - intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] + fastq // channel: [ val(meta), path('*.fastq.gz') ] + ubam // channel: [ val(meta), path('*.bam') ] + index_bwa // channel: [ /path/to/bwamem2/index/ ] + index_bwamem2 // channel: [ /path/to/bwamem2/index/ ] + fasta // channel: [ genome.fasta ] + dict // channel: [ genome.dict ] + fai // channel: [ genome.fai ] + intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] main: ch_versions = Channel.empty() // Outputs bam files - BWAMEM2_MEM_MT (fastq , genome_index, true) - ch_mt_bam = BWAMEM2_MEM_MT.out.bam + BWAMEM2_MEM_MT (fastq , index_bwamem2, true) + + SENTIEON_BWAMEM_MT ( fastq, fasta, fai, index_bwa ) + + ch_mt_bam = Channel.empty().mix(BWAMEM2_MEM_MT.out.bam, SENTIEON_BWAMEM_MT.out.bam) ch_fastq_ubam = ch_mt_bam.join(ubam, by: [0]) - GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, genome_fasta, genome_dict) + GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, fasta, dict) PICARD_ADDORREPLACEREADGROUPS_MT (GATK4_MERGEBAMALIGNMENT_MT.out.bam) - PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam, genome_fasta, genome_fai) + PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam, fasta, fai) SAMTOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) @@ -43,7 +48,7 @@ workflow ALIGN_AND_CALL_MT { ch_sort_index_bam = SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) ch_sort_index_bam_int_mt = ch_sort_index_bam.combine(intervals_mt) - GATK4_MUTECT2_MT (ch_sort_index_bam_int_mt, genome_fasta, genome_fai, genome_dict, [], [], [],[]) + GATK4_MUTECT2_MT (ch_sort_index_bam_int_mt, fasta, fai, dict, [], [], [],[]) // Haplocheck // TODO: probably it will be outside this subworkflow as we want to run @@ -58,7 +63,7 @@ workflow ALIGN_AND_CALL_MT { return [meta, vcf, tbi, stats, [], [], [], []] } - GATK4_FILTERMUTECTCALLS_MT (ch_to_filt, genome_fasta, genome_fai, genome_dict) + GATK4_FILTERMUTECTCALLS_MT (ch_to_filt, fasta, fai, dict) ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 7c067b97..f84a6eaa 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -2,7 +2,7 @@ // Prepare reference files // -include { BWA_INDEX } from '../../modules/nf-core/bwa/index/main' +include { BWA_INDEX as BWA_INDEX_GENOME } from '../../modules/nf-core/bwa/index/main' include { BWAMEM2_INDEX as BWAMEM2_INDEX_GENOME } from '../../modules/nf-core/bwamem2/index/main' include { BWAMEM2_INDEX as BWAMEM2_INDEX_SHIFT_MT } from '../../modules/nf-core/bwamem2/index/main' include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/cat/cat/main' @@ -14,7 +14,8 @@ include { GATK4_INTERVALLISTTOOLS as GATK_ILT } from '../../modul include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' include { SAMTOOLS_FAIDX as SAMTOOLS_FAIDX_GENOME } from '../../modules/nf-core/samtools/faidx/main' include { SAMTOOLS_FAIDX as SAMTOOLS_FAIDX_SHIFT_MT } from '../../modules/nf-core/samtools/faidx/main' -include { SENTIEON_BWAINDEX } from '../../modules/local/sentieon/bwamemindex' +include { SENTIEON_BWAINDEX as SENTIEON_BWAINDEX_GENOME } from '../../modules/local/sentieon/bwamemindex' +include { SENTIEON_BWAINDEX as SENTIEON_BWAINDEX_SHIFT_MT } from '../../modules/local/sentieon/bwamemindex' include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modules/nf-core/tabix/bgziptabix/main' include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/tabix/tabix/main' include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/tabix/tabix/main' @@ -34,17 +35,18 @@ workflow PREPARE_REFERENCES { target_bed main: - ch_versions = Channel.empty() - ch_tbi = Channel.empty() - ch_bgzip_tbi = Channel.empty() - ch_bwa = Channel.empty() - ch_sentieonbwa= Channel.empty() + ch_versions = Channel.empty() + ch_tbi = Channel.empty() + ch_bgzip_tbi = Channel.empty() + ch_bwa = Channel.empty() + ch_sentieonbwa = Channel.empty() // Genome indices - BWA_INDEX(fasta_meta).index.set{ch_bwa} + BWA_INDEX_GENOME(fasta_meta).index.set{ch_bwa} BWAMEM2_INDEX_GENOME(fasta_meta) BWAMEM2_INDEX_SHIFT_MT(mt_fasta_shift_meta) - SENTIEON_BWAINDEX(fasta_meta).index.set{ch_sentieonbwa} + SENTIEON_BWAINDEX_GENOME(fasta_meta).index.set{ch_sentieonbwa} + SENTIEON_BWAINDEX_SHIFT_MT(mt_fasta_shift_meta) SAMTOOLS_FAIDX_GENOME(fasta_meta) SAMTOOLS_FAIDX_SHIFT_MT(mt_fasta_shift_meta) GATK_SD(fasta_no_meta) @@ -73,10 +75,11 @@ workflow PREPARE_REFERENCES { CAT_CAT_BAIT ( ch_bait_intervals_cat_in ) // Gather versions - ch_versions = ch_versions.mix(BWA_INDEX.out.versions) + ch_versions = ch_versions.mix(BWA_INDEX_GENOME.out.versions) ch_versions = ch_versions.mix(BWAMEM2_INDEX_GENOME.out.versions) ch_versions = ch_versions.mix(BWAMEM2_INDEX_SHIFT_MT.out.versions) - ch_versions = ch_versions.mix(SENTIEON_BWAINDEX.out.versions) + ch_versions = ch_versions.mix(SENTIEON_BWAINDEX_GENOME.out.versions) + ch_versions = ch_versions.mix(SENTIEON_BWAINDEX_SHIFT_MT.out.versions) ch_versions = ch_versions.mix(SAMTOOLS_FAIDX_GENOME.out.versions) ch_versions = ch_versions.mix(SAMTOOLS_FAIDX_SHIFT_MT.out.versions) ch_versions = ch_versions.mix(GATK_SD.out.versions) @@ -93,6 +96,7 @@ workflow PREPARE_REFERENCES { emit: bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() + bwa_index_mt_shift = SENTIEON_BWAINDEX_SHIFT_MT.out.index.collect() bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6007fa37..8046694d 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -29,6 +29,7 @@ def checkPathParamList = [ params.known_mills, params.ml_model, params.mt_backchain_shift, + params.mt_bwa_index_shift, params.mt_bwamem2_index_shift, params.mt_fasta_shift, params.mt_fai_shift, @@ -203,6 +204,8 @@ workflow RAREDISEASE { ch_bait_intervals = ch_references.bait_intervals ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index).map {it -> [[id:it[0].simpleName], it]}.collect() : ( ch_references.bwa_index ?: Channel.empty() ) + ch_bwa_index_mt_shift = params.mt_bwa_index_shift ? Channel.fromPath(params.mt_bwa_index_shift).map {it -> [[id:it[0].simpleName], it]}.collect() + : ( ch_references.bwa_index_mt_shift ?: Channel.empty() ) ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index).map {it -> [[id:it[0].simpleName], it]}.collect() : ( ch_references.bwamem2_index ?: Channel.empty() ) ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift).collect() @@ -359,6 +362,7 @@ workflow RAREDISEASE { ANALYSE_MT ( ch_mapped.bam_bai, + ch_bwa_index, ch_bwamem2_index, ch_genome_fasta_meta, ch_genome_fasta_no_meta, @@ -366,6 +370,7 @@ workflow RAREDISEASE { ch_sequence_dictionary_no_meta, ch_genome_fai_no_meta, ch_mt_intervals, + ch_bwa_index_mt_shift, ch_bwamem2_index_mt_shift, ch_mt_fasta_shift_no_meta, ch_sequence_dictionary_mt_shift, From 1186d1d746eef795c2b95e2952348aab36fa0254 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Feb 2023 00:49:53 +0100 Subject: [PATCH 0929/1169] fixed editor config lint error --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 8e73bd01..6e9d8ac1 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -100,7 +100,7 @@ process { ] } - withName: '.*PREPARE_REFERENCES:BWA_INDEX_GENOME' { + withName: '.*PREPARE_REFERENCES:BWA_INDEX_GENOME' { ext.when = {!params.bwa_index && !(params.aligner == "sentieon")} publishDir = [ path: { "${params.outdir}/references" }, @@ -963,7 +963,7 @@ process { ext.args = { "-M -K 100000000 -R ${meta.read_group}" } } - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SENTIEON_BWAMEM_MT' { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SENTIEON_BWAMEM_MT' { ext.args = { "-M -K 10000000 -R ${meta.read_group}" } ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") && params.aligner == "sentieon" } ext.prefix = { "${meta.id}.sorted" } From 1df227725dfb22aaeecf69ac737b165177fcf918 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 10 Feb 2023 10:53:24 +0100 Subject: [PATCH 0930/1169] add mt switch --- nextflow.config | 3 +- nextflow_schema.json | 6 ++++ workflows/raredisease.nf | 78 +++++++++++++++++++++++----------------- 3 files changed, 53 insertions(+), 34 deletions(-) diff --git a/nextflow.config b/nextflow.config index 886cbcb8..86e262ad 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,7 +23,8 @@ params { // Main options analysis_type = 'wgs' annotate_snv_switch = true - annotate_sv_switch = false + annotate_sv_switch = true + annotate_mt_switch = true gens_switch = false platform = 'illumina' diff --git a/nextflow_schema.json b/nextflow_schema.json index 0f243e6c..d72972c3 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -372,6 +372,12 @@ "fa_icon": "fas fa-book", "enum": ["wgs", "wes", "mito"] }, + "annotate_mt_switch": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to run a separate subworkflow for mitochondria.", + "fa_icon": "fas fa-book" + }, "annotate_snv_switch": { "type": "boolean", "default": true, diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6007fa37..5dcc7cba 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -357,27 +357,30 @@ workflow RAREDISEASE { } - ANALYSE_MT ( - ch_mapped.bam_bai, - ch_bwamem2_index, - ch_genome_fasta_meta, - ch_genome_fasta_no_meta, - ch_sequence_dictionary_meta, - ch_sequence_dictionary_no_meta, - ch_genome_fai_no_meta, - ch_mt_intervals, - ch_bwamem2_index_mt_shift, - ch_mt_fasta_shift_no_meta, - ch_sequence_dictionary_mt_shift, - ch_mt_shift_fai, - ch_mt_intervals_shift, - ch_mt_backchain_shift, - params.genome, - params.vep_cache_version, - ch_vep_cache, - CHECK_INPUT.out.case_info - ) - ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) + if (params.annotate_mt_switch) { + ANALYSE_MT ( + ch_mapped.bam_bai, + ch_bwamem2_index, + ch_genome_fasta_meta, + ch_genome_fasta_no_meta, + ch_sequence_dictionary_meta, + ch_sequence_dictionary_no_meta, + ch_genome_fai_no_meta, + ch_mt_intervals, + ch_bwamem2_index_mt_shift, + ch_mt_fasta_shift_no_meta, + ch_sequence_dictionary_mt_shift, + ch_mt_shift_fai, + ch_mt_intervals_shift, + ch_mt_backchain_shift, + params.genome, + params.vep_cache_version, + ch_vep_cache, + CHECK_INPUT.out.case_info + ) + ch_versions = ch_versions.mix(ANALYSE_MT.out.versions) + + } // VARIANT ANNOTATION ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) @@ -398,19 +401,28 @@ workflow RAREDISEASE { ).set {ch_snv_annotate} ch_versions = ch_versions.mix(ch_snv_annotate.versions) - ch_snv_annotate.tbi - .concat(ANALYSE_MT.out.tbi) - .groupTuple() - .set { ch_merged_tbi } - ch_snv_annotate.vcf_ann - .concat(ANALYSE_MT.out.vcf) - .groupTuple() - .set { ch_merged_vcf } - ch_merged_vcf.join(ch_merged_tbi).set {ch_concat_in} - - BCFTOOLS_CONCAT (ch_concat_in) + ch_snv_annotate = ANNOTATE_SNVS.out.vcf_ann + + if (params.annotate_mt_switch) { + + ANNOTATE_SNVS.out.tbi + .concat(ANALYSE_MT.out.tbi) + .groupTuple() + .set { ch_merged_tbi } + + ANNOTATE_SNVS.out.vcf_ann + .concat(ANALYSE_MT.out.vcf) + .groupTuple() + .set { ch_merged_vcf } + + ch_merged_vcf.join(ch_merged_tbi).set {ch_concat_in} + + BCFTOOLS_CONCAT (ch_concat_in) + ch_snv_annotate = BCFTOOLS_CONCAT.out.vcf + } + ANN_CSQ_PLI_SNV ( - BCFTOOLS_CONCAT.out.vcf, + ch_snv_annotate, ch_variant_consequences ) ch_versions = ch_versions.mix(ANN_CSQ_PLI_SNV.out.versions) From 5c6fd9e2ffc59f68de0f0be698368d71c4e0e81e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 10 Feb 2023 13:58:15 +0100 Subject: [PATCH 0931/1169] revert change to nextflow config --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 86e262ad..a36589d3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,7 +23,7 @@ params { // Main options analysis_type = 'wgs' annotate_snv_switch = true - annotate_sv_switch = true + annotate_sv_switch = false annotate_mt_switch = true gens_switch = false platform = 'illumina' From 0b1a7e38181152713ea1364604e8c17f5001ca08 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 13 Feb 2023 13:21:12 +0100 Subject: [PATCH 0932/1169] review suggestions --- subworkflows/local/mitochondria/align_and_call_MT.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 959ac4aa..1a45a28a 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -16,19 +16,18 @@ include { TABIX_TABIX as TABIX_TABIX_MT } fr workflow ALIGN_AND_CALL_MT { take: - fastq // channel: [ val(meta), path('*.fastq.gz') ] - ubam // channel: [ val(meta), path('*.bam') ] + fastq // channel: [ val(meta), path('*.fastq.gz') ] + ubam // channel: [ val(meta), path('*.bam') ] index_bwa // channel: [ /path/to/bwamem2/index/ ] index_bwamem2 // channel: [ /path/to/bwamem2/index/ ] fasta // channel: [ genome.fasta ] dict // channel: [ genome.dict ] fai // channel: [ genome.fai ] - intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] + intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] main: ch_versions = Channel.empty() - // Outputs bam files BWAMEM2_MEM_MT (fastq , index_bwamem2, true) SENTIEON_BWAMEM_MT ( fastq, fasta, fai, index_bwa ) From 642dd347465db88fffa3eb42ddce04d96b03d123 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Feb 2023 13:24:40 +0100 Subject: [PATCH 0933/1169] review suggestions --- nextflow.config | 2 +- nextflow_schema.json | 12 ++++++------ subworkflows/local/call_snv.nf | 11 ++--------- workflows/raredisease.nf | 21 ++++++++++++++++++--- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/nextflow.config b/nextflow.config index a36589d3..ccd41f42 100644 --- a/nextflow.config +++ b/nextflow.config @@ -24,7 +24,7 @@ params { analysis_type = 'wgs' annotate_snv_switch = true annotate_sv_switch = false - annotate_mt_switch = true + dedicated_mt_analysis = true gens_switch = false platform = 'illumina' diff --git a/nextflow_schema.json b/nextflow_schema.json index d72972c3..46bf51ba 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -372,12 +372,6 @@ "fa_icon": "fas fa-book", "enum": ["wgs", "wes", "mito"] }, - "annotate_mt_switch": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to run a separate subworkflow for mitochondria.", - "fa_icon": "fas fa-book" - }, "annotate_snv_switch": { "type": "boolean", "default": true, @@ -390,6 +384,12 @@ "description": "Specifies whether or not to run annotate structural variant subworkflow.", "fa_icon": "fas fa-book" }, + "dedicated_mt_analysis": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to run a separate subworkflow for mitochondrial analysis.", + "fa_icon": "fas fa-book" + }, "gens_switch": { "type": "boolean", "default": false, diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index 23e94ed0..a1e98a2f 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -45,18 +45,11 @@ workflow CALL_SNV { ch_vcf = Channel.empty().mix(CALL_SNV_DEEPVARIANT.out.vcf, CALL_SNV_SENTIEON.out.vcf) ch_tabix = Channel.empty().mix(CALL_SNV_DEEPVARIANT.out.tabix, CALL_SNV_SENTIEON.out.tabix) - ch_vcf.join(ch_tabix) - .map { meta, vcf, tbi -> return [meta, vcf, tbi, []]} - .set { ch_selvar_in } - - GATK4_SELECTVARIANTS(ch_selvar_in) - ch_versions = ch_versions.mix(CALL_SNV_DEEPVARIANT.out.versions) ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) - ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions) emit: - vcf = GATK4_SELECTVARIANTS.out.vcf - tabix = GATK4_SELECTVARIANTS.out.tbi + vcf = ch_vcf + tabix = ch_tabix versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 5dcc7cba..c7020450 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -84,6 +84,7 @@ include { MAKE_PED } from '../modules/local/create_ include { BCFTOOLS_CONCAT } from '../modules/nf-core/bcftools/concat/main' include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' include { FASTQC } from '../modules/nf-core/fastqc/main' +include { GATK4_SELECTVARIANTS } from '../modules/nf-core/gatk4/selectvariants/main' include { MULTIQC } from '../modules/nf-core/multiqc/main' // @@ -357,7 +358,7 @@ workflow RAREDISEASE { } - if (params.annotate_mt_switch) { + if (params.dedicated_mt_analysis) { ANALYSE_MT ( ch_mapped.bam_bai, ch_bwamem2_index, @@ -383,9 +384,22 @@ workflow RAREDISEASE { } // VARIANT ANNOTATION - ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) if (params.annotate_snv_switch) { + + ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) + + if (params.dedicated_mt_analysis) { + ch_vcf + .map { meta, vcf, tbi -> return [meta, vcf, tbi, []]} + .set { ch_selvar_in } + + GATK4_SELECTVARIANTS(ch_selvar_in) // remove mitochondrial variants + + ch_vcf = GATK4_SELECTVARIANTS.out.vcf.join(GATK4_SELECTVARIANTS.out.tbi, by: [0]) + ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions) + } + ANNOTATE_SNVS ( ch_vcf, ch_vcfanno_resources, @@ -403,7 +417,7 @@ workflow RAREDISEASE { ch_snv_annotate = ANNOTATE_SNVS.out.vcf_ann - if (params.annotate_mt_switch) { + if (params.dedicated_mt_analysis) { ANNOTATE_SNVS.out.tbi .concat(ANALYSE_MT.out.tbi) @@ -419,6 +433,7 @@ workflow RAREDISEASE { BCFTOOLS_CONCAT (ch_concat_in) ch_snv_annotate = BCFTOOLS_CONCAT.out.vcf + ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) } ANN_CSQ_PLI_SNV ( From 7683a73446d356463c98b9ab391e7c013139616d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Feb 2023 13:27:32 +0100 Subject: [PATCH 0934/1169] change order --- workflows/raredisease.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index a46c5729..1b3127f5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -425,16 +425,16 @@ workflow RAREDISEASE { if (params.dedicated_mt_analysis) { - ANNOTATE_SNVS.out.tbi - .concat(ANALYSE_MT.out.tbi) - .groupTuple() - .set { ch_merged_tbi } - ANNOTATE_SNVS.out.vcf_ann .concat(ANALYSE_MT.out.vcf) .groupTuple() .set { ch_merged_vcf } + ANNOTATE_SNVS.out.tbi + .concat(ANALYSE_MT.out.tbi) + .groupTuple() + .set { ch_merged_tbi } + ch_merged_vcf.join(ch_merged_tbi).set {ch_concat_in} BCFTOOLS_CONCAT (ch_concat_in) From d5a9b8131bb9471ad75a0ad4a8a267a57948bccb Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Feb 2023 13:36:06 +0100 Subject: [PATCH 0935/1169] remove extra spaces --- subworkflows/local/mitochondria/align_and_call_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 1a45a28a..5baddbc9 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -2,7 +2,7 @@ // Align and call MT // -include { SENTIEON_BWAMEM as SENTIEON_BWAMEM_MT } from '../../../modules/local/sentieon/bwamem' +include { SENTIEON_BWAMEM as SENTIEON_BWAMEM_MT } from '../../../modules/local/sentieon/bwamem' include { BWAMEM2_MEM as BWAMEM2_MEM_MT } from '../../../modules/nf-core/bwamem2/mem/main' include { GATK4_MERGEBAMALIGNMENT as GATK4_MERGEBAMALIGNMENT_MT } from '../../../modules/nf-core/gatk4/mergebamalignment/main' include { PICARD_ADDORREPLACEREADGROUPS as PICARD_ADDORREPLACEREADGROUPS_MT } from '../../../modules/nf-core/picard/addorreplacereadgroups/main' From 339471c46c73bd4881ac6e7892b3693ddd6233f4 Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 14 Feb 2023 15:34:01 +0100 Subject: [PATCH 0936/1169] Added bcftools filter --- .../local/variant_calling/call_snv_sentieon.nf | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 01d4297f..4076e2dd 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -8,6 +8,9 @@ include { BCFTOOLS_MERGE } from '../../../modules/nf-c include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_SEN } from '../../../modules/nf-core/bcftools/norm/main' include { BCFTOOLS_NORM as REMOVE_DUPLICATES_SEN } from '../../../modules/nf-core/bcftools/norm/main' include { TABIX_TABIX as TABIX_SEN } from '../../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_BCFTOOLS } from '../../../modules/nf-core/tabix/tabix/main' +include { BCFTOOLS_FILTER as BCF_FILTER_ONE } from '../../../modules/nf-core/bcftools/filter/main' +include { BCFTOOLS_FILTER as BCF_FILTER_TWO } from '../../../modules/nf-core/bcftools/filter/main' workflow CALL_SNV_SENTIEON { take: @@ -36,6 +39,12 @@ workflow CALL_SNV_SENTIEON { ch_index = SENTIEON_DNAMODELAPPLY.out.vcf_index } + BCF_FILTER_ONE (ch_vcf ) + BCF_FILTER_TWO ( BCF_FILTER_ONE.out.vcf ) + ch_vcf = BCF_FILTER_TWO.out.vcf + TABIX_BCFTOOLS ( ch_vcf ) + ch_index = TABIX_BCFTOOLS.out.tbi + ch_vcf.join(ch_index) .map { meta,vcf,tbi -> return [vcf,tbi] } .set { ch_vcf_idx } @@ -68,6 +77,7 @@ workflow CALL_SNV_SENTIEON { ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_SEN.out.versions.first()) ch_versions = ch_versions.mix(REMOVE_DUPLICATES_SEN.out.versions.first()) ch_versions = ch_versions.mix(TABIX_SEN.out.versions.first()) + ch_versions = ch_versions.mix(BCF_FILTER_ONE.out.versions.first()) emit: vcf = REMOVE_DUPLICATES_SEN.out.vcf From bfcef5b8cdc0eda6dfd085106e3639bc1d2ccec3 Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 14 Feb 2023 15:48:17 +0100 Subject: [PATCH 0937/1169] Added bcftools filter module configs --- conf/modules.config | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 6e9d8ac1..dbe688c0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -423,6 +423,25 @@ process { ] } + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_ONE' { + ext.args = "-s 'ML_FAIL' -i 'INFO/ML_PROB <= 0.95' -m x -Oz" + ext.prefix = { "${meta.id}_mlfiltered_0.95" } + publishDir = [ + path: { "${params.outdir}/sentieon_filter" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_TWO' { + ext.args = "-i FILTER='\"PASS\"' -m x -Oz" + ext.prefix = { "${meta.id}_passed" } + publishDir = [ + path: { "${params.outdir}/sentieon_filter" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SPLIT_MULTIALLELICS_SEN' { ext.args = '--output-type z --multiallelics -both' ext.prefix = { "${meta.id}_split" } From 8488414e2fa0ea8158f1cad275efcdaa7adf24dd Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 14 Feb 2023 15:48:42 +0100 Subject: [PATCH 0938/1169] New line --- conf/modules.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index dbe688c0..314c6354 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -432,6 +432,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_TWO' { ext.args = "-i FILTER='\"PASS\"' -m x -Oz" ext.prefix = { "${meta.id}_passed" } @@ -441,7 +442,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SPLIT_MULTIALLELICS_SEN' { ext.args = '--output-type z --multiallelics -both' ext.prefix = { "${meta.id}_split" } From 56fd81e89489a971a6adc08929ff9a0a553a049a Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 14 Feb 2023 15:51:40 +0100 Subject: [PATCH 0939/1169] installed bcftools filter module --- modules.json | 5 +++ modules/nf-core/bcftools/filter/main.nf | 46 ++++++++++++++++++++++++ modules/nf-core/bcftools/filter/meta.yml | 41 +++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 modules/nf-core/bcftools/filter/main.nf create mode 100644 modules/nf-core/bcftools/filter/meta.yml diff --git a/modules.json b/modules.json index 55fa0e61..f99e87d5 100644 --- a/modules.json +++ b/modules.json @@ -10,6 +10,11 @@ "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", "installed_by": ["modules"] }, + "bcftools/filter": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, "bcftools/merge": { "branch": "master", "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", diff --git a/modules/nf-core/bcftools/filter/main.nf b/modules/nf-core/bcftools/filter/main.nf new file mode 100644 index 00000000..4e02009d --- /dev/null +++ b/modules/nf-core/bcftools/filter/main.nf @@ -0,0 +1,46 @@ +process BCFTOOLS_FILTER { + tag "$meta.id" + label 'process_medium' + + conda "bioconda::bcftools=1.16" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': + 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" + + input: + tuple val(meta), path(vcf) + + output: + tuple val(meta), path("*.gz"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + bcftools filter \\ + --output ${prefix}.vcf.gz \\ + $args \\ + $vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + touch ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/filter/meta.yml b/modules/nf-core/bcftools/filter/meta.yml new file mode 100644 index 00000000..05a6d828 --- /dev/null +++ b/modules/nf-core/bcftools/filter/meta.yml @@ -0,0 +1,41 @@ +name: bcftools_filter +description: Filters VCF files +keywords: + - variant calling + - filtering + - VCF +tools: + - filter: + description: | + Apply fixed-threshold filters to VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF input file + pattern: "*.{vcf}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF filtered output file + pattern: "*.{vcf}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" From f78c1c9f0fe39b4dcc7d19367ab3139fa8954167 Mon Sep 17 00:00:00 2001 From: jemten Date: Wed, 15 Feb 2023 09:48:50 +0100 Subject: [PATCH 0940/1169] updates modules to remove enable_conda --- modules.json | 124 +++++++++--------- modules/local/add_most_severe_consequence.nf | 2 +- modules/local/add_most_severe_pli.nf | 2 +- modules/local/change_name.nf | 2 +- modules/local/check_input_vcf.nf | 2 +- modules/local/create_bed_from_fai.nf | 2 +- modules/local/create_pedfile.nf | 2 +- modules/local/ensemblvep/main.nf | 5 +- modules/local/filter_vep.nf | 5 +- modules/local/gatk4/collectreadcounts/main.nf | 2 +- modules/local/gatk4/denoisereadcounts/main.nf | 2 +- modules/local/get_chrom_sizes.nf | 2 +- modules/nf-core/bcftools/concat/main.nf | 2 +- modules/nf-core/bcftools/concat/meta.yml | 1 + modules/nf-core/bcftools/merge/main.nf | 2 +- modules/nf-core/bcftools/norm/main.nf | 2 +- modules/nf-core/bcftools/roh/main.nf | 2 +- modules/nf-core/bcftools/view/main.nf | 2 +- modules/nf-core/bwa/index/main.nf | 2 +- modules/nf-core/bwamem2/index/main.nf | 2 +- modules/nf-core/bwamem2/index/meta.yml | 2 +- modules/nf-core/bwamem2/mem/main.nf | 2 +- modules/nf-core/cat/cat/main.nf | 2 +- modules/nf-core/cnvpytor/callcnvs/main.nf | 2 +- modules/nf-core/cnvpytor/histogram/main.nf | 2 +- .../nf-core/cnvpytor/importreaddepth/main.nf | 2 +- modules/nf-core/cnvpytor/partition/main.nf | 2 +- modules/nf-core/cnvpytor/view/main.nf | 2 +- modules/nf-core/deepvariant/main.nf | 8 +- modules/nf-core/expansionhunter/main.nf | 2 +- .../nf-core/gatk4/bedtointervallist/main.nf | 2 +- .../gatk4/createsequencedictionary/main.nf | 4 +- .../nf-core/gatk4/filtermutectcalls/main.nf | 2 +- .../nf-core/gatk4/intervallisttools/main.nf | 2 +- .../nf-core/gatk4/mergebamalignment/main.nf | 2 +- modules/nf-core/gatk4/mergevcfs/main.nf | 2 +- modules/nf-core/gatk4/mutect2/main.nf | 2 +- modules/nf-core/gatk4/printreads/main.nf | 2 +- modules/nf-core/gatk4/revertsam/main.nf | 2 +- modules/nf-core/gatk4/samtofastq/main.nf | 2 +- modules/nf-core/gatk4/selectvariants/main.nf | 2 +- modules/nf-core/gatk4/splitintervals/main.nf | 2 +- .../nf-core/gatk4/variantfiltration/main.nf | 2 +- modules/nf-core/genmod/annotate/main.nf | 2 +- modules/nf-core/genmod/compound/main.nf | 2 +- modules/nf-core/genmod/models/main.nf | 2 +- modules/nf-core/genmod/score/main.nf | 2 +- modules/nf-core/glnexus/main.nf | 2 +- modules/nf-core/haplocheck/main.nf | 2 +- modules/nf-core/haplogrep2/classify/main.nf | 2 +- modules/nf-core/hmtnote/main.nf | 2 +- modules/nf-core/manta/germline/main.nf | 2 +- modules/nf-core/mosdepth/main.nf | 8 +- modules/nf-core/mosdepth/meta.yml | 10 ++ modules/nf-core/multiqc/main.nf | 6 +- .../picard/addorreplacereadgroups/main.nf | 2 +- .../nf-core/picard/collecthsmetrics/main.nf | 4 +- .../picard/collectmultiplemetrics/main.nf | 4 +- modules/nf-core/picard/liftovervcf/main.nf | 2 +- modules/nf-core/picard/markduplicates/main.nf | 2 +- modules/nf-core/picard/sortvcf/main.nf | 2 +- modules/nf-core/qualimap/bamqc/main.nf | 2 +- modules/nf-core/rhocall/annotate/main.nf | 2 +- modules/nf-core/samtools/faidx/main.nf | 2 +- modules/nf-core/samtools/index/main.nf | 2 +- modules/nf-core/samtools/merge/main.nf | 2 +- modules/nf-core/samtools/sort/main.nf | 2 +- modules/nf-core/samtools/stats/main.nf | 2 +- modules/nf-core/stranger/main.nf | 2 +- modules/nf-core/svdb/merge/main.nf | 2 +- modules/nf-core/svdb/query/main.nf | 2 +- modules/nf-core/tabix/bgziptabix/main.nf | 2 +- modules/nf-core/tabix/tabix/main.nf | 2 +- modules/nf-core/tiddit/cov/main.nf | 2 +- modules/nf-core/tiddit/sv/main.nf | 2 +- modules/nf-core/ucsc/wigtobigwig/main.nf | 2 +- modules/nf-core/vcfanno/main.nf | 2 +- 77 files changed, 162 insertions(+), 149 deletions(-) diff --git a/modules.json b/modules.json index 55fa0e61..5645d0c1 100644 --- a/modules.json +++ b/modules.json @@ -7,72 +7,72 @@ "nf-core": { "bcftools/concat": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "git_sha": "582ff1755bdd205c65e2ba4c31e0a008dae299ec", "installed_by": ["modules"] }, "bcftools/merge": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "bcftools/norm": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "bcftools/roh": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "bcftools/view": { "branch": "master", - "git_sha": "78cf39939fbe160a1410c44a6c5946f9a4c56e7e", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "bwa/index": { "branch": "master", - "git_sha": "9518fa4f65f3fb8cde24fde7d40333b39ec8fd65", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "bwamem2/mem": { "branch": "master", - "git_sha": "653588be2a4aadab487b530643dbc9baf7a485c4", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "cat/cat": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "cnvpytor/callcnvs": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "cnvpytor/histogram": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "cnvpytor/importreaddepth": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "cnvpytor/partition": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "cnvpytor/view": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { @@ -82,12 +82,12 @@ }, "deepvariant": { "branch": "master", - "git_sha": "6e58487f28429876b7cad237afbf4685e90c7bd4", + "git_sha": "c62b41a07a00fee11ec73e2a0d4a1aec771a742b", "installed_by": ["modules"] }, "expansionhunter": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "fastqc": { @@ -97,232 +97,232 @@ }, "gatk4/bedtointervallist": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/createsequencedictionary": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/filtermutectcalls": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/intervallisttools": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/mergebamalignment": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/mergevcfs": { "branch": "master", - "git_sha": "c25943553f62be5f907e3c12c42eaf0a1b40746d", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/mutect2": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/printreads": { "branch": "master", - "git_sha": "6220bc7d99377159f4cc7f6a421b494f3e2466d6", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/revertsam": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/samtofastq": { "branch": "master", - "git_sha": "7578005a576f3ac1b0d4f10c037dde34cdedfb67", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/selectvariants": { "branch": "master", - "git_sha": "9b7ca0f32e122a0cd1f33689fafbad4112407b42", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/splitintervals": { "branch": "master", - "git_sha": "f6ee593e77fbb9fb88e506b761611cccb0bf51ac", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "gatk4/variantfiltration": { "branch": "master", - "git_sha": "c95bed5b125e90553814b8720875c8c663524619", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "genmod/annotate": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "genmod/compound": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "genmod/models": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "genmod/score": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "glnexus": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "haplocheck": { "branch": "master", - "git_sha": "d39b18e3613d996884a11ef2948e15c4c71cffae", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "haplogrep2/classify": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "hmtnote": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "manta/germline": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "mosdepth": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "def5f182583df0c20f43ec3d4355e8ebd341aaa9", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "ee80d14721e76e2e079103b8dcd5d57129e584ba", "installed_by": ["modules"] }, "picard/addorreplacereadgroups": { "branch": "master", - "git_sha": "a50554f372baf3e079425e5d3ac4d09dc5ff8bc5", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "picard/collecthsmetrics": { "branch": "master", - "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "picard/collectmultiplemetrics": { "branch": "master", - "git_sha": "f24b0232ef276882e61edbacd4e3f2f687031ef2", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "picard/liftovervcf": { "branch": "master", - "git_sha": "3d5d18db1b39e1133505ae2fa2a062b0073c8a6a", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "picard/markduplicates": { "branch": "master", - "git_sha": "eca65aa4a5e2e192ac44d6962c8f9260f314ffb8", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "picard/sortvcf": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "qualimap/bamqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "rhocall/annotate": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "samtools/index": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "stranger": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "svdb/merge": { "branch": "master", - "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "svdb/query": { "branch": "master", - "git_sha": "4a8a2caf44b87734b41ea4c67f508c14f0745ee7", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "tabix/tabix": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "tiddit/cov": { "branch": "master", - "git_sha": "3a54013f0790674624b77e9a074ce8d22400d4fa", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "tiddit/sv": { "branch": "master", - "git_sha": "89f98091ac9e1653657b9e324e394b158d723a4f", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "ucsc/wigtobigwig": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "vcfanno": { "branch": "master", - "git_sha": "2edbd10f12f7d3d681d2196707f15140d0e4d463", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] } } diff --git a/modules/local/add_most_severe_consequence.nf b/modules/local/add_most_severe_consequence.nf index ff99b76c..9d2d9551 100644 --- a/modules/local/add_most_severe_consequence.nf +++ b/modules/local/add_most_severe_consequence.nf @@ -2,7 +2,7 @@ process ADD_MOST_SEVERE_CSQ { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'quay.io/biocontainers/python:3.9--1' }" diff --git a/modules/local/add_most_severe_pli.nf b/modules/local/add_most_severe_pli.nf index 53108c87..dd492331 100644 --- a/modules/local/add_most_severe_pli.nf +++ b/modules/local/add_most_severe_pli.nf @@ -2,7 +2,7 @@ process ADD_MOST_SEVERE_PLI { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'quay.io/biocontainers/python:3.9--1' }" diff --git a/modules/local/change_name.nf b/modules/local/change_name.nf index 6770f8bc..38ee7c95 100644 --- a/modules/local/change_name.nf +++ b/modules/local/change_name.nf @@ -3,7 +3,7 @@ process CHANGE_NAME { label 'process_low' label 'process_single' - conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'quay.io/biocontainers/python:3.9--1' }" diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf index c56e25ed..bc020ff1 100644 --- a/modules/local/check_input_vcf.nf +++ b/modules/local/check_input_vcf.nf @@ -2,7 +2,7 @@ process CHECK_INPUT_VCF { tag "check_vcf" label 'process_single' - conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'quay.io/biocontainers/python:3.9--1' }" diff --git a/modules/local/create_bed_from_fai.nf b/modules/local/create_bed_from_fai.nf index c097a00e..ed2a35d2 100644 --- a/modules/local/create_bed_from_fai.nf +++ b/modules/local/create_bed_from_fai.nf @@ -2,7 +2,7 @@ process BUILD_BED { tag "$meta.id" label 'process_single' - conda (params.enable_conda ? "anaconda::gawk=5.1.0" : null) + conda "anaconda::gawk=5.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gawk:5.1.0' : 'quay.io/biocontainers/gawk:5.1.0' }" diff --git a/modules/local/create_pedfile.nf b/modules/local/create_pedfile.nf index 0ee1e96c..d5940829 100644 --- a/modules/local/create_pedfile.nf +++ b/modules/local/create_pedfile.nf @@ -2,7 +2,7 @@ process MAKE_PED { tag "make_ped" label 'process_single' - conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'quay.io/biocontainers/python:3.9--1' }" diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index a893c4d5..ecff7854 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -2,8 +2,9 @@ process ENSEMBLVEP { tag "$meta.id" label 'process_medium' - if (params.enable_conda) { - exit 1, "Conda environments cannot be used with vep at the moment. Please use Docker or Singularity containers." + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + exit 1, "Local VEP module does not support Conda. Please use Docker / Singularity / Podman instead." } container "ensemblorg/ensembl-vep:release_107.0" diff --git a/modules/local/filter_vep.nf b/modules/local/filter_vep.nf index 3122b43b..4f3d8f59 100644 --- a/modules/local/filter_vep.nf +++ b/modules/local/filter_vep.nf @@ -2,8 +2,9 @@ process FILTER_VEP { tag "$meta.id" label 'process_low' - if (params.enable_conda) { - exit 1, "Conda environments cannot be used with vep at the moment. Please use Docker or Singularity containers." + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + exit 1, "Local VEP module does not support Conda. Please use Docker / Singularity / Podman instead." } container "ensemblorg/ensembl-vep:release_107.0" diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index de6fed4f..b9690e0b 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -2,7 +2,7 @@ process GATK4_COLLECTREADCOUNTS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + conda "bioconda::gatk4=4.2.4.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" diff --git a/modules/local/gatk4/denoisereadcounts/main.nf b/modules/local/gatk4/denoisereadcounts/main.nf index 8ca2e8a7..48d3da82 100644 --- a/modules/local/gatk4/denoisereadcounts/main.nf +++ b/modules/local/gatk4/denoisereadcounts/main.nf @@ -2,7 +2,7 @@ process GATK4_DENOISEREADCOUNTS { tag "$meta.id" label 'process_high' - conda (params.enable_conda ? "bioconda::gatk4=4.2.4.1" : null) + conda "bioconda::gatk4=4.2.4.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index 7a483ec2..d5dc0a76 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -2,7 +2,7 @@ process GET_CHROM_SIZES { tag "$fai" label 'process_single' - conda (params.enable_conda ? "conda-forge::coreutils=8.31" : null) + conda "conda-forge::coreutils=8.31" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gnu-wget:1.18--0' : 'quay.io/biocontainers/gnu-wget:1.18--0' }" diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf index f933dd13..c7c39d9f 100644 --- a/modules/nf-core/bcftools/concat/main.nf +++ b/modules/nf-core/bcftools/concat/main.nf @@ -2,7 +2,7 @@ process BCFTOOLS_CONCAT { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) + conda "bioconda::bcftools=1.16" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" diff --git a/modules/nf-core/bcftools/concat/meta.yml b/modules/nf-core/bcftools/concat/meta.yml index 167dbe5a..e8c83cd6 100644 --- a/modules/nf-core/bcftools/concat/meta.yml +++ b/modules/nf-core/bcftools/concat/meta.yml @@ -46,3 +46,4 @@ output: pattern: "versions.yml" authors: - "@abhi18av" + - "@nvnieuwk" diff --git a/modules/nf-core/bcftools/merge/main.nf b/modules/nf-core/bcftools/merge/main.nf index caf15d36..e664f0eb 100644 --- a/modules/nf-core/bcftools/merge/main.nf +++ b/modules/nf-core/bcftools/merge/main.nf @@ -2,7 +2,7 @@ process BCFTOOLS_MERGE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) + conda "bioconda::bcftools=1.16" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" diff --git a/modules/nf-core/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf index a01b339b..ef95bee4 100644 --- a/modules/nf-core/bcftools/norm/main.nf +++ b/modules/nf-core/bcftools/norm/main.nf @@ -2,7 +2,7 @@ process BCFTOOLS_NORM { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) + conda "bioconda::bcftools=1.16" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" diff --git a/modules/nf-core/bcftools/roh/main.nf b/modules/nf-core/bcftools/roh/main.nf index b3cad8ed..dc516b02 100644 --- a/modules/nf-core/bcftools/roh/main.nf +++ b/modules/nf-core/bcftools/roh/main.nf @@ -2,7 +2,7 @@ process BCFTOOLS_ROH { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) + conda "bioconda::bcftools=1.16" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" diff --git a/modules/nf-core/bcftools/view/main.nf b/modules/nf-core/bcftools/view/main.nf index b0458ecd..04ced9c9 100644 --- a/modules/nf-core/bcftools/view/main.nf +++ b/modules/nf-core/bcftools/view/main.nf @@ -2,7 +2,7 @@ process BCFTOOLS_VIEW { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bcftools=1.16" : null) + conda "bioconda::bcftools=1.16" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" diff --git a/modules/nf-core/bwa/index/main.nf b/modules/nf-core/bwa/index/main.nf index 6d70fc15..7ccf3110 100644 --- a/modules/nf-core/bwa/index/main.nf +++ b/modules/nf-core/bwa/index/main.nf @@ -2,7 +2,7 @@ process BWA_INDEX { tag "$fasta" label 'process_single' - conda (params.enable_conda ? "bioconda::bwa=0.7.17" : null) + conda "bioconda::bwa=0.7.17" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7' : 'quay.io/biocontainers/bwa:0.7.17--hed695b0_7' }" diff --git a/modules/nf-core/bwamem2/index/main.nf b/modules/nf-core/bwamem2/index/main.nf index 0b7ad199..a236121b 100644 --- a/modules/nf-core/bwamem2/index/main.nf +++ b/modules/nf-core/bwamem2/index/main.nf @@ -2,7 +2,7 @@ process BWAMEM2_INDEX { tag "$fasta" label 'process_single' - conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1" : null) + conda "bioconda::bwa-mem2=2.2.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bwa-mem2:2.2.1--he513fc3_0' : 'quay.io/biocontainers/bwa-mem2:2.2.1--he513fc3_0' }" diff --git a/modules/nf-core/bwamem2/index/meta.yml b/modules/nf-core/bwamem2/index/meta.yml index a6b11ae5..40c26c38 100644 --- a/modules/nf-core/bwamem2/index/meta.yml +++ b/modules/nf-core/bwamem2/index/meta.yml @@ -6,7 +6,7 @@ keywords: - genome - reference tools: - - bwa: + - bwamem2: description: | BWA-mem2 is a software package for mapping DNA sequences against a large reference genome, such as the human genome. diff --git a/modules/nf-core/bwamem2/mem/main.nf b/modules/nf-core/bwamem2/mem/main.nf index 84b99dfa..489b1704 100644 --- a/modules/nf-core/bwamem2/mem/main.nf +++ b/modules/nf-core/bwamem2/mem/main.nf @@ -2,7 +2,7 @@ process BWAMEM2_MEM { tag "$meta.id" label 'process_high' - conda (params.enable_conda ? "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.16.1" : null) + conda "bioconda::bwa-mem2=2.2.1 bioconda::samtools=1.16.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:2cdf6bf1e92acbeb9b2834b1c58754167173a410-0' : 'quay.io/biocontainers/mulled-v2-e5d375990341c5aef3c9aff74f96f66f65375ef6:2cdf6bf1e92acbeb9b2834b1c58754167173a410-0' }" diff --git a/modules/nf-core/cat/cat/main.nf b/modules/nf-core/cat/cat/main.nf index 40e53f3e..840af4b9 100644 --- a/modules/nf-core/cat/cat/main.nf +++ b/modules/nf-core/cat/cat/main.nf @@ -2,7 +2,7 @@ process CAT_CAT { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "conda-forge::pigz=2.3.4" : null) + conda "conda-forge::pigz=2.3.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/pigz:2.3.4' : 'quay.io/biocontainers/pigz:2.3.4' }" diff --git a/modules/nf-core/cnvpytor/callcnvs/main.nf b/modules/nf-core/cnvpytor/callcnvs/main.nf index 021cd879..2a92a3d2 100644 --- a/modules/nf-core/cnvpytor/callcnvs/main.nf +++ b/modules/nf-core/cnvpytor/callcnvs/main.nf @@ -2,7 +2,7 @@ process CNVPYTOR_CALLCNVS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) + conda "bioconda::cnvpytor=1.2.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" diff --git a/modules/nf-core/cnvpytor/histogram/main.nf b/modules/nf-core/cnvpytor/histogram/main.nf index 2abb96e6..aebb4f89 100644 --- a/modules/nf-core/cnvpytor/histogram/main.nf +++ b/modules/nf-core/cnvpytor/histogram/main.nf @@ -2,7 +2,7 @@ process CNVPYTOR_HISTOGRAM { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) + conda "bioconda::cnvpytor=1.2.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" diff --git a/modules/nf-core/cnvpytor/importreaddepth/main.nf b/modules/nf-core/cnvpytor/importreaddepth/main.nf index fd09d1c7..860f4f74 100644 --- a/modules/nf-core/cnvpytor/importreaddepth/main.nf +++ b/modules/nf-core/cnvpytor/importreaddepth/main.nf @@ -2,7 +2,7 @@ process CNVPYTOR_IMPORTREADDEPTH { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) + conda "bioconda::cnvpytor=1.2.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" diff --git a/modules/nf-core/cnvpytor/partition/main.nf b/modules/nf-core/cnvpytor/partition/main.nf index d32741ba..46b46401 100644 --- a/modules/nf-core/cnvpytor/partition/main.nf +++ b/modules/nf-core/cnvpytor/partition/main.nf @@ -2,7 +2,7 @@ process CNVPYTOR_PARTITION { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) + conda "bioconda::cnvpytor=1.2.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" diff --git a/modules/nf-core/cnvpytor/view/main.nf b/modules/nf-core/cnvpytor/view/main.nf index 153f43e8..bf1edc92 100644 --- a/modules/nf-core/cnvpytor/view/main.nf +++ b/modules/nf-core/cnvpytor/view/main.nf @@ -2,7 +2,7 @@ process CNVPYTOR_VIEW { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::cnvpytor=1.2.1" : null) + conda "bioconda::cnvpytor=1.2.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" diff --git a/modules/nf-core/deepvariant/main.nf b/modules/nf-core/deepvariant/main.nf index de48d9c1..7e11b766 100644 --- a/modules/nf-core/deepvariant/main.nf +++ b/modules/nf-core/deepvariant/main.nf @@ -2,13 +2,13 @@ process DEEPVARIANT { tag "$meta.id" label 'process_medium' + container "google/deepvariant:1.4.0" - if (params.enable_conda) { - exit 1, "Conda environments cannot be used with DeepVariant at the moment. Please use Docker or Singularity containers." + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + exit 1, "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." } - container "google/deepvariant:1.4.0" - input: tuple val(meta), path(input), path(index), path(intervals) path(fasta) diff --git a/modules/nf-core/expansionhunter/main.nf b/modules/nf-core/expansionhunter/main.nf index f60b75b4..5db8794a 100644 --- a/modules/nf-core/expansionhunter/main.nf +++ b/modules/nf-core/expansionhunter/main.nf @@ -2,7 +2,7 @@ process EXPANSIONHUNTER { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::expansionhunter=4.0.2" : null) + conda "bioconda::expansionhunter=4.0.2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/expansionhunter:4.0.2--he785bd8_0' : 'quay.io/biocontainers/expansionhunter:4.0.2--he785bd8_0' }" diff --git a/modules/nf-core/gatk4/bedtointervallist/main.nf b/modules/nf-core/gatk4/bedtointervallist/main.nf index 64a3fa9a..41fab003 100644 --- a/modules/nf-core/gatk4/bedtointervallist/main.nf +++ b/modules/nf-core/gatk4/bedtointervallist/main.nf @@ -2,7 +2,7 @@ process GATK4_BEDTOINTERVALLIST { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/createsequencedictionary/main.nf b/modules/nf-core/gatk4/createsequencedictionary/main.nf index fb78cdf5..bc324ada 100644 --- a/modules/nf-core/gatk4/createsequencedictionary/main.nf +++ b/modules/nf-core/gatk4/createsequencedictionary/main.nf @@ -2,7 +2,7 @@ process GATK4_CREATESEQUENCEDICTIONARY { tag "$fasta" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" @@ -41,7 +41,7 @@ process GATK4_CREATESEQUENCEDICTIONARY { stub: """ - touch test.dict + touch ${fasta.baseName}.dict cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/gatk4/filtermutectcalls/main.nf b/modules/nf-core/gatk4/filtermutectcalls/main.nf index 130c83b6..f3585bb3 100644 --- a/modules/nf-core/gatk4/filtermutectcalls/main.nf +++ b/modules/nf-core/gatk4/filtermutectcalls/main.nf @@ -2,7 +2,7 @@ process GATK4_FILTERMUTECTCALLS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/intervallisttools/main.nf b/modules/nf-core/gatk4/intervallisttools/main.nf index 09e2b257..84da7bf7 100644 --- a/modules/nf-core/gatk4/intervallisttools/main.nf +++ b/modules/nf-core/gatk4/intervallisttools/main.nf @@ -2,7 +2,7 @@ process GATK4_INTERVALLISTTOOLS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/mergebamalignment/main.nf b/modules/nf-core/gatk4/mergebamalignment/main.nf index 55f9b6a5..6bbab76c 100644 --- a/modules/nf-core/gatk4/mergebamalignment/main.nf +++ b/modules/nf-core/gatk4/mergebamalignment/main.nf @@ -2,7 +2,7 @@ process GATK4_MERGEBAMALIGNMENT { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/mergevcfs/main.nf b/modules/nf-core/gatk4/mergevcfs/main.nf index 08fb3969..d418468f 100644 --- a/modules/nf-core/gatk4/mergevcfs/main.nf +++ b/modules/nf-core/gatk4/mergevcfs/main.nf @@ -2,7 +2,7 @@ process GATK4_MERGEVCFS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/mutect2/main.nf b/modules/nf-core/gatk4/mutect2/main.nf index 693340d9..c2085266 100644 --- a/modules/nf-core/gatk4/mutect2/main.nf +++ b/modules/nf-core/gatk4/mutect2/main.nf @@ -2,7 +2,7 @@ process GATK4_MUTECT2 { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/printreads/main.nf b/modules/nf-core/gatk4/printreads/main.nf index c7562d9e..26a70681 100644 --- a/modules/nf-core/gatk4/printreads/main.nf +++ b/modules/nf-core/gatk4/printreads/main.nf @@ -2,7 +2,7 @@ process GATK4_PRINTREADS { tag "$meta.id" label 'process_single' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/revertsam/main.nf b/modules/nf-core/gatk4/revertsam/main.nf index 1c52aeff..9fe041c4 100644 --- a/modules/nf-core/gatk4/revertsam/main.nf +++ b/modules/nf-core/gatk4/revertsam/main.nf @@ -2,7 +2,7 @@ process GATK4_REVERTSAM { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/samtofastq/main.nf b/modules/nf-core/gatk4/samtofastq/main.nf index b7a6bcb0..9ba5ea8d 100644 --- a/modules/nf-core/gatk4/samtofastq/main.nf +++ b/modules/nf-core/gatk4/samtofastq/main.nf @@ -2,7 +2,7 @@ process GATK4_SAMTOFASTQ { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/selectvariants/main.nf b/modules/nf-core/gatk4/selectvariants/main.nf index d05bff6f..0c4fcceb 100644 --- a/modules/nf-core/gatk4/selectvariants/main.nf +++ b/modules/nf-core/gatk4/selectvariants/main.nf @@ -2,7 +2,7 @@ process GATK4_SELECTVARIANTS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/splitintervals/main.nf b/modules/nf-core/gatk4/splitintervals/main.nf index c642b210..1640806b 100644 --- a/modules/nf-core/gatk4/splitintervals/main.nf +++ b/modules/nf-core/gatk4/splitintervals/main.nf @@ -2,7 +2,7 @@ process GATK4_SPLITINTERVALS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/gatk4/variantfiltration/main.nf b/modules/nf-core/gatk4/variantfiltration/main.nf index 9365bfa8..e2837a91 100644 --- a/modules/nf-core/gatk4/variantfiltration/main.nf +++ b/modules/nf-core/gatk4/variantfiltration/main.nf @@ -2,7 +2,7 @@ process GATK4_VARIANTFILTRATION { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::gatk4=4.3.0.0" : null) + conda "bioconda::gatk4=4.3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" diff --git a/modules/nf-core/genmod/annotate/main.nf b/modules/nf-core/genmod/annotate/main.nf index 9ba2f612..9d9350dc 100644 --- a/modules/nf-core/genmod/annotate/main.nf +++ b/modules/nf-core/genmod/annotate/main.nf @@ -2,7 +2,7 @@ process GENMOD_ANNOTATE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::genmod=3.7.4" : null) + conda "bioconda::genmod=3.7.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/genmod:3.7.4--pyh5e36f6f_0': 'quay.io/biocontainers/genmod:3.7.4--pyh5e36f6f_0' }" diff --git a/modules/nf-core/genmod/compound/main.nf b/modules/nf-core/genmod/compound/main.nf index e7d43fea..925f76bb 100644 --- a/modules/nf-core/genmod/compound/main.nf +++ b/modules/nf-core/genmod/compound/main.nf @@ -2,7 +2,7 @@ process GENMOD_COMPOUND { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::genmod=3.7.4" : null) + conda "bioconda::genmod=3.7.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/genmod:3.7.4--pyh5e36f6f_0': 'quay.io/biocontainers/genmod:3.7.4--pyh5e36f6f_0' }" diff --git a/modules/nf-core/genmod/models/main.nf b/modules/nf-core/genmod/models/main.nf index 8d73d745..cd1b747e 100644 --- a/modules/nf-core/genmod/models/main.nf +++ b/modules/nf-core/genmod/models/main.nf @@ -2,7 +2,7 @@ process GENMOD_MODELS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::genmod=3.7.4 conda-forge::python=3.4.5" : null) + conda "bioconda::genmod=3.7.4 conda-forge::python=3.4.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/genmod:3.7.4--pyh5e36f6f_0': 'quay.io/biocontainers/genmod:3.7.4--pyh5e36f6f_0' }" diff --git a/modules/nf-core/genmod/score/main.nf b/modules/nf-core/genmod/score/main.nf index e0a0277c..d3c9957c 100644 --- a/modules/nf-core/genmod/score/main.nf +++ b/modules/nf-core/genmod/score/main.nf @@ -2,7 +2,7 @@ process GENMOD_SCORE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::genmod=3.7.4" : null) + conda "bioconda::genmod=3.7.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/genmod:3.7.4--pyh5e36f6f_0': 'quay.io/biocontainers/genmod:3.7.4--pyh5e36f6f_0' }" diff --git a/modules/nf-core/glnexus/main.nf b/modules/nf-core/glnexus/main.nf index a26ab4ce..479da5a7 100644 --- a/modules/nf-core/glnexus/main.nf +++ b/modules/nf-core/glnexus/main.nf @@ -2,7 +2,7 @@ process GLNEXUS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::glnexus=1.4.1" : null) + conda "bioconda::glnexus=1.4.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/glnexus:1.4.1--h40d77a6_0' : 'quay.io/biocontainers/glnexus:1.4.1--h40d77a6_0' }" diff --git a/modules/nf-core/haplocheck/main.nf b/modules/nf-core/haplocheck/main.nf index 6e8541f6..0a593bd0 100644 --- a/modules/nf-core/haplocheck/main.nf +++ b/modules/nf-core/haplocheck/main.nf @@ -2,7 +2,7 @@ process HAPLOCHECK { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::haplocheck=1.3.3" : null) + conda "bioconda::haplocheck=1.3.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/haplocheck:1.3.3--h4a94de4_0': 'quay.io/biocontainers/haplocheck:1.3.3--h4a94de4_0' }" diff --git a/modules/nf-core/haplogrep2/classify/main.nf b/modules/nf-core/haplogrep2/classify/main.nf index c49cb957..8931ca78 100644 --- a/modules/nf-core/haplogrep2/classify/main.nf +++ b/modules/nf-core/haplogrep2/classify/main.nf @@ -2,7 +2,7 @@ process HAPLOGREP2_CLASSIFY { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::haplogrep=2.4.0" : null) + conda "bioconda::haplogrep=2.4.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/haplogrep:2.4.0--hdfd78af_0': 'quay.io/biocontainers/haplogrep:2.4.0--hdfd78af_0' }" diff --git a/modules/nf-core/hmtnote/main.nf b/modules/nf-core/hmtnote/main.nf index a1796924..415a44b0 100644 --- a/modules/nf-core/hmtnote/main.nf +++ b/modules/nf-core/hmtnote/main.nf @@ -2,7 +2,7 @@ process HMTNOTE { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::hmtnote=0.7.2" : null) + conda "bioconda::hmtnote=0.7.2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/hmtnote:0.7.2--pyhdfd78af_0': 'quay.io/biocontainers/hmtnote:0.7.2--pyhdfd78af_0' }" diff --git a/modules/nf-core/manta/germline/main.nf b/modules/nf-core/manta/germline/main.nf index 5f2964fb..2feb6ed2 100644 --- a/modules/nf-core/manta/germline/main.nf +++ b/modules/nf-core/manta/germline/main.nf @@ -2,7 +2,7 @@ process MANTA_GERMLINE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::manta=1.6.0" : null) + conda "bioconda::manta=1.6.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/manta:1.6.0--h9ee0642_1' : 'quay.io/biocontainers/manta:1.6.0--h9ee0642_1' }" diff --git a/modules/nf-core/mosdepth/main.nf b/modules/nf-core/mosdepth/main.nf index d7e3c929..be4be831 100644 --- a/modules/nf-core/mosdepth/main.nf +++ b/modules/nf-core/mosdepth/main.nf @@ -2,15 +2,15 @@ process MOSDEPTH { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? 'bioconda::mosdepth=0.3.3' : null) + conda "bioconda::mosdepth=0.3.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mosdepth:0.3.3--hdfd78af_1' : 'quay.io/biocontainers/mosdepth:0.3.3--hdfd78af_1'}" input: - tuple val(meta), path(bam), path(bai) - path bed - path fasta + tuple val(meta), path(bam), path(bai) + tuple val(meta2), path(bed) + tuple val(meta3), path(fasta) output: tuple val(meta), path('*.global.dist.txt') , emit: global_txt diff --git a/modules/nf-core/mosdepth/meta.yml b/modules/nf-core/mosdepth/meta.yml index d1e33447..adf3893f 100644 --- a/modules/nf-core/mosdepth/meta.yml +++ b/modules/nf-core/mosdepth/meta.yml @@ -26,10 +26,20 @@ input: type: file description: Index for BAM/CRAM file pattern: "*.{bai,crai}" + - meta2: + type: map + description: | + Groovy Map containing bed information + e.g. [ id:'test' ] - bed: type: file description: BED file with intersected intervals pattern: "*.{bed}" + - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] - fasta: type: file description: Reference genome FASTA file diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 68f66bea..4b604749 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_single' - conda "bioconda::multiqc=1.13" + conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/picard/addorreplacereadgroups/main.nf b/modules/nf-core/picard/addorreplacereadgroups/main.nf index a6debc91..01a97428 100644 --- a/modules/nf-core/picard/addorreplacereadgroups/main.nf +++ b/modules/nf-core/picard/addorreplacereadgroups/main.nf @@ -2,7 +2,7 @@ process PICARD_ADDORREPLACEREADGROUPS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) + conda "bioconda::picard=2.27.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" diff --git a/modules/nf-core/picard/collecthsmetrics/main.nf b/modules/nf-core/picard/collecthsmetrics/main.nf index d2414cc6..ee8116ec 100644 --- a/modules/nf-core/picard/collecthsmetrics/main.nf +++ b/modules/nf-core/picard/collecthsmetrics/main.nf @@ -1,8 +1,8 @@ process PICARD_COLLECTHSMETRICS { tag "$meta.id" - label 'process_medium' + label 'process_single' - conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) + conda "bioconda::picard=2.27.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" diff --git a/modules/nf-core/picard/collectmultiplemetrics/main.nf b/modules/nf-core/picard/collectmultiplemetrics/main.nf index 6f5e6f1e..73cdaf3a 100644 --- a/modules/nf-core/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/picard/collectmultiplemetrics/main.nf @@ -1,8 +1,8 @@ process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" - label 'process_medium' + label 'process_single' - conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) + conda "bioconda::picard=2.27.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" diff --git a/modules/nf-core/picard/liftovervcf/main.nf b/modules/nf-core/picard/liftovervcf/main.nf index d4f6be95..04336271 100644 --- a/modules/nf-core/picard/liftovervcf/main.nf +++ b/modules/nf-core/picard/liftovervcf/main.nf @@ -2,7 +2,7 @@ process PICARD_LIFTOVERVCF { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) + conda "bioconda::picard=2.27.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" diff --git a/modules/nf-core/picard/markduplicates/main.nf b/modules/nf-core/picard/markduplicates/main.nf index d1f3aaa1..14800392 100644 --- a/modules/nf-core/picard/markduplicates/main.nf +++ b/modules/nf-core/picard/markduplicates/main.nf @@ -2,7 +2,7 @@ process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) + conda "bioconda::picard=2.27.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" diff --git a/modules/nf-core/picard/sortvcf/main.nf b/modules/nf-core/picard/sortvcf/main.nf index b57b39c6..d3a32a52 100644 --- a/modules/nf-core/picard/sortvcf/main.nf +++ b/modules/nf-core/picard/sortvcf/main.nf @@ -2,7 +2,7 @@ process PICARD_SORTVCF { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) + conda "bioconda::picard=2.27.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" diff --git a/modules/nf-core/qualimap/bamqc/main.nf b/modules/nf-core/qualimap/bamqc/main.nf index 3bfcb4c1..936471ba 100644 --- a/modules/nf-core/qualimap/bamqc/main.nf +++ b/modules/nf-core/qualimap/bamqc/main.nf @@ -2,7 +2,7 @@ process QUALIMAP_BAMQC { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::qualimap=2.2.2d" : null) + conda "bioconda::qualimap=2.2.2d" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/qualimap:2.2.2d--1' : 'quay.io/biocontainers/qualimap:2.2.2d--1' }" diff --git a/modules/nf-core/rhocall/annotate/main.nf b/modules/nf-core/rhocall/annotate/main.nf index 95d647b1..155a9d69 100644 --- a/modules/nf-core/rhocall/annotate/main.nf +++ b/modules/nf-core/rhocall/annotate/main.nf @@ -2,7 +2,7 @@ process RHOCALL_ANNOTATE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::rhocall=0.5.1" : null) + conda "bioconda::rhocall=0.5.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/rhocall:0.5.1--py39hbf8eff0_0': 'quay.io/biocontainers/rhocall:0.5.1--py39hbf8eff0_0' }" diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index 2830963e..ce6580d2 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -2,7 +2,7 @@ process SAMTOOLS_FAIDX { tag "$fasta" label 'process_single' - conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) + conda "bioconda::samtools=1.16.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index 8577dc9d..8b95687a 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -2,7 +2,7 @@ process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) + conda "bioconda::samtools=1.16.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" diff --git a/modules/nf-core/samtools/merge/main.nf b/modules/nf-core/samtools/merge/main.nf index 89dd072a..a80ff3a2 100644 --- a/modules/nf-core/samtools/merge/main.nf +++ b/modules/nf-core/samtools/merge/main.nf @@ -2,7 +2,7 @@ process SAMTOOLS_MERGE { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) + conda "bioconda::samtools=1.16.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf index ac43e67a..84c167cd 100644 --- a/modules/nf-core/samtools/sort/main.nf +++ b/modules/nf-core/samtools/sort/main.nf @@ -2,7 +2,7 @@ process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) + conda "bioconda::samtools=1.16.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index 5d2fd68a..0a2a3640 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -2,7 +2,7 @@ process SAMTOOLS_STATS { tag "$meta.id" label 'process_single' - conda (params.enable_conda ? "bioconda::samtools=1.16.1" : null) + conda "bioconda::samtools=1.16.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" diff --git a/modules/nf-core/stranger/main.nf b/modules/nf-core/stranger/main.nf index ddfa0070..582e389e 100644 --- a/modules/nf-core/stranger/main.nf +++ b/modules/nf-core/stranger/main.nf @@ -2,7 +2,7 @@ process STRANGER { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::stranger=0.8.1" : null) + conda "bioconda::stranger=0.8.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/stranger:0.8.1--pyh5e36f6f_0': 'quay.io/biocontainers/stranger:0.8.1--pyh5e36f6f_0' }" diff --git a/modules/nf-core/svdb/merge/main.nf b/modules/nf-core/svdb/merge/main.nf index 7dd92653..8544daff 100644 --- a/modules/nf-core/svdb/merge/main.nf +++ b/modules/nf-core/svdb/merge/main.nf @@ -1,7 +1,7 @@ process SVDB_MERGE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.8.1 bioconda::samtools=1.16.1" : null) + conda "bioconda::svdb=2.8.1 bioconda::samtools=1.16.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:af6f8534cd538a85ff43a2eae1b52b143e7abd05-0': 'quay.io/biocontainers/mulled-v2-c8daa8f9d69d3c5a1a4ff08283a166c18edb0000:af6f8534cd538a85ff43a2eae1b52b143e7abd05-0' }" diff --git a/modules/nf-core/svdb/query/main.nf b/modules/nf-core/svdb/query/main.nf index aee9aad1..f5e7da0f 100644 --- a/modules/nf-core/svdb/query/main.nf +++ b/modules/nf-core/svdb/query/main.nf @@ -2,7 +2,7 @@ process SVDB_QUERY { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::svdb=2.8.1" : null) + conda "bioconda::svdb=2.8.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/svdb:2.8.1--py39h5371cbf_0': 'quay.io/biocontainers/svdb:2.8.1--py39h5371cbf_0' }" diff --git a/modules/nf-core/tabix/bgziptabix/main.nf b/modules/nf-core/tabix/bgziptabix/main.nf index 0d05984a..d3a3bbff 100644 --- a/modules/nf-core/tabix/bgziptabix/main.nf +++ b/modules/nf-core/tabix/bgziptabix/main.nf @@ -2,7 +2,7 @@ process TABIX_BGZIPTABIX { tag "$meta.id" label 'process_single' - conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + conda "bioconda::tabix=1.11" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" diff --git a/modules/nf-core/tabix/tabix/main.nf b/modules/nf-core/tabix/tabix/main.nf index 21b2e79f..9a404db9 100644 --- a/modules/nf-core/tabix/tabix/main.nf +++ b/modules/nf-core/tabix/tabix/main.nf @@ -2,7 +2,7 @@ process TABIX_TABIX { tag "$meta.id" label 'process_single' - conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + conda "bioconda::tabix=1.11" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" diff --git a/modules/nf-core/tiddit/cov/main.nf b/modules/nf-core/tiddit/cov/main.nf index a0a79523..dec79332 100644 --- a/modules/nf-core/tiddit/cov/main.nf +++ b/modules/nf-core/tiddit/cov/main.nf @@ -2,7 +2,7 @@ process TIDDIT_COV { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::tiddit=3.3.2" : null) + conda "bioconda::tiddit=3.3.2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/tiddit:3.3.2--py310hc2b7f4b_0' : 'quay.io/biocontainers/tiddit:3.3.2--py310hc2b7f4b_0' }" diff --git a/modules/nf-core/tiddit/sv/main.nf b/modules/nf-core/tiddit/sv/main.nf index 7faefa99..45f9588a 100644 --- a/modules/nf-core/tiddit/sv/main.nf +++ b/modules/nf-core/tiddit/sv/main.nf @@ -2,7 +2,7 @@ process TIDDIT_SV { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::tiddit=3.3.2" : null) + conda "bioconda::tiddit=3.3.2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/tiddit:3.3.2--py310hc2b7f4b_0' : 'quay.io/biocontainers/tiddit:3.3.2--py310hc2b7f4b_0' }" diff --git a/modules/nf-core/ucsc/wigtobigwig/main.nf b/modules/nf-core/ucsc/wigtobigwig/main.nf index cf76cf0a..7626159e 100644 --- a/modules/nf-core/ucsc/wigtobigwig/main.nf +++ b/modules/nf-core/ucsc/wigtobigwig/main.nf @@ -3,7 +3,7 @@ process UCSC_WIGTOBIGWIG { label 'process_single' // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. - conda (params.enable_conda ? "bioconda::ucsc-wigtobigwig=377" : null) + conda "bioconda::ucsc-wigtobigwig=377" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ucsc-wigtobigwig:377--h0b8a92a_2' : 'quay.io/biocontainers/ucsc-wigtobigwig:377--h0b8a92a_2' }" diff --git a/modules/nf-core/vcfanno/main.nf b/modules/nf-core/vcfanno/main.nf index c8b432f6..2d5d162a 100644 --- a/modules/nf-core/vcfanno/main.nf +++ b/modules/nf-core/vcfanno/main.nf @@ -2,7 +2,7 @@ process VCFANNO { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::vcfanno=0.3.3" : null) + conda "bioconda::vcfanno=0.3.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/vcfanno:0.3.3--h9ee0642_0': 'quay.io/biocontainers/vcfanno:0.3.3--h9ee0642_0' }" From 98cb0fe582cd8090bf972050cf00548b8efe1a55 Mon Sep 17 00:00:00 2001 From: jemten Date: Wed, 15 Feb 2023 10:52:39 +0100 Subject: [PATCH 0941/1169] fix for mosdepth channels --- subworkflows/local/qc_bam.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index e21557f0..0f3e29be 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -34,7 +34,7 @@ workflow QC_BAM { UCSC_WIGTOBIGWIG (TIDDIT_COV.out.wig, chrom_sizes) - MOSDEPTH (bam_bai, [], []) + MOSDEPTH (bam_bai, Channel.value([[],[]]) , Channel.value([[],[]]) ) ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions.first()) From a61ec855d0bac8f2100212225d881f7858b7d2d3 Mon Sep 17 00:00:00 2001 From: jemten Date: Wed, 15 Feb 2023 11:05:01 +0100 Subject: [PATCH 0942/1169] small change for readability --- subworkflows/local/qc_bam.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 0f3e29be..48c486cc 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -34,7 +34,7 @@ workflow QC_BAM { UCSC_WIGTOBIGWIG (TIDDIT_COV.out.wig, chrom_sizes) - MOSDEPTH (bam_bai, Channel.value([[],[]]) , Channel.value([[],[]]) ) + MOSDEPTH (bam_bai, Channel.value([[], []]), Channel.value([[], []])) ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions.first()) From 14508dbfa84d406b4b1ebd158fa4113e64772b11 Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 15 Feb 2023 12:56:53 +0100 Subject: [PATCH 0943/1169] add combined bam input channel --- workflows/raredisease.nf | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index ab07e37b..6526a96a 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -284,8 +284,23 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 1.7: SMNCOPYNUMBERCALLER + ALIGN.out.bam + .collect{it[1]} + .toList() + .set { ch_bam_list } + + ALIGN.out.bai + .collect{it[1]} + .toList() + .set { ch_bai_list } + + CHECK_INPUT.out.case_info + .combine(ch_bam_list) + .combine(ch_bai_list) + .set { ch_bams_bais } + SMNCOPYNUMBERCALLER ( - ch_mapped.bam_bai + ch_bams_bais ) ch_versions = ch_versions.mix(SMNCOPYNUMBERCALLER.out.versions) From 62b78dac3abfb053da371b1d7437624925543819 Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 15 Feb 2023 13:12:43 +0100 Subject: [PATCH 0944/1169] change input channel to bam_bai --- workflows/raredisease.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 6526a96a..96370288 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -284,13 +284,13 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) // STEP 1.7: SMNCOPYNUMBERCALLER - ALIGN.out.bam + ALIGN.out.bam_bai .collect{it[1]} .toList() .set { ch_bam_list } - ALIGN.out.bai - .collect{it[1]} + ALIGN.out.bam_bai + .collect{it[2]} .toList() .set { ch_bai_list } @@ -298,7 +298,7 @@ workflow RAREDISEASE { .combine(ch_bam_list) .combine(ch_bai_list) .set { ch_bams_bais } - + SMNCOPYNUMBERCALLER ( ch_bams_bais ) From 894ed25d96b4183e9b2c5e2bf81c3af1590a2d3a Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 15 Feb 2023 13:49:00 +0100 Subject: [PATCH 0945/1169] fixed spaces --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 314c6354..0c2e27a5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -432,7 +432,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_TWO' { ext.args = "-i FILTER='\"PASS\"' -m x -Oz" ext.prefix = { "${meta.id}_passed" } @@ -449,7 +449,7 @@ process { publishDir = [ enabled: false ] - } + } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:REMOVE_DUPLICATES_SEN' { ext.args = '--output-type z --rm-dup none' From 9047711007d42bb6c47daa1d08ec360d730ad96d Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 15 Feb 2023 13:50:35 +0100 Subject: [PATCH 0946/1169] fixed spaces --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 0c2e27a5..b1527612 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -449,7 +449,7 @@ process { publishDir = [ enabled: false ] - } + } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:REMOVE_DUPLICATES_SEN' { ext.args = '--output-type z --rm-dup none' From b455223527ca0df10d20e35be98619bc9909961e Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Wed, 15 Feb 2023 16:48:19 +0100 Subject: [PATCH 0947/1169] Added peddy --- conf/modules.config | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 484c526a..6ed613dc 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1173,3 +1173,17 @@ process { ext.args2 = " --min_init_normal_lod 0,5 --min_normal_lod 2,0 --min_init_tumor_lod 1,0 --min_tumor_lod 2,8 --trim_soft_clip " } } + +// +// PEDDY CHECK +// + +process { + withName: '.*PEDDY_CHECK:PEDDY' { + ext.args = '' + publishDir = [ + path: { "${params.outdir}/Peddy" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} From fcaed3cc875b0b22424ccc8800a86b15d79dafe3 Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 15 Feb 2023 16:51:35 +0100 Subject: [PATCH 0948/1169] installed peddy --- modules.json | 5 +++ modules/nf-core/peddy/main.nf | 53 ++++++++++++++++++++++++++++ modules/nf-core/peddy/meta.yml | 64 ++++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 modules/nf-core/peddy/main.nf create mode 100644 modules/nf-core/peddy/meta.yml diff --git a/modules.json b/modules.json index bcc39bc4..668e037f 100644 --- a/modules.json +++ b/modules.json @@ -220,6 +220,11 @@ "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, + "peddy": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, "picard/addorreplacereadgroups": { "branch": "master", "git_sha": "a50554f372baf3e079425e5d3ac4d09dc5ff8bc5", diff --git a/modules/nf-core/peddy/main.nf b/modules/nf-core/peddy/main.nf new file mode 100644 index 00000000..03cbd02f --- /dev/null +++ b/modules/nf-core/peddy/main.nf @@ -0,0 +1,53 @@ +process PEDDY { + tag "$meta.id" + label 'process_low' + + conda "bioconda::peddy=0.4.8" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/peddy:0.4.8--pyh5e36f6f_0' : + 'quay.io/biocontainers/peddy:0.4.8--pyh5e36f6f_0' }" + + input: + tuple val(meta), path(vcf), path(vcf_tbi) + path ped + + output: + tuple val(meta), path("*.html") , emit: html + tuple val(meta), path("*.csv") , emit: csv + tuple val(meta), path("*.peddy.ped"), emit: ped + tuple val(meta), path("*.png") , optional: true, emit: png + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + peddy \\ + $args \\ + --plot \\ + -p $task.cpus \\ + $vcf \\ + $ped + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + peddy: \$( peddy --version 2>&1 | sed 's/peddy, version //' ) + END_VERSIONS + """ + + stub: + """ + filename=\$(basename $vcf) + touch \$filename.ped_check.csv + touch \$filename.vs.html + touch \$filename.het_check.csv + touch \$filename.sex_check.csv + touch \$filename.peddy.ped + touch \$filename.html + + touch versions.yml + """ +} diff --git a/modules/nf-core/peddy/meta.yml b/modules/nf-core/peddy/meta.yml new file mode 100644 index 00000000..b3f40bb5 --- /dev/null +++ b/modules/nf-core/peddy/meta.yml @@ -0,0 +1,64 @@ +name: peddy +description: Manipulation, validation and exploration of pedigrees +keywords: + - pedigrees + - ped + - family + +tools: + - peddy: + description: genotype, ped correspondence check, ancestry check, sex check. directly, quickly on VCF + homepage: https://github.com/brentp/peddy + documentation: https://peddy.readthedocs.io/en/latest/ + tool_dev_url: https://github.com/brentp/peddy + doi: "https://doi.org/10.1016/j.ajhg.2017.01.017" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF file + pattern: "*.{vcf.gz}" + - ped: + type: file + description: PED/FAM file + pattern: "*.{ped,fam}" + - vcf_tbi: + type: file + description: TBI file + pattern: "*.{vcf.gz.tbi}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ped: + type: file + description: PED/FAM file + pattern: "*.peddy.{ped}" + - html: + type: file + description: HTML file + pattern: "*.{html}" + - csv: + type: file + description: CSV file + pattern: "*.{csv}" + - png: + type: file + description: PNG file + pattern: "*.{png}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@rannick" From 52d591f2f41b96be70f5bb4c93b34b32f1065de1 Mon Sep 17 00:00:00 2001 From: sima-r Date: Wed, 15 Feb 2023 17:10:26 +0100 Subject: [PATCH 0949/1169] added peddy module and sunworkflow --- conf/modules.config | 2 +- modules/nf-core/peddy/main.nf | 1 + subworkflows/local/peddy_check.nf | 24 ++++++++++++++++++++++++ workflows/raredisease.nf | 10 ++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 subworkflows/local/peddy_check.nf diff --git a/conf/modules.config b/conf/modules.config index 6ed613dc..8788546a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1180,7 +1180,7 @@ process { process { withName: '.*PEDDY_CHECK:PEDDY' { - ext.args = '' + ext.args = { (params.genome == 'GRCh38') ? '--sites hg38' : '' } publishDir = [ path: { "${params.outdir}/Peddy" }, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, diff --git a/modules/nf-core/peddy/main.nf b/modules/nf-core/peddy/main.nf index 03cbd02f..6bed1621 100644 --- a/modules/nf-core/peddy/main.nf +++ b/modules/nf-core/peddy/main.nf @@ -27,6 +27,7 @@ process PEDDY { """ peddy \\ $args \\ + --prefix $prefix \\ --plot \\ -p $task.cpus \\ $vcf \\ diff --git a/subworkflows/local/peddy_check.nf b/subworkflows/local/peddy_check.nf new file mode 100644 index 00000000..3d9adbc2 --- /dev/null +++ b/subworkflows/local/peddy_check.nf @@ -0,0 +1,24 @@ +// +// Peddy subworkflow to check sex and relatedness. +// + +include { PEDDY } from '../../modules/nf-core/peddy/main' + +workflow PEDDY_CHECK { + take: + vcf // channel: [ val(meta), path(vcf), path(vcf_index) ] + ped + + main: + ch_versions = Channel.empty() + + PEDDY(vcf, ped) + ch_versions = ch_versions.mix(PEDDY.out.versions) + + emit: + ped = PEDDY.out.ped + csv = PEDDY.out.csv + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} + + diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8497dd53..6add4210 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -110,6 +110,7 @@ include { QC_BAM } from '../subworkflows/local/qc include { RANK_VARIANTS as RANK_VARIANTS_SNV } from '../subworkflows/local/rank_variants' include { RANK_VARIANTS as RANK_VARIANTS_SV } from '../subworkflows/local/rank_variants' include { SCATTER_GENOME } from '../subworkflows/local/scatter_genome' +include { PEDDY_CHECK } from '../subworkflows/local/peddy_check' /* @@ -320,6 +321,15 @@ workflow RAREDISEASE { ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) + // ped correspondence, sex check, ancestry check + ch_vcf_peddy = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) + + PEDDY_CHECK ( + ch_vcf_peddy, + MAKE_PED.out.ped + ) + ch_versions = ch_versions.mix(PEDDY_CHECK.out.versions) + // GENS if (params.gens_switch) { GENS ( From bd775722be1af59158cc380595c02f1de86818c8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Feb 2023 14:06:16 +0100 Subject: [PATCH 0950/1169] update tests --- conf/test.config | 47 +++++++++++++++++++------------------ conf/test2samples.config | 46 ------------------------------------ conf/test_solo.config | 50 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 68 deletions(-) delete mode 100644 conf/test2samples.config create mode 100644 conf/test_solo.config diff --git a/conf/test.config b/conf/test.config index bde530bc..63371ee2 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,29 +20,32 @@ params { max_time = '2.h' // Input data - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_MT.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_trio.csv' // Genome references - fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' - mt_fasta_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' - intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" - intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" - - // Variant catalog file - variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' - - // Variant annotation - vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_resources.txt' - vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' - vcfanno_lua = "" - target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' - - mt_intervals = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' - mt_intervals_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/control_region_shifted.chrM.interval_list' - mt_backchain_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' - - genome = 'GRCh38' - vep_cache_version = 107 + fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" + genome = 'GRCh37' + gnomad_af = "/home/ramprasad.neethiraj/nextflow/demo/minimal_test_data/gnomad_reformated.tab.gz" + intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" + intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" + known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" + mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" + mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" + mt_intervals_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.intervals" + mt_backchain_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.back_chain" + pli_per_gene = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins/pLI_values_107.txt" + reduced_penetrance = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reduced_penetrance.tsv" + score_config_snv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_snv.ini" + score_config_sv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_sv.ini" + select_feature_file = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" + svdb_query_dbs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/svdb_querydb_files.csv" + target_bed = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target.bed" + variant_catalog = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/variant_catalog.json" + vcfanno_lua = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_functions.lua" + vcfanno_resources = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_resources.txt" + vcfanno_toml = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_config.toml" + vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins" + vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" + vep_cache_version = 107 } diff --git a/conf/test2samples.config b/conf/test2samples.config deleted file mode 100644 index 5cdd9052..00000000 --- a/conf/test2samples.config +++ /dev/null @@ -1,46 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running 2 samples -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple pipeline with 2 samples. - - Use as follows: - nextflow run nf-core/raredisease -profile test2samples, --outdir - ----------------------------------------------------------------------------------------- -*/ - -params { - config_profile_name = 'Test profile 2 samples' - config_profile_description = 'Minimal test dataset to check pipeline function' - - // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = '6.GB' - max_time = '2.h' - - // Input data - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_2_samples.csv' - - // Genome references - fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Homo_sapiens_assembly38_chr20_chrM.fasta' - mt_fasta_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hg38.chrM.shifted8000.fa' - - // Variant catalog file - variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/repeat_expansions.json' - - // Variant annotation - vcfanno_resources = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_resources.txt' - vcfanno_toml = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/grch38_vcfanno_config_-v0.2-_chr20.toml' - vcfanno_lua = "" - target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_chr20.bed' - - mt_intervals = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/non_control_region.chrM.interval_list' - mt_intervals_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/control_region_shifted.chrM.interval_list' - mt_backchain_shift = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/ShiftBack.chain' - - genome = 'GRCh38' - vep_cache_version = 107 -} - diff --git a/conf/test_solo.config b/conf/test_solo.config new file mode 100644 index 00000000..7c5f2300 --- /dev/null +++ b/conf/test_solo.config @@ -0,0 +1,50 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running a solo sample +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a fast and simple pipeline with 1 sample. + + Use as follows: + nextflow run nf-core/raredisease -profile test, --outdir + +---------------------------------------------------------------------------------------- +*/ + +params { + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function using a single sample' + + // Limit resources so that this can run on GitHub Actions + max_cpus = 2 + max_memory = '6.GB' + max_time = '2.h' + + // Input data + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_single.csv' + + // Genome references + fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" + genome = 'GRCh37' + gnomad_af = "/home/ramprasad.neethiraj/nextflow/demo/minimal_test_data/gnomad_reformated.tab.gz" + intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" + intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" + known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" + mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" + mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" + mt_intervals_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.intervals" + mt_backchain_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.back_chain" + pli_per_gene = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins/pLI_values_107.txt" + reduced_penetrance = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reduced_penetrance.tsv" + score_config_snv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_snv.ini" + score_config_sv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_sv.ini" + select_feature_file = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" + svdb_query_dbs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/svdb_querydb_files.csv" + target_bed = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target.bed" + variant_catalog = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/variant_catalog.json" + vcfanno_lua = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_functions.lua" + vcfanno_resources = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_resources.txt" + vcfanno_toml = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_config.toml" + vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins" + vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" + vep_cache_version = 107 +} From fc5e6bca79c266e7fc0d4bc410920beabef820df Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Feb 2023 14:07:23 +0100 Subject: [PATCH 0951/1169] update gnomad path --- conf/test.config | 2 +- conf/test_solo.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index 63371ee2..6af537aa 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,7 +25,7 @@ params { // Genome references fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' - gnomad_af = "/home/ramprasad.neethiraj/nextflow/demo/minimal_test_data/gnomad_reformated.tab.gz" + gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" diff --git a/conf/test_solo.config b/conf/test_solo.config index 7c5f2300..85068bcd 100644 --- a/conf/test_solo.config +++ b/conf/test_solo.config @@ -25,7 +25,7 @@ params { // Genome references fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' - gnomad_af = "/home/ramprasad.neethiraj/nextflow/demo/minimal_test_data/gnomad_reformated.tab.gz" + gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" From 09622a275379410d22a0da45e847afe6ed9a1a31 Mon Sep 17 00:00:00 2001 From: peterpru Date: Fri, 17 Feb 2023 10:04:47 +0100 Subject: [PATCH 0952/1169] use case_info.id as prefix --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 80d8cb91..3a96fa90 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -530,7 +530,7 @@ process { ext.args = { (params.genome == 'GRCh37') ? '--genome 37' : '--genome 38' } - ext.prefix = { "${meta.id}" } + ext.prefix = { "${case_info.id}" } publishDir = [ path: { "${params.outdir}/smncopynumbercaller" }, mode: params.publish_dir_mode, From 2cf15f9455983a375a64c1de23ed0db4a45aa795 Mon Sep 17 00:00:00 2001 From: peterpru Date: Fri, 17 Feb 2023 11:12:25 +0100 Subject: [PATCH 0953/1169] update module to include stubs --- modules/nf-core/smncopynumbercaller/main.nf | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf index fec45db0..7a0e2ec4 100644 --- a/modules/nf-core/smncopynumbercaller/main.nf +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -2,7 +2,7 @@ process SMNCOPYNUMBERCALLER { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::smncopynumbercaller=1.1.2" : null) + conda "bioconda::smncopynumbercaller=1.1.2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/smncopynumbercaller:1.1.2--py310h7cba7a3_0' : 'quay.io/biocontainers/smncopynumbercaller:1.1.2--py310h7cba7a3_0' }" @@ -37,4 +37,16 @@ process SMNCOPYNUMBERCALLER { SMNCopyNumberCaller: $VERSION END_VERSIONS """ + + stub: + """ + mkdir out + touch out/${prefix}.tsv + touch out/${prefix}.json + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + SMNCopyNumberCaller: $VERSION + END_VERSIONS + """ } From 0c0f26ffd82c5b16588d96541a0cd074072fc8ec Mon Sep 17 00:00:00 2001 From: peterpru Date: Fri, 17 Feb 2023 11:39:52 +0100 Subject: [PATCH 0954/1169] linting in modules.json --- modules.json | 266 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 199 insertions(+), 67 deletions(-) diff --git a/modules.json b/modules.json index 9d551e4e..3b7a3ed9 100644 --- a/modules.json +++ b/modules.json @@ -8,336 +8,468 @@ "bcftools/concat": { "branch": "master", "git_sha": "582ff1755bdd205c65e2ba4c31e0a008dae299ec", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/filter": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/norm": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/roh": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/view": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwa/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/mem": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/callcnvs": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/histogram": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/importreaddepth": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/partition": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/view": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "deepvariant": { "branch": "master", "git_sha": "c62b41a07a00fee11ec73e2a0d4a1aec771a742b", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "expansionhunter": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "fastqc": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/bedtointervallist": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/createsequencedictionary": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/filtermutectcalls": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/intervallisttools": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/mergebamalignment": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/mergevcfs": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/mutect2": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/printreads": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/revertsam": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/samtofastq": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/selectvariants": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/splitintervals": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/variantfiltration": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "genmod/annotate": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "genmod/compound": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "genmod/models": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "genmod/score": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "glnexus": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "haplocheck": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "haplogrep2/classify": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "hmtnote": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "manta/germline": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "def5f182583df0c20f43ec3d4355e8ebd341aaa9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "ee80d14721e76e2e079103b8dcd5d57129e584ba", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/addorreplacereadgroups": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/collecthsmetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/collectmultiplemetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/collectwgsmetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/liftovervcf": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/markduplicates": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/sortvcf": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "qualimap/bamqc": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "rhocall/annotate": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "smncopynumbercaller": { "branch": "master", - "git_sha": "2bb1f6515962a1559e79544112394d2db03a4302" + "git_sha": "93deb7b33308ce23fb4fd2a8e13b86bc117e8d77" }, "stranger": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "svdb/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "svdb/query": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/tabix": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tiddit/cov": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tiddit/sv": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/wigtobigwig": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "vcfanno": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } } From 9cf9e88a484a7cf8f32d4266fa10995e1398b3d6 Mon Sep 17 00:00:00 2001 From: peterpru Date: Fri, 17 Feb 2023 11:44:35 +0100 Subject: [PATCH 0955/1169] linting gitattributes --- .gitattributes | 1 - .prettierignore | 2 -- lib/NfcoreSchema.groovy | 1 + lib/NfcoreTemplate.groovy | 41 +++++++++------------------------------ 4 files changed, 10 insertions(+), 35 deletions(-) diff --git a/.gitattributes b/.gitattributes index 7a2dabc2..050bb120 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,3 @@ *.config linguist-language=nextflow -*.nf.test linguist-language=nextflow modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated diff --git a/.prettierignore b/.prettierignore index 437d763d..eb74a574 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1,5 @@ email_template.html adaptivecard.json -slackreport.json .nextflow* work/ data/ @@ -9,4 +8,3 @@ results/ testing/ testing* *.pyc -bin/ diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 33cd4f6e..b3d092f8 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -46,6 +46,7 @@ class NfcoreSchema { 'quiet', 'syslog', 'v', + 'version', // Options for `nextflow run` command 'ansi', diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 25a0a74a..27feb009 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -32,25 +32,6 @@ class NfcoreTemplate { } } - // - // Generate version string - // - public static String version(workflow) { - String version_string = "" - - if (workflow.manifest.version) { - def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' - version_string += "${prefix_v}${workflow.manifest.version}" - } - - if (workflow.commitId) { - def git_shortsha = workflow.commitId.substring(0, 7) - version_string += "-g${git_shortsha}" - } - - return version_string - } - // // Construct and send completion email // @@ -80,7 +61,7 @@ class NfcoreTemplate { misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp def email_fields = [:] - email_fields['version'] = NfcoreTemplate.version(workflow) + email_fields['version'] = workflow.manifest.version email_fields['runName'] = workflow.runName email_fields['success'] = workflow.success email_fields['dateComplete'] = workflow.complete @@ -165,10 +146,10 @@ class NfcoreTemplate { } // - // Construct and send a notification to a web server as JSON - // e.g. Microsoft Teams and Slack + // Construct and send adaptive card + // https://adaptivecards.io // - public static void IM_notification(workflow, params, summary_params, projectDir, log) { + public static void adaptivecard(workflow, params, summary_params, projectDir, log) { def hook_url = params.hook_url def summary = [:] @@ -189,7 +170,7 @@ class NfcoreTemplate { misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp def msg_fields = [:] - msg_fields['version'] = NfcoreTemplate.version(workflow) + msg_fields['version'] = workflow.manifest.version msg_fields['runName'] = workflow.runName msg_fields['success'] = workflow.success msg_fields['dateComplete'] = workflow.complete @@ -197,16 +178,13 @@ class NfcoreTemplate { msg_fields['exitStatus'] = workflow.exitStatus msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') msg_fields['errorReport'] = (workflow.errorReport ?: 'None') - msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") + msg_fields['commandLine'] = workflow.commandLine msg_fields['projectDir'] = workflow.projectDir msg_fields['summary'] = summary << misc_fields // Render the JSON template def engine = new groovy.text.GStringTemplateEngine() - // Different JSON depending on the service provider - // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format - def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" - def hf = new File("$projectDir/assets/${json_path}") + def hf = new File("$projectDir/assets/adaptivecard.json") def json_template = engine.createTemplate(hf).make(msg_fields) def json_message = json_template.toString() @@ -231,7 +209,7 @@ class NfcoreTemplate { if (workflow.stats.ignoredCount == 0) { log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" @@ -319,7 +297,6 @@ class NfcoreTemplate { // public static String logo(workflow, monochrome_logs) { Map colors = logColours(monochrome_logs) - String workflow_version = NfcoreTemplate.version(workflow) String.format( """\n ${dashedLine(monochrome_logs)} @@ -328,7 +305,7 @@ class NfcoreTemplate { ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} + ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} ${dashedLine(monochrome_logs)} """.stripIndent() ) From ecfe0c16cd4a391c6423a5f9f34f70b0fbe3296b Mon Sep 17 00:00:00 2001 From: peterpru Date: Fri, 17 Feb 2023 11:47:53 +0100 Subject: [PATCH 0956/1169] Revert "linting gitattributes" This reverts commit 9cf9e88a484a7cf8f32d4266fa10995e1398b3d6. --- .gitattributes | 1 + .prettierignore | 2 ++ lib/NfcoreSchema.groovy | 1 - lib/NfcoreTemplate.groovy | 41 ++++++++++++++++++++++++++++++--------- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/.gitattributes b/.gitattributes index 050bb120..7a2dabc2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ *.config linguist-language=nextflow +*.nf.test linguist-language=nextflow modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated diff --git a/.prettierignore b/.prettierignore index eb74a574..437d763d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,6 @@ email_template.html adaptivecard.json +slackreport.json .nextflow* work/ data/ @@ -8,3 +9,4 @@ results/ testing/ testing* *.pyc +bin/ diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index b3d092f8..33cd4f6e 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -46,7 +46,6 @@ class NfcoreSchema { 'quiet', 'syslog', 'v', - 'version', // Options for `nextflow run` command 'ansi', diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 27feb009..25a0a74a 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -32,6 +32,25 @@ class NfcoreTemplate { } } + // + // Generate version string + // + public static String version(workflow) { + String version_string = "" + + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string + } + // // Construct and send completion email // @@ -61,7 +80,7 @@ class NfcoreTemplate { misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp def email_fields = [:] - email_fields['version'] = workflow.manifest.version + email_fields['version'] = NfcoreTemplate.version(workflow) email_fields['runName'] = workflow.runName email_fields['success'] = workflow.success email_fields['dateComplete'] = workflow.complete @@ -146,10 +165,10 @@ class NfcoreTemplate { } // - // Construct and send adaptive card - // https://adaptivecards.io + // Construct and send a notification to a web server as JSON + // e.g. Microsoft Teams and Slack // - public static void adaptivecard(workflow, params, summary_params, projectDir, log) { + public static void IM_notification(workflow, params, summary_params, projectDir, log) { def hook_url = params.hook_url def summary = [:] @@ -170,7 +189,7 @@ class NfcoreTemplate { misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp def msg_fields = [:] - msg_fields['version'] = workflow.manifest.version + msg_fields['version'] = NfcoreTemplate.version(workflow) msg_fields['runName'] = workflow.runName msg_fields['success'] = workflow.success msg_fields['dateComplete'] = workflow.complete @@ -178,13 +197,16 @@ class NfcoreTemplate { msg_fields['exitStatus'] = workflow.exitStatus msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') msg_fields['errorReport'] = (workflow.errorReport ?: 'None') - msg_fields['commandLine'] = workflow.commandLine + msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") msg_fields['projectDir'] = workflow.projectDir msg_fields['summary'] = summary << misc_fields // Render the JSON template def engine = new groovy.text.GStringTemplateEngine() - def hf = new File("$projectDir/assets/adaptivecard.json") + // Different JSON depending on the service provider + // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format + def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" + def hf = new File("$projectDir/assets/${json_path}") def json_template = engine.createTemplate(hf).make(msg_fields) def json_message = json_template.toString() @@ -209,7 +231,7 @@ class NfcoreTemplate { if (workflow.stats.ignoredCount == 0) { log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" + log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" @@ -297,6 +319,7 @@ class NfcoreTemplate { // public static String logo(workflow, monochrome_logs) { Map colors = logColours(monochrome_logs) + String workflow_version = NfcoreTemplate.version(workflow) String.format( """\n ${dashedLine(monochrome_logs)} @@ -305,7 +328,7 @@ class NfcoreTemplate { ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} + ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} ${dashedLine(monochrome_logs)} """.stripIndent() ) From 587ed81d1badf6281d84df16310ad0cd7543a997 Mon Sep 17 00:00:00 2001 From: peterpru Date: Fri, 17 Feb 2023 11:49:20 +0100 Subject: [PATCH 0957/1169] Revert "linting in modules.json" This reverts commit 0c0f26ffd82c5b16588d96541a0cd074072fc8ec. --- modules.json | 266 +++++++++++++-------------------------------------- 1 file changed, 67 insertions(+), 199 deletions(-) diff --git a/modules.json b/modules.json index 3b7a3ed9..9d551e4e 100644 --- a/modules.json +++ b/modules.json @@ -8,468 +8,336 @@ "bcftools/concat": { "branch": "master", "git_sha": "582ff1755bdd205c65e2ba4c31e0a008dae299ec", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/filter": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/norm": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/roh": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/view": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwa/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/mem": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/callcnvs": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/histogram": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/importreaddepth": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/partition": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/view": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "deepvariant": { "branch": "master", "git_sha": "c62b41a07a00fee11ec73e2a0d4a1aec771a742b", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "expansionhunter": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "fastqc": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/bedtointervallist": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/createsequencedictionary": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/filtermutectcalls": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/intervallisttools": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/mergebamalignment": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/mergevcfs": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/mutect2": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/printreads": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/revertsam": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/samtofastq": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/selectvariants": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/splitintervals": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/variantfiltration": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "genmod/annotate": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "genmod/compound": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "genmod/models": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "genmod/score": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "glnexus": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "haplocheck": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "haplogrep2/classify": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "hmtnote": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "manta/germline": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "def5f182583df0c20f43ec3d4355e8ebd341aaa9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "ee80d14721e76e2e079103b8dcd5d57129e584ba", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/addorreplacereadgroups": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/collecthsmetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/collectmultiplemetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/collectwgsmetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/liftovervcf": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/markduplicates": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/sortvcf": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "qualimap/bamqc": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "rhocall/annotate": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "smncopynumbercaller": { "branch": "master", - "git_sha": "93deb7b33308ce23fb4fd2a8e13b86bc117e8d77" + "git_sha": "2bb1f6515962a1559e79544112394d2db03a4302" }, "stranger": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "svdb/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "svdb/query": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/tabix": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tiddit/cov": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tiddit/sv": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/wigtobigwig": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "vcfanno": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } } From feb1dd5ff80673144f8eb856954ad2551b845e56 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 11:51:09 +0100 Subject: [PATCH 0958/1169] add untar for vep cache --- conf/modules.config | 8 + conf/test.config | 2 +- modules.json | 273 +++++++++++++++++------ modules/nf-core/untar/main.nf | 63 ++++++ modules/nf-core/untar/meta.yml | 40 ++++ subworkflows/local/prepare_references.nf | 6 +- workflows/raredisease.nf | 97 ++++---- 7 files changed, 373 insertions(+), 116 deletions(-) create mode 100644 modules/nf-core/untar/main.nf create mode 100644 modules/nf-core/untar/meta.yml diff --git a/conf/modules.config b/conf/modules.config index 484c526a..658ddfbb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -265,6 +265,14 @@ process { ] } + withName: '.*PREPARE_REFERENCES:UNTAR_VEP_CACHE' { + ext.when = { params.vep_cache.endsWith("tar.gz") } + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } // diff --git a/conf/test.config b/conf/test.config index 6af537aa..0e4351cd 100644 --- a/conf/test.config +++ b/conf/test.config @@ -44,7 +44,7 @@ params { vcfanno_lua = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_functions.lua" vcfanno_resources = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_resources.txt" vcfanno_toml = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_config.toml" - vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins" + vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins.tar.gz" vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" vep_cache_version = 107 } diff --git a/modules.json b/modules.json index b719257a..2a1d70e8 100644 --- a/modules.json +++ b/modules.json @@ -8,335 +8,474 @@ "bcftools/concat": { "branch": "master", "git_sha": "582ff1755bdd205c65e2ba4c31e0a008dae299ec", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/filter": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/norm": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/roh": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/view": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwa/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/mem": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/callcnvs": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/histogram": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/importreaddepth": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/partition": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvpytor/view": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "deepvariant": { "branch": "master", "git_sha": "c62b41a07a00fee11ec73e2a0d4a1aec771a742b", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "expansionhunter": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "fastqc": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/bedtointervallist": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/createsequencedictionary": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/filtermutectcalls": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/intervallisttools": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/mergebamalignment": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/mergevcfs": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/mutect2": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/printreads": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/revertsam": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/samtofastq": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/selectvariants": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/splitintervals": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/variantfiltration": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "genmod/annotate": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "genmod/compound": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "genmod/models": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "genmod/score": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "glnexus": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "haplocheck": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "haplogrep2/classify": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "hmtnote": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "manta/germline": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "def5f182583df0c20f43ec3d4355e8ebd341aaa9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "ee80d14721e76e2e079103b8dcd5d57129e584ba", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/addorreplacereadgroups": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/collecthsmetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/collectmultiplemetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/collectwgsmetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/liftovervcf": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/markduplicates": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "picard/sortvcf": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "qualimap/bamqc": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "rhocall/annotate": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "stranger": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "svdb/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "svdb/query": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/tabix": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tiddit/cov": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tiddit/sv": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/wigtobigwig": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] + }, + "untar": { + "branch": "master", + "git_sha": "cc1f997fab6d8fde5dc0e6e2a310814df5b53ce7", + "installed_by": [ + "modules" + ] }, "vcfanno": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf new file mode 100644 index 00000000..3384847a --- /dev/null +++ b/modules/nf-core/untar/main.nf @@ -0,0 +1,63 @@ +process UNTAR { + tag "$archive" + label 'process_single' + + conda "conda-forge::sed=4.7 bioconda::grep=3.4 conda-forge::tar=1.34" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" + + input: + tuple val(meta), path(archive) + + output: + tuple val(meta), path("$prefix"), emit: untar + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName.toString().replaceFirst(/\.tar$/, "")) + + """ + mkdir $prefix + + ## Ensures --strip-components only applied when top level of tar contents is a directory + ## If just files or multiple directories, place all in prefix + if [[ \$(tar -taf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then + tar \\ + -C $prefix --strip-components 1 \\ + -xavf \\ + $args \\ + $archive \\ + $args2 + else + tar \\ + -C $prefix \\ + -xavf \\ + $args \\ + $archive \\ + $args2 + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.toString().replaceFirst(/\.[^\.]+(.gz)?$/, "")) + """ + mkdir $prefix + touch ${prefix}/file.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml new file mode 100644 index 00000000..ea7a3f38 --- /dev/null +++ b/modules/nf-core/untar/meta.yml @@ -0,0 +1,40 @@ +name: untar +description: Extract files. +keywords: + - untar + - uncompress +tools: + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ["GPL-3.0-or-later"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - untar: + type: directory + description: Directory containing contents of archive + pattern: "*/" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" + - "@matthdsm" + - "@jfy133" diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index f84a6eaa..e0677f39 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -20,7 +20,7 @@ include { TABIX_BGZIPTABIX as TABIX_PBT } from '../../modul include { TABIX_TABIX as TABIX_DBSNP } from '../../modules/nf-core/tabix/tabix/main' include { TABIX_TABIX as TABIX_GNOMAD_AF } from '../../modules/nf-core/tabix/tabix/main' include { TABIX_TABIX as TABIX_PT } from '../../modules/nf-core/tabix/tabix/main' - +include { UNTAR as UNTAR_VEP_CACHE } from '../../modules/nf-core/untar/main' workflow PREPARE_REFERENCES { take: @@ -33,6 +33,7 @@ workflow PREPARE_REFERENCES { gnomad_vcf_in known_dbsnp target_bed + vep_cache main: ch_versions = Channel.empty() @@ -73,6 +74,7 @@ workflow PREPARE_REFERENCES { } .set { ch_bait_intervals_cat_in } CAT_CAT_BAIT ( ch_bait_intervals_cat_in ) + UNTAR_VEP_CACHE (vep_cache) // Gather versions ch_versions = ch_versions.mix(BWA_INDEX_GENOME.out.versions) @@ -92,6 +94,7 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(TABIX_PBT.out.versions) ch_versions = ch_versions.mix(GATK_BILT.out.versions) ch_versions = ch_versions.mix(GATK_ILT.out.versions) + ch_versions = ch_versions.mix(UNTAR_VEP_CACHE.out.versions) emit: bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() @@ -112,6 +115,7 @@ workflow PREPARE_REFERENCES { sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict.collect() target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi).collect() target_intervals = GATK_BILT.out.interval_list.collect{it[1]}.collect() + vep_resources = UNTAR_VEP_CACHE.out.untar.map{meta, files -> [files]}collect() versions = ch_versions } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8497dd53..b7162eea 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -135,55 +135,55 @@ workflow RAREDISEASE { } // Initialize all file channels including unprocessed vcf, bed and tab files - ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() - : Channel.value([]) - ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta).collect() - : ( exit 1, 'Genome fasta not specified!' ) + ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() + : Channel.value([]) + ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta).collect() + : ( exit 1, 'Genome fasta not specified!' ) ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it[0].simpleName], it] } - ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] }.collect() - : Channel.value([[],[]]) - ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() - : Channel.empty() - ch_intervals_wgs = params.intervals_wgs ? Channel.fromPath(params.intervals_wgs).collect() - : Channel.empty() - ch_intervals_y = params.intervals_y ? Channel.fromPath(params.intervals_y).collect() - : Channel.empty() - ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() - : Channel.value([[],[]]) - ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() - : Channel.value([]) - ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() - : Channel.value([]) - ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift).collect() - : Channel.empty() - ch_mt_fasta_shift_meta = params.mt_fasta_shift ? ch_mt_fasta_shift_no_meta.map { it -> [[id:it[0].simpleName], it] }.collect() - : Channel.empty() - ch_mt_intervals = params.mt_intervals ? Channel.fromPath(params.mt_intervals).collect() - : Channel.value([]) - ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift).collect() - : Channel.value([]) - ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance).collect() - : Channel.value([]) - ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv).collect() - : Channel.value([]) - ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv).collect() - : Channel.value([]) - ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it[0].simpleName], it] }.collect() - : Channel.value([]) - ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog).collect() - : Channel.value([]) + ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] }.collect() + : Channel.value([[],[]]) + ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() + : Channel.empty() + ch_intervals_wgs = params.intervals_wgs ? Channel.fromPath(params.intervals_wgs).collect() + : Channel.empty() + ch_intervals_y = params.intervals_y ? Channel.fromPath(params.intervals_y).collect() + : Channel.empty() + ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() + : Channel.value([[],[]]) + ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() + : Channel.value([]) + ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() + : Channel.value([]) + ch_mt_fasta_shift_no_meta = params.mt_fasta_shift ? Channel.fromPath(params.mt_fasta_shift).collect() + : Channel.empty() + ch_mt_fasta_shift_meta = params.mt_fasta_shift ? ch_mt_fasta_shift_no_meta.map { it -> [[id:it[0].simpleName], it] }.collect() + : Channel.empty() + ch_mt_intervals = params.mt_intervals ? Channel.fromPath(params.mt_intervals).collect() + : Channel.value([]) + ch_mt_intervals_shift = params.mt_intervals_shift ? Channel.fromPath(params.mt_intervals_shift).collect() + : Channel.value([]) + ch_reduced_penetrance = params.reduced_penetrance ? Channel.fromPath(params.reduced_penetrance).collect() + : Channel.value([]) + ch_score_config_snv = params.score_config_snv ? Channel.fromPath(params.score_config_snv).collect() + : Channel.value([]) + ch_score_config_sv = params.score_config_sv ? Channel.fromPath(params.score_config_sv).collect() + : Channel.value([]) + ch_target_bed_unprocessed = params.target_bed ? Channel.fromPath(params.target_bed).map{ it -> [[id:it[0].simpleName], it] }.collect() + : Channel.value([]) + ch_variant_catalog = params.variant_catalog ? Channel.fromPath(params.variant_catalog).collect() + : Channel.value([]) ch_variant_consequences = Channel.fromPath("$projectDir/assets/variant_consequences_v1.txt", checkIfExists: true).collect() - ch_vcfanno_resources = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).splitText().map{it -> it.trim()}.collect() - : Channel.value([]) - ch_vcfanno_lua = params.vcfanno_lua ? Channel.fromPath(params.vcfanno_lua).collect() - : Channel.value([]) - ch_vcfanno_toml = params.vcfanno_toml ? Channel.fromPath(params.vcfanno_toml).collect() - : Channel.value([]) - ch_vep_cache = params.vep_cache ? Channel.fromPath(params.vep_cache).collect() - : Channel.value([]) - ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters).collect() - : Channel.value([]) + ch_vcfanno_resources = params.vcfanno_resources ? Channel.fromPath(params.vcfanno_resources).splitText().map{it -> it.trim()}.collect() + : Channel.value([]) + ch_vcfanno_lua = params.vcfanno_lua ? Channel.fromPath(params.vcfanno_lua).collect() + : Channel.value([]) + ch_vcfanno_toml = params.vcfanno_toml ? Channel.fromPath(params.vcfanno_toml).collect() + : Channel.value([]) + ch_vep_cache_unprocessed = params.vep_cache.endsWith("tar.gz") ? Channel.fromPath(params.vep_cache).map { it -> [[id:'vep_cache'], it] }.collect() + : Channel.value([[],[]]) + ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters).collect() + : Channel.value([]) // Generate pedigree file MAKE_PED (CHECK_INPUT.out.samples.toList()) @@ -203,7 +203,8 @@ workflow RAREDISEASE { ch_gnomad_af_tab, ch_gnomad_vcf_unprocessed, ch_known_dbsnp, - ch_target_bed_unprocessed + ch_target_bed_unprocessed, + ch_vep_cache_unprocessed ) .set { ch_references } @@ -240,6 +241,8 @@ workflow RAREDISEASE { : ( ch_references.sequence_dict_mt_shift ?: Channel.empty() ) ch_target_bed = ch_references.target_bed ch_target_intervals = ch_references.target_intervals + ch_vep_cache = params.vep_cache.endsWith("tar.gz") ? ch_references.vep_resources + : ( params.vep_cache ? Channel.fromPath(params.vep_cache).collect() : Channel.value([]) ) ch_versions = ch_versions.mix(ch_references.versions) // CREATE CHROMOSOME BED AND INTERVALS From 9701fda20b14acdd68c0353e5d5cf7e301e77439 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 11:53:46 +0100 Subject: [PATCH 0959/1169] update vep cache paths in tests --- conf/test_one_sample.config | 50 +++++++++++++++++++++++++++++++++++++ conf/test_solo.config | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 conf/test_one_sample.config diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config new file mode 100644 index 00000000..e5c3b5de --- /dev/null +++ b/conf/test_one_sample.config @@ -0,0 +1,50 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running a solo sample +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a fast and simple pipeline with 1 sample. + + Use as follows: + nextflow run nf-core/raredisease -profile test, --outdir + +---------------------------------------------------------------------------------------- +*/ + +params { + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function using a single sample' + + // Limit resources so that this can run on GitHub Actions + max_cpus = 2 + max_memory = '6.GB' + max_time = '2.h' + + // Input data + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_single.csv' + + // Genome references + fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" + genome = 'GRCh37' + gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" + intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" + intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" + known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" + mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" + mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" + mt_intervals_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.intervals" + mt_backchain_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.back_chain" + pli_per_gene = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins/pLI_values_107.txt" + reduced_penetrance = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reduced_penetrance.tsv" + score_config_snv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_snv.ini" + score_config_sv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_sv.ini" + select_feature_file = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" + svdb_query_dbs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/svdb_querydb_files.csv" + target_bed = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target.bed" + variant_catalog = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/variant_catalog.json" + vcfanno_lua = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_functions.lua" + vcfanno_resources = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_resources.txt" + vcfanno_toml = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_config.toml" + vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins.tar.gz" + vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" + vep_cache_version = 107 +} diff --git a/conf/test_solo.config b/conf/test_solo.config index 85068bcd..e5c3b5de 100644 --- a/conf/test_solo.config +++ b/conf/test_solo.config @@ -44,7 +44,7 @@ params { vcfanno_lua = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_functions.lua" vcfanno_resources = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_resources.txt" vcfanno_toml = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_config.toml" - vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins" + vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins.tar.gz" vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" vep_cache_version = 107 } From 7678ae95c8901e2b01587d0b8eb6de9f41abcb69 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 11:54:07 +0100 Subject: [PATCH 0960/1169] rename file --- conf/test_solo.config | 50 ------------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 conf/test_solo.config diff --git a/conf/test_solo.config b/conf/test_solo.config deleted file mode 100644 index e5c3b5de..00000000 --- a/conf/test_solo.config +++ /dev/null @@ -1,50 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running a solo sample -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple pipeline with 1 sample. - - Use as follows: - nextflow run nf-core/raredisease -profile test, --outdir - ----------------------------------------------------------------------------------------- -*/ - -params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function using a single sample' - - // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = '6.GB' - max_time = '2.h' - - // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_single.csv' - - // Genome references - fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" - genome = 'GRCh37' - gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" - intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" - known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" - mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" - mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" - mt_intervals_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.intervals" - mt_backchain_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.back_chain" - pli_per_gene = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins/pLI_values_107.txt" - reduced_penetrance = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reduced_penetrance.tsv" - score_config_snv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_snv.ini" - score_config_sv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_sv.ini" - select_feature_file = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" - svdb_query_dbs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/svdb_querydb_files.csv" - target_bed = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target.bed" - variant_catalog = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/variant_catalog.json" - vcfanno_lua = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_functions.lua" - vcfanno_resources = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_resources.txt" - vcfanno_toml = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_config.toml" - vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins.tar.gz" - vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" - vep_cache_version = 107 -} From 8b46eacea0a987ab593f328003d1f842a854b551 Mon Sep 17 00:00:00 2001 From: peterpru Date: Fri, 17 Feb 2023 12:11:53 +0100 Subject: [PATCH 0961/1169] update smncopynumbercaller git_sha --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 9d551e4e..e31156d1 100644 --- a/modules.json +++ b/modules.json @@ -292,7 +292,7 @@ }, "smncopynumbercaller": { "branch": "master", - "git_sha": "2bb1f6515962a1559e79544112394d2db03a4302" + "git_sha": "93deb7b33308ce23fb4fd2a8e13b86bc117e8d77" }, "stranger": { "branch": "master", From 5d3a04d0fd186c6736390fe09006eba74f23acf5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 12:15:58 +0100 Subject: [PATCH 0962/1169] fix prettier --- modules.json | 270 +++++++++++++-------------------------------------- 1 file changed, 68 insertions(+), 202 deletions(-) diff --git a/modules.json b/modules.json index 2a1d70e8..4edb8b67 100644 --- a/modules.json +++ b/modules.json @@ -8,474 +8,340 @@ "bcftools/concat": { "branch": "master", "git_sha": "582ff1755bdd205c65e2ba4c31e0a008dae299ec", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/filter": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/norm": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/roh": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/view": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwa/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/mem": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/callcnvs": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/histogram": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/importreaddepth": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/partition": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvpytor/view": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "deepvariant": { "branch": "master", "git_sha": "c62b41a07a00fee11ec73e2a0d4a1aec771a742b", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "expansionhunter": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "fastqc": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/bedtointervallist": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/createsequencedictionary": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/filtermutectcalls": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/intervallisttools": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/mergebamalignment": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/mergevcfs": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/mutect2": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/printreads": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/revertsam": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/samtofastq": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/selectvariants": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/splitintervals": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/variantfiltration": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "genmod/annotate": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "genmod/compound": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "genmod/models": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "genmod/score": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "glnexus": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "haplocheck": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "haplogrep2/classify": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "hmtnote": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "manta/germline": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "def5f182583df0c20f43ec3d4355e8ebd341aaa9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "ee80d14721e76e2e079103b8dcd5d57129e584ba", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/addorreplacereadgroups": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/collecthsmetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/collectmultiplemetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/collectwgsmetrics": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/liftovervcf": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/markduplicates": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "picard/sortvcf": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "qualimap/bamqc": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "rhocall/annotate": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/index": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "stranger": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "svdb/merge": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "svdb/query": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/tabix": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tiddit/cov": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tiddit/sv": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/wigtobigwig": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "untar": { "branch": "master", "git_sha": "cc1f997fab6d8fde5dc0e6e2a310814df5b53ce7", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "vcfanno": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } } } } -} \ No newline at end of file +} From d2b5367fe8e8a76f41a23a2d8c38c8ec67c1b171 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 12:21:42 +0100 Subject: [PATCH 0963/1169] update ci --- .github/workflows/awstest2.yml | 6 +++--- .github/workflows/ci.yml | 2 +- nextflow.config | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/awstest2.yml b/.github/workflows/awstest2.yml index 26f58bd7..469bf2ba 100644 --- a/.github/workflows/awstest2.yml +++ b/.github/workflows/awstest2.yml @@ -1,4 +1,4 @@ -name: nf-core AWS test 2 samples +name: nf-core AWS test single sample # This workflow can be triggered manually with the GitHub actions workflow dispatch button. # It runs the -profile 'test2samples' on AWS batch @@ -6,7 +6,7 @@ on: workflow_dispatch: jobs: run-tower: - name: Run AWS tests 2 samples + name: Run AWS tests single sample if: github.repository == 'nf-core/raredisease' runs-on: ubuntu-latest steps: @@ -22,7 +22,7 @@ jobs: { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test2samples-${{ github.sha }}" } - profiles: test2samples,aws_tower + profiles: test_one_sample,aws_tower - uses: actions/upload-artifact@v3 with: name: Tower debug log file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f88d7b4..e3625c69 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: - "latest-everything" parameters: - "-profile test,docker" - - "-profile test2samples,docker" + - "-profile test_one_sample,docker" steps: - name: Check out pipeline code uses: actions/checkout@v3 diff --git a/nextflow.config b/nextflow.config index ccd41f42..544b7bee 100644 --- a/nextflow.config +++ b/nextflow.config @@ -167,9 +167,9 @@ profiles { executor.cpus = 16 executor.memory = 60.GB } - test { includeConfig 'conf/test.config' } - test_full { includeConfig 'conf/test_full.config' } - test2samples { includeConfig 'conf/test2samples.config' } + test { includeConfig 'conf/test.config' } + test_full { includeConfig 'conf/test_full.config' } + test_one_sample { includeConfig 'conf/test_one_sample.config' } } // Load igenomes.config if required, else load custom genomes.config From 2fa1326d899dee989357eb05ffb1c8980114b550 Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 17 Feb 2023 12:59:40 +0100 Subject: [PATCH 0964/1169] remove null object from version channel --- subworkflows/local/align.nf | 2 +- subworkflows/local/alignment/align_bwamem2.nf | 2 +- subworkflows/local/alignment/align_sentieon.nf | 2 +- subworkflows/local/analyse_MT.nf | 2 +- subworkflows/local/annotate_consequence_pli.nf | 2 +- subworkflows/local/annotate_snvs.nf | 2 +- subworkflows/local/annotate_structural_variants.nf | 2 +- subworkflows/local/call_repeat_expansions.nf | 4 ++-- subworkflows/local/call_snv.nf | 2 +- subworkflows/local/call_structural_variants.nf | 2 +- subworkflows/local/gens.nf | 2 +- subworkflows/local/mitochondria/align_and_call_MT.nf | 2 +- subworkflows/local/preprocessing/prepare_vcf.nf | 2 +- subworkflows/local/qc_bam.nf | 7 +++---- subworkflows/local/rank_variants.nf | 2 +- subworkflows/local/scatter_genome.nf | 2 +- subworkflows/local/variant_calling/call_cnv_cnvpytor.nf | 2 +- subworkflows/local/variant_calling/call_snv_deepvariant.nf | 2 +- subworkflows/local/variant_calling/call_snv_sentieon.nf | 2 +- subworkflows/local/variant_calling/call_sv_manta.nf | 2 +- subworkflows/local/variant_calling/call_sv_tiddit.nf | 2 +- workflows/raredisease.nf | 6 +++--- 22 files changed, 27 insertions(+), 28 deletions(-) diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 54bd2f24..928a6a06 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -47,5 +47,5 @@ workflow ALIGN { marked_bam = ch_marked_bam marked_bai = ch_marked_bai bam_bai = ch_bam_bai - versions = ch_versions.ifEmpty(null) + versions = ch_versions } diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index e6e288ec..4e749a01 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -65,5 +65,5 @@ workflow ALIGN_BWAMEM2 { metrics = MARKDUPLICATES.out.metrics marked_bam = MARKDUPLICATES.out.bam marked_bai = SAMTOOLS_INDEX_MARKDUP.out.bai - versions = ch_versions.ifEmpty(null) + versions = ch_versions } diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index e45cdbb5..4076b8dd 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -85,5 +85,5 @@ workflow ALIGN_SENTIEON { gc_summary = SENTIEON_DATAMETRICS.out.gc_summary.ifEmpty(null) aln_metrics = SENTIEON_DATAMETRICS.out.aln_metrics.ifEmpty(null) is_metrics = SENTIEON_DATAMETRICS.out.is_metrics.ifEmpty(null) - versions = ch_versions.ifEmpty(null) + versions = ch_versions } diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 848d5463..3df2e989 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -105,5 +105,5 @@ workflow ANALYSE_MT { html = ALIGN_AND_CALL_MT.out.html txt_sh = ALIGN_AND_CALL_MT_SHIFT.out.txt html_sh = ALIGN_AND_CALL_MT_SHIFT.out.html - versions = ch_versions.ifEmpty(null) + versions = ch_versions } diff --git a/subworkflows/local/annotate_consequence_pli.nf b/subworkflows/local/annotate_consequence_pli.nf index a414516c..e03e0d45 100644 --- a/subworkflows/local/annotate_consequence_pli.nf +++ b/subworkflows/local/annotate_consequence_pli.nf @@ -22,5 +22,5 @@ workflow ANNOTATE_CSQ_PLI { emit: vcf_ann = ADD_MOST_SEVERE_PLI.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index d5120fc2..6b0a86fb 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -110,5 +110,5 @@ workflow ANNOTATE_SNVS { emit: vcf_ann = BCFTOOLS_CONCAT.out.vcf tbi = TABIX_BCFTOOLS_CONCAT.out.tbi - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_verions } diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 5f140508..48aa9911 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -64,5 +64,5 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { emit: vcf_ann = ENSEMBLVEP_SV.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index cca75d00..845071a2 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -22,6 +22,6 @@ workflow CALL_REPEAT_EXPANSIONS { ch_versions = ch_versions.mix(STRANGER.out.versions.first()) emit: - vcf = STRANGER.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + vcf = STRANGER.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index a1e98a2f..fed00674 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -51,5 +51,5 @@ workflow CALL_SNV { emit: vcf = ch_vcf tabix = ch_tabix - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index d77be31a..c0e5bcab 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -66,5 +66,5 @@ workflow CALL_STRUCTURAL_VARIANTS { emit: vcf = SVDB_MERGE.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index dd63842d..da1f4ba7 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -34,5 +34,5 @@ workflow GENS { emit: gens_cov_bed_gz = GENS_GENERATE.out.cov gens_baf_bed_gz = GENS_GENERATE.out.baf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 5baddbc9..5a64cf3b 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -81,5 +81,5 @@ workflow ALIGN_AND_CALL_MT { filt_sats = GATK4_FILTERMUTECTCALLS_MT.out.stats txt = HAPLOCHECK_MT.out.txt html = HAPLOCHECK_MT.out.html - versions = ch_versions.ifEmpty(null) + versions = ch_versions } diff --git a/subworkflows/local/preprocessing/prepare_vcf.nf b/subworkflows/local/preprocessing/prepare_vcf.nf index 91293964..5488e052 100644 --- a/subworkflows/local/preprocessing/prepare_vcf.nf +++ b/subworkflows/local/preprocessing/prepare_vcf.nf @@ -48,5 +48,5 @@ workflow CHECK_VCF { emit: vcf = vcf_out // path: normalized_vcf index = TABIX_PV.out.tbi - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index c634768c..a003a0e3 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -53,13 +53,13 @@ workflow QC_BAM { // COLLECT WGS METRICS PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) - + SENTIEON_WGSMETRICS ( bam_bai, fasta, fai) SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai) ch_cov = Channel.empty().mix(PICARD_COLLECTWGSMETRICS.out.metrics, SENTIEON_WGSMETRICS.out.wgs_metrics) ch_cov_y = Channel.empty().mix(PICARD_COLLECTWGSMETRICS_Y.out.metrics, SENTIEON_WGSMETRICS_Y.out.wgs_metrics) - + ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS.out.versions, SENTIEON_WGSMETRICS.out.versions) ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions, SENTIEON_WGSMETRICS_Y.out.versions) @@ -72,6 +72,5 @@ workflow QC_BAM { d4 = MOSDEPTH.out.per_base_d4 // channel: [ val(meta), path(*.d4) ] cov = ch_cov // channel: [ val(meta), path(metrics) ] cov_y = ch_cov_y // channel: [ val(meta), path(metrics) ] - - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/rank_variants.nf b/subworkflows/local/rank_variants.nf index 7b13094d..8fa405fd 100644 --- a/subworkflows/local/rank_variants.nf +++ b/subworkflows/local/rank_variants.nf @@ -33,5 +33,5 @@ workflow RANK_VARIANTS { emit: vcf = GENMOD_COMPOUND.out.vcf - versions = ch_versions.ifEmpty(null) + versions = ch_versions } diff --git a/subworkflows/local/scatter_genome.nf b/subworkflows/local/scatter_genome.nf index 8adb7349..5f136168 100644 --- a/subworkflows/local/scatter_genome.nf +++ b/subworkflows/local/scatter_genome.nf @@ -26,5 +26,5 @@ workflow SCATTER_GENOME { emit: bed = BUILD_BED.out.bed.collect() split_intervals = GATK4_SPLITINTERVALS.out.split_intervals.map { meta, it -> it }.flatten().collate(1) - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf index 38c420b2..a39abb28 100644 --- a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf +++ b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf @@ -49,6 +49,6 @@ workflow CALL_CNV_CNVPYTOR { emit: candidate_cnvs_vcf = VIEW.out.vcf // channel: [ val(meta), path(*.tsv) ] - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/variant_calling/call_snv_deepvariant.nf b/subworkflows/local/variant_calling/call_snv_deepvariant.nf index 683cdf66..fcb89efc 100644 --- a/subworkflows/local/variant_calling/call_snv_deepvariant.nf +++ b/subworkflows/local/variant_calling/call_snv_deepvariant.nf @@ -57,5 +57,5 @@ workflow CALL_SNV_DEEPVARIANT { emit: vcf = REMOVE_DUPLICATES_GL.out.vcf tabix = TABIX_GL.out.tbi - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 4076e2dd..2dc1fe1c 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -82,5 +82,5 @@ workflow CALL_SNV_SENTIEON { emit: vcf = REMOVE_DUPLICATES_SEN.out.vcf tabix = TABIX_SEN.out.tbi - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/subworkflows/local/variant_calling/call_sv_manta.nf b/subworkflows/local/variant_calling/call_sv_manta.nf index e1da4896..a0b2d0ee 100644 --- a/subworkflows/local/variant_calling/call_sv_manta.nf +++ b/subworkflows/local/variant_calling/call_sv_manta.nf @@ -50,5 +50,5 @@ workflow CALL_SV_MANTA { candidate_sv_vcf_tbi = MANTA.out.candidate_sv_vcf_tbi diploid_sv_vcf = MANTA.out.diploid_sv_vcf diploid_sv_vcf_tbi = MANTA.out.diploid_sv_vcf_tbi - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/subworkflows/local/variant_calling/call_sv_tiddit.nf b/subworkflows/local/variant_calling/call_sv_tiddit.nf index 51d8f77c..945c07a9 100644 --- a/subworkflows/local/variant_calling/call_sv_tiddit.nf +++ b/subworkflows/local/variant_calling/call_sv_tiddit.nf @@ -32,5 +32,5 @@ workflow CALL_SV_TIDDIT { emit: vcf = SVDB_MERGE_TIDDIT.out.vcf - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + versions = ch_versions } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8497dd53..d130598e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -282,7 +282,7 @@ workflow RAREDISEASE { ch_intervals_y, params.aligner ) - ch_versions = ch_versions.mix(QC_BAM.out.versions.ifEmpty(null)) + ch_versions = ch_versions.mix(QC_BAM.out.versions) // EXPANSIONHUNTER AND STRANGER CALL_REPEAT_EXPANSIONS ( @@ -290,7 +290,7 @@ workflow RAREDISEASE { ch_genome_fasta_no_meta, ch_variant_catalog ) - ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions.ifEmpty(null)) + ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions) // STEP 2: VARIANT CALLING CALL_SNV ( @@ -333,7 +333,7 @@ workflow RAREDISEASE { CHECK_INPUT.out.case_info, ch_sequence_dictionary_no_meta ) - ch_versions = ch_versions.mix(GENS.out.versions.ifEmpty(null)) + ch_versions = ch_versions.mix(GENS.out.versions) } if (params.annotate_sv_switch) { From 1f61aae3848c0bf99095785ae6266565624ad0f6 Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 17 Feb 2023 13:16:42 +0100 Subject: [PATCH 0965/1169] fixing typo --- subworkflows/local/annotate_snvs.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 6b0a86fb..ce24b7a8 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -110,5 +110,5 @@ workflow ANNOTATE_SNVS { emit: vcf_ann = BCFTOOLS_CONCAT.out.vcf tbi = TABIX_BCFTOOLS_CONCAT.out.tbi - versions = ch_verions + versions = ch_versions } From 16078a098e2dce1719eccb673a48091f3d647b22 Mon Sep 17 00:00:00 2001 From: jemten Date: Fri, 17 Feb 2023 13:54:07 +0100 Subject: [PATCH 0966/1169] renaming single mt vcf --- conf/modules.config | 5 ----- subworkflows/local/mitochondria/merge_annotate_MT.nf | 6 +----- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 484c526a..20628718 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1115,11 +1115,6 @@ process { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:CHANGE_NAME_VCF_MT' { - ext.file_type = 'vcf.gz' - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } - } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:BCFTOOLS_MERGE_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 766ccef9..8d51407a 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -83,10 +83,7 @@ workflow MERGE_ANNOTATE_MT { genome_fai) ch_merged_vcf = BCFTOOLS_MERGE_MT.out.merged_variants - CHANGE_NAME_VCF_MT(ch_case_vcf.single) - ch_vcf_changed_name = CHANGE_NAME_VCF_MT.out.file - - ch_in_vep = ch_merged_vcf.mix(ch_vcf_changed_name) + ch_in_vep = ch_merged_vcf.mix(ch_case_vcf.single) // Annotating with Hmtnote //HMTNOTE_MT(ch_in_vep) @@ -110,7 +107,6 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_MT.out.versions.first()) ch_versions = ch_versions.mix(REMOVE_DUPLICATES_MT.out.versions.first()) ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) - ch_versions = ch_versions.mix(CHANGE_NAME_VCF_MT.out.versions) ch_versions = ch_versions.mix(ENSEMBLVEP_MT.out.versions) ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) From cb829f2e23107c78b3ccf84381c61ab84ffa28a2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 14:27:41 +0100 Subject: [PATCH 0967/1169] edit modules_conf --- conf/modules.config | 2 +- conf/test.config | 4 ++-- conf/test_one_sample.config | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 658ddfbb..18c0646a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -901,7 +901,7 @@ process { // process { - withName: 'RAREDISEASE:BCFTOOLS_CONCAT' { + withName: '.*RAREDISEASE:BCFTOOLS_CONCAT' { ext.prefix = { "${meta.id}_mito_genome_merged" } } } diff --git a/conf/test.config b/conf/test.config index 0e4351cd..d3fce46b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,8 +26,8 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" - intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" + intervals_wgs = "${projectDir}/assets/1-22XYMT_grch37.interval_list" + intervals_y = "${projectDir}/assets/Y_grch37.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index e5c3b5de..ca4afe2a 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -26,8 +26,8 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" - intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" + intervals_wgs = "${projectDir}/assets/1-22XYMT_grch37.interval_list" + intervals_y = "${projectDir}/assets/Y_grch37.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" From e096830b7e14f2b89ef51579a69975058c0a00b2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 16:00:57 +0100 Subject: [PATCH 0968/1169] update test for collectwgs metrics --- conf/test.config | 9 +++++---- conf/test_one_sample.config | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/conf/test.config b/conf/test.config index d3fce46b..8d6a53dc 100644 --- a/conf/test.config +++ b/conf/test.config @@ -15,9 +15,10 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = '6.GB' - max_time = '2.h' + max_cpus = 2 + max_memory = '6.GB' + max_time = '2.h' + mt_contig_name = 'MT' // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_trio.csv' @@ -26,7 +27,7 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "${projectDir}/assets/1-22XYMT_grch37.interval_list" + intervals_wgs = "${projectDir}/assets/1-22XYMT_grch37_test.interval_list" intervals_y = "${projectDir}/assets/Y_grch37.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index ca4afe2a..c9cbf249 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -18,6 +18,7 @@ params { max_cpus = 2 max_memory = '6.GB' max_time = '2.h' + mt_contig_name = 'MT' // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_single.csv' @@ -26,8 +27,8 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "${projectDir}/assets/1-22XYMT_grch37.interval_list" - intervals_y = "${projectDir}/assets/Y_grch37.interval_list" + intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/assets/1-22XYMT_grch37_test.interval_list" + intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/assets/Y_grch37_test.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" From 6c0c8d26f8ad1f84f190dc75c4d92f5886e2a87e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 16:04:01 +0100 Subject: [PATCH 0969/1169] update test config --- conf/test.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/test.config b/conf/test.config index 8d6a53dc..d1a60939 100644 --- a/conf/test.config +++ b/conf/test.config @@ -17,7 +17,7 @@ params { // Limit resources so that this can run on GitHub Actions max_cpus = 2 max_memory = '6.GB' - max_time = '2.h' + max_time = '2.h' mt_contig_name = 'MT' // Input data @@ -27,8 +27,8 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "${projectDir}/assets/1-22XYMT_grch37_test.interval_list" - intervals_y = "${projectDir}/assets/Y_grch37.interval_list" + intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/assets/1-22XYMT_grch37_test.interval_list" + intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/assets/Y_grch37_test.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" From 8cfa90c03d7da3f8683278ac48a3ba2cce4c6bc0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 16:11:51 +0100 Subject: [PATCH 0970/1169] remove assets --- conf/test.config | 4 ++-- conf/test_one_sample.config | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/test.config b/conf/test.config index d1a60939..1c151b09 100644 --- a/conf/test.config +++ b/conf/test.config @@ -27,8 +27,8 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/assets/1-22XYMT_grch37_test.interval_list" - intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/assets/Y_grch37_test.interval_list" + intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/1-22XYMT_grch37_test.interval_list" + intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Y_grch37_test.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index c9cbf249..deae9564 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -27,8 +27,8 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/assets/1-22XYMT_grch37_test.interval_list" - intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/assets/Y_grch37_test.interval_list" + intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/1-22XYMT_grch37_test.interval_list" + intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Y_grch37_test.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" From 5275d78b48e094f0fed17c1e9347f7e7423bdb8d Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 17 Feb 2023 17:21:12 +0100 Subject: [PATCH 0971/1169] feat added vcfanno to MT subworkflow --- subworkflows/local/analyse_MT.nf | 5 ++++- .../local/mitochondria/merge_annotate_MT.nf | 15 ++++++++++++--- workflows/raredisease.nf | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 848d5463..a7a7a9af 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -25,7 +25,8 @@ workflow ANALYSE_MT { shift_mt_fai // channel: [ genome.fai ] shift_mt_intervals // channel: [ file(control_region_shifted.chrM.interval_list) ] shift_mt_backchain // channel: [ file(shift.back_chain) ] - vep_genome + vcfanno_resources + vcfanno_tomlvep_genome vep_cache_version vep_cache case_info // channel: [ val(case_info) ] @@ -80,6 +81,8 @@ workflow ANALYSE_MT { genome_dict_meta, genome_dict_no_meta, genome_fai, + vcfanno_resources, + vcfanno_tomlvep_genome, vep_genome, vep_cache_version, vep_cache, diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 766ccef9..77399fb3 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -14,6 +14,8 @@ include { HMTNOTE as HMTNOTE_MT } from '../../. include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../../modules/nf-core/tabix/tabix/main' include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../../modules/local/ensemblvep/main' include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../../modules/nf-core/haplogrep2/classify/main' +include { VCFANNO } from '../../../modules/nf-core/vcfanno/main' +include { TABIX_TABIX as TABIX_TABIX_MT4 } from '../../../modules/nf-core/tabix/tabix/main' workflow MERGE_ANNOTATE_MT { take: @@ -23,6 +25,8 @@ workflow MERGE_ANNOTATE_MT { genome_dict_meta // channel: [ genome.dict ] genome_dict_no_meta // channel: [ genome.dict ] genome_fai // channel: [ genome.fai ] + vcfanno_resources + vcfanno_toml vep_genome vep_cache_version vep_cache @@ -101,8 +105,13 @@ workflow MERGE_ANNOTATE_MT { genome_fasta, []) - // Running haplogrep2 + // Running vcfanno TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf_gz) + ch_in_vcfanno = ENSEMBLVEP_MT.out.vcf_gz.join(TABIX_TABIX_MT3.out.tbi, by: [0]) + VCFANNO(ch_in_vcfanno, vcfanno_toml, [], vcfanno_resources) + TABIX_TABIX_MT4(VCFANNO.out.vcf_gz) + + // Running haplogrep2 HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") ch_versions = ch_versions.mix(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.versions.first()) @@ -116,8 +125,8 @@ workflow MERGE_ANNOTATE_MT { emit: haplog = HAPLOGREP2_CLASSIFY_MT.out.txt - vcf = ENSEMBLVEP_MT.out.vcf_gz - tbi = TABIX_TABIX_MT3.out.tbi + vcf = VCFANNO.out.vcf_gz + tbi = TABIX_TABIX_MT4.out.tbi report = ENSEMBLVEP_MT.out.report versions = ch_versions // channel: [ versions.yml ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index b7162eea..95dd1fe4 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -391,6 +391,8 @@ workflow RAREDISEASE { ch_mt_shift_fai, ch_mt_intervals_shift, ch_mt_backchain_shift, + ch_vcfanno_resources + ch_vcfanno_toml, params.genome, params.vep_cache_version, ch_vep_cache, From 0850753bc8d636b28841ba847669f4e62379aa04 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 17 Feb 2023 17:28:13 +0100 Subject: [PATCH 0972/1169] feat add version vcfanno --- subworkflows/local/analyse_MT.nf | 3 ++- subworkflows/local/mitochondria/merge_annotate_MT.nf | 1 + workflows/raredisease.nf | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index a7a7a9af..b4e23066 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -26,7 +26,8 @@ workflow ANALYSE_MT { shift_mt_intervals // channel: [ file(control_region_shifted.chrM.interval_list) ] shift_mt_backchain // channel: [ file(shift.back_chain) ] vcfanno_resources - vcfanno_tomlvep_genome + vcfanno_toml + vep_genome vep_cache_version vep_cache case_info // channel: [ val(case_info) ] diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 77399fb3..bada1da5 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -121,6 +121,7 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) ch_versions = ch_versions.mix(CHANGE_NAME_VCF_MT.out.versions) ch_versions = ch_versions.mix(ENSEMBLVEP_MT.out.versions) + ch_versions = ch_versions.mix(VCFANNO.out.versions) ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) emit: diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 95dd1fe4..c8379847 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -391,7 +391,7 @@ workflow RAREDISEASE { ch_mt_shift_fai, ch_mt_intervals_shift, ch_mt_backchain_shift, - ch_vcfanno_resources + ch_vcfanno_resources, ch_vcfanno_toml, params.genome, params.vep_cache_version, From 5a4e2524f36c7391eaf22bc889b8dabe19ad24eb Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 17 Feb 2023 17:29:56 +0100 Subject: [PATCH 0973/1169] fix typo --- subworkflows/local/analyse_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index b4e23066..6b1f66c4 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -83,7 +83,7 @@ workflow ANALYSE_MT { genome_dict_no_meta, genome_fai, vcfanno_resources, - vcfanno_tomlvep_genome, + vcfanno_toml, vep_genome, vep_cache_version, vep_cache, From c85dc3db95ba2f9f86551f41c5e9168a0ed65fbf Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 17 Feb 2023 17:33:02 +0100 Subject: [PATCH 0974/1169] fix channel output name --- subworkflows/local/analyse_MT.nf | 2 +- subworkflows/local/mitochondria/merge_annotate_MT.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 6b1f66c4..5b6c38de 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -109,5 +109,5 @@ workflow ANALYSE_MT { html = ALIGN_AND_CALL_MT.out.html txt_sh = ALIGN_AND_CALL_MT_SHIFT.out.txt html_sh = ALIGN_AND_CALL_MT_SHIFT.out.html - versions = ch_versions.ifEmpty(null) + versions = ch_versions } diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index bada1da5..070e9db0 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -109,7 +109,7 @@ workflow MERGE_ANNOTATE_MT { TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf_gz) ch_in_vcfanno = ENSEMBLVEP_MT.out.vcf_gz.join(TABIX_TABIX_MT3.out.tbi, by: [0]) VCFANNO(ch_in_vcfanno, vcfanno_toml, [], vcfanno_resources) - TABIX_TABIX_MT4(VCFANNO.out.vcf_gz) + TABIX_TABIX_MT4(VCFANNO.out.vcf) // Running haplogrep2 HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") @@ -126,7 +126,7 @@ workflow MERGE_ANNOTATE_MT { emit: haplog = HAPLOGREP2_CLASSIFY_MT.out.txt - vcf = VCFANNO.out.vcf_gz + vcf = VCFANNO.out.vcf tbi = TABIX_TABIX_MT4.out.tbi report = ENSEMBLVEP_MT.out.report versions = ch_versions // channel: [ versions.yml ] From 4684e5450598aa145ae78dc44a798dba03862c84 Mon Sep 17 00:00:00 2001 From: lucpen Date: Fri, 17 Feb 2023 17:57:15 +0100 Subject: [PATCH 0975/1169] fix vcf and tbi file for vcfanno --- subworkflows/local/analyse_MT.nf | 3 +-- .../local/mitochondria/merge_annotate_MT.nf | 13 ++++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 5b6c38de..ba22bd35 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -97,8 +97,7 @@ workflow ANALYSE_MT { ch_versions = ch_versions.mix(MERGE_ANNOTATE_MT.out.versions) emit: - vcf = MERGE_ANNOTATE_MT.out.vcf - tbi = MERGE_ANNOTATE_MT.out.tbi + vcf = MERGE_ANNOTATE_MT.out.vcf_gz_tbi stats = ALIGN_AND_CALL_MT.out.stats filt_sats = ALIGN_AND_CALL_MT.out.filt_sats stats_sh = ALIGN_AND_CALL_MT_SHIFT.out.stats diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 070e9db0..8a6da5a2 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -15,7 +15,7 @@ include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../. include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../../modules/local/ensemblvep/main' include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../../modules/nf-core/haplogrep2/classify/main' include { VCFANNO } from '../../../modules/nf-core/vcfanno/main' -include { TABIX_TABIX as TABIX_TABIX_MT4 } from '../../../modules/nf-core/tabix/tabix/main' +include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../../modules/nf-core/tabix/bgziptabix/main' workflow MERGE_ANNOTATE_MT { take: @@ -109,7 +109,7 @@ workflow MERGE_ANNOTATE_MT { TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf_gz) ch_in_vcfanno = ENSEMBLVEP_MT.out.vcf_gz.join(TABIX_TABIX_MT3.out.tbi, by: [0]) VCFANNO(ch_in_vcfanno, vcfanno_toml, [], vcfanno_resources) - TABIX_TABIX_MT4(VCFANNO.out.vcf) + ZIP_TABIX_VCFANNO(VCFANNO.out.vcf) // Running haplogrep2 HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") @@ -125,9 +125,8 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) emit: - haplog = HAPLOGREP2_CLASSIFY_MT.out.txt - vcf = VCFANNO.out.vcf - tbi = TABIX_TABIX_MT4.out.tbi - report = ENSEMBLVEP_MT.out.report - versions = ch_versions // channel: [ versions.yml ] + haplog = HAPLOGREP2_CLASSIFY_MT.out.txt + vcf_gz_tbi = ZIP_TABIX_VCFANNO.out.gz_tbi + report = ENSEMBLVEP_MT.out.report + versions = ch_versions // channel: [ versions.yml ] } From 03e005d553a720fd76f6e7544ef8094922498c0c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 23:44:38 +0100 Subject: [PATCH 0976/1169] tests work! --- conf/modules.config | 87 +++++++++++++++++++++++++++++++++------------ conf/test.config | 6 ++-- nextflow.config | 2 +- 3 files changed, 68 insertions(+), 27 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 18c0646a..348801af 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -491,6 +491,14 @@ process { ] } + withName: '.*QC_BAM:PICARD_COLLECTHSMETRICS' { + publishDir = [ + path: { "${params.outdir}/bamqc/collecthsmetrics" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + withName: '.*QC_BAM:QUALIMAP_BAMQC' { publishDir = [ path: { "${params.outdir}/bamqc_qualimap" }, @@ -639,7 +647,14 @@ process { ] } - withName: '.*CALL_SNV:GATK4_SELECTVARIANTS' { +} + +// +// Remove mitochondrial variants +// + +process { + withName: '.*RAREDISEASE:GATK4_SELECTVARIANTS' { ext.args = "--exclude-intervals ${params.mt_contig_name}" ext.prefix = { "${meta.id}_nomito" } ext.when = { params.annotate_snv_switch } @@ -714,7 +729,7 @@ process { } withName: '.*CALL_STRUCTURAL_VARIANTS:SVDB_MERGE' { - ext.args = '--pass_only' + ext.args = '--pass_only --same_order' publishDir = [ path: { "${params.outdir}/sv_caller" }, mode: params.publish_dir_mode, @@ -764,15 +779,16 @@ process { withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:ENSEMBLVEP_SV' { ext.when = { params.annotate_sv_switch } ext.args = [ - '--plugin LoFtool,vep_cache/LoFtool_scores.txt', - '--distance 5000', - '--buffer_size 20000', - '--format vcf --max_sv_size 248956422', - '--appris --biotype --canonical --ccds --compress_output bgzip', - '--domains --exclude_predicted --force_overwrite', - '--humdiv --no_progress --no_stats --numbers', - '--polyphen p --protein --offline --regulatory --sift p --symbol --tsl', - '--uniprot' + '--dir_cache vep_cache', + '--dir_plugins vep_cache/Plugins', + '--plugin pLI,vep_cache/pLI_values_107.txt', + '--appris --biotype --buffer_size 100 --canonical --cache --ccds', + '--compress_output bgzip --distance 5000 --domains', + '--exclude_predicted --force_overwrite --format vcf', + '--fork 4 --hgvs --humdiv --max_sv_size 248956422 --merged', + '--no_progress --no_stats --numbers --per_gene --polyphen p', + '--protein --offline --regulatory --sift p', + '--symbol --tsl --uniprot --vcf' ].join(' ') publishDir = [ path: { "${params.outdir}/sv_annotate" }, @@ -846,7 +862,7 @@ process { withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { ext.when = { params.annotate_snv_switch } ext.prefix = { "${meta.id}_view" } - ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70 | INFO/SWEGENAF > 0.70" ' } + ext.args = { '--output-type z' } publishDir = [ path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, @@ -870,7 +886,11 @@ process { ext.when = { params.annotate_snv_switch } ext.prefix = { "${vcf.simpleName}_vep" } ext.args = [ + '--dir_plugins vep_cache/Plugins', '--plugin LoFtool,vep_cache/LoFtool_scores.txt', + '--plugin pLI,vep_cache/pLI_values_107.txt', + '--plugin SpliceAI,snv=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz,indel=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz', + '--plugin MaxEntScan,vep_cache/fordownload,SWA,NCSS', '--distance 5000', '--buffer_size 20000', '--format vcf --max_sv_size 248956422', @@ -878,7 +898,7 @@ process { '--domains --exclude_predicted --force_overwrite', '--hgvs --humdiv --no_progress --no_stats --numbers', '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl', - '--uniprot' + '--uniprot --vcf' ].join(' ') publishDir = [ path: { "${params.outdir}/snv_annotation" }, @@ -1015,8 +1035,14 @@ process { } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_FILTERMUTECTCALLS_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_filtered" } } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_RENAMESAMPLEINVCF_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } + ext.prefix = { "${meta.id}_renamed" } + } } // @@ -1077,6 +1103,22 @@ process { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_filtered_shifted" } } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_RENAMESAMPLEINVCF_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } + ext.prefix = { "${meta.id}_renamed" } + } +} + +// +// Liftover +// +process { + + withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } + ext.prefix = { "${meta.id}_liftover" } + } } // @@ -1142,14 +1184,18 @@ process { withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ENSEMBLVEP_MT' { ext.args = [ + '--dir_plugins vep_cache/Plugins', '--plugin LoFtool,vep_cache/LoFtool_scores.txt', - '--distance 0', + '--plugin pLI,vep_cache/pLI_values_107.txt', + '--plugin SpliceAI,snv=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz,indel=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz', + '--plugin MaxEntScan,vep_cache/fordownload,SWA,NCSS', + '--distance 5000', '--buffer_size 20000', - '--format vcf --vcf --max_sv_size 16600', + '--format vcf --fork 4 --max_sv_size 248956422', '--appris --biotype --cache --canonical --ccds --compress_output bgzip', '--domains --exclude_predicted --force_overwrite', - '--hgvs --humdiv --no_progress --numbers', - '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl', + '--hgvs --humdiv --no_progress --no_stats --numbers', + '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl --vcf', '--uniprot' ].join(' ') ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } @@ -1165,12 +1211,6 @@ process { } -process { - withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { - ext.when = { params.mt_fasta_shift && params.mt_backchain_shift && !(params.analysis_type == "wes") } - } -} - // // SENTIEON_TNSCOPE_MT_CALL // @@ -1179,5 +1219,6 @@ process { withName: '.*SENTIEON_TNSCOPE' { ext.args = { (params.genome == "GRCh37") ? " --interval MT " : "--interval chrM" } ext.args2 = " --min_init_normal_lod 0,5 --min_normal_lod 2,0 --min_init_tumor_lod 1,0 --min_tumor_lod 2,8 --trim_soft_clip " + ext.when = params.variant_caller.equals("sentieon") } } diff --git a/conf/test.config b/conf/test.config index 1c151b09..61485360 100644 --- a/conf/test.config +++ b/conf/test.config @@ -27,8 +27,8 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/1-22XYMT_grch37_test.interval_list" - intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Y_grch37_test.interval_list" + intervals_wgs = "https://raw.githubusercontent.com/ramprasadn/test-datasets/raredisease/reference/target_wgs.interval_list" + intervals_y = "https://raw.githubusercontent.com/ramprasadn/test-datasets/raredisease/reference/targetY.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" @@ -36,7 +36,7 @@ params { mt_backchain_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.back_chain" pli_per_gene = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins/pLI_values_107.txt" reduced_penetrance = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reduced_penetrance.tsv" - score_config_snv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_snv.ini" + score_config_snv = "https://raw.githubusercontent.com/ramprasadn/test-datasets/raredisease/reference/rank_model_snv.ini" score_config_sv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_sv.ini" select_feature_file = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" svdb_query_dbs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/svdb_querydb_files.csv" diff --git a/nextflow.config b/nextflow.config index 544b7bee..25090eb3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,7 +23,7 @@ params { // Main options analysis_type = 'wgs' annotate_snv_switch = true - annotate_sv_switch = false + annotate_sv_switch = true dedicated_mt_analysis = true gens_switch = false platform = 'illumina' From 462a6ca1bb5a7a1446ccddbb2a6420249969f91a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 17 Feb 2023 23:48:51 +0100 Subject: [PATCH 0977/1169] update paths --- conf/test.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/test.config b/conf/test.config index 61485360..15544c85 100644 --- a/conf/test.config +++ b/conf/test.config @@ -27,8 +27,8 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "https://raw.githubusercontent.com/ramprasadn/test-datasets/raredisease/reference/target_wgs.interval_list" - intervals_y = "https://raw.githubusercontent.com/ramprasadn/test-datasets/raredisease/reference/targetY.interval_list" + intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_wgs.interval_list" + intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/targetY.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" @@ -36,7 +36,7 @@ params { mt_backchain_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.back_chain" pli_per_gene = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins/pLI_values_107.txt" reduced_penetrance = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reduced_penetrance.tsv" - score_config_snv = "https://raw.githubusercontent.com/ramprasadn/test-datasets/raredisease/reference/rank_model_snv.ini" + score_config_snv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_snv.ini" score_config_sv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_sv.ini" select_feature_file = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" svdb_query_dbs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/svdb_querydb_files.csv" From 7936dcfafe73c4b8c5a59deffff95c3d086f1be3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Feb 2023 09:10:37 +0100 Subject: [PATCH 0978/1169] update paths in test_one_sample --- conf/test_one_sample.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index deae9564..d8d13d9a 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -27,8 +27,8 @@ params { fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reference.fasta" genome = 'GRCh37' gnomad_af = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gnomad_reformated.tab.gz" - intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/1-22XYMT_grch37_test.interval_list" - intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/Y_grch37_test.interval_list" + intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_wgs.interval_list" + intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/targetY.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" From d60d3b1a17e40b3ab501e9333c4ac4da7a651941 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Feb 2023 09:14:41 +0100 Subject: [PATCH 0979/1169] update schema --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 2126ed1c..c7a9f47c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -404,7 +404,7 @@ }, "annotate_sv_switch": { "type": "boolean", - "default": false, + "default": true, "description": "Specifies whether or not to run annotate structural variant subworkflow.", "fa_icon": "fas fa-book" }, From 0c703ec8b3df524033553f57f6802882fa163e63 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 20 Feb 2023 10:44:57 +0100 Subject: [PATCH 0980/1169] feat change name of vcfanno mt output --- conf/modules.config | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 18c0646a..4fdb4fe2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1163,6 +1163,16 @@ process { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:VCFANNO' { + ext.prefix = { "${meta.id}_vcfanno_MT" } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + } process { From f36eb8c9919a067a8012179970f406bb918d9363 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Feb 2023 10:44:58 +0100 Subject: [PATCH 0981/1169] review suggestions --- conf/modules.config | 4 ++-- conf/test.config | 14 ++++++++++++++ conf/test_one_sample.config | 13 +++++++++++++ nextflow.config | 3 +++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 348801af..7b655ded 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -862,7 +862,7 @@ process { withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { ext.when = { params.annotate_snv_switch } ext.prefix = { "${meta.id}_view" } - ext.args = { '--output-type z' } + ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70 | INFO/SWEGENAF > 0.70" ' } publishDir = [ path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, @@ -1189,7 +1189,7 @@ process { '--plugin pLI,vep_cache/pLI_values_107.txt', '--plugin SpliceAI,snv=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz,indel=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz', '--plugin MaxEntScan,vep_cache/fordownload,SWA,NCSS', - '--distance 5000', + '--distance 0', '--buffer_size 20000', '--format vcf --fork 4 --max_sv_size 248956422', '--appris --biotype --cache --canonical --ccds --compress_output bgzip', diff --git a/conf/test.config b/conf/test.config index 15544c85..36bb3835 100644 --- a/conf/test.config +++ b/conf/test.config @@ -50,3 +50,17 @@ params { vep_cache_version = 107 } +process { + withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { + ext.when = { params.annotate_snv_switch } + ext.prefix = { "${meta.id}_view" } + ext.args = { '--output-type z' } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} + + diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index d8d13d9a..63cec545 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -49,3 +49,16 @@ params { vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" vep_cache_version = 107 } + +process { + withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { + ext.when = { params.annotate_snv_switch } + ext.prefix = { "${meta.id}_view" } + ext.args = { '--output-type z' } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} diff --git a/nextflow.config b/nextflow.config index 25090eb3..879f91c7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -35,6 +35,9 @@ params { // Variant calling variant_caller = 'deepvariant' + // sentieon Defaults + ml_model = '' + // Dnascope SNV calling pcrfree = true variant_type = 'snp,indel' From 7d7b556e3af9a21d847f06262f09e1ab401d5c90 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 20 Feb 2023 10:45:54 +0100 Subject: [PATCH 0982/1169] feat divided vcf tbi channel into 2 channels --- subworkflows/local/analyse_MT.nf | 3 ++- subworkflows/local/mitochondria/merge_annotate_MT.nf | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index ba22bd35..5b6c38de 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -97,7 +97,8 @@ workflow ANALYSE_MT { ch_versions = ch_versions.mix(MERGE_ANNOTATE_MT.out.versions) emit: - vcf = MERGE_ANNOTATE_MT.out.vcf_gz_tbi + vcf = MERGE_ANNOTATE_MT.out.vcf + tbi = MERGE_ANNOTATE_MT.out.tbi stats = ALIGN_AND_CALL_MT.out.stats filt_sats = ALIGN_AND_CALL_MT.out.filt_sats stats_sh = ALIGN_AND_CALL_MT_SHIFT.out.stats diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 8a6da5a2..8bed7ffd 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -111,6 +111,11 @@ workflow MERGE_ANNOTATE_MT { VCFANNO(ch_in_vcfanno, vcfanno_toml, [], vcfanno_resources) ZIP_TABIX_VCFANNO(VCFANNO.out.vcf) + // Prepare output + ch_vcf_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, vcf] } + ch_vcf_out.view() + ch_tbi_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, tbi] } + ch_tbi_out.view() // Running haplogrep2 HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") @@ -126,7 +131,8 @@ workflow MERGE_ANNOTATE_MT { emit: haplog = HAPLOGREP2_CLASSIFY_MT.out.txt - vcf_gz_tbi = ZIP_TABIX_VCFANNO.out.gz_tbi + vcf = ch_vcf_out + tbi = ch_tbi_out report = ENSEMBLVEP_MT.out.report versions = ch_versions // channel: [ versions.yml ] } From 9d2537e7480af417b6f37c3d564afd821ea5d7e8 Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 20 Feb 2023 10:54:00 +0100 Subject: [PATCH 0983/1169] feat removed .view() --- subworkflows/local/mitochondria/merge_annotate_MT.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 8bed7ffd..b19b953d 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -113,9 +113,8 @@ workflow MERGE_ANNOTATE_MT { // Prepare output ch_vcf_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, vcf] } - ch_vcf_out.view() ch_tbi_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, tbi] } - ch_tbi_out.view() + // Running haplogrep2 HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") From 28244d89a5742360b336463c2b3982126970942c Mon Sep 17 00:00:00 2001 From: Anders Jemt Date: Mon, 20 Feb 2023 11:14:08 +0100 Subject: [PATCH 0984/1169] Update conf/modules.config --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 7b655ded..bb12906f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -862,7 +862,7 @@ process { withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { ext.when = { params.annotate_snv_switch } ext.prefix = { "${meta.id}_view" } - ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70 | INFO/SWEGENAF > 0.70" ' } + ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70 | INFO/SWEGENAF > 0.70" ' } publishDir = [ path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, From ff63a7d07d0c3eb3d628e07462408c44950a097a Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 20 Feb 2023 11:38:52 +0100 Subject: [PATCH 0985/1169] fix changed name of ZIP_TABIX_VCFANNO output --- conf/modules.config | 18 ++++++++++++------ .../local/mitochondria/merge_annotate_MT.nf | 8 ++++---- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 4fdb4fe2..3f30818d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -903,6 +903,7 @@ process { process { withName: '.*RAREDISEASE:BCFTOOLS_CONCAT' { ext.prefix = { "${meta.id}_mito_genome_merged" } + ext.args = " -a " } } @@ -1154,8 +1155,8 @@ process { ].join(' ') ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } publishDir = [ - path: { "${params.outdir}/mt_annotation" }, - mode: params.publish_dir_mode, + path: { "${params.outdir}/mt_annotation_vep" }, + mode: params.publish_dir_mode ] } @@ -1163,16 +1164,21 @@ process { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:VCFANNO' { - ext.prefix = { "${meta.id}_vcfanno_MT" } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:VCFANNO_MT' { + ext.prefix = { "${meta.id}_mito_ann" } ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } publishDir = [ - path: { "${params.outdir}/snv_annotation" }, + path: { "${params.outdir}/mt_annotation" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ZIP_TABIX_VCFANNO' { + ext.prefix = { "${meta.id}_mito_ann" } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + } process { diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index b19b953d..4531db97 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -14,7 +14,7 @@ include { HMTNOTE as HMTNOTE_MT } from '../../. include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../../modules/nf-core/tabix/tabix/main' include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../../modules/local/ensemblvep/main' include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../../modules/nf-core/haplogrep2/classify/main' -include { VCFANNO } from '../../../modules/nf-core/vcfanno/main' +include { VCFANNO as VCFANNO_MT } from '../../../modules/nf-core/vcfanno/main' include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../../modules/nf-core/tabix/bgziptabix/main' workflow MERGE_ANNOTATE_MT { @@ -108,8 +108,8 @@ workflow MERGE_ANNOTATE_MT { // Running vcfanno TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf_gz) ch_in_vcfanno = ENSEMBLVEP_MT.out.vcf_gz.join(TABIX_TABIX_MT3.out.tbi, by: [0]) - VCFANNO(ch_in_vcfanno, vcfanno_toml, [], vcfanno_resources) - ZIP_TABIX_VCFANNO(VCFANNO.out.vcf) + VCFANNO_MT(ch_in_vcfanno, vcfanno_toml, [], vcfanno_resources) + ZIP_TABIX_VCFANNO(VCFANNO_MT.out.vcf) // Prepare output ch_vcf_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, vcf] } @@ -125,7 +125,7 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) ch_versions = ch_versions.mix(CHANGE_NAME_VCF_MT.out.versions) ch_versions = ch_versions.mix(ENSEMBLVEP_MT.out.versions) - ch_versions = ch_versions.mix(VCFANNO.out.versions) + ch_versions = ch_versions.mix(VCFANNO_MT.out.versions) ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) emit: From 9c570eb6654f388c4d8b64761c8d45ebdaad2a9c Mon Sep 17 00:00:00 2001 From: lucpen Date: Mon, 20 Feb 2023 11:39:59 +0100 Subject: [PATCH 0986/1169] fix spacing in .config --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 3f30818d..6ed64090 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -903,7 +903,7 @@ process { process { withName: '.*RAREDISEASE:BCFTOOLS_CONCAT' { ext.prefix = { "${meta.id}_mito_genome_merged" } - ext.args = " -a " + ext.args = " -a " } } From f6b2496a4f568953326a1aa26751c4134b5e0d66 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 20 Feb 2023 13:34:37 +0100 Subject: [PATCH 0987/1169] Update subworkflows/local/mitochondria/merge_annotate_MT.nf Co-authored-by: Anders Jemt --- subworkflows/local/mitochondria/merge_annotate_MT.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 4531db97..1fc18921 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -129,9 +129,9 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) emit: - haplog = HAPLOGREP2_CLASSIFY_MT.out.txt - vcf = ch_vcf_out - tbi = ch_tbi_out - report = ENSEMBLVEP_MT.out.report - versions = ch_versions // channel: [ versions.yml ] + haplog = HAPLOGREP2_CLASSIFY_MT.out.txt + vcf = ch_vcf_out + tbi = ch_tbi_out + report = ENSEMBLVEP_MT.out.report + versions = ch_versions // channel: [ versions.yml ] } From 323d118e721d99f1b8b03934a04c7cb4acfc0c27 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Feb 2023 13:53:31 +0100 Subject: [PATCH 0988/1169] update tests --- conf/modules.config | 2 +- conf/test.config | 13 ------------- conf/test_one_sample.config | 13 ------------- 3 files changed, 1 insertion(+), 27 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 7b655ded..0f77438e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -862,7 +862,7 @@ process { withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { ext.when = { params.annotate_snv_switch } ext.prefix = { "${meta.id}_view" } - ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70 | INFO/SWEGENAF > 0.70" ' } + ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70" ' } publishDir = [ path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, diff --git a/conf/test.config b/conf/test.config index 36bb3835..ea3c7d24 100644 --- a/conf/test.config +++ b/conf/test.config @@ -50,17 +50,4 @@ params { vep_cache_version = 107 } -process { - withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { - ext.when = { params.annotate_snv_switch } - ext.prefix = { "${meta.id}_view" } - ext.args = { '--output-type z' } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } -} - diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index 63cec545..d8d13d9a 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -49,16 +49,3 @@ params { vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" vep_cache_version = 107 } - -process { - withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { - ext.when = { params.annotate_snv_switch } - ext.prefix = { "${meta.id}_view" } - ext.args = { '--output-type z' } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } -} From 2c751b22a6d8bc6ad985cdcf39edc11abb695f0d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Feb 2023 14:26:12 +0100 Subject: [PATCH 0989/1169] remove space --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index b4e73ef1..451d6be7 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -862,7 +862,7 @@ process { withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { ext.when = { params.annotate_snv_switch } ext.prefix = { "${meta.id}_view" } - ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70" ' } + ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70" ' } publishDir = [ path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, From 0995ec5eb7afdbb128b00b886edabd8ea0f8a4b0 Mon Sep 17 00:00:00 2001 From: peterpru Date: Mon, 20 Feb 2023 16:32:21 +0100 Subject: [PATCH 0990/1169] Test without stub section --- modules/nf-core/smncopynumbercaller/main.nf | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf index 7a0e2ec4..33ca3013 100644 --- a/modules/nf-core/smncopynumbercaller/main.nf +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -37,16 +37,4 @@ process SMNCOPYNUMBERCALLER { SMNCopyNumberCaller: $VERSION END_VERSIONS """ - - stub: - """ - mkdir out - touch out/${prefix}.tsv - touch out/${prefix}.json - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - SMNCopyNumberCaller: $VERSION - END_VERSIONS - """ } From 7a6d8281819e605a92be100e85bbe040c69de3d3 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Tue, 21 Feb 2023 11:43:54 +0100 Subject: [PATCH 0991/1169] removes change name from included --- subworkflows/local/mitochondria/merge_annotate_MT.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 842fae18..e594c97a 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -8,7 +8,6 @@ include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_MT } from '../../. include { TABIX_TABIX as TABIX_TABIX_MT } from '../../../modules/nf-core/tabix/tabix/main' include { BCFTOOLS_NORM as REMOVE_DUPLICATES_MT } from '../../../modules/nf-core/bcftools/norm/main' include { TABIX_TABIX as TABIX_TABIX_MT2 } from '../../../modules/nf-core/tabix/tabix/main' -include { CHANGE_NAME as CHANGE_NAME_VCF_MT } from '../../../modules/local/change_name' include { BCFTOOLS_MERGE as BCFTOOLS_MERGE_MT } from '../../../modules/nf-core/bcftools/merge/main' include { HMTNOTE as HMTNOTE_MT } from '../../../modules/nf-core/hmtnote/main' include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../../modules/nf-core/tabix/tabix/main' From c60ca162f8cdb5b4b8536b274dd9cf8cfe5e66a9 Mon Sep 17 00:00:00 2001 From: peterpru Date: Tue, 21 Feb 2023 16:11:21 +0100 Subject: [PATCH 0992/1169] add stubs in again --- modules/nf-core/smncopynumbercaller/main.nf | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf index 33ca3013..8688fe78 100644 --- a/modules/nf-core/smncopynumbercaller/main.nf +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -37,4 +37,16 @@ process SMNCOPYNUMBERCALLER { SMNCopyNumberCaller: $VERSION END_VERSIONS """ + + stub: + """ + mkdir out + touch out/$prefix.tsv + touch out/$prefix.json + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + SMNCopyNumberCaller: $VERSION + END_VERSIONS + """ } From cd313d7fa1060e0fde76f65c936135bdf078eb18 Mon Sep 17 00:00:00 2001 From: peterpru Date: Tue, 21 Feb 2023 16:32:27 +0100 Subject: [PATCH 0993/1169] add custom stub as prefix not defined in stubs --- modules/nf-core/smncopynumbercaller/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf index 8688fe78..e636e5c6 100644 --- a/modules/nf-core/smncopynumbercaller/main.nf +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -41,8 +41,8 @@ process SMNCOPYNUMBERCALLER { stub: """ mkdir out - touch out/$prefix.tsv - touch out/$prefix.json + touch out/smnstub.tsv + touch out/smnstub.json cat <<-END_VERSIONS > versions.yml "${task.process}": From f2fba8d53f8b0d7bddeffcf8b9778e0abc0ee7b3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 21 Feb 2023 17:14:28 +0100 Subject: [PATCH 0994/1169] more fixes --- bin/add_most_severe_pli.py | 2 +- conf/test.config | 4 +--- conf/test_one_sample.config | 4 +--- subworkflows/local/annotate_snvs.nf | 13 +++++++------ subworkflows/local/annotate_structural_variants.nf | 2 +- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/bin/add_most_severe_pli.py b/bin/add_most_severe_pli.py index 99f61d9f..8f528389 100755 --- a/bin/add_most_severe_pli.py +++ b/bin/add_most_severe_pli.py @@ -90,7 +90,7 @@ def parse_args(argv=None): """Define and immediately parse command line arguments.""" parser = argparse.ArgumentParser( description="Annotate vcf with the most severe pli field.", - epilog="Example: python vcfparser.py --file_in vep.vcf --file_out vep.most_severe_pli.vcf --pli pli_per_gene.txt", + epilog="Example: python vcfparser.py --file_in vep.vcf --file_out vep.most_severe_pli.vcf", ) parser.add_argument( "--file_in", diff --git a/conf/test.config b/conf/test.config index ea3c7d24..be4b45ba 100644 --- a/conf/test.config +++ b/conf/test.config @@ -34,11 +34,9 @@ params { mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" mt_intervals_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.intervals" mt_backchain_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.back_chain" - pli_per_gene = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins/pLI_values_107.txt" reduced_penetrance = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reduced_penetrance.tsv" score_config_snv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_snv.ini" score_config_sv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_sv.ini" - select_feature_file = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" svdb_query_dbs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/svdb_querydb_files.csv" target_bed = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target.bed" variant_catalog = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/variant_catalog.json" @@ -46,7 +44,7 @@ params { vcfanno_resources = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_resources.txt" vcfanno_toml = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_config.toml" vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins.tar.gz" - vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" + vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" vep_cache_version = 107 } diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index d8d13d9a..55be0d91 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -34,11 +34,9 @@ params { mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" mt_intervals_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.intervals" mt_backchain_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.back_chain" - pli_per_gene = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins/pLI_values_107.txt" reduced_penetrance = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/reduced_penetrance.tsv" score_config_snv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_snv.ini" score_config_sv = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/rank_model_sv.ini" - select_feature_file = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" svdb_query_dbs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/svdb_querydb_files.csv" target_bed = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target.bed" variant_catalog = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/variant_catalog.json" @@ -46,6 +44,6 @@ params { vcfanno_resources = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_resources.txt" vcfanno_toml = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vcfanno_config.toml" vep_cache = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins.tar.gz" - vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/gene_panels.bed" + vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" vep_cache_version = 107 } diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index ce24b7a8..d522f4f2 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -10,7 +10,7 @@ include { RHOCALL_ANNOTATE } from '../../modules/nf-core/ include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' include { TABIX_BGZIPTABIX as ZIP_TABIX_ROHCALL } from '../../modules/nf-core/tabix/bgziptabix/main' include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' -include { TABIX_BGZIPTABIX as ZIP_TABIX_VEP } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_TABIX as TABIX_VEP } from '../../modules/nf-core/tabix/tabix/main' include { TABIX_TABIX as TABIX_BCFTOOLS_CONCAT } from '../../modules/nf-core/tabix/tabix/main' include { TABIX_TABIX as TABIX_BCFTOOLS_VIEW } from '../../modules/nf-core/tabix/tabix/main' include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariants/main' @@ -79,13 +79,14 @@ workflow ANNOTATE_SNVS { [] ) - ZIP_TABIX_VEP (ENSEMBLVEP_SNV.out.vcf) + TABIX_VEP (ENSEMBLVEP_SNV.out.vcf_gz) - ZIP_TABIX_VEP.out.gz_tbi + ENSEMBLVEP_SNV.out.vcf_gz + .join(TABIX_VEP.out.tbi) .groupTuple() .map { meta, vcfs, tbis -> - def sortedvcfs = vcfs.sort() - def sortedtbis = tbis.sort() + def sortedvcfs = vcfs.sort { it.baseName } + def sortedtbis = tbis.sort { it.baseName } return [ meta, sortedvcfs, sortedtbis ] } .set { ch_vep_ann } @@ -103,7 +104,7 @@ workflow ANNOTATE_SNVS { ch_versions = ch_versions.mix(TABIX_BCFTOOLS_VIEW.out.versions) ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions.first()) ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions.first()) - ch_versions = ch_versions.mix(ZIP_TABIX_VEP.out.versions.first()) + ch_versions = ch_versions.mix(TABIX_VEP.out.versions.first()) ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 48aa9911..fc37c4eb 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -63,6 +63,6 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) emit: - vcf_ann = ENSEMBLVEP_SV.out.vcf + vcf_ann = ENSEMBLVEP_SV.out.vcf_gz versions = ch_versions } From 3be280604e2802252684ad8305182bebbd88dcd9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 21 Feb 2023 17:30:11 +0100 Subject: [PATCH 0995/1169] update template --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 92b6ee7a..d848b01e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir -stub`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test2samples,docker --outdir -stub`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test_one_sample,docker --outdir -stub`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. From 412da09e02a9d80bb0f6397ff11c310b52dbe3f0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 21 Feb 2023 22:11:34 +0100 Subject: [PATCH 0996/1169] update wgs metrics --- conf/modules.config | 2 -- modules/local/sentieon/wgsmetricsalgo.nf | 9 ++++++--- subworkflows/local/qc_bam.nf | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f03155f9..58381d22 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -553,7 +553,6 @@ process { withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { ext.when = params.aligner.equals("sentieon") - ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, mode: params.publish_dir_mode, @@ -563,7 +562,6 @@ process { withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { ext.when = params.aligner.equals("sentieon") - ext.args = { (params.genome == "GRCh37") ? "--interval Y" : "--interval chrY" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, mode: params.publish_dir_mode, diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index bce76109..2165741c 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -9,6 +9,7 @@ process SENTIEON_WGSMETRICSALGO { tuple val(meta), path(bam), path(bai) tuple val(meta2), path(fasta) tuple val(meta2), path(fai) + path intervals_list output: tuple val(meta), path('*wgs_metrics.txt'), emit: wgs_metrics @@ -18,9 +19,10 @@ process SENTIEON_WGSMETRICSALGO { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def input = bam.sort().collect{"-i $it"}.join(' ') - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def input = bam.sort().collect{"-i $it"}.join(' ') + def prefix = task.ext.prefix ?: "${meta.id}" + def interval = intervals_list ? "--interval ${intervals_list}" : "" """ if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" @@ -32,6 +34,7 @@ process SENTIEON_WGSMETRICSALGO { -t $task.cpus \\ -r $fasta \\ $input \\ + $interval \\ $args \\ --algo WgsMetricsAlgo ${prefix}_wgs_metrics.txt diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index a003a0e3..4d4e26d6 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -54,8 +54,8 @@ workflow QC_BAM { PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) - SENTIEON_WGSMETRICS ( bam_bai, fasta, fai) - SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai) + SENTIEON_WGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) + SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) ch_cov = Channel.empty().mix(PICARD_COLLECTWGSMETRICS.out.metrics, SENTIEON_WGSMETRICS.out.wgs_metrics) ch_cov_y = Channel.empty().mix(PICARD_COLLECTWGSMETRICS_Y.out.metrics, SENTIEON_WGSMETRICS_Y.out.wgs_metrics) From f617f70017ca92daf32882cfc394ae1e74cdbb38 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:59:32 +0100 Subject: [PATCH 0997/1169] update ml model --- conf/test.config | 1 + conf/test_one_sample.config | 1 + modules/local/sentieon/dnamodelapply.nf | 7 +++--- modules/local/sentieon/dnascope.nf | 7 +++--- .../variant_calling/call_snv_sentieon.nf | 24 ++++++++----------- workflows/raredisease.nf | 4 ++++ 6 files changed, 24 insertions(+), 20 deletions(-) diff --git a/conf/test.config b/conf/test.config index ea3c7d24..b336b1b7 100644 --- a/conf/test.config +++ b/conf/test.config @@ -30,6 +30,7 @@ params { intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_wgs.interval_list" intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/targetY.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" + ml_model = "https://s3.amazonaws.com/sentieon-release/other/SentieonDNAscopeModel1.0.model" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" mt_intervals_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.intervals" diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index d8d13d9a..f476e772 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -30,6 +30,7 @@ params { intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_wgs.interval_list" intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/targetY.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" + ml_model = "https://s3.amazonaws.com/sentieon-release/other/SentieonDNAscopeModel1.1.model" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" mt_intervals_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.intervals" diff --git a/modules/local/sentieon/dnamodelapply.nf b/modules/local/sentieon/dnamodelapply.nf index 3be8ec10..3da61591 100644 --- a/modules/local/sentieon/dnamodelapply.nf +++ b/modules/local/sentieon/dnamodelapply.nf @@ -10,9 +10,10 @@ process SENTIEON_DNAMODELAPPLY { path ml_model output: - tuple val(meta), path("*_dnascope_ml.vcf.gz") , emit: vcf - tuple val(meta), path("*_dnascope_ml.vcf.gz.tbi") , emit: vcf_index - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: index + tuple val(meta), path("*.vcf.gz"), path("*.vcf.gz.tbi") , emit: vcf_index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/sentieon/dnascope.nf b/modules/local/sentieon/dnascope.nf index 1d2d1ccc..5bd5ac15 100644 --- a/modules/local/sentieon/dnascope.nf +++ b/modules/local/sentieon/dnascope.nf @@ -13,9 +13,10 @@ process SENTIEON_DNASCOPE { path ml_model output: - tuple val(meta), path("*_dnascope.vcf.gz") , emit: vcf - tuple val(meta), path("*_dnascope.vcf.gz.tbi") , emit: vcf_index - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: index + tuple val(meta), path("*.vcf.gz"), path("*.vcf.gz.tbi") , emit: vcf_index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 2dc1fe1c..aef4eeeb 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -27,25 +27,16 @@ workflow CALL_SNV_SENTIEON { ch_versions = Channel.empty() SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, call_interval, ml_model ) - ch_vcf = SENTIEON_DNASCOPE.out.vcf - ch_index = SENTIEON_DNASCOPE.out.vcf_index - ch_vcf_idx = ch_vcf.join( ch_index ) + SENTIEON_DNAMODELAPPLY ( SENTIEON_DNASCOPE.out.vcf_index, fasta, fai, ml_model ) - SENTIEON_DNAMODELAPPLY ( ch_vcf_idx, fasta, fai, ml_model ) + BCF_FILTER_ONE (SENTIEON_DNAMODELAPPLY.out.vcf ) - if (params.ml_model) { - ch_vcf = SENTIEON_DNAMODELAPPLY.out.vcf - ch_index = SENTIEON_DNAMODELAPPLY.out.vcf_index - } - - BCF_FILTER_ONE (ch_vcf ) BCF_FILTER_TWO ( BCF_FILTER_ONE.out.vcf ) - ch_vcf = BCF_FILTER_TWO.out.vcf - TABIX_BCFTOOLS ( ch_vcf ) - ch_index = TABIX_BCFTOOLS.out.tbi - ch_vcf.join(ch_index) + TABIX_BCFTOOLS ( BCF_FILTER_TWO.out.vcf ) + + BCF_FILTER_TWO.out.vcf.join(TABIX_BCFTOOLS.out.tbi) .map { meta,vcf,tbi -> return [vcf,tbi] } .set { ch_vcf_idx } @@ -59,16 +50,21 @@ workflow CALL_SNV_SENTIEON { .set{ ch_vcf_idx_merge_in } BCFTOOLS_MERGE(ch_vcf_idx_merge_in.multiple,[],fasta,fai) + ch_split_multi_in = BCFTOOLS_MERGE.out.merged_variants .map{meta, bcf -> return [meta, bcf, []]} + ch_vcf_idx_case = ch_vcf_idx_merge_in.single.mix(ch_split_multi_in) + SPLIT_MULTIALLELICS_SEN(ch_vcf_idx_case, fasta) ch_remove_dup_in = SPLIT_MULTIALLELICS_SEN.out.vcf .map{meta, vcf -> return [meta, vcf, []]} + REMOVE_DUPLICATES_SEN(ch_remove_dup_in, fasta) + TABIX_SEN(REMOVE_DUPLICATES_SEN.out.vcf) ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions.first()) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 519a57e5..4a1bb331 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -134,6 +134,10 @@ workflow RAREDISEASE { exit 1, 'Input samplesheet not specified!' } + if (params.variant_caller.equals("sentieon") && !params.ml_model) { + exit 1, 'Machine learning model not specified!' + } + // Initialize all file channels including unprocessed vcf, bed and tab files ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() : Channel.value([]) From 53fc63c115f4c248199be313802627be41157959 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Feb 2023 00:25:54 +0100 Subject: [PATCH 0998/1169] update link --- conf/test_one_sample.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index f476e772..f41baa9a 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -30,7 +30,7 @@ params { intervals_wgs = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/target_wgs.interval_list" intervals_y = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/targetY.interval_list" known_dbsnp = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/dbsnp_-138-.vcf.gz" - ml_model = "https://s3.amazonaws.com/sentieon-release/other/SentieonDNAscopeModel1.1.model" + ml_model = "https://s3.amazonaws.com/sentieon-release/other/SentieonDNAscopeModel1.0.model" mt_fasta_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.fa" mt_intervals = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt.intervals" mt_intervals_shift = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/mt_shift8000.intervals" From e8ddbaed1102a07b4942c38787214f884e958aae Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Feb 2023 09:54:04 +0100 Subject: [PATCH 0999/1169] refactor modules --- conf/modules.config | 111 ++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 55 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 58381d22..8e49211f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -411,6 +411,7 @@ process { } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { + ext.prefix = { "${meta.id}_dnascope" } ext.args2 = { [ params.variant_type ? "--var_type ${params.variant_type}" : '', params.pcrfree ? "--pcr_indel_model NONE" : '' @@ -423,7 +424,7 @@ process { } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNAMODELAPPLY' { - ext.when = { params.ml_model } + ext.prefix = { "${meta.id}_dnamodelapply" } publishDir = [ path: { "${params.outdir}/sentieon_dnamodelapply" }, mode: params.publish_dir_mode, @@ -598,8 +599,12 @@ process { // process { + + withName: '.*CALL_SNV_DEEPVARIANT:.*' { + ext.when = params.variant_caller.equals("deepvariant") + } + withName: '.*CALL_SNV_DEEPVARIANT:DEEPVARIANT' { - ext.when = { params.variant_caller.equals("deepvariant") } ext.args = { "--model_type=${params.analysis_type.toUpperCase()}" } ext.prefix = { "${meta.id}_deepvar" } publishDir = [ @@ -610,7 +615,6 @@ process { } withName: '.*CALL_SNV_DEEPVARIANT:GLNEXUS' { - ext.when = { params.variant_caller.equals("deepvariant") } ext.args = '--config DeepVariant_unfiltered' publishDir = [ enabled: false @@ -618,7 +622,6 @@ process { } withName: '.*CALL_SNV_DEEPVARIANT:SPLIT_MULTIALLELICS_GL' { - ext.when = { params.variant_caller.equals("deepvariant") } ext.args = '--output-type z --multiallelics -both' publishDir = [ enabled: false @@ -626,7 +629,6 @@ process { } withName: '.*CALL_SNV_DEEPVARIANT:REMOVE_DUPLICATES_GL' { - ext.when = { params.variant_caller.equals("deepvariant") } ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ @@ -637,7 +639,6 @@ process { } withName: '.*CALL_SNV_DEEPVARIANT:TABIX_GL' { - ext.when = { params.variant_caller.equals("deepvariant") } publishDir = [ path: { "${params.outdir}/glnexus" }, mode: params.publish_dir_mode, @@ -752,22 +753,23 @@ process { // process { + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:.*' { + ext.when = params.annotate_sv_switch + } + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:SVDB_QUERY' { - ext.when = { params.annotate_sv_switch } publishDir = [ enabled: false, ] } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:PICARD_SORTVCF' { - ext.when = { params.annotate_sv_switch } publishDir = [ enabled: false, ] } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:BCFTOOLS_VIEW' { - ext.when = { params.annotate_sv_switch } ext.prefix = { "${meta.id}_view" } publishDir = [ enabled: false, @@ -775,7 +777,6 @@ process { } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:ENSEMBLVEP_SV' { - ext.when = { params.annotate_sv_switch } ext.args = [ '--dir_cache vep_cache', '--dir_plugins vep_cache/Plugins', @@ -800,20 +801,21 @@ process { // process { + withName: '.*RANK_VARIANTS_SV:.*' { + ext.when = params.annotate_sv_switch + } + withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE' { - ext.when = { params.annotate_sv_switch } ext.args = { (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' } } withName: '.*RANK_VARIANTS_SV:GENMOD_SCORE' { - ext.when = { params.annotate_sv_switch } ext.args = " --rank_results " } withName: '.*RANK_VARIANTS_SV:GENMOD_COMPOUND' { - ext.when = { params.annotate_sv_switch } publishDir = [ path: { "${params.outdir}/genmod" }, mode: params.publish_dir_mode, @@ -827,9 +829,12 @@ process { // process { + withName: '.*ANNOTATE_SNVS:.*' { + ext.when = params.annotate_snv_switch + } + withName: '.*ANNOTATE_SNVS:VCFANNO' { ext.prefix = { "${meta.id}_vcfanno" } - ext.when = { params.annotate_snv_switch } publishDir = [ path: { "${params.outdir}/snv_annotation" }, mode: params.publish_dir_mode, @@ -838,7 +843,6 @@ process { } withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { - ext.when = { params.annotate_snv_switch } ext.args = { "--samples ${meta.id} --skip-indels " } publishDir = [ path: { "${params.outdir}/snv_annotation" }, @@ -848,7 +852,6 @@ process { } withName: '.*ANNOTATE_SNVS:RHOCALL_ANNOTATE' { - ext.when = { params.annotate_snv_switch } ext.args = { "--v14 " } publishDir = [ path: { "${params.outdir}/snv_annotation" }, @@ -858,7 +861,6 @@ process { } withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { - ext.when = { params.annotate_snv_switch } ext.prefix = { "${meta.id}_view" } ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70" ' } publishDir = [ @@ -869,7 +871,6 @@ process { } withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { - ext.when = { params.annotate_snv_switch } ext.prefix = { "${meta.id}_${intervals.simpleName}" } ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} publishDir = [ @@ -881,7 +882,6 @@ process { } withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { - ext.when = { params.annotate_snv_switch } ext.prefix = { "${vcf.simpleName}_vep" } ext.args = [ '--dir_plugins vep_cache/Plugins', @@ -905,7 +905,6 @@ process { } withName: '.*ANNOTATE_SNVS:ZIP_TABIX_VEP' { - ext.when = { params.annotate_snv_switch } ext.prefix = { "${input.simpleName}" } publishDir = [ path: { "${params.outdir}/snv_annotation" }, @@ -930,25 +929,25 @@ process { // process { + withName: '.*RANK_VARIANTS_SNV:.*' { + ext.when = params.annotate_snv_switch + } + withName: '.*RANK_VARIANTS_SNV:GENMOD_ANNOTATE' { - ext.when = { params.annotate_snv_switch } ext.args = { (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' } } withName: '.*RANK_VARIANTS_SNV:GENMOD_MODELS' { - ext.when = { params.annotate_snv_switch } ext.args = " --whole_gene " } withName: '.*RANK_VARIANTS_SNV:GENMOD_SCORE' { - ext.when = { params.annotate_snv_switch } ext.args = " --rank_results " } withName: '.*RANK_VARIANTS_SNV:GENMOD_COMPOUND' { - ext.when = { params.annotate_snv_switch } publishDir = [ path: { "${params.outdir}/genmod" }, mode: params.publish_dir_mode, @@ -963,9 +962,12 @@ process { // process { + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:.*' { + ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } + } + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_PRINTREADS_MT' { beforeScript = {"mkdir ./tmp"} - ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } ext.args = [ "-L ${params.mt_contig_name}", "--read-filter MateOnSameContigOrNoMappedMateReadFilter", @@ -974,12 +976,10 @@ process { } withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_REVERTSAM_MT' { - ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } ext.args = '--OUTPUT_BY_READGROUP false --VALIDATION_STRINGENCY LENIENT --ATTRIBUTE_TO_CLEAR FT --ATTRIBUTE_TO_CLEAR CO --SORT_ORDER queryname --RESTORE_ORIGINAL_QUALITIES false' } withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_SAMTOFASTQ_MT' { - ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT' } } @@ -989,6 +989,10 @@ process { // process { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:.*' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:BWAMEM2_MEM_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") && params.aligner == "bwamem2" } ext.args = { "-M -K 100000000 -R ${meta.read_group}" } @@ -1001,13 +1005,11 @@ process { } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MERGEBAMALIGNMENT_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}_merged" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = { [ "--VALIDATION_STRINGENCY LENIENT", "--RGLB lib", @@ -1018,28 +1020,23 @@ process { } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_MARKDUPLICATES_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:SAMTOOLS_SORT_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_sorted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MUTECT2_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } ext.args = '--mitochondria-mode TRUE' } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_FILTERMUTECTCALLS_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_filtered" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_RENAMESAMPLEINVCF_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_renamed" } } } @@ -1049,6 +1046,10 @@ process { // process { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:.*' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } + } + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") && params.aligner == "bwamem2" } ext.args = { "-M -K 100000000 -R ${meta.read_group}" } @@ -1061,13 +1062,11 @@ process { } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MERGEBAMALIGNMENT_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}_merged_shifted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_ADDORREPLACEREADGROUPS_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = { [ "--VALIDATION_STRINGENCY LENIENT", "--RGLB lib", @@ -1078,33 +1077,27 @@ process { } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_MARKDUPLICATES_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' ext.prefix = { "${meta.id}_markduplicates_shifted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SAMTOOLS_SORT_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_sorted_shifted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.args = '--mitochondria-mode TRUE' } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:HAPLOCHECK_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_shifted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_FILTERMUTECTCALLS_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_filtered_shifted" } } withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_RENAMESAMPLEINVCF_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_renamed" } } } @@ -1125,34 +1118,35 @@ process { // process { + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:.*' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_MERGEVCFS_LIFT_UNLIFT_MT' { ext.prefix = { "${meta.id}_merged" } - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_VARIANTFILTRATION_MT' { ext.prefix = { "${meta.id}_filt" } - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:SPLIT_MULTIALLELICS_MT' { ext.args = '--output-type z --multiallelics -both' ext.prefix = { "${meta.id}_split" } - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } publishDir = [ enabled: false ] } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + publishDir = [ + enabled: false + ] } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:REMOVE_DUPLICATES_MT' { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } publishDir = [ path: { "${params.outdir}/gatk4" }, mode: params.publish_dir_mode, @@ -1161,19 +1155,27 @@ process { } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT2' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + publishDir = [ + enabled: false + ] } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:BCFTOOLS_MERGE_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + publishDir = [ + enabled: false + ] } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HMTNOTE_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + publishDir = [ + enabled: false + ] } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT3' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + publishDir = [ + enabled: false + ] } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ENSEMBLVEP_MT' { @@ -1192,7 +1194,6 @@ process { '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl --vcf', '--uniprot' ].join(' ') - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } publishDir = [ path: { "${params.outdir}/mt_annotation_vep" }, mode: params.publish_dir_mode @@ -1200,12 +1201,13 @@ process { } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HAPLOGREP2_CLASSIFY_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + publishDir = [ + enabled: false + ] } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:VCFANNO_MT' { ext.prefix = { "${meta.id}_mito_ann" } - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } publishDir = [ path: { "${params.outdir}/mt_annotation" }, mode: params.publish_dir_mode, @@ -1215,7 +1217,6 @@ process { withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ZIP_TABIX_VCFANNO' { ext.prefix = { "${meta.id}_mito_ann" } - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } } } From 9d59af9cc8f2a622f925336613e290bdf2d7bc5f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Feb 2023 10:37:04 +0100 Subject: [PATCH 1000/1169] remove changes overlapping with the other PR --- conf/modules.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 8e49211f..acd5d7e0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -554,7 +554,7 @@ process { withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { ext.when = params.aligner.equals("sentieon") - publishDir = [ + ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, @@ -563,6 +563,7 @@ process { withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { ext.when = params.aligner.equals("sentieon") + ext.args = { (params.genome == "GRCh37") ? "--interval Y" : "--interval chrY" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, mode: params.publish_dir_mode, From 76e1c4872332ba805e48cc2f2d3acdd13bccf7b0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Feb 2023 10:43:18 +0100 Subject: [PATCH 1001/1169] Update subworkflows/local/qc_bam.nf Co-authored-by: Anders Jemt --- subworkflows/local/qc_bam.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 4d4e26d6..a003a0e3 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -54,8 +54,8 @@ workflow QC_BAM { PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) - SENTIEON_WGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) - SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) + SENTIEON_WGSMETRICS ( bam_bai, fasta, fai) + SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai) ch_cov = Channel.empty().mix(PICARD_COLLECTWGSMETRICS.out.metrics, SENTIEON_WGSMETRICS.out.wgs_metrics) ch_cov_y = Channel.empty().mix(PICARD_COLLECTWGSMETRICS_Y.out.metrics, SENTIEON_WGSMETRICS_Y.out.wgs_metrics) From b900290b57fd5f7f35fe4ca1b638abbfee9700ee Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:10:09 +0100 Subject: [PATCH 1002/1169] revert more changes --- modules/local/sentieon/wgsmetricsalgo.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index 2165741c..5c5ad94c 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -9,7 +9,6 @@ process SENTIEON_WGSMETRICSALGO { tuple val(meta), path(bam), path(bai) tuple val(meta2), path(fasta) tuple val(meta2), path(fai) - path intervals_list output: tuple val(meta), path('*wgs_metrics.txt'), emit: wgs_metrics From 23d600a7f0516e70850b7e5ee3ccd959e6c81eaf Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 22 Feb 2023 11:50:36 +0100 Subject: [PATCH 1003/1169] change version argument --- modules/nf-core/smncopynumbercaller/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf index e636e5c6..dea55aac 100644 --- a/modules/nf-core/smncopynumbercaller/main.nf +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -22,7 +22,7 @@ process SMNCOPYNUMBERCALLER { manifest_text = bam.join("\n") def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = "1.1.2" // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. + // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. """ echo "$manifest_text" >manifest.txt smn_caller.py \\ @@ -34,7 +34,7 @@ process SMNCOPYNUMBERCALLER { cat <<-END_VERSIONS > versions.yml "${task.process}": - SMNCopyNumberCaller: $VERSION + SMNCopyNumberCaller: "1.1.2" END_VERSIONS """ @@ -46,7 +46,7 @@ process SMNCOPYNUMBERCALLER { cat <<-END_VERSIONS > versions.yml "${task.process}": - SMNCopyNumberCaller: $VERSION + SMNCopyNumberCaller: $"1.1.2" END_VERSIONS """ } From bbbca9f99ef1fc23c3663420431ae8ab216de866 Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 22 Feb 2023 11:53:01 +0100 Subject: [PATCH 1004/1169] fix typo --- modules/nf-core/smncopynumbercaller/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf index dea55aac..0f8cd9b0 100644 --- a/modules/nf-core/smncopynumbercaller/main.nf +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -46,7 +46,7 @@ process SMNCOPYNUMBERCALLER { cat <<-END_VERSIONS > versions.yml "${task.process}": - SMNCopyNumberCaller: $"1.1.2" + SMNCopyNumberCaller: "1.1.2" END_VERSIONS """ } From b80665b16367303dd26f83236a20035e895c53aa Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 22 Feb 2023 13:15:23 +0100 Subject: [PATCH 1005/1169] remove and install smncopynumbercaller using nf-core modules commands --- modules/nf-core/smncopynumbercaller/main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf index 0f8cd9b0..7a0e2ec4 100644 --- a/modules/nf-core/smncopynumbercaller/main.nf +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -22,7 +22,7 @@ process SMNCOPYNUMBERCALLER { manifest_text = bam.join("\n") def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. + def VERSION = "1.1.2" // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. """ echo "$manifest_text" >manifest.txt smn_caller.py \\ @@ -34,19 +34,19 @@ process SMNCOPYNUMBERCALLER { cat <<-END_VERSIONS > versions.yml "${task.process}": - SMNCopyNumberCaller: "1.1.2" + SMNCopyNumberCaller: $VERSION END_VERSIONS """ stub: """ mkdir out - touch out/smnstub.tsv - touch out/smnstub.json + touch out/${prefix}.tsv + touch out/${prefix}.json cat <<-END_VERSIONS > versions.yml "${task.process}": - SMNCopyNumberCaller: "1.1.2" + SMNCopyNumberCaller: $VERSION END_VERSIONS """ } From d1369e1296dd63d3abdb99966349a491b1d483c4 Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 22 Feb 2023 14:16:15 +0100 Subject: [PATCH 1006/1169] update smn module which contains stub fixes --- modules.json | 2 +- modules/nf-core/smncopynumbercaller/main.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules.json b/modules.json index 9fd26f25..2b5a8258 100644 --- a/modules.json +++ b/modules.json @@ -292,7 +292,7 @@ }, "smncopynumbercaller": { "branch": "master", - "git_sha": "93deb7b33308ce23fb4fd2a8e13b86bc117e8d77" + "git_sha": "e70433b04bef836b22bbed5a1e6e4e95aeec09fe" }, "stranger": { "branch": "master", diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf index 7a0e2ec4..27b5ae21 100644 --- a/modules/nf-core/smncopynumbercaller/main.nf +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -31,7 +31,6 @@ process SMNCOPYNUMBERCALLER { --prefix $prefix \\ --outDir "out" \\ --threads $task.cpus - cat <<-END_VERSIONS > versions.yml "${task.process}": SMNCopyNumberCaller: $VERSION @@ -39,11 +38,12 @@ process SMNCOPYNUMBERCALLER { """ stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = "1.1.2" """ mkdir out touch out/${prefix}.tsv touch out/${prefix}.json - cat <<-END_VERSIONS > versions.yml "${task.process}": SMNCopyNumberCaller: $VERSION From 4b7a154e9bd68ea748b08546348be2f41ab77d9c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:38:47 +0100 Subject: [PATCH 1007/1169] revert changes --- modules/local/sentieon/wgsmetricsalgo.nf | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index 5c5ad94c..bce76109 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -18,10 +18,9 @@ process SENTIEON_WGSMETRICSALGO { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def input = bam.sort().collect{"-i $it"}.join(' ') - def prefix = task.ext.prefix ?: "${meta.id}" - def interval = intervals_list ? "--interval ${intervals_list}" : "" + def args = task.ext.args ?: '' + def input = bam.sort().collect{"-i $it"}.join(' ') + def prefix = task.ext.prefix ?: "${meta.id}" """ if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" @@ -33,7 +32,6 @@ process SENTIEON_WGSMETRICSALGO { -t $task.cpus \\ -r $fasta \\ $input \\ - $interval \\ $args \\ --algo WgsMetricsAlgo ${prefix}_wgs_metrics.txt From 75836a20b3d7abaccbd5cc31c3200641235e3abc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:40:43 +0100 Subject: [PATCH 1008/1169] edit spaces --- conf/modules.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index acd5d7e0..90e18a74 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -554,7 +554,8 @@ process { withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { ext.when = params.aligner.equals("sentieon") - ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } publishDir = [ + ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } + publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, From 5b58bf9f2c175bd333855fd2125c788f65b4d0d9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Feb 2023 18:26:19 +0100 Subject: [PATCH 1009/1169] break modules.config into smaller configs --- conf/modules.config | 1236 ----------------- conf/modules/align.config | 12 + conf/modules/align_and_call_MT.config | 130 ++ conf/modules/align_bwamem2.config | 62 + conf/modules/align_sentieon.config | 65 + conf/modules/analyse_MT.config | 24 + conf/modules/annotate_consequence_pli.config | 12 + conf/modules/annotate_snvs.config | 101 ++ .../annotate_structural_variants.config | 60 + conf/modules/call_cnv_cnvpytor.config | 48 + conf/modules/call_repeat_expansions.config | 34 + conf/modules/call_snv.config | 12 + conf/modules/call_snv_deepvariant.config | 65 + conf/modules/call_snv_sentieon.config | 90 ++ conf/modules/call_structural_variants.config | 26 + conf/modules/call_sv_manta.config | 27 + conf/modules/call_sv_tiddit.config | 36 + conf/modules/check_input.config | 12 + conf/modules/convert_mt_bam_to_fastq.config | 39 + conf/modules/gens.config | 30 + conf/modules/merge_annotate_MT.config | 120 ++ conf/modules/prepare_references.config | 198 +++ conf/modules/prepare_vcf.config | 55 + conf/modules/qc_bam.config | 106 ++ conf/modules/rank_variants.config | 72 + conf/modules/raredisease.config | 94 ++ conf/modules/scatter_genome.config | 34 + nextflow.config | 30 +- 28 files changed, 1592 insertions(+), 1238 deletions(-) delete mode 100644 conf/modules.config create mode 100644 conf/modules/align.config create mode 100644 conf/modules/align_and_call_MT.config create mode 100644 conf/modules/align_bwamem2.config create mode 100644 conf/modules/align_sentieon.config create mode 100644 conf/modules/analyse_MT.config create mode 100644 conf/modules/annotate_consequence_pli.config create mode 100644 conf/modules/annotate_snvs.config create mode 100644 conf/modules/annotate_structural_variants.config create mode 100644 conf/modules/call_cnv_cnvpytor.config create mode 100644 conf/modules/call_repeat_expansions.config create mode 100644 conf/modules/call_snv.config create mode 100644 conf/modules/call_snv_deepvariant.config create mode 100644 conf/modules/call_snv_sentieon.config create mode 100644 conf/modules/call_structural_variants.config create mode 100644 conf/modules/call_sv_manta.config create mode 100644 conf/modules/call_sv_tiddit.config create mode 100644 conf/modules/check_input.config create mode 100644 conf/modules/convert_mt_bam_to_fastq.config create mode 100644 conf/modules/gens.config create mode 100644 conf/modules/merge_annotate_MT.config create mode 100644 conf/modules/prepare_references.config create mode 100644 conf/modules/prepare_vcf.config create mode 100644 conf/modules/qc_bam.config create mode 100644 conf/modules/rank_variants.config create mode 100644 conf/modules/raredisease.config create mode 100644 conf/modules/scatter_genome.config diff --git a/conf/modules.config b/conf/modules.config deleted file mode 100644 index 90e18a74..00000000 --- a/conf/modules.config +++ /dev/null @@ -1,1236 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config file for defining DSL2 per module options and publishing paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. - ext.when = Conditional clause ----------------------------------------------------------------------------------------- -*/ - -// -// General configuration options -// - -process { - publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - - withName: '.*CHECK_INPUT:SAMPLESHEET_CHECK' { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: 'CUSTOM_DUMPSOFTWAREVERSIONS' { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } -} - -// -// Read QC options -// - -process { - withName: 'FASTQC' { - ext.args = '--quiet' - publishDir = [ - path: { "${params.outdir}/reports/fastqc/${meta.id}" }, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } -} - -// -// Genome preparation options -// - -process { - withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_GENOME' { - ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" - ] - } - - withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_SHIFT_MT' { - ext.when = {!params.mt_bwamem2_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes") && params.aligner == "bwamem2"} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" - ] - } - - withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_GENOME' { - ext.when = {!params.bwa_index && params.aligner == "sentieon"} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference - ] - } - - withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_SHIFT_MT' { - ext.when = {!params.mt_bwa_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes") && params.aligner == "sentieon"} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference - ] - } - - withName: '.*PREPARE_REFERENCES:BWA_INDEX_GENOME' { - ext.when = {!params.bwa_index && !(params.aligner == "sentieon")} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference - ] - } - - withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_GENOME' { - ext.when = {!params.fasta_fai} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*fai" - ] - } - - withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_SHIFT_MT' { - ext.when = {!params.mt_fai_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*fai" - ] - } - - withName: '.*PREPARE_REFERENCES:GATK_SD' { - ext.when = {!params.sequence_dictionary} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*dict" - ] - } - - withName: '.*PREPARE_REFERENCES:GATK_SD_SHIFT_MT' { - ext.when = {!params.mt_sequence_dictionary_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*dict" - ] - } - - withName: '.*PREPARE_REFERENCES:GET_CHROM_SIZES' { - publishDir = [ - enabled: false, - ] - } - - withName: '.*PREPARE_REFERENCES:TABIX_DBSNP' { - ext.when = {params.known_dbsnp && !params.known_dbsnp_tbi} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*tbi" - ] - } - - withName: '.*PREPARE_REFERENCES:TABIX_GNOMAD_AF' { - ext.when = {params.gnomad_af && !params.gnomad_af_idx} - ext.args = '-s 1 -b 2 -e 2' - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*tbi" - ] - } - - withName: '.*PREPARE_REFERENCES:CHECK_VCF:CHECK_INPUT_VCF' { - ext.when = {params.gnomad_vcf} - publishDir = [ - enabled: false, - ] - } - - withName: '.*PREPARE_REFERENCES:CHECK_VCF:SPLIT_MULTIALLELICS_PV' { - ext.when = {params.gnomad_vcf} - ext.args = '--output-type z --multiallelics -both' - ext.prefix = { "${meta.id}_split" } - publishDir = [ - enabled: false - ] - } - - withName: '.*PREPARE_REFERENCES:CHECK_VCF:REMOVE_DUPLICATES_PV' { - ext.when = {params.gnomad_vcf} - ext.args = '--output-type z --rm-dup none' - ext.prefix = { "${meta.id}_split_rmdup" } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*PREPARE_REFERENCES:CHECK_VCF:TABIX_PV' { - ext.when = {params.gnomad_vcf} - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*PREPARE_REFERENCES:TABIX_PT' { - ext.when = { params.target_bed && params.target_bed.endsWith(".gz") } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*PREPARE_REFERENCES:TABIX_PBT' { - ext.when = { params.target_bed && !params.target_bed.endsWith(".gz") } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*PREPARE_REFERENCES:GATK_BILT' { - ext.when = { params.target_bed } - ext.prefix = { "${meta.id}_target" } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*PREPARE_REFERENCES:GATK_ILT' { - ext.when = { params.target_bed } - ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' - publishDir = [ - enabled: false - ] - } - - withName: '.*PREPARE_REFERENCES:CAT_CAT_BAIT' { - ext.when = { params.target_bed } - ext.prefix = { "${meta.id}" } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*PREPARE_REFERENCES:UNTAR_VEP_CACHE' { - ext.when = { params.vep_cache.endsWith("tar.gz") } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} - -// -// Create bed and interval files for scatter operations -// - -process { - withName: '.*SCATTER_GENOME:BUILD_BED' { - ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} - } - - withName: '.*SCATTER_GENOME:GATK4_SPLITINTERVALS' { - ext.args = { "--subdivision-mode BALANCING_WITHOUT_INTERVAL_SUBDIVISION --scatter-count 22" } - ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} - ext.prefix = { "${meta.id}_genome_intervals" } - publishDir = [ - enabled: params.save_reference, - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} - -// -// Bwamem2 alignment options -// - -process { - withName: '.*ALIGN_BWAMEM2:.*' { - ext.when = params.aligner.equals("bwamem2") - publishDir = [ - path: { "${params.outdir}/bwamem2" }, - mode: 'copy', - pattern: "*{stats,sorted_md.bam,sorted_md.bam.bai}", - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*ALIGN:ALIGN_BWAMEM2:BWAMEM2_MEM' { - ext.args = { "-M -K 100000000 -R ${meta.read_group}" } - publishDir = [ - path: { "${params.outdir}/bwamem2" }, - enabled: false, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_STATS' { - ext.args = '-s --remove-overlaps' - publishDir = [ - path: { "${params.outdir}/bwamem2" }, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_MERGE' { - ext.prefix = { "${meta.id}_sorted_merged" } - publishDir = [ - enabled: false, - ] - } - - withName: '.*ALIGN:ALIGN_BWAMEM2:MARKDUPLICATES' { - ext.prefix = { "${meta.id}_sorted_md" } - publishDir = [ - path: { "${params.outdir}/bwamem2" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - -} - -// -// Sentieon alignment options -// - -process { - withName: '.*ALIGN_SENTIEON:.*' { - ext.when = params.aligner.equals("sentieon") - } - - withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BWAMEM' { - ext.args = { "-M -K 10000000 -R ${meta.read_group} " } - ext.prefix = { "${meta.id}.sorted" } - publishDir = [ - path: { "${params.outdir}/sentieon_align" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DATAMETRICS' { - publishDir = [ - path: { "${params.outdir}/sentieon_bam_metrics" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_LOCUSCOLLECTOR' { - publishDir = [ - path: { "${params.outdir}/sentieon_dedup" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DEDUP' { - ext.args = { $params.rmdup ? "--rmdup" : '' } - publishDir = [ - path: { "${params.outdir}/sentieon_dedup" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BQSR' { - publishDir = [ - path: { "${params.outdir}/sentieon_recal" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} - -// -// Sentieon SNV calling options -// - -process { - withName: '.*CALL_SNV_SENTIEON:.*' { - ext.when = params.variant_caller.equals("sentieon") - } - - withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { - ext.prefix = { "${meta.id}_dnascope" } - ext.args2 = { [ - params.variant_type ? "--var_type ${params.variant_type}" : '', - params.pcrfree ? "--pcr_indel_model NONE" : '' - ].join(" ") } - publishDir = [ - path: { "${params.outdir}/sentieon_dnascope" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNAMODELAPPLY' { - ext.prefix = { "${meta.id}_dnamodelapply" } - publishDir = [ - path: { "${params.outdir}/sentieon_dnamodelapply" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_ONE' { - ext.args = "-s 'ML_FAIL' -i 'INFO/ML_PROB <= 0.95' -m x -Oz" - ext.prefix = { "${meta.id}_mlfiltered_0.95" } - publishDir = [ - path: { "${params.outdir}/sentieon_filter" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_TWO' { - ext.args = "-i FILTER='\"PASS\"' -m x -Oz" - ext.prefix = { "${meta.id}_passed" } - publishDir = [ - path: { "${params.outdir}/sentieon_filter" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SPLIT_MULTIALLELICS_SEN' { - ext.args = '--output-type z --multiallelics -both' - ext.prefix = { "${meta.id}_split" } - publishDir = [ - enabled: false - ] - } - - withName: '.*CALL_SNV:CALL_SNV_SENTIEON:REMOVE_DUPLICATES_SEN' { - ext.args = '--output-type z --rm-dup none' - ext.prefix = { "${meta.id}_split_rmdup" } - publishDir = [ - path: { "${params.outdir}/sentieon_normvcf" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*CALL_SNV_SENTIEON:TABIX_SEN' { - publishDir = [ - path: { "${params.outdir}/sentieon_normvcf" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} - -// -// Bam QC options -// - -process { - withName: '.*QC_BAM:PICARD_COLLECTMULTIPLEMETRICS' { - publishDir = [ - path: { "${params.outdir}/bamqc_collectmultiplemetrics" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*QC_BAM:PICARD_COLLECTHSMETRICS' { - publishDir = [ - path: { "${params.outdir}/bamqc/collecthsmetrics" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*QC_BAM:QUALIMAP_BAMQC' { - publishDir = [ - path: { "${params.outdir}/bamqc_qualimap" }, - mode: params.publish_dir_mode, - ] - } - - withName: '.*QC_BAM:TIDDIT_COV' { - ext.args = '-z 500 -w' - publishDir = [ - path: { "${params.outdir}/tiddit_coverage" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*QC_BAM:UCSC_WIGTOBIGWIG' { - ext.args = '-clip' - publishDir = [ - path: { "${params.outdir}/tiddit_coverage" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*QC_BAM:MOSDEPTH' { - ext.args = '--d4' - publishDir = [ - path: { "${params.outdir}/mosdepth" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS' { - ext.when = params.aligner.equals("bwamem2") - publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS_Y' { - ext.when = params.aligner.equals("bwamem2") - publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { - ext.when = params.aligner.equals("sentieon") - ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } - publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { - ext.when = params.aligner.equals("sentieon") - ext.args = { (params.genome == "GRCh37") ? "--interval Y" : "--interval chrY" } - publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } -} - -// -// Repeat expansion calling options -// - -process { - withName: '.*CALL_REPEAT_EXPANSIONS:EXPANSIONHUNTER' { - publishDir = [ - path: { "${params.outdir}/expansionhunter" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*CALL_REPEAT_EXPANSIONS:STRANGER' { - publishDir = [ - path: { "${params.outdir}/stranger" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } -} - - -// -// SNV calling options -// - -process { - - withName: '.*CALL_SNV_DEEPVARIANT:.*' { - ext.when = params.variant_caller.equals("deepvariant") - } - - withName: '.*CALL_SNV_DEEPVARIANT:DEEPVARIANT' { - ext.args = { "--model_type=${params.analysis_type.toUpperCase()}" } - ext.prefix = { "${meta.id}_deepvar" } - publishDir = [ - path: { "${params.outdir}/deepvariant" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*CALL_SNV_DEEPVARIANT:GLNEXUS' { - ext.args = '--config DeepVariant_unfiltered' - publishDir = [ - enabled: false - ] - } - - withName: '.*CALL_SNV_DEEPVARIANT:SPLIT_MULTIALLELICS_GL' { - ext.args = '--output-type z --multiallelics -both' - publishDir = [ - enabled: false - ] - } - - withName: '.*CALL_SNV_DEEPVARIANT:REMOVE_DUPLICATES_GL' { - ext.args = '--output-type z --rm-dup none' - ext.prefix = { "${meta.id}_split_rmdup" } - publishDir = [ - path: { "${params.outdir}/glnexus" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*CALL_SNV_DEEPVARIANT:TABIX_GL' { - publishDir = [ - path: { "${params.outdir}/glnexus" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - -} - -// -// Remove mitochondrial variants -// - -process { - withName: '.*RAREDISEASE:GATK4_SELECTVARIANTS' { - ext.args = "--exclude-intervals ${params.mt_contig_name}" - ext.prefix = { "${meta.id}_nomito" } - ext.when = { params.annotate_snv_switch } - publishDir = [ - path: { "${params.outdir}/glnexus/no_mito" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} - -// -// Structural variant calling options -// - -process { - withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA' { - ext.prefix = { "${meta.id}_manta" } - publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:TIDDIT_SV' { - ext.args = '-p 6' - publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, - ] - } - - withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:SVDB_MERGE_TIDDIT' { - ext.args = '--notag --pass_only' - ext.prefix = { "${meta.id}_tiddit" } - publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:GENERATE_PYTOR" { - ext.args = { params.cnvpytor_chr ? "-chrom ${params.cnvpytor_chr}" : '' } - } - - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:HISTOGRAMS" { - publishDir = [ - enabled: false - ] - } - - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:PARTITIONS" { - publishDir = [ - enabled: false - ] - } - - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:CALL_CNVS" { - publishDir = [ - enabled: false - ] - } - - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:VIEW" { - ext.prefix = { "${meta.id}_cnvpytor" } - publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, - ] - } - - withName: '.*CALL_STRUCTURAL_VARIANTS:SVDB_MERGE' { - ext.args = '--pass_only --same_order' - publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, - ] - } - - withName: '.*GENS:COLLECTREADCOUNTS' { - ext.args = '--interval-merging-rule OVERLAPPING_ONLY' - } - - withName: GENS { - publishDir = [ - path: { "${params.outdir}/gens" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} - -// -// Structural variant annotation options -// - -process { - withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:.*' { - ext.when = params.annotate_sv_switch - } - - withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:SVDB_QUERY' { - publishDir = [ - enabled: false, - ] - } - - withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:PICARD_SORTVCF' { - publishDir = [ - enabled: false, - ] - } - - withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:BCFTOOLS_VIEW' { - ext.prefix = { "${meta.id}_view" } - publishDir = [ - enabled: false, - ] - } - - withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:ENSEMBLVEP_SV' { - ext.args = [ - '--dir_cache vep_cache', - '--dir_plugins vep_cache/Plugins', - '--plugin pLI,vep_cache/pLI_values_107.txt', - '--appris --biotype --buffer_size 100 --canonical --cache --ccds', - '--compress_output bgzip --distance 5000 --domains', - '--exclude_predicted --force_overwrite --format vcf', - '--fork 4 --hgvs --humdiv --max_sv_size 248956422 --merged', - '--no_progress --no_stats --numbers --per_gene --polyphen p', - '--protein --offline --regulatory --sift p', - '--symbol --tsl --uniprot --vcf' - ].join(' ') - publishDir = [ - path: { "${params.outdir}/sv_annotate" }, - mode: params.publish_dir_mode, - ] - } -} - -// -// Score and rank structural variants -// - -process { - withName: '.*RANK_VARIANTS_SV:.*' { - ext.when = params.annotate_sv_switch - } - - withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE' { - ext.args = { - (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' - } - } - - withName: '.*RANK_VARIANTS_SV:GENMOD_SCORE' { - ext.args = " --rank_results " - } - - withName: '.*RANK_VARIANTS_SV:GENMOD_COMPOUND' { - publishDir = [ - path: { "${params.outdir}/genmod" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} - -// -// SNV annotation options -// - -process { - withName: '.*ANNOTATE_SNVS:.*' { - ext.when = params.annotate_snv_switch - } - - withName: '.*ANNOTATE_SNVS:VCFANNO' { - ext.prefix = { "${meta.id}_vcfanno" } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { - ext.args = { "--samples ${meta.id} --skip-indels " } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*ANNOTATE_SNVS:RHOCALL_ANNOTATE' { - ext.args = { "--v14 " } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { - ext.prefix = { "${meta.id}_view" } - ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70" ' } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] - } - - withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { - ext.prefix = { "${meta.id}_${intervals.simpleName}" } - ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} - publishDir = [ - enabled: params.save_reference, - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { - ext.prefix = { "${vcf.simpleName}_vep" } - ext.args = [ - '--dir_plugins vep_cache/Plugins', - '--plugin LoFtool,vep_cache/LoFtool_scores.txt', - '--plugin pLI,vep_cache/pLI_values_107.txt', - '--plugin SpliceAI,snv=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz,indel=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz', - '--plugin MaxEntScan,vep_cache/fordownload,SWA,NCSS', - '--distance 5000', - '--buffer_size 20000', - '--format vcf --max_sv_size 248956422', - '--appris --biotype --cache --canonical --ccds --compress_output bgzip', - '--domains --exclude_predicted --force_overwrite', - '--hgvs --humdiv --no_progress --no_stats --numbers', - '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl', - '--uniprot --vcf' - ].join(' ') - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - ] - } - - withName: '.*ANNOTATE_SNVS:ZIP_TABIX_VEP' { - ext.prefix = { "${input.simpleName}" } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - ] - } -} - -// -// Merge mitochondrial and genomic vcfs -// - -process { - withName: '.*RAREDISEASE:BCFTOOLS_CONCAT' { - ext.prefix = { "${meta.id}_mito_genome_merged" } - ext.args = " -a " - } -} - -// -// Score and rank SNVs -// - -process { - withName: '.*RANK_VARIANTS_SNV:.*' { - ext.when = params.annotate_snv_switch - } - - withName: '.*RANK_VARIANTS_SNV:GENMOD_ANNOTATE' { - ext.args = { - (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' - } - } - - withName: '.*RANK_VARIANTS_SNV:GENMOD_MODELS' { - ext.args = " --whole_gene " - } - - withName: '.*RANK_VARIANTS_SNV:GENMOD_SCORE' { - ext.args = " --rank_results " - } - - withName: '.*RANK_VARIANTS_SNV:GENMOD_COMPOUND' { - publishDir = [ - path: { "${params.outdir}/genmod" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} - - -// -// ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ -// - -process { - withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:.*' { - ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } - } - - withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_PRINTREADS_MT' { - beforeScript = {"mkdir ./tmp"} - ext.args = [ - "-L ${params.mt_contig_name}", - "--read-filter MateOnSameContigOrNoMappedMateReadFilter", - "--read-filter MateUnmappedAndUnmappedReadFilter" - ].join(" ").trim() - } - - withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_REVERTSAM_MT' { - ext.args = '--OUTPUT_BY_READGROUP false --VALIDATION_STRINGENCY LENIENT --ATTRIBUTE_TO_CLEAR FT --ATTRIBUTE_TO_CLEAR CO --SORT_ORDER queryname --RESTORE_ORIGINAL_QUALITIES false' - } - - withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_SAMTOFASTQ_MT' { - ext.args = '--VALIDATION_STRINGENCY LENIENT' - } -} - -// -// ANALYSE_MT:ALIGN_AND_CALL_MT -// - -process { - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:.*' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:BWAMEM2_MEM_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") && params.aligner == "bwamem2" } - ext.args = { "-M -K 100000000 -R ${meta.read_group}" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:SENTIEON_BWAMEM_MT' { - ext.args = { "-M -K 10000000 -R ${meta.read_group}" } - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") && params.aligner == "sentieon" } - ext.prefix = { "${meta.id}.sorted" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MERGEBAMALIGNMENT_MT' { - ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' - ext.prefix = { "${meta.id}_merged" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { - ext.args = { [ - "--VALIDATION_STRINGENCY LENIENT", - "--RGLB lib", - "--RGPL ILLUMINA", - "--RGPU barcode", - "--RGSM ${meta.id}" - ].join(' ' ).trim() } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_MARKDUPLICATES_MT' { - ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' - ext.prefix = { "${meta.id}_markduplicates" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:SAMTOOLS_SORT_MT' { - ext.prefix = { "${meta.id}_sorted" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MUTECT2_MT' { - ext.args = '--mitochondria-mode TRUE' - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_FILTERMUTECTCALLS_MT' { - ext.prefix = { "${meta.id}_filtered" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_RENAMESAMPLEINVCF_MT' { - ext.prefix = { "${meta.id}_renamed" } - } -} - -// -// ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT -// - -process { - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:.*' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") && params.aligner == "bwamem2" } - ext.args = { "-M -K 100000000 -R ${meta.read_group}" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SENTIEON_BWAMEM_MT' { - ext.args = { "-M -K 10000000 -R ${meta.read_group}" } - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") && params.aligner == "sentieon" } - ext.prefix = { "${meta.id}.sorted" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MERGEBAMALIGNMENT_MT' { - ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' - ext.prefix = { "${meta.id}_merged_shifted" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_ADDORREPLACEREADGROUPS_MT' { - ext.args = { [ - "--VALIDATION_STRINGENCY LENIENT", - "--RGLB lib", - "--RGPL ${params.platform}", - "--RGPU barcode", - "--RGSM ${meta.id}" - ].join(' ' ).trim() } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_MARKDUPLICATES_MT' { - ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' - ext.prefix = { "${meta.id}_markduplicates_shifted" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SAMTOOLS_SORT_MT' { - ext.prefix = { "${meta.id}_sorted_shifted" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { - ext.args = '--mitochondria-mode TRUE' - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:HAPLOCHECK_MT' { - ext.prefix = { "${meta.id}_shifted" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_FILTERMUTECTCALLS_MT' { - ext.prefix = { "${meta.id}_filtered_shifted" } - } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_RENAMESAMPLEINVCF_MT' { - ext.prefix = { "${meta.id}_renamed" } - } -} - -// -// Liftover -// -process { - - withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { - ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } - ext.prefix = { "${meta.id}_liftover" } - } -} - -// -// ANALYSE_MT:MERGE_ANNOTATE_MT -// - -process { - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:.*' { - ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_MERGEVCFS_LIFT_UNLIFT_MT' { - ext.prefix = { "${meta.id}_merged" } - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_VARIANTFILTRATION_MT' { - ext.prefix = { "${meta.id}_filt" } - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:SPLIT_MULTIALLELICS_MT' { - ext.args = '--output-type z --multiallelics -both' - ext.prefix = { "${meta.id}_split" } - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT' { - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:REMOVE_DUPLICATES_MT' { - ext.args = '--output-type z --rm-dup none' - ext.prefix = { "${meta.id}_split_rmdup" } - publishDir = [ - path: { "${params.outdir}/gatk4" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT2' { - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:BCFTOOLS_MERGE_MT' { - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HMTNOTE_MT' { - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT3' { - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ENSEMBLVEP_MT' { - ext.args = [ - '--dir_plugins vep_cache/Plugins', - '--plugin LoFtool,vep_cache/LoFtool_scores.txt', - '--plugin pLI,vep_cache/pLI_values_107.txt', - '--plugin SpliceAI,snv=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz,indel=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz', - '--plugin MaxEntScan,vep_cache/fordownload,SWA,NCSS', - '--distance 0', - '--buffer_size 20000', - '--format vcf --fork 4 --max_sv_size 248956422', - '--appris --biotype --cache --canonical --ccds --compress_output bgzip', - '--domains --exclude_predicted --force_overwrite', - '--hgvs --humdiv --no_progress --no_stats --numbers', - '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl --vcf', - '--uniprot' - ].join(' ') - publishDir = [ - path: { "${params.outdir}/mt_annotation_vep" }, - mode: params.publish_dir_mode - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HAPLOGREP2_CLASSIFY_MT' { - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:VCFANNO_MT' { - ext.prefix = { "${meta.id}_mito_ann" } - publishDir = [ - path: { "${params.outdir}/mt_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ZIP_TABIX_VCFANNO' { - ext.prefix = { "${meta.id}_mito_ann" } - } - -} - -// -// SENTIEON_TNSCOPE_MT_CALL -// - -process { - withName: '.*SENTIEON_TNSCOPE' { - ext.args = { (params.genome == "GRCh37") ? " --interval MT " : "--interval chrM" } - ext.args2 = " --min_init_normal_lod 0,5 --min_normal_lod 2,0 --min_init_tumor_lod 1,0 --min_tumor_lod 2,8 --trim_soft_clip " - ext.when = params.variant_caller.equals("sentieon") - } -} diff --git a/conf/modules/align.config b/conf/modules/align.config new file mode 100644 index 00000000..2812ef7f --- /dev/null +++ b/conf/modules/align.config @@ -0,0 +1,12 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ diff --git a/conf/modules/align_and_call_MT.config b/conf/modules/align_and_call_MT.config new file mode 100644 index 00000000..fdcf5a0e --- /dev/null +++ b/conf/modules/align_and_call_MT.config @@ -0,0 +1,130 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// ANALYSE_MT:ALIGN_AND_CALL_MT +// + +process { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:.*' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:BWAMEM2_MEM_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") && params.aligner == "bwamem2" } + ext.args = { "-M -K 100000000 -R ${meta.read_group}" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:SENTIEON_BWAMEM_MT' { + ext.args = { "-M -K 10000000 -R ${meta.read_group}" } + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") && params.aligner == "sentieon" } + ext.prefix = { "${meta.id}.sorted" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MERGEBAMALIGNMENT_MT' { + ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' + ext.prefix = { "${meta.id}_merged" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_ADDORREPLACEREADGROUPS_MT' { + ext.args = { [ + "--VALIDATION_STRINGENCY LENIENT", + "--RGLB lib", + "--RGPL ILLUMINA", + "--RGPU barcode", + "--RGSM ${meta.id}" + ].join(' ' ).trim() } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_MARKDUPLICATES_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' + ext.prefix = { "${meta.id}_markduplicates" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:SAMTOOLS_SORT_MT' { + ext.prefix = { "${meta.id}_sorted" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_MUTECT2_MT' { + ext.args = '--mitochondria-mode TRUE' + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_FILTERMUTECTCALLS_MT' { + ext.prefix = { "${meta.id}_filtered" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_RENAMESAMPLEINVCF_MT' { + ext.prefix = { "${meta.id}_renamed" } + } +} + +// +// ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT +// + +process { + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:.*' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:BWAMEM2_MEM_MT' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") && params.aligner == "bwamem2" } + ext.args = { "-M -K 100000000 -R ${meta.read_group}" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SENTIEON_BWAMEM_MT' { + ext.args = { "-M -K 10000000 -R ${meta.read_group}" } + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") && params.aligner == "sentieon" } + ext.prefix = { "${meta.id}.sorted" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MERGEBAMALIGNMENT_MT' { + ext.args = '--CREATE_INDEX true --MAX_GAPS -1 --SORT_ORDER queryname --INCLUDE_SECONDARY_ALIGNMENTS false --PAIRED_RUN false --VALIDATION_STRINGENCY LENIENT' + ext.prefix = { "${meta.id}_merged_shifted" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_ADDORREPLACEREADGROUPS_MT' { + ext.args = { [ + "--VALIDATION_STRINGENCY LENIENT", + "--RGLB lib", + "--RGPL ${params.platform}", + "--RGPU barcode", + "--RGSM ${meta.id}" + ].join(' ' ).trim() } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_MARKDUPLICATES_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT --CREATE_INDEX true' + ext.prefix = { "${meta.id}_markduplicates_shifted" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:SAMTOOLS_SORT_MT' { + ext.prefix = { "${meta.id}_sorted_shifted" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_MUTECT2_MT' { + ext.args = '--mitochondria-mode TRUE' + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:HAPLOCHECK_MT' { + ext.prefix = { "${meta.id}_shifted" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:GATK4_FILTERMUTECTCALLS_MT' { + ext.prefix = { "${meta.id}_filtered_shifted" } + } + + withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_RENAMESAMPLEINVCF_MT' { + ext.prefix = { "${meta.id}_renamed" } + } +} diff --git a/conf/modules/align_bwamem2.config b/conf/modules/align_bwamem2.config new file mode 100644 index 00000000..81b5e785 --- /dev/null +++ b/conf/modules/align_bwamem2.config @@ -0,0 +1,62 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Bwamem2 alignment options +// + +process { + withName: '.*ALIGN_BWAMEM2:.*' { + ext.when = params.aligner.equals("bwamem2") + publishDir = [ + path: { "${params.outdir}/bwamem2" }, + mode: 'copy', + pattern: "*{stats,sorted_md.bam,sorted_md.bam.bai}", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ALIGN:ALIGN_BWAMEM2:BWAMEM2_MEM' { + ext.args = { "-M -K 100000000 -R ${meta.read_group}" } + publishDir = [ + path: { "${params.outdir}/bwamem2" }, + enabled: false, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_STATS' { + ext.args = '-s --remove-overlaps' + publishDir = [ + path: { "${params.outdir}/bwamem2" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_MERGE' { + ext.prefix = { "${meta.id}_sorted_merged" } + publishDir = [ + enabled: false, + ] + } + + withName: '.*ALIGN:ALIGN_BWAMEM2:MARKDUPLICATES' { + ext.prefix = { "${meta.id}_sorted_md" } + publishDir = [ + path: { "${params.outdir}/bwamem2" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} diff --git a/conf/modules/align_sentieon.config b/conf/modules/align_sentieon.config new file mode 100644 index 00000000..56b96cac --- /dev/null +++ b/conf/modules/align_sentieon.config @@ -0,0 +1,65 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Sentieon alignment options +// + +process { + withName: '.*ALIGN_SENTIEON:.*' { + ext.when = params.aligner.equals("sentieon") + } + + withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BWAMEM' { + ext.args = { "-M -K 10000000 -R ${meta.read_group} " } + ext.prefix = { "${meta.id}.sorted" } + publishDir = [ + path: { "${params.outdir}/sentieon_align" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DATAMETRICS' { + publishDir = [ + path: { "${params.outdir}/sentieon_bam_metrics" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_LOCUSCOLLECTOR' { + publishDir = [ + path: { "${params.outdir}/sentieon_dedup" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DEDUP' { + ext.args = { $params.rmdup ? "--rmdup" : '' } + publishDir = [ + path: { "${params.outdir}/sentieon_dedup" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BQSR' { + publishDir = [ + path: { "${params.outdir}/sentieon_recal" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/conf/modules/analyse_MT.config b/conf/modules/analyse_MT.config new file mode 100644 index 00000000..7c3adbb2 --- /dev/null +++ b/conf/modules/analyse_MT.config @@ -0,0 +1,24 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Liftover +// + +process { + + withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { + ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } + ext.prefix = { "${meta.id}_liftover" } + } +} diff --git a/conf/modules/annotate_consequence_pli.config b/conf/modules/annotate_consequence_pli.config new file mode 100644 index 00000000..2812ef7f --- /dev/null +++ b/conf/modules/annotate_consequence_pli.config @@ -0,0 +1,12 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ diff --git a/conf/modules/annotate_snvs.config b/conf/modules/annotate_snvs.config new file mode 100644 index 00000000..7e8caa7f --- /dev/null +++ b/conf/modules/annotate_snvs.config @@ -0,0 +1,101 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// SNV annotation options +// + +process { + withName: '.*ANNOTATE_SNVS:.*' { + ext.when = params.annotate_snv_switch + } + + withName: '.*ANNOTATE_SNVS:VCFANNO' { + ext.prefix = { "${meta.id}_vcfanno" } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { + ext.args = { "--samples ${meta.id} --skip-indels " } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ANNOTATE_SNVS:RHOCALL_ANNOTATE' { + ext.args = { "--v14 " } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { + ext.prefix = { "${meta.id}_view" } + ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70" ' } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { + ext.prefix = { "${meta.id}_${intervals.simpleName}" } + ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} + publishDir = [ + enabled: params.save_reference, + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { + ext.prefix = { "${vcf.simpleName}_vep" } + ext.args = [ + '--dir_plugins vep_cache/Plugins', + '--plugin LoFtool,vep_cache/LoFtool_scores.txt', + '--plugin pLI,vep_cache/pLI_values_107.txt', + '--plugin SpliceAI,snv=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz,indel=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz', + '--plugin MaxEntScan,vep_cache/fordownload,SWA,NCSS', + '--distance 5000', + '--buffer_size 20000', + '--format vcf --max_sv_size 248956422', + '--appris --biotype --cache --canonical --ccds --compress_output bgzip', + '--domains --exclude_predicted --force_overwrite', + '--hgvs --humdiv --no_progress --no_stats --numbers', + '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl', + '--uniprot --vcf' + ].join(' ') + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + ] + } + + withName: '.*ANNOTATE_SNVS:ZIP_TABIX_VEP' { + ext.prefix = { "${input.simpleName}" } + publishDir = [ + path: { "${params.outdir}/snv_annotation" }, + mode: params.publish_dir_mode, + ] + } +} diff --git a/conf/modules/annotate_structural_variants.config b/conf/modules/annotate_structural_variants.config new file mode 100644 index 00000000..07d43734 --- /dev/null +++ b/conf/modules/annotate_structural_variants.config @@ -0,0 +1,60 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Structural variant annotation options +// + +process { + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:.*' { + ext.when = params.annotate_sv_switch + } + + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:SVDB_QUERY' { + publishDir = [ + enabled: false, + ] + } + + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:PICARD_SORTVCF' { + publishDir = [ + enabled: false, + ] + } + + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:BCFTOOLS_VIEW' { + ext.prefix = { "${meta.id}_view" } + publishDir = [ + enabled: false, + ] + } + + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:ENSEMBLVEP_SV' { + ext.args = [ + '--dir_cache vep_cache', + '--dir_plugins vep_cache/Plugins', + '--plugin pLI,vep_cache/pLI_values_107.txt', + '--appris --biotype --buffer_size 100 --canonical --cache --ccds', + '--compress_output bgzip --distance 5000 --domains', + '--exclude_predicted --force_overwrite --format vcf', + '--fork 4 --hgvs --humdiv --max_sv_size 248956422 --merged', + '--no_progress --no_stats --numbers --per_gene --polyphen p', + '--protein --offline --regulatory --sift p', + '--symbol --tsl --uniprot --vcf' + ].join(' ') + publishDir = [ + path: { "${params.outdir}/sv_annotate" }, + mode: params.publish_dir_mode, + ] + } +} diff --git a/conf/modules/call_cnv_cnvpytor.config b/conf/modules/call_cnv_cnvpytor.config new file mode 100644 index 00000000..cce0b1ee --- /dev/null +++ b/conf/modules/call_cnv_cnvpytor.config @@ -0,0 +1,48 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// cnvpytor calling options +// + +process { + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:GENERATE_PYTOR" { + ext.args = { params.cnvpytor_chr ? "-chrom ${params.cnvpytor_chr}" : '' } + } + + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:HISTOGRAMS" { + publishDir = [ + enabled: false + ] + } + + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:PARTITIONS" { + publishDir = [ + enabled: false + ] + } + + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:CALL_CNVS" { + publishDir = [ + enabled: false + ] + } + + withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:VIEW" { + ext.prefix = { "${meta.id}_cnvpytor" } + publishDir = [ + path: { "${params.outdir}/sv_caller" }, + mode: params.publish_dir_mode, + ] + } +} diff --git a/conf/modules/call_repeat_expansions.config b/conf/modules/call_repeat_expansions.config new file mode 100644 index 00000000..f52412f0 --- /dev/null +++ b/conf/modules/call_repeat_expansions.config @@ -0,0 +1,34 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Repeat expansion calling options +// + +process { + withName: '.*CALL_REPEAT_EXPANSIONS:EXPANSIONHUNTER' { + publishDir = [ + path: { "${params.outdir}/expansionhunter" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*CALL_REPEAT_EXPANSIONS:STRANGER' { + publishDir = [ + path: { "${params.outdir}/stranger" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} diff --git a/conf/modules/call_snv.config b/conf/modules/call_snv.config new file mode 100644 index 00000000..2812ef7f --- /dev/null +++ b/conf/modules/call_snv.config @@ -0,0 +1,12 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ diff --git a/conf/modules/call_snv_deepvariant.config b/conf/modules/call_snv_deepvariant.config new file mode 100644 index 00000000..5825469c --- /dev/null +++ b/conf/modules/call_snv_deepvariant.config @@ -0,0 +1,65 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// SNV calling options - deepvariant +// + +process { + + withName: '.*CALL_SNV_DEEPVARIANT:.*' { + ext.when = params.variant_caller.equals("deepvariant") + } + + withName: '.*CALL_SNV_DEEPVARIANT:DEEPVARIANT' { + ext.args = { "--model_type=${params.analysis_type.toUpperCase()}" } + ext.prefix = { "${meta.id}_deepvar" } + publishDir = [ + path: { "${params.outdir}/deepvariant" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_SNV_DEEPVARIANT:GLNEXUS' { + ext.args = '--config DeepVariant_unfiltered' + publishDir = [ + enabled: false + ] + } + + withName: '.*CALL_SNV_DEEPVARIANT:SPLIT_MULTIALLELICS_GL' { + ext.args = '--output-type z --multiallelics -both' + publishDir = [ + enabled: false + ] + } + + withName: '.*CALL_SNV_DEEPVARIANT:REMOVE_DUPLICATES_GL' { + ext.args = '--output-type z --rm-dup none' + ext.prefix = { "${meta.id}_split_rmdup" } + publishDir = [ + path: { "${params.outdir}/glnexus" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_SNV_DEEPVARIANT:TABIX_GL' { + publishDir = [ + path: { "${params.outdir}/glnexus" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/conf/modules/call_snv_sentieon.config b/conf/modules/call_snv_sentieon.config new file mode 100644 index 00000000..5ad82181 --- /dev/null +++ b/conf/modules/call_snv_sentieon.config @@ -0,0 +1,90 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Sentieon SNV calling options +// + +process { + withName: '.*CALL_SNV_SENTIEON:.*' { + ext.when = params.variant_caller.equals("sentieon") + } + + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { + ext.prefix = { "${meta.id}_dnascope" } + ext.args2 = { [ + params.variant_type ? "--var_type ${params.variant_type}" : '', + params.pcrfree ? "--pcr_indel_model NONE" : '' + ].join(" ") } + publishDir = [ + path: { "${params.outdir}/sentieon_dnascope" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNAMODELAPPLY' { + ext.prefix = { "${meta.id}_dnamodelapply" } + publishDir = [ + path: { "${params.outdir}/sentieon_dnamodelapply" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_ONE' { + ext.args = "-s 'ML_FAIL' -i 'INFO/ML_PROB <= 0.95' -m x -Oz" + ext.prefix = { "${meta.id}_mlfiltered_0.95" } + publishDir = [ + path: { "${params.outdir}/sentieon_filter" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_TWO' { + ext.args = "-i FILTER='\"PASS\"' -m x -Oz" + ext.prefix = { "${meta.id}_passed" } + publishDir = [ + path: { "${params.outdir}/sentieon_filter" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SPLIT_MULTIALLELICS_SEN' { + ext.args = '--output-type z --multiallelics -both' + ext.prefix = { "${meta.id}_split" } + publishDir = [ + enabled: false + ] + } + + withName: '.*CALL_SNV:CALL_SNV_SENTIEON:REMOVE_DUPLICATES_SEN' { + ext.args = '--output-type z --rm-dup none' + ext.prefix = { "${meta.id}_split_rmdup" } + publishDir = [ + path: { "${params.outdir}/sentieon_normvcf" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_SNV_SENTIEON:TABIX_SEN' { + publishDir = [ + path: { "${params.outdir}/sentieon_normvcf" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/conf/modules/call_structural_variants.config b/conf/modules/call_structural_variants.config new file mode 100644 index 00000000..d59ebb9d --- /dev/null +++ b/conf/modules/call_structural_variants.config @@ -0,0 +1,26 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Structural variant calling options +// + +process { + withName: '.*CALL_STRUCTURAL_VARIANTS:SVDB_MERGE' { + ext.args = '--pass_only --same_order' + publishDir = [ + path: { "${params.outdir}/sv_caller" }, + mode: params.publish_dir_mode, + ] + } +} diff --git a/conf/modules/call_sv_manta.config b/conf/modules/call_sv_manta.config new file mode 100644 index 00000000..57cc3440 --- /dev/null +++ b/conf/modules/call_sv_manta.config @@ -0,0 +1,27 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Structural variant calling options - Manta +// + +process { + withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA' { + ext.prefix = { "${meta.id}_manta" } + publishDir = [ + path: { "${params.outdir}/sv_caller" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} diff --git a/conf/modules/call_sv_tiddit.config b/conf/modules/call_sv_tiddit.config new file mode 100644 index 00000000..8e316156 --- /dev/null +++ b/conf/modules/call_sv_tiddit.config @@ -0,0 +1,36 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Structural variant calling options -tiddit +// + +process { + withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:TIDDIT_SV' { + ext.args = '-p 6' + publishDir = [ + path: { "${params.outdir}/sv_caller" }, + mode: params.publish_dir_mode, + ] + } + + withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:SVDB_MERGE_TIDDIT' { + ext.args = '--notag --pass_only' + ext.prefix = { "${meta.id}_tiddit" } + publishDir = [ + path: { "${params.outdir}/sv_caller" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} diff --git a/conf/modules/check_input.config b/conf/modules/check_input.config new file mode 100644 index 00000000..2812ef7f --- /dev/null +++ b/conf/modules/check_input.config @@ -0,0 +1,12 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ diff --git a/conf/modules/convert_mt_bam_to_fastq.config b/conf/modules/convert_mt_bam_to_fastq.config new file mode 100644 index 00000000..47e1f5bf --- /dev/null +++ b/conf/modules/convert_mt_bam_to_fastq.config @@ -0,0 +1,39 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Extract mitochondrial reads from bam and save them in fastq files +// + +process { + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:.*' { + ext.when = { params.mt_fasta_shift && !(params.analysis_type == "wes") } + } + + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_PRINTREADS_MT' { + beforeScript = {"mkdir ./tmp"} + ext.args = [ + "-L ${params.mt_contig_name}", + "--read-filter MateOnSameContigOrNoMappedMateReadFilter", + "--read-filter MateUnmappedAndUnmappedReadFilter" + ].join(" ").trim() + } + + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_REVERTSAM_MT' { + ext.args = '--OUTPUT_BY_READGROUP false --VALIDATION_STRINGENCY LENIENT --ATTRIBUTE_TO_CLEAR FT --ATTRIBUTE_TO_CLEAR CO --SORT_ORDER queryname --RESTORE_ORIGINAL_QUALITIES false' + } + + withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_SAMTOFASTQ_MT' { + ext.args = '--VALIDATION_STRINGENCY LENIENT' + } +} diff --git a/conf/modules/gens.config b/conf/modules/gens.config new file mode 100644 index 00000000..f1a8ec8f --- /dev/null +++ b/conf/modules/gens.config @@ -0,0 +1,30 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Gens options +// + +process { + withName: '.*GENS:COLLECTREADCOUNTS' { + ext.args = '--interval-merging-rule OVERLAPPING_ONLY' + } + + withName: GENS { + publishDir = [ + path: { "${params.outdir}/gens" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/conf/modules/merge_annotate_MT.config b/conf/modules/merge_annotate_MT.config new file mode 100644 index 00000000..d574fcaa --- /dev/null +++ b/conf/modules/merge_annotate_MT.config @@ -0,0 +1,120 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Mitochondrial annotation options +// + +process { + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:.*' { + ext.when = { params.mt_fasta_shift && params.mt_intervals && !(params.analysis_type == "wes") } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_MERGEVCFS_LIFT_UNLIFT_MT' { + ext.prefix = { "${meta.id}_merged" } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:GATK4_VARIANTFILTRATION_MT' { + ext.prefix = { "${meta.id}_filt" } + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:SPLIT_MULTIALLELICS_MT' { + ext.args = '--output-type z --multiallelics -both' + ext.prefix = { "${meta.id}_split" } + publishDir = [ + enabled: false + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT' { + publishDir = [ + enabled: false + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:REMOVE_DUPLICATES_MT' { + ext.args = '--output-type z --rm-dup none' + ext.prefix = { "${meta.id}_split_rmdup" } + publishDir = [ + path: { "${params.outdir}/gatk4" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT2' { + publishDir = [ + enabled: false + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:BCFTOOLS_MERGE_MT' { + publishDir = [ + enabled: false + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HMTNOTE_MT' { + publishDir = [ + enabled: false + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT3' { + publishDir = [ + enabled: false + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ENSEMBLVEP_MT' { + ext.args = [ + '--dir_plugins vep_cache/Plugins', + '--plugin LoFtool,vep_cache/LoFtool_scores.txt', + '--plugin pLI,vep_cache/pLI_values_107.txt', + '--plugin SpliceAI,snv=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz,indel=vep_cache/spliceai_21_scores_raw_snv_-v1.3-.vcf.gz', + '--plugin MaxEntScan,vep_cache/fordownload,SWA,NCSS', + '--distance 0', + '--buffer_size 20000', + '--format vcf --fork 4 --max_sv_size 248956422', + '--appris --biotype --cache --canonical --ccds --compress_output bgzip', + '--domains --exclude_predicted --force_overwrite', + '--hgvs --humdiv --no_progress --no_stats --numbers', + '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl --vcf', + '--uniprot' + ].join(' ') + publishDir = [ + path: { "${params.outdir}/mt_annotation_vep" }, + mode: params.publish_dir_mode + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HAPLOGREP2_CLASSIFY_MT' { + publishDir = [ + enabled: false + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:VCFANNO_MT' { + ext.prefix = { "${meta.id}_mito_ann" } + publishDir = [ + path: { "${params.outdir}/mt_annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ZIP_TABIX_VCFANNO' { + ext.prefix = { "${meta.id}_mito_ann" } + } + +} diff --git a/conf/modules/prepare_references.config b/conf/modules/prepare_references.config new file mode 100644 index 00000000..8be6d38d --- /dev/null +++ b/conf/modules/prepare_references.config @@ -0,0 +1,198 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Genome and reference preparation options +// + +process { + withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_GENOME' { + ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" + ] + } + + withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_SHIFT_MT' { + ext.when = {!params.mt_bwamem2_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes") && params.aligner == "bwamem2"} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" + ] + } + + withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_GENOME' { + ext.when = {!params.bwa_index && params.aligner == "sentieon"} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + + withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_SHIFT_MT' { + ext.when = {!params.mt_bwa_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes") && params.aligner == "sentieon"} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + + withName: '.*PREPARE_REFERENCES:BWA_INDEX_GENOME' { + ext.when = {!params.bwa_index && !(params.aligner == "sentieon")} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + + withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_GENOME' { + ext.when = {!params.fasta_fai} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*fai" + ] + } + + withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_SHIFT_MT' { + ext.when = {!params.mt_fai_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*fai" + ] + } + + withName: '.*PREPARE_REFERENCES:GATK_SD' { + ext.when = {!params.sequence_dictionary} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*dict" + ] + } + + withName: '.*PREPARE_REFERENCES:GATK_SD_SHIFT_MT' { + ext.when = {!params.mt_sequence_dictionary_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*dict" + ] + } + + withName: '.*PREPARE_REFERENCES:GET_CHROM_SIZES' { + publishDir = [ + enabled: false, + ] + } + + withName: '.*PREPARE_REFERENCES:TABIX_DBSNP' { + ext.when = {params.known_dbsnp && !params.known_dbsnp_tbi} + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*tbi" + ] + } + + withName: '.*PREPARE_REFERENCES:TABIX_GNOMAD_AF' { + ext.when = {params.gnomad_af && !params.gnomad_af_idx} + ext.args = '-s 1 -b 2 -e 2' + publishDir = [ + path: { "${params.outdir}/references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference, + pattern: "*tbi" + ] + } + + withName: '.*PREPARE_REFERENCES:TABIX_PT' { + ext.when = { params.target_bed && params.target_bed.endsWith(".gz") } + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*PREPARE_REFERENCES:TABIX_PBT' { + ext.when = { params.target_bed && !params.target_bed.endsWith(".gz") } + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*PREPARE_REFERENCES:GATK_BILT' { + ext.when = { params.target_bed } + ext.prefix = { "${meta.id}_target" } + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*PREPARE_REFERENCES:GATK_ILT' { + ext.when = { params.target_bed } + ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' + publishDir = [ + enabled: false + ] + } + + withName: '.*PREPARE_REFERENCES:CAT_CAT_BAIT' { + ext.when = { params.target_bed } + ext.prefix = { "${meta.id}" } + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*PREPARE_REFERENCES:UNTAR_VEP_CACHE' { + ext.when = { params.vep_cache.endsWith("tar.gz") } + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/conf/modules/prepare_vcf.config b/conf/modules/prepare_vcf.config new file mode 100644 index 00000000..56856837 --- /dev/null +++ b/conf/modules/prepare_vcf.config @@ -0,0 +1,55 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Normalize and index vcf files +// + +process { + + withName: '.*PREPARE_REFERENCES:CHECK_VCF:CHECK_INPUT_VCF' { + ext.when = {params.gnomad_vcf} + publishDir = [ + enabled: false, + ] + } + + withName: '.*PREPARE_REFERENCES:CHECK_VCF:SPLIT_MULTIALLELICS_PV' { + ext.when = {params.gnomad_vcf} + ext.args = '--output-type z --multiallelics -both' + ext.prefix = { "${meta.id}_split" } + publishDir = [ + enabled: false + ] + } + + withName: '.*PREPARE_REFERENCES:CHECK_VCF:REMOVE_DUPLICATES_PV' { + ext.when = {params.gnomad_vcf} + ext.args = '--output-type z --rm-dup none' + ext.prefix = { "${meta.id}_split_rmdup" } + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*PREPARE_REFERENCES:CHECK_VCF:TABIX_PV' { + ext.when = {params.gnomad_vcf} + publishDir = [ + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/conf/modules/qc_bam.config b/conf/modules/qc_bam.config new file mode 100644 index 00000000..38eca259 --- /dev/null +++ b/conf/modules/qc_bam.config @@ -0,0 +1,106 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Bam QC options +// + +process { + withName: '.*QC_BAM:PICARD_COLLECTMULTIPLEMETRICS' { + publishDir = [ + path: { "${params.outdir}/bamqc_collectmultiplemetrics" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:PICARD_COLLECTHSMETRICS' { + publishDir = [ + path: { "${params.outdir}/bamqc/collecthsmetrics" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:QUALIMAP_BAMQC' { + publishDir = [ + path: { "${params.outdir}/bamqc_qualimap" }, + mode: params.publish_dir_mode, + ] + } + + withName: '.*QC_BAM:TIDDIT_COV' { + ext.args = '-z 500 -w' + publishDir = [ + path: { "${params.outdir}/tiddit_coverage" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:UCSC_WIGTOBIGWIG' { + ext.args = '-clip' + publishDir = [ + path: { "${params.outdir}/tiddit_coverage" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:MOSDEPTH' { + ext.args = '--d4' + publishDir = [ + path: { "${params.outdir}/mosdepth" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS' { + ext.when = params.aligner.equals("bwamem2") + publishDir = [ + path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS_Y' { + ext.when = params.aligner.equals("bwamem2") + publishDir = [ + path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { + ext.when = params.aligner.equals("sentieon") + ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } + publishDir = [ + path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { + ext.when = params.aligner.equals("sentieon") + ext.args = { (params.genome == "GRCh37") ? "--interval Y" : "--interval chrY" } + publishDir = [ + path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} diff --git a/conf/modules/rank_variants.config b/conf/modules/rank_variants.config new file mode 100644 index 00000000..3b786955 --- /dev/null +++ b/conf/modules/rank_variants.config @@ -0,0 +1,72 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Score and rank structural variants +// + +process { + withName: '.*RANK_VARIANTS_SV:.*' { + ext.when = params.annotate_sv_switch + } + + withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE' { + ext.args = { + (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' + } + } + + withName: '.*RANK_VARIANTS_SV:GENMOD_SCORE' { + ext.args = " --rank_results " + } + + withName: '.*RANK_VARIANTS_SV:GENMOD_COMPOUND' { + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} + +// +// Score and rank SNVs +// + +process { + withName: '.*RANK_VARIANTS_SNV:.*' { + ext.when = params.annotate_snv_switch + } + + withName: '.*RANK_VARIANTS_SNV:GENMOD_ANNOTATE' { + ext.args = { + (params.genome == 'GRCh37') ? '--annotate_regions --genome-build 37' : '--annotate_regions --genome-build 38' + } + } + + withName: '.*RANK_VARIANTS_SNV:GENMOD_MODELS' { + ext.args = " --whole_gene " + } + + withName: '.*RANK_VARIANTS_SNV:GENMOD_SCORE' { + ext.args = " --rank_results " + } + + withName: '.*RANK_VARIANTS_SNV:GENMOD_COMPOUND' { + publishDir = [ + path: { "${params.outdir}/genmod" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/conf/modules/raredisease.config b/conf/modules/raredisease.config new file mode 100644 index 00000000..04cd8447 --- /dev/null +++ b/conf/modules/raredisease.config @@ -0,0 +1,94 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// General configuration options +// + +process { + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + withName: '.*CHECK_INPUT:SAMPLESHEET_CHECK' { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'CUSTOM_DUMPSOFTWAREVERSIONS' { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: params.publish_dir_mode, + pattern: '*_versions.yml' + ] + } +} + +// +// Read QC options +// + +process { + withName: '.*RAREDISEASE:FASTQC' { + ext.args = '--quiet' + publishDir = [ + path: { "${params.outdir}/reports/fastqc/${meta.id}" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} + +// +// Remove mitochondrial variants +// + +process { + withName: '.*RAREDISEASE:GATK4_SELECTVARIANTS' { + ext.args = "--exclude-intervals ${params.mt_contig_name}" + ext.prefix = { "${meta.id}_nomito" } + ext.when = { params.annotate_snv_switch } + publishDir = [ + path: { "${params.outdir}/glnexus/no_mito" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} + +// +// Merge mitochondrial and genomic vcfs +// + +process { + withName: '.*RAREDISEASE:BCFTOOLS_CONCAT' { + ext.prefix = { "${meta.id}_mito_genome_merged" } + ext.args = " -a " + } +} + +// +// SENTIEON_TNSCOPE_MT_CALL +// + +process { + withName: '.*SENTIEON_TNSCOPE' { + ext.args = { (params.genome == "GRCh37") ? " --interval MT " : "--interval chrM" } + ext.args2 = " --min_init_normal_lod 0,5 --min_normal_lod 2,0 --min_init_tumor_lod 1,0 --min_tumor_lod 2,8 --trim_soft_clip " + ext.when = params.variant_caller.equals("sentieon") + } +} diff --git a/conf/modules/scatter_genome.config b/conf/modules/scatter_genome.config new file mode 100644 index 00000000..cb804163 --- /dev/null +++ b/conf/modules/scatter_genome.config @@ -0,0 +1,34 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Create bed and interval files for scatter operations +// + +process { + withName: '.*SCATTER_GENOME:BUILD_BED' { + ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} + } + + withName: '.*SCATTER_GENOME:GATK4_SPLITINTERVALS' { + ext.args = { "--subdivision-mode BALANCING_WITHOUT_INTERVAL_SUBDIVISION --scatter-count 22" } + ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} + ext.prefix = { "${meta.id}_genome_intervals" } + publishDir = [ + enabled: params.save_reference, + path: { "${params.outdir}/processed_references" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/nextflow.config b/nextflow.config index 879f91c7..a1ed8187 100644 --- a/nextflow.config +++ b/nextflow.config @@ -243,8 +243,34 @@ manifest { doi = '' } -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' +// Load DSL2 module options from config files, where each file contains the options for modules used in the eponymous subworkflow. + +includeConfig 'conf/modules/align_and_call_MT.config' +includeConfig 'conf/modules/align_bwamem2.config' +includeConfig 'conf/modules/align.config' +includeConfig 'conf/modules/align_sentieon.config' +includeConfig 'conf/modules/analyse_MT.config' +includeConfig 'conf/modules/annotate_consequence_pli.config' +includeConfig 'conf/modules/annotate_snvs.config' +includeConfig 'conf/modules/annotate_structural_variants.config' +includeConfig 'conf/modules/call_cnv_cnvpytor.config' +includeConfig 'conf/modules/call_repeat_expansions.config' +includeConfig 'conf/modules/call_snv.config' +includeConfig 'conf/modules/call_snv_deepvariant.config' +includeConfig 'conf/modules/call_snv_sentieon.config' +includeConfig 'conf/modules/call_structural_variants.config' +includeConfig 'conf/modules/call_sv_manta.config' +includeConfig 'conf/modules/call_sv_tiddit.config' +includeConfig 'conf/modules/check_input.config' +includeConfig 'conf/modules/convert_mt_bam_to_fastq.config' +includeConfig 'conf/modules/gens.config' +includeConfig 'conf/modules/merge_annotate_MT.config' +includeConfig 'conf/modules/prepare_references.config' +includeConfig 'conf/modules/prepare_vcf.config' +includeConfig 'conf/modules/qc_bam.config' +includeConfig 'conf/modules/rank_variants.config' +includeConfig 'conf/modules/raredisease.config' +includeConfig 'conf/modules/scatter_genome.config' // Function to ensure that resource requirements don't go beyond // a maximum limit From 8fe4f1a700bd99ac8e4c7d7291939eee3d06804d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Feb 2023 18:39:12 +0100 Subject: [PATCH 1010/1169] update lint config --- .nf-core.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index a6868bcb..a22ef6f7 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,4 +1,6 @@ lint: + files_exist: + - conf/modules.config files_unchanged: - .github/CONTRIBUTING.md - .github/ISSUE_TEMPLATE/bug_report.yml From 4ebda90efbf6748096cd8e979a308f2d53d210b3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:07:55 +0100 Subject: [PATCH 1011/1169] resolve merge conflict --- conf/modules/qc_bam.config | 2 -- modules/local/sentieon/wgsmetricsalgo.nf | 3 +++ subworkflows/local/qc_bam.nf | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/conf/modules/qc_bam.config b/conf/modules/qc_bam.config index 38eca259..cb1af0ea 100644 --- a/conf/modules/qc_bam.config +++ b/conf/modules/qc_bam.config @@ -86,7 +86,6 @@ process { withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { ext.when = params.aligner.equals("sentieon") - ext.args = { (params.genome == "GRCh37") ? "--interval 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT" : "--interval chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX,chrY,chrM" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, mode: params.publish_dir_mode, @@ -96,7 +95,6 @@ process { withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { ext.when = params.aligner.equals("sentieon") - ext.args = { (params.genome == "GRCh37") ? "--interval Y" : "--interval chrY" } publishDir = [ path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, mode: params.publish_dir_mode, diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index bce76109..555131fe 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -9,6 +9,7 @@ process SENTIEON_WGSMETRICSALGO { tuple val(meta), path(bam), path(bai) tuple val(meta2), path(fasta) tuple val(meta2), path(fai) + path intervals_list output: tuple val(meta), path('*wgs_metrics.txt'), emit: wgs_metrics @@ -21,6 +22,7 @@ process SENTIEON_WGSMETRICSALGO { def args = task.ext.args ?: '' def input = bam.sort().collect{"-i $it"}.join(' ') def prefix = task.ext.prefix ?: "${meta.id}" + def interval = intervals_list ? "--interval ${intervals_list}" : "" """ if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" @@ -32,6 +34,7 @@ process SENTIEON_WGSMETRICSALGO { -t $task.cpus \\ -r $fasta \\ $input \\ + $interval \\ $args \\ --algo WgsMetricsAlgo ${prefix}_wgs_metrics.txt diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index a003a0e3..4d4e26d6 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -54,8 +54,8 @@ workflow QC_BAM { PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) - SENTIEON_WGSMETRICS ( bam_bai, fasta, fai) - SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai) + SENTIEON_WGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) + SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) ch_cov = Channel.empty().mix(PICARD_COLLECTWGSMETRICS.out.metrics, SENTIEON_WGSMETRICS.out.wgs_metrics) ch_cov_y = Channel.empty().mix(PICARD_COLLECTWGSMETRICS_Y.out.metrics, SENTIEON_WGSMETRICS_Y.out.wgs_metrics) From 46a7693ce03c670fbf308f8dd206bbea48a7165d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:28:20 +0100 Subject: [PATCH 1012/1169] fix spaces --- modules/local/sentieon/wgsmetricsalgo.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index 555131fe..2165741c 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -19,9 +19,9 @@ process SENTIEON_WGSMETRICSALGO { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def input = bam.sort().collect{"-i $it"}.join(' ') - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def input = bam.sort().collect{"-i $it"}.join(' ') + def prefix = task.ext.prefix ?: "${meta.id}" def interval = intervals_list ? "--interval ${intervals_list}" : "" """ if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then From 8356740832451283989bb0834708b68e23525f8b Mon Sep 17 00:00:00 2001 From: peterpru Date: Thu, 23 Feb 2023 11:57:28 +0100 Subject: [PATCH 1013/1169] integrate review comments --- conf/modules.config | 2 +- modules.json | 3 ++- workflows/raredisease.nf | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 50e68159..b726836c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -604,7 +604,7 @@ process { ext.args = { (params.genome == 'GRCh37') ? '--genome 37' : '--genome 38' } - ext.prefix = { "${case_info.id}" } + ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/smncopynumbercaller" }, mode: params.publish_dir_mode, diff --git a/modules.json b/modules.json index 2b5a8258..b000fc5c 100644 --- a/modules.json +++ b/modules.json @@ -292,7 +292,8 @@ }, "smncopynumbercaller": { "branch": "master", - "git_sha": "e70433b04bef836b22bbed5a1e6e4e95aeec09fe" + "git_sha": "e70433b04bef836b22bbed5a1e6e4e95aeec09fe", + "installed_by": ["modules"] }, "stranger": { "branch": "master", diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e624999a..0fa501e1 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -297,12 +297,12 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions) // STEP 1.7: SMNCOPYNUMBERCALLER - ALIGN.out.bam_bai + ch_mapped.bam_bai .collect{it[1]} .toList() .set { ch_bam_list } - ALIGN.out.bam_bai + ch_mapped.bam_bai .collect{it[2]} .toList() .set { ch_bai_list } From 64c7f60604cfdc53048606ba9c560921afd107dd Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 23 Feb 2023 17:28:58 +0100 Subject: [PATCH 1014/1169] removes unused process from modules config --- conf/modules/align_and_call_MT.config | 7 ------- 1 file changed, 7 deletions(-) diff --git a/conf/modules/align_and_call_MT.config b/conf/modules/align_and_call_MT.config index fdcf5a0e..c4915c11 100644 --- a/conf/modules/align_and_call_MT.config +++ b/conf/modules/align_and_call_MT.config @@ -62,10 +62,6 @@ process { withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:GATK4_FILTERMUTECTCALLS_MT' { ext.prefix = { "${meta.id}_filtered" } } - - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT:PICARD_RENAMESAMPLEINVCF_MT' { - ext.prefix = { "${meta.id}_renamed" } - } } // @@ -124,7 +120,4 @@ process { ext.prefix = { "${meta.id}_filtered_shifted" } } - withName: '.*ANALYSE_MT:ALIGN_AND_CALL_MT_SHIFT:PICARD_RENAMESAMPLEINVCF_MT' { - ext.prefix = { "${meta.id}_renamed" } - } } From b875d5fcd47d612c250a1d182b9dd1f303b720e8 Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 23 Feb 2023 17:46:09 +0100 Subject: [PATCH 1015/1169] removed one more unused process from config --- conf/modules/annotate_snvs.config | 8 -------- 1 file changed, 8 deletions(-) diff --git a/conf/modules/annotate_snvs.config b/conf/modules/annotate_snvs.config index 7e8caa7f..9db85f23 100644 --- a/conf/modules/annotate_snvs.config +++ b/conf/modules/annotate_snvs.config @@ -90,12 +90,4 @@ process { mode: params.publish_dir_mode, ] } - - withName: '.*ANNOTATE_SNVS:ZIP_TABIX_VEP' { - ext.prefix = { "${input.simpleName}" } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - ] - } } From 07f55e898c631e5d649688ec8d57177a85183ad6 Mon Sep 17 00:00:00 2001 From: Peter Pruisscher Date: Mon, 27 Feb 2023 12:31:06 +0100 Subject: [PATCH 1016/1169] update smncopynumbercaller --- modules.json | 2 +- modules/nf-core/smncopynumbercaller/main.nf | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/modules.json b/modules.json index b000fc5c..bc7ff072 100644 --- a/modules.json +++ b/modules.json @@ -292,7 +292,7 @@ }, "smncopynumbercaller": { "branch": "master", - "git_sha": "e70433b04bef836b22bbed5a1e6e4e95aeec09fe", + "git_sha": "c5620578276a1927f5b4afbc2b4266c9cf7b43ca", "installed_by": ["modules"] }, "stranger": { diff --git a/modules/nf-core/smncopynumbercaller/main.nf b/modules/nf-core/smncopynumbercaller/main.nf index 27b5ae21..e746f9fc 100644 --- a/modules/nf-core/smncopynumbercaller/main.nf +++ b/modules/nf-core/smncopynumbercaller/main.nf @@ -19,18 +19,19 @@ process SMNCOPYNUMBERCALLER { task.ext.when == null || task.ext.when script: - manifest_text = bam.join("\n") def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = "1.1.2" // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. """ - echo "$manifest_text" >manifest.txt + echo $bam | tr ' ' ' + ' > manifest.txt smn_caller.py \\ $args \\ --manifest manifest.txt \\ --prefix $prefix \\ --outDir "out" \\ --threads $task.cpus + cat <<-END_VERSIONS > versions.yml "${task.process}": SMNCopyNumberCaller: $VERSION @@ -44,6 +45,7 @@ process SMNCOPYNUMBERCALLER { mkdir out touch out/${prefix}.tsv touch out/${prefix}.json + cat <<-END_VERSIONS > versions.yml "${task.process}": SMNCopyNumberCaller: $VERSION From 675ebce2c336acaaee9edac8d0e729b97f741e86 Mon Sep 17 00:00:00 2001 From: jemten Date: Tue, 28 Feb 2023 10:17:03 +0100 Subject: [PATCH 1017/1169] merge expansionhunter calls --- CITATIONS.md | 3 + conf/modules/call_repeat_expansions.config | 67 +++++++++++++++++- modules.json | 10 +++ modules/nf-core/bcftools/reheader/main.nf | 68 +++++++++++++++++++ modules/nf-core/bcftools/reheader/meta.yml | 52 ++++++++++++++ .../nf-core/picard/renamesampleinvcf/main.nf | 56 +++++++++++++++ .../nf-core/picard/renamesampleinvcf/meta.yml | 44 ++++++++++++ subworkflows/local/call_repeat_expansions.nf | 66 ++++++++++++++++-- subworkflows/local/check_input.nf | 7 +- workflows/raredisease.nf | 4 +- 10 files changed, 366 insertions(+), 11 deletions(-) create mode 100644 modules/nf-core/bcftools/reheader/main.nf create mode 100644 modules/nf-core/bcftools/reheader/meta.yml create mode 100644 modules/nf-core/picard/renamesampleinvcf/main.nf create mode 100644 modules/nf-core/picard/renamesampleinvcf/meta.yml diff --git a/CITATIONS.md b/CITATIONS.md index a8407622..188639d8 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -19,6 +19,9 @@ - [SMNCopyNumberCaller](https://www.nature.com/articles/s41436-020-0754-0) > Chen X, Sanchis-Juan A, French CE, Connel AJ, Delon I, Kingsbury Z, Chawla A, Halpern AL, Taft RJ, NIHR BioResource, Bentley DR, Butchbach MER, Raymond FL, Eberle MA. Spinal muscular atrophy diagnosis and carrier screening from genome sequencing data. Genet Med. February 2020:1-9. doi:10.1038/s41436-020-0754-0 +- [ExpansionHunter](https://academic.oup.com/bioinformatics/article/doi/10.1093/bioinformatics/btz431/5499079) + > Egor Dolzhenko, Viraj Deshpande, Felix Schlesinger, Peter Krusche, Roman Petrovski, Sai Chen, Dorothea Emig-Agius, Andrew Gross, Giuseppe Narzisi, Brett Bowman, Konrad Scheffler, Joke J F A van Vugt, Courtney French, Alba Sanchis-Juan, Kristina Ibáñez, Arianna Tucci, Bryan R Lajoie, Jan H Veldink, F Lucy Raymond, Ryan J Taft, David R Bentley, Michael A Eberle, ExpansionHunter: a sequence-graph-based tool to analyze variation in short tandem repeat regions, Bioinformatics, Volume 35, Issue 22, November 2019, Pages 4754–4756, https://doi.org/10.1093/bioinformatics/btz431 + ## Software packaging/containerisation tools - [Anaconda](https://anaconda.com) diff --git a/conf/modules/call_repeat_expansions.config b/conf/modules/call_repeat_expansions.config index f52412f0..6c4b0c33 100644 --- a/conf/modules/call_repeat_expansions.config +++ b/conf/modules/call_repeat_expansions.config @@ -16,17 +16,80 @@ // process { + withName: '.*CALL_REPEAT_EXPANSIONS:.*' { + ext.when = { params.analysis_type != "wes" } + } + withName: '.*CALL_REPEAT_EXPANSIONS:EXPANSIONHUNTER' { publishDir = [ - path: { "${params.outdir}/expansionhunter" }, + enabled: false, + ] + } + + withName: '.*CALL_REPEAT_EXPANSIONS:BCFTOOLS_REHEADER_EXP' { + ext.prefix = { "${meta.id}_reheader" } + publishDir = [ + enabled: false, + ] + } + + withName: '.*CALL_REPEAT_EXPANSIONS:RENAMESAMPLE_EXP' { + publishDir = [ + path: { "${params.outdir}/repeat_expansions" }, + mode: params.publish_dir_mode, + saveAs: { filename -> + filename.equals('versions.yml') ? null : + filename.contains('_renam.vcf.gz') ? "${meta.id}_repeat_expansion.vcf.gz" : + filename + }, + ] + } + + withName: '.*CALL_REPEAT_EXPANSIONS:TABIX_EXP_RENAME' { + publishDir = [ + path: { "${params.outdir}/repeat_expansions" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> + filename.equals('versions.yml') ? null : + filename.contains('_renam.vcf.gz.tbi') ? "${meta.id}_repeat_expansion.vcf.gz.tbi" : + filename + }, + ] + } + + withName: '.*CALL_REPEAT_EXPANSIONS:SPLIT_MULTIALLELICS_EXP' { + ext.prefix = { "${meta.id}_exp" } + publishDir = [ + enabled: false, + ] + } + + withName: '.*CALL_REPEAT_EXPANSIONS:SVDB_MERGE_REPEATS' { + ext.args = {"--notag"} + publishDir = [ + enabled: false ] } withName: '.*CALL_REPEAT_EXPANSIONS:STRANGER' { publishDir = [ - path: { "${params.outdir}/stranger" }, + enabled: false + ] + } + + withName: '.*CALL_REPEAT_EXPANSIONS:COMPRESS_STRANGER' { + ext.prefix = { "${meta.id}_repeat_expansion" } + publishDir = [ + path: { "${params.outdir}/repeat_expansions" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*CALL_REPEAT_EXPANSIONS:INDEX_STRANGER' { + publishDir = [ + path: { "${params.outdir}/repeat_expansions" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] diff --git a/modules.json b/modules.json index bc7ff072..c7d7d205 100644 --- a/modules.json +++ b/modules.json @@ -25,6 +25,11 @@ "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, + "bcftools/reheader": { + "branch": "master", + "git_sha": "bd4b60c7f9358c7146ac198fd0c4ae6355ddd086", + "installed_by": ["modules"] + }, "bcftools/roh": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", @@ -250,6 +255,11 @@ "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, + "picard/renamesampleinvcf": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, "picard/sortvcf": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", diff --git a/modules/nf-core/bcftools/reheader/main.nf b/modules/nf-core/bcftools/reheader/main.nf new file mode 100644 index 00000000..57634c07 --- /dev/null +++ b/modules/nf-core/bcftools/reheader/main.nf @@ -0,0 +1,68 @@ +process BCFTOOLS_REHEADER { + tag "$meta.id" + label 'process_low' + + conda "bioconda::bcftools=1.16" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.16--hfe4b78e_1': + 'quay.io/biocontainers/bcftools:1.16--hfe4b78e_1' }" + + input: + tuple val(meta), path(vcf), path(header) + path fai + + output: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def update_sequences = fai ? "-f $fai" : "" + def new_header = header ? "-h $header" : "" + + def args2 = task.ext.args2 ?: '--output-type z' + def extension = args2.contains("--output-type b") || args2.contains("-Ob") ? "bcf.gz" : + args2.contains("--output-type u") || args2.contains("-Ou") ? "bcf" : + args2.contains("--output-type z") || args2.contains("-Oz") ? "vcf.gz" : + args2.contains("--output-type v") || args2.contains("-Ov") ? "vcf" : + "vcf" + """ + bcftools \\ + reheader \\ + $update_sequences \\ + $new_header \\ + $args \\ + --threads $task.cpus \\ + $vcf \\ + | bcftools view \\ + $args2 \\ + --output ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args2 = task.ext.args2 ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + + def extension = args2.contains("--output-type b") || args2.contains("-Ob") ? "bcf.gz" : + args2.contains("--output-type u") || args2.contains("-Ou") ? "bcf" : + args2.contains("--output-type z") || args2.contains("-Oz") ? "vcf.gz" : + args2.contains("--output-type v") || args2.contains("-Ov") ? "vcf" : + "vcf" + """ + touch ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/reheader/meta.yml b/modules/nf-core/bcftools/reheader/meta.yml new file mode 100644 index 00000000..44d75fdf --- /dev/null +++ b/modules/nf-core/bcftools/reheader/meta.yml @@ -0,0 +1,52 @@ +name: bcftools_reheader +description: Reheader a VCF file +keywords: + - reheader + - vcf + - update header +tools: + - reheader: + description: | + Modify header of VCF/BCF files, change sample names. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://samtools.github.io/bcftools/bcftools.html#reheader + doi: 10.1093/gigascience/giab008 + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF/BCF file + pattern: "*.{vcf.gz,vcf,bcf}" + - header: + type: file + description: New header to add to the VCF + pattern: "*.{header.txt}" + - fai: + type: file + description: Fasta index to update header sequences with + pattern: "*.{fai}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: VCF with updated header, bgzipped per default + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + +authors: + - "@bjohnnyd" + - "@jemten" diff --git a/modules/nf-core/picard/renamesampleinvcf/main.nf b/modules/nf-core/picard/renamesampleinvcf/main.nf new file mode 100644 index 00000000..5fadbd40 --- /dev/null +++ b/modules/nf-core/picard/renamesampleinvcf/main.nf @@ -0,0 +1,56 @@ + +process PICARD_RENAMESAMPLEINVCF { + tag "$meta.id" + label 'process_single' + + conda "bioconda::picard=2.27.4" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + + input: + tuple val(meta), path(vcf) + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def extended_args = args.contains("--NEW_SAMPLE_NAME") ? $args : "${args} --NEW_SAMPLE_NAME ${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard RenameSampleInVcf] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + + """ + picard \\ + RenameSampleInVcf \\ + -Xmx${avail_mem}g \\ + --INPUT $vcf \\ + --OUTPUT ${prefix}_renam.vcf.gz \\ + $extended_args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard RenameSampleInVcf --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_renam.vcf.gz + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(picard RenameSampleInVcf --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ +} diff --git a/modules/nf-core/picard/renamesampleinvcf/meta.yml b/modules/nf-core/picard/renamesampleinvcf/meta.yml new file mode 100644 index 00000000..8f3ed6b4 --- /dev/null +++ b/modules/nf-core/picard/renamesampleinvcf/meta.yml @@ -0,0 +1,44 @@ +name: "picard_renamesampleinvcf" +description: changes name of sample in the vcf file +keywords: + - picard + - picard/renamesampleinvcf +tools: + - "picard": + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ + tool_dev_url: "https://github.com/broadinstitute/picard" + doi: "" + licence: "['MIT']" + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF file + pattern: "*.{vcf,vcf.gz}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: VCF file + pattern: "*.{vcf,vcf.gz}" + +authors: + - "@Lucpen" diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 845071a2..8e501891 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -2,26 +2,78 @@ // Run ExpansionHunter and Stranger // -include { EXPANSIONHUNTER } from '../../modules/nf-core/expansionhunter/main' -include { STRANGER } from '../../modules/nf-core/stranger/main' +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_EXP } from '../../modules/nf-core/bcftools/norm/main' +include { BCFTOOLS_REHEADER as BCFTOOLS_REHEADER_EXP } from '../../modules/nf-core/bcftools/reheader/main' +include { BCFTOOLS_VIEW as COMPRESS_STRANGER } from '../../modules/nf-core/bcftools/view/main' +include { EXPANSIONHUNTER } from '../../modules/nf-core/expansionhunter/main' +include { PICARD_RENAMESAMPLEINVCF as RENAMESAMPLE_EXP } from '../../modules/nf-core/picard/renamesampleinvcf/main' +include { STRANGER } from '../../modules/nf-core/stranger/main' +include { SVDB_MERGE as SVDB_MERGE_REPEATS } from '../../modules/nf-core/svdb/merge/main' +include { TABIX_BGZIPTABIX as BGZIPTABIX_EXP } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_TABIX as INDEX_STRANGER } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_EXP_RENAME } from '../../modules/nf-core/tabix/tabix/main' workflow CALL_REPEAT_EXPANSIONS { take: bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // channel: /path/to/genome.fasta variant_catalog // channel: /path/to/variant_catalog.json + case_info // channel: [ case_id ] + fasta // channel: /path/to/genome.fasta + fai // channel: /path/to/genome.fasta.fai main: ch_versions = Channel.empty() - EXPANSIONHUNTER (bam, fasta, variant_catalog) + EXPANSIONHUNTER ( + bam, + fasta, + variant_catalog + ) + + // Fix header and rename sample + BCFTOOLS_REHEADER_EXP ( + EXPANSIONHUNTER.out.vcf.map{ meta, vcf -> [ meta, vcf, [] ]}, + fai + ) + RENAMESAMPLE_EXP ( BCFTOOLS_REHEADER_EXP.out.vcf ) + TABIX_EXP_RENAME ( RENAMESAMPLE_EXP.out.vcf ) + + // Split multi allelelic + SPLIT_MULTIALLELICS_EXP ( + RENAMESAMPLE_EXP.out.vcf.join(TABIX_EXP_RENAME.out.tbi), + fasta + ) + //TABIX_EXP_SPLIT ( SPLIT_MULTIALLELICS_EXP.out.vcf ) + + // Merge indiviual repeat expansions + SPLIT_MULTIALLELICS_EXP.out.vcf + .collect{it[1]} + .toList() + .set {ch_exp_vcfs} + case_info + .combine(ch_exp_vcfs) + .set {ch_svdb_merge_input} + SVDB_MERGE_REPEATS ( ch_svdb_merge_input, [] ) - STRANGER (EXPANSIONHUNTER.out.vcf, variant_catalog) + // Annotate, compress and index + STRANGER ( SVDB_MERGE_REPEATS.out.vcf, variant_catalog ) + COMPRESS_STRANGER ( + STRANGER.out.vcf.map{ meta, vcf -> [meta, vcf, [] ]}, + [], [], [] + ) + INDEX_STRANGER ( COMPRESS_STRANGER.out.vcf ) ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions.first()) + ch_versions = ch_versions.mix(BCFTOOLS_REHEADER_EXP.out.versions.first()) + ch_versions = ch_versions.mix(RENAMESAMPLE_EXP.out.versions.first() ) + ch_versions = ch_versions.mix(TABIX_EXP_RENAME.out.versions.first()) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_EXP.out.versions.first()) + ch_versions = ch_versions.mix(SVDB_MERGE_REPEATS.out.versions.first()) ch_versions = ch_versions.mix(STRANGER.out.versions.first()) + ch_versions = ch_versions.mix(COMPRESS_STRANGER.out.versions.first()) + ch_versions = ch_versions.mix(INDEX_STRANGER.out.versions.first()) emit: - vcf = STRANGER.out.vcf // channel: [ val(meta), path(*.vcf.gz) ] - versions = ch_versions // channel: [ versions.yml ] + vcf = COMPRESS_STRANGER.out.vcf.join(INDEX_STRANGER.out.tbi) // channel: [ val(meta), path(*.vcf.gz), path(*.vcf.gz.tbi) ] + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/check_input.nf b/subworkflows/local/check_input.nf index 5856870a..fa64498a 100644 --- a/subworkflows/local/check_input.nf +++ b/subworkflows/local/check_input.nf @@ -30,7 +30,12 @@ workflow CHECK_INPUT { def create_fastq_channel(LinkedHashMap row) { // create meta map def meta = [:] - meta.id = row.sample + meta.case_id = row.case_id + meta.gender = row.gender + meta.id = row.sample + meta.maternal = row.maternal_id + meta.paternal = row.paternal_id + meta.phenotype = row.phenotype meta.single_end = row.single_end.toBoolean() //TODO: think about adding LB and PU, make sure only illumina will be used, ID can also contain a flowcell id meta.read_group = "\'@RG\\tID:"+ row.fastq_1.split('/')[-1] + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index c198c935..997c7e0c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -295,8 +295,10 @@ workflow RAREDISEASE { // EXPANSIONHUNTER AND STRANGER CALL_REPEAT_EXPANSIONS ( ch_mapped.bam_bai, + ch_variant_catalog, + CHECK_INPUT.out.case_info, ch_genome_fasta_no_meta, - ch_variant_catalog + ch_genome_fai_no_meta ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions) From ecd1c270aa03e3f58f837c879675062c97f909c4 Mon Sep 17 00:00:00 2001 From: jemten Date: Tue, 28 Feb 2023 10:40:26 +0100 Subject: [PATCH 1018/1169] prettier on CITATIONS.md --- CITATIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CITATIONS.md b/CITATIONS.md index 188639d8..4d6298e5 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -17,6 +17,7 @@ > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. - [SMNCopyNumberCaller](https://www.nature.com/articles/s41436-020-0754-0) + > Chen X, Sanchis-Juan A, French CE, Connel AJ, Delon I, Kingsbury Z, Chawla A, Halpern AL, Taft RJ, NIHR BioResource, Bentley DR, Butchbach MER, Raymond FL, Eberle MA. Spinal muscular atrophy diagnosis and carrier screening from genome sequencing data. Genet Med. February 2020:1-9. doi:10.1038/s41436-020-0754-0 - [ExpansionHunter](https://academic.oup.com/bioinformatics/article/doi/10.1093/bioinformatics/btz431/5499079) From 29d92f5c882dbf67260f5555f97acf10769d0911 Mon Sep 17 00:00:00 2001 From: jemten Date: Tue, 28 Feb 2023 16:34:36 +0100 Subject: [PATCH 1019/1169] removes line that was commented out --- subworkflows/local/call_repeat_expansions.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 8e501891..4c1569b8 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -43,7 +43,6 @@ workflow CALL_REPEAT_EXPANSIONS { RENAMESAMPLE_EXP.out.vcf.join(TABIX_EXP_RENAME.out.tbi), fasta ) - //TABIX_EXP_SPLIT ( SPLIT_MULTIALLELICS_EXP.out.vcf ) // Merge indiviual repeat expansions SPLIT_MULTIALLELICS_EXP.out.vcf From 5a86e1f0ac0df5b55a9c7050dd694745ce3b708a Mon Sep 17 00:00:00 2001 From: peterpru Date: Tue, 7 Mar 2023 13:40:13 +0100 Subject: [PATCH 1020/1169] remove deprecated .yaml file and add bamqc to multiqc --- assets/multiqc_config.yaml | 11 ----------- assets/multiqc_config.yml | 4 ++++ workflows/raredisease.nf | 10 +++++++++- 3 files changed, 13 insertions(+), 12 deletions(-) delete mode 100644 assets/multiqc_config.yaml diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml deleted file mode 100644 index 15ff17a9..00000000 --- a/assets/multiqc_config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/raredisease - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - software_versions: - order: -1000 - nf-core-raredisease-summary: - order: -1001 - -export_plots: true diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 3f45252a..a0ce1f4d 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,3 +1,7 @@ +custom_logo: "nf-core-raredisease_logo_light.png" +custom_logo_url: https://github.com/nf-core/raredisease/ +custom_logo_title: "nf-core/raredisease" + report_comment: > This report has been generated by the nf-core/raredisease analysis pipeline. For information about how to interpret these results, please see the diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 997c7e0c..b48cd4da 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -528,7 +528,15 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) - + ch_multiqc_files = ch_multiqc_files.mix(PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(PICARD_COLLECTHSMETRICS.out.metrics.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QUALIMAP_BAMQC.out.results.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.per_base_d4.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(TIDDIT_COV.out.wig.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(UCSC_WIGTOBIGWIG.out.bw.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_cov.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_cov_y.collect().ifEmpty([])) + MULTIQC ( ch_multiqc_files.collect(), ch_multiqc_config.toList(), From 126663cfc737a46a1602ea1627bf221ae67b85e5 Mon Sep 17 00:00:00 2001 From: peterpru Date: Tue, 7 Mar 2023 13:42:44 +0100 Subject: [PATCH 1021/1169] undo last commit --- assets/multiqc_config.yaml | 11 +++++++++++ assets/multiqc_config.yml | 4 ---- workflows/raredisease.nf | 10 +--------- 3 files changed, 12 insertions(+), 13 deletions(-) create mode 100644 assets/multiqc_config.yaml diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml new file mode 100644 index 00000000..15ff17a9 --- /dev/null +++ b/assets/multiqc_config.yaml @@ -0,0 +1,11 @@ +report_comment: > + This report has been generated by the nf-core/raredisease + analysis pipeline. For information about how to interpret these results, please see the + documentation. +report_section_order: + software_versions: + order: -1000 + nf-core-raredisease-summary: + order: -1001 + +export_plots: true diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index a0ce1f4d..3f45252a 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,3 @@ -custom_logo: "nf-core-raredisease_logo_light.png" -custom_logo_url: https://github.com/nf-core/raredisease/ -custom_logo_title: "nf-core/raredisease" - report_comment: > This report has been generated by the nf-core/raredisease analysis pipeline. For information about how to interpret these results, please see the diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index b48cd4da..997c7e0c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -528,15 +528,7 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(PICARD_COLLECTHSMETRICS.out.metrics.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QUALIMAP_BAMQC.out.results.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.per_base_d4.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(TIDDIT_COV.out.wig.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(UCSC_WIGTOBIGWIG.out.bw.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_cov.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_cov_y.collect().ifEmpty([])) - + MULTIQC ( ch_multiqc_files.collect(), ch_multiqc_config.toList(), From 8fcff9fcc301cf3954aa7c9bd36677cc1db47777 Mon Sep 17 00:00:00 2001 From: peterpru Date: Tue, 7 Mar 2023 13:51:02 +0100 Subject: [PATCH 1022/1169] remove deprecated .yaml file and add bamqc to multiqc --- assets/multiqc_config.yaml | 11 ----------- assets/multiqc_config.yml | 4 ++++ workflows/raredisease.nf | 9 +++++++++ 3 files changed, 13 insertions(+), 11 deletions(-) delete mode 100644 assets/multiqc_config.yaml diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml deleted file mode 100644 index 15ff17a9..00000000 --- a/assets/multiqc_config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/raredisease - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - software_versions: - order: -1000 - nf-core-raredisease-summary: - order: -1001 - -export_plots: true diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 3f45252a..a0ce1f4d 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,3 +1,7 @@ +custom_logo: "nf-core-raredisease_logo_light.png" +custom_logo_url: https://github.com/nf-core/raredisease/ +custom_logo_title: "nf-core/raredisease" + report_comment: > This report has been generated by the nf-core/raredisease analysis pipeline. For information about how to interpret these results, please see the diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 997c7e0c..97d6a1fe 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -528,6 +528,15 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(PICARD_COLLECTHSMETRICS.out.metrics.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QUALIMAP_BAMQC.out.results.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.per_base_d4.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(TIDDIT_COV.out.wig.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(UCSC_WIGTOBIGWIG.out.bw.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_cov.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_cov_y.collect().ifEmpty([])) + MULTIQC ( ch_multiqc_files.collect(), From 443819854ca886c3456787571a6e434a4b4fa8fc Mon Sep 17 00:00:00 2001 From: peterpru Date: Tue, 7 Mar 2023 14:47:53 +0100 Subject: [PATCH 1023/1169] define subworkflow to access channel --- workflows/raredisease.nf | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 97d6a1fe..66d94506 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -528,14 +528,15 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(PICARD_COLLECTHSMETRICS.out.metrics.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QUALIMAP_BAMQC.out.results.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.per_base_d4.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(TIDDIT_COV.out.wig.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(UCSC_WIGTOBIGWIG.out.bw.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_cov.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_cov_y.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.multiple_metrics.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.hs_metrics.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.qualimap_results.results.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.tiddit_wig.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.bigwig.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.bw.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.d4.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.cov.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.cov_y.collect().ifEmpty([])) MULTIQC ( From a5cb8f56c68ddc2d2301d9a92fc41b096f322504 Mon Sep 17 00:00:00 2001 From: peterpru Date: Tue, 7 Mar 2023 16:27:13 +0100 Subject: [PATCH 1024/1169] add correct channels to give to multiqc --- workflows/raredisease.nf | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 66d94506..2be32d58 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -530,13 +530,7 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.multiple_metrics.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.hs_metrics.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.qualimap_results.results.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.tiddit_wig.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.bigwig.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.bw.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.d4.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.cov.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.cov_y.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.qualimap_results.collect().ifEmpty([])) MULTIQC ( From a8170245dda9064e69b8dc89ba6ef83c8c885431 Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 8 Mar 2023 11:17:41 +0100 Subject: [PATCH 1025/1169] add file paths using .map.collect --- workflows/raredisease.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 2be32d58..eec9ba20 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -528,9 +528,9 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.multiple_metrics.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.hs_metrics.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.qualimap_results.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.multiple_metrics.map{it[1]}.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.hs_metrics.map{it[1]}.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.qualimap_results.map{it[1]}.collect().ifEmpty([])) MULTIQC ( From c72fab2c0f71bb7eb43640fad27ce1a1cbc08ff9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Mar 2023 14:38:30 +0100 Subject: [PATCH 1026/1169] Usage markdown --- docs/usage.md | 349 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 255 insertions(+), 94 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 9bdb486b..14177890 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,36 +1,94 @@ # nf-core/raredisease: Usage -## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/raredisease/usage](https://nf-co.re/raredisease/usage) +**We recommend reading this documentation on the nf-core website: [https://nf-co.re/raredisease/usage](https://nf-co.re/raredisease/usage)** + +Table of contents: + +- [nf-core/raredisease: Usage](#nf-core-raredisease--usage) +- [Introduction](#introduction) +- [Prerequisites](#prerequisites) +- [Run nf-core/raredisease with test data] (#run-nf-core-raredisease-with-test-data--a-id--testdata----) +- [Run nf-core/raredisease with your data] (#run-nf-core-raredisease-with-your-data--a-id--owndata----) + - [Samplesheet](#samplesheet) + - [Reference files and parameters](#reference-files-and-parameters) + - [1. Alignment](#1-alignment) + - [2. QC stats from alignment files](#2-qc-stats-from-alignment-files) + - [3. Repeat expansions](#3-repeat-expansions) + - [4. Variant calling - SNV](#4-variant-calling---snv) + - [5. Variant calling - Structural variants](#5-variant-calling---structural-variants) + - [6. Annotation & Ranking - SNV](#6-annotation---ranking---snv) + - [7. Annotation & Ranking - SV](#7-annotation---ranking---sv) + - [8. Mitochondrial analysis workflow](#8-mitochondrial-analysis-workflow) + - [Run the pipeline](#run-the-pipeline) + - [Command line](#command-line) + - [Config file](#config-file) +- [Tips](#tips) + - [Custom configuration](#custom-configuration) + - [Resource requests](#resource-requests) + - [For beginners](#for-beginners) + - [Advanced option on process level](#advanced-option-on-process-level) + - [Updating containers (advanced users)](#updating-containers--advanced-users-) + - [nf-core/configs](#nf-core-configs) + - [Run sentieon](#run-sentieon) + - [Azure Resource Requests](#azure-resource-requests) + - [Running in the background](#running-in-the-background) + - [Nextflow memory requirements](#nextflow-memory-requirements) + +# Introduction + +nf-core/raredisease is a bioinformatics best-practice analysis pipeline to call, annotate and score variants from WGS/WES of rare disease patients. The pipeline is built using nextflow. + +# Prerequisites + +1. Install Nextflow (>=22.10.1) using the instructions [here.](https://nextflow.io/docs/latest/getstarted.html#installation) +2. Install one of the following technologies for full pipeline reproducibility: Docker, Singularity, Podman, Shifter or Charliecloud. + > Almost all nf-core pipelines give you the option to use conda as well. However, some tools used in the raredisease pipeline do not have a conda package so we do not support conda at the moment. + +# Run nf-core/raredisease with test data + +Before running the pipeline with your data, we recommend running it with the test dataset available [here](https://github.com/nf-core/test-datasets/tree/raredisease). + +> You do not need to download the data as the pipeline is configured to fetch that data automatically for you when you use the test profile. + +Run the following command, where YOURPROFILE is the package manager you installed on your machine. For example, `-profile test,docker` or `-profile test,singularity`: -> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ +``` +nextflow run nf-core/raredisease \ + -revision dev -profile test, \ + --outdir +``` -## Introduction +> Check [nf-core/configs](https://github.com/nf-core/configs/tree/master/conf) to see if a custom config file to run nf-core pipelines already exists for your institute. If so, you can simply use `-profile test,` in your command. This enables the appropirate package manager and sets the appropriate execution settings for your machine. +> NB: The order of profiles is important! They are loaded in sequence, so later profiles can overwrite earlier profiles. - +The above command downloads the pipeline from github, caches it, and tests it on the test dataset. -## Samplesheet input +> When you run the command again, it will fetch the pipeline from cache even if the remote version of the pipeline is available. To make sure that you're running the latest version of the pipeline, update the cached version of the pipeline by including `-latest` in the command. -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 9 columns, and a header row as shown in the examples below. +Test profile runs the pipeline with a proband containing three samples, but if you would like to test the pipeline with one sample, use `-profile test_one_sample,`. -```bash ---input '[path to samplesheet file]' +Running the command creates the following files in your working directory: + +``` +work # Directory containing the nextflow working files + # Finished results in specified location (defined with --outdir) +.nextflow_log # Log file from Nextflow +# Other nextflow hidden files, like history of pipeline logs. ``` -### Multiple runs of the same sample +# Run nf-core/raredisease with your data -The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will align the raw read/read-pairs independently before merging the alignments belonging to the same sample. Below is an example for a trio with the proband sequenced across 2 lanes: +Running the pipeline involves three steps: - +1. Prepare a samplesheet +2. Gather all required references +3. Supply samplesheet and references, and run the command -```console -sample,lane,fastq_1,fastq_2,gender,phenotype,paternal_id,maternal_id,case_id -AEG588A1,2,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1,2,AEG588A3,AEG588A2,fam_1 -AEG588A1,3,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,1,2,AEG588A3,AEG588A2,fam_1 -AEG588A2,4,AEG588A2_S1_L004_R1_001.fastq.gz,AEG588A2_S1_L004_R2_001.fastq.gz,2,1,,,fam_1 -AEG588A3,4,AEG588A3_S1_L004_R1_001.fastq.gz,AEG588A3_S1_L004_R2_001.fastq.gz,1,1,,,fam_1 -``` +### Samplesheet + +A samplesheet is used to pass the information about the sample(s), such as the path to the fastq files and other meta data (gender, phenotype, etc.,) to the pipeline. -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information in the samplesheet (sex/gender and phenotype) should be provided as they would be for a [ped file](https://gatk.broadinstitute.org/hc/en-us/articles/360035531972-PED-Pedigree-format) (i.e. 1 for male, 2 for female, other for unknown). +nf-core/raredisease will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information in the samplesheet (sex/gender and phenotype) should be provided as they would be for a [ped file](https://gatk.broadinstitute.org/hc/en-us/articles/360035531972-PED-Pedigree-format) (i.e. 1 for male, 2 for female, other for unknown). | Column | Description | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -44,110 +102,196 @@ The pipeline will auto-detect whether a sample is single- or paired-end using th | `maternal_id` | Sample ID of the mother, can be blank if the mother isn't part of the analysis or for other samples than the proband. | | `case_id` | Case ID, for the analysis used when generating a family VCF | -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. +It is also possible to include multiple runs of the same sample in a samplesheet like when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. In that case, the `sample` identifiers in the samplesheet have to be the same. The pipeline will align the raw read/read-pairs independently before merging the alignments belonging to the same sample. Below is an example for a trio with the proband sequenced across 2 lanes: -## Running the pipeline +| sample | lane | fastq_1 | fastq_2 | gender | phenotype | paternal_id | maternal_id | case_id | +| -------- | ---- | -------------------------------- | -------------------------------- | ------ | --------- | ----------- | ----------- | ------- | +| AEG588A1 | 2 | AEG588A1_S1_L002_R1_001.fastq.gz | AEG588A1_S1_L002_R2_001.fastq.gz | 1 | 2 | AEG588A3 | AEG588A2 | fam_1 | +| AEG588A1 | 3 | AEG588A1_S1_L003_R1_001.fastq.gz | AEG588A1_S1_L003_R2_001.fastq.gz | 1 | 2 | AEG588A3 | AEG588A2 | fam_1 | +| AEG588A2 | 4 | AEG588A2_S1_L004_R1_001.fastq.gz | AEG588A2_S1_L004_R2_001.fastq.gz | 2 | 1 | | | fam_1 | +| AEG588A3 | 4 | AEG588A3_S1_L004_R1_001.fastq.gz | AEG588A3_S1_L004_R2_001.fastq.gz | 1 | 1 | | | fam_1 | -The typical command for running the pipeline is as follows: +If you would like to see more examples of what a typical samplesheet looks like for a singleton and a trio, follow these links, [singleton](https://github.com/nf-core/test-datasets/blob/raredisease/testdata/samplesheet_single.csv) and [trio](https://github.com/nf-core/test-datasets/blob/raredisease/testdata/samplesheet_trio.csv). -```bash -nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile docker -``` +### Reference files and parameters -This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. +In nf-core/raredisease, references can be supplied using parameters listed [here](https://nf-co.re/raredisease/dev/parameters). -Note that the pipeline will create the following files in your working directory: +Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (ex: you can align with either bwamem2 or sentieon, call SNVs with deepvariant or sentieon). You also have the option to turn off parts of the pipeline if you do not want to run them (ex: snv annotation can be turned off by setting `--annotate_snv_switch` flag to false). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters only used by that tool need not be provided. For example, for SNV calling if you decide to use deepvariant as your variant caller, you do not need to provide the parameter `--ml_model`, as it is only used by sentieon. -```bash -work # Directory containing the nextflow working files - # Finished results in specified location (defined with --outdir) -.nextflow_log # Log file from Nextflow -# Other nextflow hidden files, eg. history of pipeline runs and old logs. -``` +To help you decide which parameters you need to supply, we have tabulated the mandatory and optional inputs for different features that constitute the pipeline. -### Updating the pipeline +> Of the features listed below alignment, qc stats, repeat expansions, snv & sv variant calling are always run by default so the mandatory parameters used by those features will always have to be supplied to the pipeline. -When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: +#### 1. Alignment -```bash -nextflow pull nf-core/raredisease -``` +| Mandatory | Optional | +| ------------------- | --------------------------- | +| aligner1 | fasta_fai2 | +| fasta | bwamem2_index2 | +| platform | known_dbsnp3 | +| | known_dbsnp_tbi3 | -### Reproducibility +1Default value is bwamem2, but if you have a valid license for sentieon, you have the option to use sentieon as well. +2fasta_fai and bwamem2_index, if not provided by the user, will be generated by the pipeline when necessary. +3Used only by sentieon. -It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. +#### 2. QC stats from alignment files -First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. +| Mandatory | Optional | +| ------------------------------------------------------------ | -------- | +| intervals_wgs | | +| intervals_y | | +| target_bed / (bait_intervals & target_intervals)1 | | -This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. +1 If a target_bed file is provided, bait_intervals and target_intervals can be generated by the pipeline. -## Core Nextflow arguments +#### 3. Repeat expansions -> **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). +| Mandatory | Optional | +| --------------- | -------- | +| variant_catalog | | -### `-profile` +#### 4. Variant calling - SNV -Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. +| Mandatory | Optional | +| -------------------------- | --------------------------- | +| variant_caller1 | known_dbsnp2 | +| ml_model2 | known_dbsnp_tbi2 | +| analysis_type 3 | call_interval2 | +| | known_dbsnp_tbi2 | -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. +1Default variant caller is deepvariant, but you have the option to use sentieon as well. +2These parameters are only used by sentieon. +3Default is WGS, but you have the option to choose WES as well. -> We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. +#### 5. Variant calling - Structural variants -The pipeline also dynamically loads configurations from [https://github.com/nf-core/configs](https://github.com/nf-core/configs) when it runs, making multiple config profiles for various institutional clusters available at run time. For more information and to see if your system is available in these configs please see the [nf-core/configs documentation](https://github.com/nf-core/configs#documentation). +| Mandatory | Optional | +| --------- | ---------- | +| | target_bed | +| | bwa_index | -Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! -They are loaded in sequence, so later profiles can overwrite earlier profiles. +#### 6. Annotation & Ranking - SNV -If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended, since it can lead to different results on different machines dependent on the computer enviroment. +| Mandatory | Optional | +| ----------------------------- | ------------------------------ | +| genome1 | gnomad_af4 | +| vcfanno_resources2 | reduced_penetrance5 | +| vcfanno_toml3 | vcfanno_lua | +| vep_cache_version | vep_filters | +| vep_cache | | -- `test` - - A profile with a complete configuration for automated testing - - Includes links to test data so needs no other parameters -- `docker` - - A generic configuration profile to be used with [Docker](https://docker.com/) -- `singularity` - - A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) -- `podman` - - A generic configuration profile to be used with [Podman](https://podman.io/) -- `shifter` - - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) -- `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) -- `conda` - - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. +1Genome version is used by vep. You have the option to choose between GRCh37 and GRCh38. +2Path to vcf files and their indices used by vcfanno. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/vcfanno_resources.txt). +3Path to a vcfanno configration file. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/vcfanno_config.toml). +4Gnomad vcf file can be downloaded from here https://gnomad.broadinstitute.org/downloads. +5Used by genmod while ranking the variants. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv). -### `-resume` +#### 7. Annotation & Ranking - SV -Specify this when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). +| Mandatory | Optional | +| -------------------------- | ------------------ | +| genome | reduced_penetrance | +| svdb_query_dbs1 | score_config_sv | +| vep_cache_version | vep_filters | +| vep_cache | | -You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. +1 A csv file that describes the databases(vcfs) used by svdb for annotating structural variants. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/svdb_querydb_files.csv). Information about the column headers can be found [here](https://github.com/J35P312/SVDB#Query). -### `-c` +#### 8. Mitochondrial analysis workflow -Specify the path to a specific config file (this is a core Nextflow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. +| Mandatory | Optional | +| ------------------------------- | -------- | +| genome | | +| mt_backchain_shift 1 | | +| mt_contig_name | | +| mt_fasta_shift | | +| mt_intervals | | +| mt_intervals_shift | | +| vcfanno_resources | | +| vcfanno_toml | | +| vep_cache_version | | +| vep_cache | | + +1 Can be generated by GATK's [ShiftFasta](https://gatk.broadinstitute.org/hc/en-us/articles/9570501436827-ShiftFasta-BETA-). Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/mt_shift8000.back_chain). + +### Run the pipeline + +There are two possible approaches you can take to supply samplesheet and reference data to the pipeline while starting a run. + +1. Command line +2. Config file + +#### Command line + +All of the pipeline parameters listed [here](https://nf-co.re/raredisease/dev/parameters) can be passed from the command line. For example, you can provide the samplesheet, reference fasta, and turn off annotations for SNVs and SVs by running, + +``` +nextflow run nf-core/raredisease \ + -revision dev \ + -profile test, \ + --input samplesheet.csv \ + --fasta reference.fasta \ + --annotate_snv_switch false \ + --annotate_sv_switch false \ + --outdir +``` + +#### Config file + +While one can quickly supply/change the default parameters easily from the command line, it can easily become confusing so we recommend using a config file instead. In such cases, one can create a config file that contains all the parameters and pass that file from the command line instead. + +``` +nextflow run nf-core/raredisease \ + -revision dev \ + -profile test, \ + -c \ + --outdir +``` + +A sample config file can be found [here](https://github.com/nf-core/raredisease/blob/dev/conf/test.config). + +# Tips + +- **Singularity cache:** If you are using singularity, please use the nf-core download command to download images first, before running the pipeline. Setting the NXF_SINGULARITY_CACHEDIR or singularity.cacheDir Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. + +- **Save references:** While the pipeline can generate indices for the fasta and some vcf files when they are not provided, it can be benficial to supply them to the pipeline as it avoids wasting resources. You can use the `--save_reference` parameter to publish those files, and then update your config file to contain the paths to these files for your subsequent runs. + +- **Update pipeline:** If you would like to update the pipeline code stored in cache, in addition to running the command with `-latest` option, you can also run the command below: + +```bash +nextflow pull nf-core/raredisease +``` + +- **Reproducibility:** It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. + +- **Restart a previous run:** Add `-resume` to your command when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. ## Custom configuration ### Resource requests -Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. +Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/raredisease/blob/dev/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. -For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: +For example, if the nf-core/raredisease pipeline is failing after multiple re-submissions of the `DEEPVARIANT` process due to an exit code of `137` this would indicate that there is an out of memory issue: ```console -[62/149eb0] NOTE: Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) -Error executing process > 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' +[62/149eb0] NOTE: Process `NFCORE_RAREDISEASE:RAREDISEASE:CALL_SNV:CALL_SNV_DEEPVARIANT:DEEPVARIANT (earlycasualcaiman)` terminated with an error exit status (137) -- Execution is retried (1) +Error executing process > 'NFCORE_RAREDISEASE:RAREDISEASE:CALL_SNV:CALL_SNV_DEEPVARIANT:DEEPVARIANT (earlycasualcaiman)' Caused by: - Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) + Process `NFCORE_RAREDISEASE:RAREDISEASE:CALL_SNV:CALL_SNV_DEEPVARIANT:DEEPVARIANT (earlycasualcaiman)` terminated with an error exit status (137) Command executed: - STAR \ - --genomeDir star \ - --readFilesIn WT_REP1_trimmed.fq.gz \ - --runThreadN 2 \ - --outFileNamePrefix WT_REP1. \ - + /opt/deepvariant/bin/run_deepvariant \ + --ref=reference.fasta \ + --reads=earlycasualcaiman_sorted_md.bam \ + --output_vcf=earlycasualcaiman_deepvar.vcf.gz \ + --output_gvcf=earlycasualcaiman_deepvar.g.vcf.gz \ + --model_type=WGS \ + \ + --num_shards=2 Command exit status: 137 @@ -156,7 +300,8 @@ Command output: (empty) Command error: - .command.sh: line 9: 30 Killed STAR --genomeDir star --readFilesIn WT_REP1_trimmed.fq.gz --runThreadN 2 --outFileNamePrefix WT_REP1. + .command.sh: line 9: 30 Killed /opt/deepvariant/bin/run_deepvariant --ref=reference.fasta --reads=earlycasualcaiman_sorted_md.bam --output_vcf=earlycasualcaiman_deepvar.vcf.gz --output_gvcf=earlycasualcaiman_deepvar.g.vcf.gz --model_type=WGS --num_shards=2 + Work dir: /home/pipelinetest/work/9d/172ca5881234073e8d76f2a19c88fb @@ -165,27 +310,27 @@ Tip: you can replicate the issue by changing to the process work dir and enterin #### For beginners -A first step to bypass this error, you could try to increase the amount of CPUs, memory, and time for the whole pipeline. Therefor you can try to increase the resource for the parameters `--max_cpus`, `--max_memory`, and `--max_time`. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of rnaseq](https://nf-co.re/rnaseq/3.9/parameters) and scroll down to the `show hidden parameter` button to get the default value for `--max_memory`. In this case 128GB, you than can try to run your pipeline again with `--max_memory 200GB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. +A first step to bypass this error, you could try to increase the amount of CPUs, memory, and time for the whole pipeline. Therefor you can try to increase the resource for the parameters `--max_cpus`, `--max_memory`, and `--max_time`. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of raredisease](https://nf-co.re/raredisease/dev/parameters) and scroll down to the `Click here to show all hidden params.` button to get the default value for `--max_memory`. In this case 128GB, you than can try to run your pipeline again with `--max_memory 200GB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. #### Advanced option on process level -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). -We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/star/align/main.nf`. -If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). +To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process DEEPAVARIANT` in the [nf-core/raredisease Github repo](https://github.com/nf-core/raredisease/search?q=process+DEEPVARIANT). +We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/deepvariant/main.nf`. +If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_medium`](https://github.com/nf-core/raredisease/blob/7a0d47aca1d5b59771af2ce49c320249e379fc23/modules/nf-core/deepvariant/main.nf#L3). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. -The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. -Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. +The default values for the `process_medium` label are set in the pipeline's [`base.config`](https://github.com/nf-core/raredisease/blob/7a0d47aca1d5b59771af2ce49c320249e379fc23/conf/base.config#L39-L43) which in this case is defined as 36GB. +Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `DEEPVARIANT` process failure by creating a custom config file that sets at least 36GB of memory, in this case increased to 72GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. ```nextflow process { - withName: 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN' { - memory = 100.GB + withName: 'NFCORE_RAREDISEASE:RAREDISEASE:CALL_SNV:CALL_SNV_DEEPVARIANT:DEEPVARIANT' { + memory = 72.GB } } ``` -> **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. +> **NB:** We specify the full process name i.e. `NFCORE_RAREDISEASE:RAREDISEASE:CALL_SNV:CALL_SNV_DEEPVARIANT:DEEPVARIANT` in the config file because this takes priority over the short name (`DEEPVARIANT`) and allows existing configuration using the full process name to be correctly overridden. > > If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. @@ -231,12 +376,28 @@ The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementatio ### nf-core/configs -In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. +In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information about creating your own configuration files. If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). +## Run sentieon + +To use sentieon you have to: + +1. Ensure that sentieon executable is in path. +2. If necessary, store license information as a secret in nextflow's local store. +3. Set environmental variable `NXF_ENABLE_SECRETS` to an appropriate value. + +To elaborate more on item #2 in the list above, if you are running nf-core/raredisease with sentieon on AWS or on a local machine where do not want other users to know your license details, we recommend that you use [nextflow's secrets feature](https://www.nextflow.io/docs/latest/secrets.html) to pass the that information. To do that run the command below after replacing LICENSE with the value corresponding to your license server (ex:1.1.1.1:4000) + +``` +nextflow secrets set SENTIEON_LICENSE_BASE64 +``` + +If you are using nextflow secrets, you have to set the environment variable `NXF_ENABLE_SECRETS` to true. This will see to it that the pipeline can retrieve the secret from nextflow's secrets store during the pipeline execution. Keep in mind that versions of nextflow Version 22.09.2-edge and onwards have NXF_ENABLE_SECRETS to true by default. If you are not using secrets set `NXF_ENABLE_SECRETS` to false, but make sure that the environmental variable [`SENTIEON_LICENSE`](`NXF_ENABLE_SECRETS`) is set to reflect the value of your license server on your machine. + ## Azure Resource Requests To be used with the `azurebatch` profile by specifying the `-profile azurebatch`. From dc355d2339c8c0e4718b957db18af20369f91ec2 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Mar 2023 14:42:52 +0100 Subject: [PATCH 1027/1169] update toc --- docs/usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 14177890..455ea5dd 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -7,8 +7,8 @@ Table of contents: - [nf-core/raredisease: Usage](#nf-core-raredisease--usage) - [Introduction](#introduction) - [Prerequisites](#prerequisites) -- [Run nf-core/raredisease with test data] (#run-nf-core-raredisease-with-test-data--a-id--testdata----) -- [Run nf-core/raredisease with your data] (#run-nf-core-raredisease-with-your-data--a-id--owndata----) +- [Run nf-core/raredisease with test data](#run-nf-core-raredisease-with-test-data--a-id--testdata----) +- [Run nf-core/raredisease with your data](#run-nf-core-raredisease-with-your-data--a-id--owndata----) - [Samplesheet](#samplesheet) - [Reference files and parameters](#reference-files-and-parameters) - [1. Alignment](#1-alignment) From 2664b62590662c3443d2bab9dcbe2c002ff050ac Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Mar 2023 15:56:28 +0100 Subject: [PATCH 1028/1169] add categories --- docs/usage.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 455ea5dd..d5ccb891 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -4,7 +4,6 @@ Table of contents: -- [nf-core/raredisease: Usage](#nf-core-raredisease--usage) - [Introduction](#introduction) - [Prerequisites](#prerequisites) - [Run nf-core/raredisease with test data](#run-nf-core-raredisease-with-test-data--a-id--testdata----) @@ -119,7 +118,16 @@ In nf-core/raredisease, references can be supplied using parameters listed [here Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (ex: you can align with either bwamem2 or sentieon, call SNVs with deepvariant or sentieon). You also have the option to turn off parts of the pipeline if you do not want to run them (ex: snv annotation can be turned off by setting `--annotate_snv_switch` flag to false). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters only used by that tool need not be provided. For example, for SNV calling if you decide to use deepvariant as your variant caller, you do not need to provide the parameter `--ml_model`, as it is only used by sentieon. -To help you decide which parameters you need to supply, we have tabulated the mandatory and optional inputs for different features that constitute the pipeline. +nf-core/raredisease consists of several tools used for various purposes. For convienience, we have grouped those tools under the following catergories and tabulated the mandatory and optional parameters for each group below. + +1. Alignment (bwamem2/sentieon) +2. QC stats the alignment files +3. Repeat expansions (Expansionshunter & Stranger) +4. Variant calling - SNV (deepvariant/Sentieon-haplotypecaller) +5. Variant calling - Structural variants (Tiddit & Manta) +6. Annotation & ranking - SNV (rohcall, vcfanno, ensemblvep, genmod) +7. Annotation & ranking - SV (svdb query, ensemblvep, genmod) +8. Mitochondrial analysis workflow > Of the features listed below alignment, qc stats, repeat expansions, snv & sv variant calling are always run by default so the mandatory parameters used by those features will always have to be supplied to the pipeline. From cc1adc78815a9b8d0810eb74bec861af14f24f19 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Mar 2023 15:57:48 +0100 Subject: [PATCH 1029/1169] fix typo --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index d5ccb891..880fada2 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -118,7 +118,7 @@ In nf-core/raredisease, references can be supplied using parameters listed [here Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (ex: you can align with either bwamem2 or sentieon, call SNVs with deepvariant or sentieon). You also have the option to turn off parts of the pipeline if you do not want to run them (ex: snv annotation can be turned off by setting `--annotate_snv_switch` flag to false). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters only used by that tool need not be provided. For example, for SNV calling if you decide to use deepvariant as your variant caller, you do not need to provide the parameter `--ml_model`, as it is only used by sentieon. -nf-core/raredisease consists of several tools used for various purposes. For convienience, we have grouped those tools under the following catergories and tabulated the mandatory and optional parameters for each group below. +nf-core/raredisease consists of several tools used for various purposes. For convenience, we have grouped those tools under the following catergories and tabulated the mandatory and optional parameters for each group below. 1. Alignment (bwamem2/sentieon) 2. QC stats the alignment files From dd135177117a4e05b3ef7d80b074fdf0ddd493c6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 9 Mar 2023 18:20:56 +0100 Subject: [PATCH 1030/1169] update section headers --- docs/usage.md | 122 +++++++++++++++++++++++++------------------------- 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 880fada2..15202fae 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -4,34 +4,36 @@ Table of contents: +- [nf-core/raredisease: Usage](#nf-core-raredisease--usage) - [Introduction](#introduction) - [Prerequisites](#prerequisites) -- [Run nf-core/raredisease with test data](#run-nf-core-raredisease-with-test-data--a-id--testdata----) -- [Run nf-core/raredisease with your data](#run-nf-core-raredisease-with-your-data--a-id--owndata----) +- [Run nf-core/raredisease with test data](#run-nf-core-raredisease-with-test-data) +- [Run nf-core/raredisease with your data](#run-nf-core-raredisease-with-your-data) - [Samplesheet](#samplesheet) - [Reference files and parameters](#reference-files-and-parameters) - [1. Alignment](#1-alignment) - - [2. QC stats from alignment files](#2-qc-stats-from-alignment-files) + - [2. QC stats from the alignment files](#2-qc-stats-from-the-alignment-files) - [3. Repeat expansions](#3-repeat-expansions) - [4. Variant calling - SNV](#4-variant-calling---snv) - [5. Variant calling - Structural variants](#5-variant-calling---structural-variants) - - [6. Annotation & Ranking - SNV](#6-annotation---ranking---snv) - - [7. Annotation & Ranking - SV](#7-annotation---ranking---sv) - - [8. Mitochondrial analysis workflow](#8-mitochondrial-analysis-workflow) + - [6. SNV annotation & Ranking](#6-snv-annotation---ranking) + - [7. SV annotation & Ranking](#7-sv-annotation---ranking) + - [8. Mitochondrial analysis](#8-mitochondrial-analysis) - [Run the pipeline](#run-the-pipeline) - - [Command line](#command-line) - - [Config file](#config-file) -- [Tips](#tips) - - [Custom configuration](#custom-configuration) - - [Resource requests](#resource-requests) - - [For beginners](#for-beginners) - - [Advanced option on process level](#advanced-option-on-process-level) - - [Updating containers (advanced users)](#updating-containers--advanced-users-) - - [nf-core/configs](#nf-core-configs) - - [Run sentieon](#run-sentieon) - - [Azure Resource Requests](#azure-resource-requests) - - [Running in the background](#running-in-the-background) - - [Nextflow memory requirements](#nextflow-memory-requirements) + - [Direct input in cli](#direct-input-in-cli) + - [Import from a config file (recommended)](#import-from-a-config-file--recommended-) +- [Best practices](#best-practices) +- [Troubleshooting](#troubleshooting) + - [Resource errors](#resource-errors) + - [For beginners](#for-beginners) + - [Advanced option on process level](#advanced-option-on-process-level) +- [Custom configuration](#custom-configuration) + - [Updating containers (advanced users)](#updating-containers--advanced-users-) + - [nf-core/configs](#nf-core-configs) + * [Run sentieon](#run-sentieon) + * [Azure Resource Requests](#azure-resource-requests) + * [Running in the background](#running-in-the-background) + * [Nextflow memory requirements](#nextflow-memory-requirements) # Introduction @@ -62,7 +64,7 @@ nextflow run nf-core/raredisease \ The above command downloads the pipeline from github, caches it, and tests it on the test dataset. -> When you run the command again, it will fetch the pipeline from cache even if the remote version of the pipeline is available. To make sure that you're running the latest version of the pipeline, update the cached version of the pipeline by including `-latest` in the command. +> When you run the command again, it will fetch the pipeline from cache even if a latest version of the pipeline is available. To make sure that you're running the latest version of the pipeline, update the cached version of the pipeline by including `-latest` in the command. Test profile runs the pipeline with a proband containing three samples, but if you would like to test the pipeline with one sample, use `-profile test_one_sample,`. @@ -85,23 +87,23 @@ Running the pipeline involves three steps: ### Samplesheet -A samplesheet is used to pass the information about the sample(s), such as the path to the fastq files and other meta data (gender, phenotype, etc.,) to the pipeline. +A samplesheet is used to pass the information about the sample(s), such as the path to the fastq files and other meta data (gender, phenotype, etc.,) to the pipeline in csv format. nf-core/raredisease will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information in the samplesheet (sex/gender and phenotype) should be provided as they would be for a [ped file](https://gatk.broadinstitute.org/hc/en-us/articles/360035531972-PED-Pedigree-format) (i.e. 1 for male, 2 for female, other for unknown). -| Column | Description | +| Fields | Description | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | | `lane` | Used to generate seperate channels during the alignment step | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_1` | Absolute path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Absolute path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | | `gender` | Sex (1=male; 2=female; other=unknown) | | `phenotype` | Affected status of patient (0 = missing; 1=unaffected; 2=affected) | -| `paternal_id` | Sample ID of the father, can be blank if the father isn't part of the analysis or for other samples than the proband. | -| `maternal_id` | Sample ID of the mother, can be blank if the mother isn't part of the analysis or for other samples than the proband. | +| `paternal_id` | Sample ID of the father, can be blank if the father isn't part of the analysis or for samples other than the proband. | +| `maternal_id` | Sample ID of the mother, can be blank if the mother isn't part of the analysis or for samples other than the proband. | | `case_id` | Case ID, for the analysis used when generating a family VCF | -It is also possible to include multiple runs of the same sample in a samplesheet like when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. In that case, the `sample` identifiers in the samplesheet have to be the same. The pipeline will align the raw read/read-pairs independently before merging the alignments belonging to the same sample. Below is an example for a trio with the proband sequenced across 2 lanes: +It is also possible to include multiple runs of the same sample in a samplesheet. For example, when you have re-sequenced the same sample more than once to increase sequencing depth. In that case, the `sample` identifiers in the samplesheet have to be the same. The pipeline will align the raw read/read-pairs independently before merging the alignments belonging to the same sample. Below is an example for a trio with the proband sequenced across 2 lanes: | sample | lane | fastq_1 | fastq_2 | gender | phenotype | paternal_id | maternal_id | case_id | | -------- | ---- | -------------------------------- | -------------------------------- | ------ | --------- | ----------- | ----------- | ------- | @@ -116,20 +118,22 @@ If you would like to see more examples of what a typical samplesheet looks like In nf-core/raredisease, references can be supplied using parameters listed [here](https://nf-co.re/raredisease/dev/parameters). -Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (ex: you can align with either bwamem2 or sentieon, call SNVs with deepvariant or sentieon). You also have the option to turn off parts of the pipeline if you do not want to run them (ex: snv annotation can be turned off by setting `--annotate_snv_switch` flag to false). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters only used by that tool need not be provided. For example, for SNV calling if you decide to use deepvariant as your variant caller, you do not need to provide the parameter `--ml_model`, as it is only used by sentieon. +Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (example, you can align with either bwamem2 or sentieon, call SNVs with DeepVariant or sentieon). You also have the option to turn off sections of the pipeline if you do not want to run them (example, snv annotation can be turned off by setting `--annotate_snv_switch` flag to false). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by sentieon. -nf-core/raredisease consists of several tools used for various purposes. For convenience, we have grouped those tools under the following catergories and tabulated the mandatory and optional parameters for each group below. +nf-core/raredisease consists of several tools used for various purposes. For convenience, we have grouped those tools under the following catergories: 1. Alignment (bwamem2/sentieon) -2. QC stats the alignment files +2. QC stats from the alignment files 3. Repeat expansions (Expansionshunter & Stranger) -4. Variant calling - SNV (deepvariant/Sentieon-haplotypecaller) +4. Variant calling - SNV (DeepVariant/Sentieon-haplotypecaller) 5. Variant calling - Structural variants (Tiddit & Manta) -6. Annotation & ranking - SNV (rohcall, vcfanno, ensemblvep, genmod) -7. Annotation & ranking - SV (svdb query, ensemblvep, genmod) -8. Mitochondrial analysis workflow +6. SNV annotation & ranking (rohcall, vcfanno, ensemblvep, genmod) +7. SV annotation & ranking (svdb query, ensemblvep, genmod) +8. Mitochondrial analysis -> Of the features listed below alignment, qc stats, repeat expansions, snv & sv variant calling are always run by default so the mandatory parameters used by those features will always have to be supplied to the pipeline. +The mandatory and optional parameters for each category are tabulated below. + +> Alignment, qc stats, repeat expansions, snv & sv variant calling are run by default. Hence, the mandatory parameters used by those features will always have to be provided to the pipeline. #### 1. Alignment @@ -144,7 +148,7 @@ nf-core/raredisease consists of several tools used for various purposes. For con 2fasta_fai and bwamem2_index, if not provided by the user, will be generated by the pipeline when necessary. 3Used only by sentieon. -#### 2. QC stats from alignment files +#### 2. QC stats from the alignment files | Mandatory | Optional | | ------------------------------------------------------------ | -------- | @@ -169,7 +173,7 @@ nf-core/raredisease consists of several tools used for various purposes. For con | analysis_type 3 | call_interval2 | | | known_dbsnp_tbi2 | -1Default variant caller is deepvariant, but you have the option to use sentieon as well. +1Default variant caller is DeepVariant, but you have the option to use sentieon as well. 2These parameters are only used by sentieon. 3Default is WGS, but you have the option to choose WES as well. @@ -180,7 +184,7 @@ nf-core/raredisease consists of several tools used for various purposes. For con | | target_bed | | | bwa_index | -#### 6. Annotation & Ranking - SNV +#### 6. SNV annotation & Ranking | Mandatory | Optional | | ----------------------------- | ------------------------------ | @@ -196,7 +200,7 @@ nf-core/raredisease consists of several tools used for various purposes. For con 4Gnomad vcf file can be downloaded from here https://gnomad.broadinstitute.org/downloads. 5Used by genmod while ranking the variants. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv). -#### 7. Annotation & Ranking - SV +#### 7. SV annotation & Ranking | Mandatory | Optional | | -------------------------- | ------------------ | @@ -207,7 +211,7 @@ nf-core/raredisease consists of several tools used for various purposes. For con 1 A csv file that describes the databases(vcfs) used by svdb for annotating structural variants. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/svdb_querydb_files.csv). Information about the column headers can be found [here](https://github.com/J35P312/SVDB#Query). -#### 8. Mitochondrial analysis workflow +#### 8. Mitochondrial analysis | Mandatory | Optional | | ------------------------------- | -------- | @@ -226,14 +230,11 @@ nf-core/raredisease consists of several tools used for various purposes. For con ### Run the pipeline -There are two possible approaches you can take to supply samplesheet and reference data to the pipeline while starting a run. - -1. Command line -2. Config file +You can directly supply the parameters in the command line (cli) or use a config file from which the pipeline can import the parameters. -#### Command line +#### Direct input in cli -All of the pipeline parameters listed [here](https://nf-co.re/raredisease/dev/parameters) can be passed from the command line. For example, you can provide the samplesheet, reference fasta, and turn off annotations for SNVs and SVs by running, +All of the pipeline parameters listed [here](https://nf-co.re/raredisease/dev/parameters) can be passed using the cli. For example, you can provide the samplesheet, reference fasta, and turn off annotations for SNVs and SVs by running, ``` nextflow run nf-core/raredisease \ @@ -246,9 +247,9 @@ nextflow run nf-core/raredisease \ --outdir ``` -#### Config file +#### Import from a config file (recommended) -While one can quickly supply/change the default parameters easily from the command line, it can easily become confusing so we recommend using a config file instead. In such cases, one can create a config file that contains all the parameters and pass that file from the command line instead. +To input or change the default parameters, we recommend using a config file instead. Create a config file that contains all the parameters and supply that file as shown below. ``` nextflow run nf-core/raredisease \ @@ -260,11 +261,11 @@ nextflow run nf-core/raredisease \ A sample config file can be found [here](https://github.com/nf-core/raredisease/blob/dev/conf/test.config). -# Tips +# Best practices -- **Singularity cache:** If you are using singularity, please use the nf-core download command to download images first, before running the pipeline. Setting the NXF_SINGULARITY_CACHEDIR or singularity.cacheDir Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. +- **Singularity cache:** If you are using singularity, use the nf-core download command to download images first, before running the pipeline. Define [NXF_SINGULARITY_CACHEDIR](https://nextflow.io/docs/latest/config.html?highlight=nxf_singularity_cachedir#environment-variables) or singularity.cacheDir Nextflow options to store and re-use the images from a central location for future pipeline runs. -- **Save references:** While the pipeline can generate indices for the fasta and some vcf files when they are not provided, it can be benficial to supply them to the pipeline as it avoids wasting resources. You can use the `--save_reference` parameter to publish those files, and then update your config file to contain the paths to these files for your subsequent runs. +- **Save references:** While the pipeline can generate indices for the fasta and some vcf files when they are not provided, it can be benficial to supply them to the pipeline as it saves computing resources. You can use the `--save_reference` parameter to publish those files, and then update your config file with the paths to these files for your subsequent runs. - **Update pipeline:** If you would like to update the pipeline code stored in cache, in addition to running the command with `-latest` option, you can also run the command below: @@ -272,13 +273,13 @@ A sample config file can be found [here](https://github.com/nf-core/raredisease/ nextflow pull nf-core/raredisease ``` -- **Reproducibility:** It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. +- **Reproducibility:** Specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r`, for example, `-r 1.3.1`. You can switch to another version by changing the number after the `-r` flag. This version number will be logged in reports when you run the pipeline. For example, you can view the version number at the bottom of the MultiQC reports. -- **Restart a previous run:** Add `-resume` to your command when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. +- **Restart a previous run:** Add `-resume` to your command when restarting a pipeline. Nextflow will use cached results from any pipeline steps where inputs are the same, and resume the run from where it terminated previously. For input to be considered the same, names and the files' contents must be identical. For more info about `-resume`, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. -## Custom configuration +# Troubleshooting -### Resource requests +### Resource errors Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/raredisease/blob/dev/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. @@ -318,17 +319,16 @@ Tip: you can replicate the issue by changing to the process work dir and enterin #### For beginners -A first step to bypass this error, you could try to increase the amount of CPUs, memory, and time for the whole pipeline. Therefor you can try to increase the resource for the parameters `--max_cpus`, `--max_memory`, and `--max_time`. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of raredisease](https://nf-co.re/raredisease/dev/parameters) and scroll down to the `Click here to show all hidden params.` button to get the default value for `--max_memory`. In this case 128GB, you than can try to run your pipeline again with `--max_memory 200GB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. +nf-core/raredisease provides you with options to increase the amount of CPUs(`--max_cpus`), memory(`--max_memory`), and time (`--max_time`) for the whole pipeline. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of raredisease](https://nf-co.re/raredisease/dev/parameters) and click `show hidden params` button in the right panel to get the default value for `--max_memory`. Run the pipeline with updated max_memory value `--max_memory xxxGB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. #### Advanced option on process level -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process DEEPAVARIANT` in the [nf-core/raredisease Github repo](https://github.com/nf-core/raredisease/search?q=process+DEEPVARIANT). +To bypass this error you would need to find exactly which resources are set by the `DEEPVARIANT` process. The quickest way is to search for `process DEEPAVARIANT` in the [nf-core/raredisease Github repo](https://github.com/nf-core/raredisease/search?q=process+DEEPVARIANT). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/deepvariant/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_medium`](https://github.com/nf-core/raredisease/blob/7a0d47aca1d5b59771af2ce49c320249e379fc23/modules/nf-core/deepvariant/main.nf#L3). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. -The default values for the `process_medium` label are set in the pipeline's [`base.config`](https://github.com/nf-core/raredisease/blob/7a0d47aca1d5b59771af2ce49c320249e379fc23/conf/base.config#L39-L43) which in this case is defined as 36GB. -Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `DEEPVARIANT` process failure by creating a custom config file that sets at least 36GB of memory, in this case increased to 72GB. -The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. +The default memory value for the `process_medium` label is set in the pipeline's [`base.config`](https://github.com/nf-core/raredisease/blob/7a0d47aca1d5b59771af2ce49c320249e379fc23/conf/base.config#L39-L43), which in this case is 36GB. +We can try and bypass the `DEEPVARIANT` process failure by creating a custom config file that increases the memory limit from 36GB to 72GB (NB: verify that the value set by --max_memory is above 72GB). The custom config below can then be provided to the pipeline via the `-c` parameter as highlighted in previous sections. ```nextflow process { @@ -342,6 +342,8 @@ process { > > If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. +# Custom configuration + ### Updating containers (advanced users) The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. From 9937194bf61aae640388e5ee8488aac7a2d26461 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 10 Mar 2023 13:50:22 +0100 Subject: [PATCH 1031/1169] review suggestions --- docs/usage.md | 154 ++++++++++++++++++++++++++------------------------ 1 file changed, 79 insertions(+), 75 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 15202fae..59ccc5c4 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -5,47 +5,47 @@ Table of contents: - [nf-core/raredisease: Usage](#nf-core-raredisease--usage) -- [Introduction](#introduction) -- [Prerequisites](#prerequisites) -- [Run nf-core/raredisease with test data](#run-nf-core-raredisease-with-test-data) -- [Run nf-core/raredisease with your data](#run-nf-core-raredisease-with-your-data) - - [Samplesheet](#samplesheet) - - [Reference files and parameters](#reference-files-and-parameters) - - [1. Alignment](#1-alignment) - - [2. QC stats from the alignment files](#2-qc-stats-from-the-alignment-files) - - [3. Repeat expansions](#3-repeat-expansions) - - [4. Variant calling - SNV](#4-variant-calling---snv) - - [5. Variant calling - Structural variants](#5-variant-calling---structural-variants) - - [6. SNV annotation & Ranking](#6-snv-annotation---ranking) - - [7. SV annotation & Ranking](#7-sv-annotation---ranking) - - [8. Mitochondrial analysis](#8-mitochondrial-analysis) - - [Run the pipeline](#run-the-pipeline) - - [Direct input in cli](#direct-input-in-cli) - - [Import from a config file (recommended)](#import-from-a-config-file--recommended-) -- [Best practices](#best-practices) -- [Troubleshooting](#troubleshooting) - - [Resource errors](#resource-errors) - - [For beginners](#for-beginners) - - [Advanced option on process level](#advanced-option-on-process-level) -- [Custom configuration](#custom-configuration) - - [Updating containers (advanced users)](#updating-containers--advanced-users-) - - [nf-core/configs](#nf-core-configs) - * [Run sentieon](#run-sentieon) - * [Azure Resource Requests](#azure-resource-requests) - * [Running in the background](#running-in-the-background) - * [Nextflow memory requirements](#nextflow-memory-requirements) - -# Introduction + - [Introduction](#introduction) + - [Prerequisites](#prerequisites) + - [Run nf-core/raredisease with test data](#run-nf-core-raredisease-with-test-data) + - [Run nf-core/raredisease with your data](#run-nf-core-raredisease-with-your-data) + - [Samplesheet](#samplesheet) + - [Reference files and parameters](#reference-files-and-parameters) + - [1. Alignment](#1-alignment) + - [2. QC stats from the alignment files](#2-qc-stats-from-the-alignment-files) + - [3. Repeat expansions](#3-repeat-expansions) + - [4. Variant calling - SNV](#4-variant-calling---snv) + - [5. Variant calling - Structural variants](#5-variant-calling---structural-variants) + - [6. SNV annotation & Ranking](#6-snv-annotation---ranking) + - [7. SV annotation & Ranking](#7-sv-annotation---ranking) + - [8. Mitochondrial analysis](#8-mitochondrial-analysis) + - [Run the pipeline](#run-the-pipeline) + - [Direct input in cli](#direct-input-in-cli) + - [Import from a config file (recommended)](#import-from-a-config-file--recommended-) + - [Best practices](#best-practices) + - [Troubleshooting](#troubleshooting) + - [Resource errors](#resource-errors) + - [For beginners](#for-beginners) + - [Advanced option on process level](#advanced-option-on-process-level) + - [Custom configuration](#custom-configuration) + - [Updating containers (advanced users)](#updating-containers--advanced-users-) + - [nf-core/configs](#nf-core-configs) + - [Run sentieon](#run-sentieon) + - [Azure Resource Requests](#azure-resource-requests) + - [Running in the background](#running-in-the-background) + - [Nextflow memory requirements](#nextflow-memory-requirements) + +## Introduction nf-core/raredisease is a bioinformatics best-practice analysis pipeline to call, annotate and score variants from WGS/WES of rare disease patients. The pipeline is built using nextflow. -# Prerequisites +## Prerequisites 1. Install Nextflow (>=22.10.1) using the instructions [here.](https://nextflow.io/docs/latest/getstarted.html#installation) 2. Install one of the following technologies for full pipeline reproducibility: Docker, Singularity, Podman, Shifter or Charliecloud. > Almost all nf-core pipelines give you the option to use conda as well. However, some tools used in the raredisease pipeline do not have a conda package so we do not support conda at the moment. -# Run nf-core/raredisease with test data +## Run nf-core/raredisease with test data Before running the pipeline with your data, we recommend running it with the test dataset available [here](https://github.com/nf-core/test-datasets/tree/raredisease). @@ -64,7 +64,7 @@ nextflow run nf-core/raredisease \ The above command downloads the pipeline from github, caches it, and tests it on the test dataset. -> When you run the command again, it will fetch the pipeline from cache even if a latest version of the pipeline is available. To make sure that you're running the latest version of the pipeline, update the cached version of the pipeline by including `-latest` in the command. +> When you run the command again, it will fetch the pipeline from cache even if a more recent version of the pipeline is available. To make sure that you're running the latest version of the pipeline, update the cached version of the pipeline by including `-latest` in the command. Test profile runs the pipeline with a proband containing three samples, but if you would like to test the pipeline with one sample, use `-profile test_one_sample,`. @@ -77,7 +77,7 @@ work # Directory containing the nextflow working files # Other nextflow hidden files, like history of pipeline logs. ``` -# Run nf-core/raredisease with your data +## Run nf-core/raredisease with your data Running the pipeline involves three steps: @@ -85,7 +85,7 @@ Running the pipeline involves three steps: 2. Gather all required references 3. Supply samplesheet and references, and run the command -### Samplesheet +#### Samplesheet A samplesheet is used to pass the information about the sample(s), such as the path to the fastq files and other meta data (gender, phenotype, etc.,) to the pipeline in csv format. @@ -114,7 +114,7 @@ It is also possible to include multiple runs of the same sample in a samplesheet If you would like to see more examples of what a typical samplesheet looks like for a singleton and a trio, follow these links, [singleton](https://github.com/nf-core/test-datasets/blob/raredisease/testdata/samplesheet_single.csv) and [trio](https://github.com/nf-core/test-datasets/blob/raredisease/testdata/samplesheet_trio.csv). -### Reference files and parameters +#### Reference files and parameters In nf-core/raredisease, references can be supplied using parameters listed [here](https://nf-co.re/raredisease/dev/parameters). @@ -131,11 +131,13 @@ nf-core/raredisease consists of several tools used for various purposes. For con 7. SV annotation & ranking (svdb query, ensemblvep, genmod) 8. Mitochondrial analysis +> We have only listed the groups that require at least one input from the user. For example, the pipeline also runs smncopynumbercaller, but it does not require any input other than the bam files passed by the pipeline. Hence, it is not mentioned in the list above. To know more about the tools used in the pipeline check [README](../README.md). + The mandatory and optional parameters for each category are tabulated below. > Alignment, qc stats, repeat expansions, snv & sv variant calling are run by default. Hence, the mandatory parameters used by those features will always have to be provided to the pipeline. -#### 1. Alignment +##### 1. Alignment | Mandatory | Optional | | ------------------- | --------------------------- | @@ -144,11 +146,11 @@ The mandatory and optional parameters for each category are tabulated below. | platform | known_dbsnp3 | | | known_dbsnp_tbi3 | -1Default value is bwamem2, but if you have a valid license for sentieon, you have the option to use sentieon as well. -2fasta_fai and bwamem2_index, if not provided by the user, will be generated by the pipeline when necessary. -3Used only by sentieon. +1Default value is bwamem2, but if you have a valid license for sentieon, you have the option to use sentieon as well.
    +2fasta_fai and bwamem2_index, if not provided by the user, will be generated by the pipeline when necessary.
    +3Used only by sentieon.
    -#### 2. QC stats from the alignment files +##### 2. QC stats from the alignment files | Mandatory | Optional | | ------------------------------------------------------------ | -------- | @@ -158,13 +160,13 @@ The mandatory and optional parameters for each category are tabulated below. 1 If a target_bed file is provided, bait_intervals and target_intervals can be generated by the pipeline. -#### 3. Repeat expansions +##### 3. Repeat expansions | Mandatory | Optional | | --------------- | -------- | | variant_catalog | | -#### 4. Variant calling - SNV +##### 4. Variant calling - SNV | Mandatory | Optional | | -------------------------- | --------------------------- | @@ -173,34 +175,36 @@ The mandatory and optional parameters for each category are tabulated below. | analysis_type 3 | call_interval2 | | | known_dbsnp_tbi2 | -1Default variant caller is DeepVariant, but you have the option to use sentieon as well. -2These parameters are only used by sentieon. -3Default is WGS, but you have the option to choose WES as well. +1Default variant caller is DeepVariant, but you have the option to use sentieon as well.
    +2These parameters are only used by sentieon.
    +3Default is WGS, but you have the option to choose WES as well.
    -#### 5. Variant calling - Structural variants +##### 5. Variant calling - Structural variants | Mandatory | Optional | | --------- | ---------- | | | target_bed | | | bwa_index | -#### 6. SNV annotation & Ranking +##### 6. SNV annotation & Ranking | Mandatory | Optional | | ----------------------------- | ------------------------------ | | genome1 | gnomad_af4 | | vcfanno_resources2 | reduced_penetrance5 | | vcfanno_toml3 | vcfanno_lua | -| vep_cache_version | vep_filters | -| vep_cache | | +| vep_cache_version | vep_filters6 | +| vep_cache | score_config_snv7 | -1Genome version is used by vep. You have the option to choose between GRCh37 and GRCh38. -2Path to vcf files and their indices used by vcfanno. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/vcfanno_resources.txt). -3Path to a vcfanno configration file. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/vcfanno_config.toml). -4Gnomad vcf file can be downloaded from here https://gnomad.broadinstitute.org/downloads. -5Used by genmod while ranking the variants. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv). +1Genome version is used by vep. You have the option to choose between GRCh37 and GRCh38.
    +2Path to vcf files and their indices used by vcfanno. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_resources.txt).
    +3Path to a vcfanno configration file. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_config.toml).
    +4Gnomad vcf file can be downloaded from here https://gnomad.broadinstitute.org/downloads.
    +5Used by genmod while modeling the variants. Contains a list of loci that show [reduced penetrance](https://medlineplus.gov/genetics/understanding/inheritance/penetranceexpressivity/) in people. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv).
    +6 This file contains a list of candidate genes(HGNC ids) that is used to split the variants into a canditate variants and research variants. Research variants contain all the variants. While candidate variants are a subset of research variants and are associated with candidate genes. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/hgnc.txt).
    +7Used by genmod for ranking the variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/rank_model_snv.ini).
    -#### 7. SV annotation & Ranking +##### 7. SV annotation & Ranking | Mandatory | Optional | | -------------------------- | ------------------ | @@ -209,9 +213,9 @@ The mandatory and optional parameters for each category are tabulated below. | vep_cache_version | vep_filters | | vep_cache | | -1 A csv file that describes the databases(vcfs) used by svdb for annotating structural variants. Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/svdb_querydb_files.csv). Information about the column headers can be found [here](https://github.com/J35P312/SVDB#Query). +1 A csv file that describes the databases(vcfs) used by svdb for annotating structural variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/svdb_querydb_files.csv). Information about the column headers can be found [here](https://github.com/J35P312/SVDB#Query). -#### 8. Mitochondrial analysis +##### 8. Mitochondrial analysis | Mandatory | Optional | | ------------------------------- | -------- | @@ -226,13 +230,13 @@ The mandatory and optional parameters for each category are tabulated below. | vep_cache_version | | | vep_cache | | -1 Can be generated by GATK's [ShiftFasta](https://gatk.broadinstitute.org/hc/en-us/articles/9570501436827-ShiftFasta-BETA-). Sample file [here](https://github.com/ramprasadn/test-datasets/blob/raredisease/reference/mt_shift8000.back_chain). +1 Can be generated by GATK's [ShiftFasta](https://gatk.broadinstitute.org/hc/en-us/articles/9570501436827-ShiftFasta-BETA-). Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/mt_shift8000.back_chain). -### Run the pipeline +#### Run the pipeline You can directly supply the parameters in the command line (cli) or use a config file from which the pipeline can import the parameters. -#### Direct input in cli +##### Direct input in cli All of the pipeline parameters listed [here](https://nf-co.re/raredisease/dev/parameters) can be passed using the cli. For example, you can provide the samplesheet, reference fasta, and turn off annotations for SNVs and SVs by running, @@ -247,7 +251,7 @@ nextflow run nf-core/raredisease \ --outdir ``` -#### Import from a config file (recommended) +##### Import from a config file (recommended) To input or change the default parameters, we recommend using a config file instead. Create a config file that contains all the parameters and supply that file as shown below. @@ -261,7 +265,7 @@ nextflow run nf-core/raredisease \ A sample config file can be found [here](https://github.com/nf-core/raredisease/blob/dev/conf/test.config). -# Best practices +## Best practices - **Singularity cache:** If you are using singularity, use the nf-core download command to download images first, before running the pipeline. Define [NXF_SINGULARITY_CACHEDIR](https://nextflow.io/docs/latest/config.html?highlight=nxf_singularity_cachedir#environment-variables) or singularity.cacheDir Nextflow options to store and re-use the images from a central location for future pipeline runs. @@ -277,9 +281,9 @@ nextflow pull nf-core/raredisease - **Restart a previous run:** Add `-resume` to your command when restarting a pipeline. Nextflow will use cached results from any pipeline steps where inputs are the same, and resume the run from where it terminated previously. For input to be considered the same, names and the files' contents must be identical. For more info about `-resume`, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. -# Troubleshooting +## Troubleshooting -### Resource errors +#### Resource errors Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/raredisease/blob/dev/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. @@ -317,11 +321,11 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` -#### For beginners +##### For beginners nf-core/raredisease provides you with options to increase the amount of CPUs(`--max_cpus`), memory(`--max_memory`), and time (`--max_time`) for the whole pipeline. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of raredisease](https://nf-co.re/raredisease/dev/parameters) and click `show hidden params` button in the right panel to get the default value for `--max_memory`. Run the pipeline with updated max_memory value `--max_memory xxxGB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. -#### Advanced option on process level +##### Advanced option on process level To bypass this error you would need to find exactly which resources are set by the `DEEPVARIANT` process. The quickest way is to search for `process DEEPAVARIANT` in the [nf-core/raredisease Github repo](https://github.com/nf-core/raredisease/search?q=process+DEEPVARIANT). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/deepvariant/main.nf`. @@ -342,9 +346,9 @@ process { > > If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. -# Custom configuration +## Custom configuration -### Updating containers (advanced users) +#### Updating containers (advanced users) The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. @@ -384,7 +388,7 @@ The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementatio > **NB:** If you wish to periodically update individual tool-specific results (e.g. Pangolin) generated by the pipeline then you must ensure to keep the `work/` directory otherwise the `-resume` ability of the pipeline will be compromised and it will restart from scratch. -### nf-core/configs +#### nf-core/configs In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. @@ -392,7 +396,7 @@ See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -## Run sentieon +### Run sentieon To use sentieon you have to: @@ -408,7 +412,7 @@ nextflow secrets set SENTIEON_LICENSE_BASE64 If you are using nextflow secrets, you have to set the environment variable `NXF_ENABLE_SECRETS` to true. This will see to it that the pipeline can retrieve the secret from nextflow's secrets store during the pipeline execution. Keep in mind that versions of nextflow Version 22.09.2-edge and onwards have NXF_ENABLE_SECRETS to true by default. If you are not using secrets set `NXF_ENABLE_SECRETS` to false, but make sure that the environmental variable [`SENTIEON_LICENSE`](`NXF_ENABLE_SECRETS`) is set to reflect the value of your license server on your machine. -## Azure Resource Requests +### Azure Resource Requests To be used with the `azurebatch` profile by specifying the `-profile azurebatch`. We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by default but these options can be changed if required. @@ -416,7 +420,7 @@ We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by de Note that the choice of VM size depends on your quota and the overall workload during the analysis. For a thorough list, please refer the [Azure Sizes for virtual machines in Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). -## Running in the background +### Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. @@ -425,7 +429,7 @@ The Nextflow `-bg` flag launches Nextflow in the background, detached from your Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). -## Nextflow memory requirements +### Nextflow memory requirements In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): From b1962d3cb9d733f4b0772e0b67fe04d342f15586 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 11 Mar 2023 16:00:27 +0100 Subject: [PATCH 1032/1169] update align subworkflows --- subworkflows/local/alignment/align_bwamem2.nf | 28 +++++++++---------- .../local/alignment/align_sentieon.nf | 24 ++++++++-------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 4e749a01..774089b3 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -12,17 +12,17 @@ include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../../modules/nf-c workflow ALIGN_BWAMEM2 { take: - reads_input // channel: [ val(meta), reads_input ] - index // channel: [ /path/to/bwamem2/index/ ] - fasta // channel: [genome.fasta] - fai // channel: [genome.fai] - platform // params.platform + ch_reads_input // channel: [mandatory] [ val(meta), path(reads_input) ] + ch_index // channel: [mandatory] [ path(bwamem2_index) ] + ch_fasta // channel: [mandatory] [ path(genome.fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + val_platform // string: [mandatory] val(platform) main: ch_versions = Channel.empty() // Map, sort, and index - BWAMEM2_MEM ( reads_input, index, true ) + BWAMEM2_MEM ( ch_reads_input, ch_index, true ) SAMTOOLS_INDEX_ALIGN ( BWAMEM2_MEM.out.bam ) @@ -35,7 +35,7 @@ workflow ALIGN_BWAMEM2 { .map{ meta, bam -> new_meta = meta.clone() new_meta.id = new_meta.id.split('_')[0] - new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + platform + "\\tSM:" + new_meta.id + "\'" + new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + val_platform + "\\tSM:" + new_meta.id + "\'" [new_meta, bam] } .groupTuple(by: 0) @@ -46,11 +46,11 @@ workflow ALIGN_BWAMEM2 { .set{ bams } // If there are no samples to merge, skip the process - SAMTOOLS_MERGE ( bams.multiple, fasta, fai ) + SAMTOOLS_MERGE ( bams.multiple, ch_fasta, ch_fai ) prepared_bam = bams.single.mix(SAMTOOLS_MERGE.out.bam) // Marking duplicates - MARKDUPLICATES ( prepared_bam , fasta, fai ) + MARKDUPLICATES ( prepared_bam , ch_fasta, ch_fai ) SAMTOOLS_INDEX_MARKDUP ( MARKDUPLICATES.out.bam ) ch_versions = ch_versions.mix(BWAMEM2_MEM.out.versions.first()) @@ -61,9 +61,9 @@ workflow ALIGN_BWAMEM2 { ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MARKDUP.out.versions.first()) emit: - stats = SAMTOOLS_STATS.out.stats - metrics = MARKDUPLICATES.out.metrics - marked_bam = MARKDUPLICATES.out.bam - marked_bai = SAMTOOLS_INDEX_MARKDUP.out.bai - versions = ch_versions + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] + metrics = MARKDUPLICATES.out.metrics // channel: [ val(meta), path(metrics) ] + marked_bam = MARKDUPLICATES.out.bam // channel: [ val(meta), path(bam) ] + marked_bai = SAMTOOLS_INDEX_MARKDUP.out.bai // channel: [ val(meta), path(bai) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index 4076b8dd..04a03d7c 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -11,13 +11,13 @@ include { SENTIEON_READWRITER } from '../../../modules/local/sentieon/readwr workflow ALIGN_SENTIEON { take: - reads_input // channel: [ val(meta), reads_input ] - fasta // path: genome.fasta - fai // path: genome.fai - index // channel: [ /path/to/bwamem2/index/ ] - known_dbsnp // path: params.known_dbsnp - known_dbsnp_tbi // path: params.known_dbsnp - platform // value: params.platform + ch_reads_input // channel: [mandatory] [ val(meta), path(reads_input) ] + ch_fasta // channel: [mandatory] [ path(genome.fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_index // channel: [mandatory] [ path(bwamem2_index) ] + ch_known_dbsnp // channel: [mandatory] [ path(known_dbsnp) ] + ch_known_dbsnp_tbi // channel: [mandatory] [ path(known_dbsnp_tbi) ] + val_platform // string: [mandatory] val(platform) main: ch_versions = Channel.empty() @@ -25,7 +25,7 @@ workflow ALIGN_SENTIEON { ch_bqsr_bai = Channel.empty() ch_bqsr_csv = Channel.empty() - SENTIEON_BWAMEM ( reads_input, fasta, fai, index ) + SENTIEON_BWAMEM ( ch_reads_input, ch_fasta, ch_fai, ch_index ) SENTIEON_BWAMEM.out .bam @@ -33,7 +33,7 @@ workflow ALIGN_SENTIEON { .map{ meta, bam, bai -> new_meta = meta.clone() new_meta.id = new_meta.id.split('_')[0] - new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + platform + "\\tSM:" + new_meta.id + "\'" + new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + val_platform + "\\tSM:" + new_meta.id + "\'" [new_meta, bam, bai] } .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] @@ -46,7 +46,7 @@ workflow ALIGN_SENTIEON { SENTIEON_READWRITER (merge_bams_in.multiple) ch_bam_bai = merge_bams_in.single.mix(SENTIEON_READWRITER.out.bam_bai) - SENTIEON_DATAMETRICS (ch_bam_bai, fasta, fai ) + SENTIEON_DATAMETRICS (ch_bam_bai, ch_fasta, ch_fai ) SENTIEON_LOCUSCOLLECTOR ( ch_bam_bai ) @@ -55,13 +55,13 @@ workflow ALIGN_SENTIEON { .join(SENTIEON_LOCUSCOLLECTOR.out.score_idx) .set { ch_bam_bai_score } - SENTIEON_DEDUP ( ch_bam_bai_score, fasta, fai ) + SENTIEON_DEDUP ( ch_bam_bai_score, ch_fasta, ch_fai ) if (params.variant_caller == "sentieon") { SENTIEON_DEDUP.out.bam .join(SENTIEON_DEDUP.out.bai) .set { ch_dedup_bam_bai } - SENTIEON_BQSR ( ch_dedup_bam_bai, fasta, fai, known_dbsnp, known_dbsnp_tbi ) + SENTIEON_BQSR ( ch_dedup_bam_bai, ch_fasta, ch_fai, ch_known_dbsnp, ch_known_dbsnp_tbi ) ch_bqsr_bam = SENTIEON_BQSR.out.bam ch_bqsr_bai = SENTIEON_BQSR.out.bai ch_bqsr_csv = SENTIEON_BQSR.out.recal_csv From 27c3d4f41469a919db117d3c38a84539e731fe9a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 11 Mar 2023 17:40:38 +0100 Subject: [PATCH 1033/1169] simplify some ternary operators --- workflows/raredisease.nf | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index eec9ba20..e09615e3 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -216,34 +216,34 @@ workflow RAREDISEASE { // Gather built indices or get them from the params ch_bait_intervals = ch_references.bait_intervals ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index).map {it -> [[id:it[0].simpleName], it]}.collect() - : ( ch_references.bwa_index ?: Channel.empty() ) + : ch_references.bwa_index ch_bwa_index_mt_shift = params.mt_bwa_index_shift ? Channel.fromPath(params.mt_bwa_index_shift).map {it -> [[id:it[0].simpleName], it]}.collect() - : ( ch_references.bwa_index_mt_shift ?: Channel.empty() ) + : ch_references.bwa_index_mt_shift ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index).map {it -> [[id:it[0].simpleName], it]}.collect() - : ( ch_references.bwamem2_index ?: Channel.empty() ) + : ch_references.bwamem2_index ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift).collect() - : ( ch_references.bwamem2_index_mt_shift ?: Channel.empty() ) + : ch_references.bwamem2_index_mt_shift ch_chrom_sizes = ch_references.chrom_sizes ch_genome_fai_no_meta = params.fasta_fai ? Channel.fromPath(params.fasta_fai).collect() - : ( ch_references.fasta_fai ?: Channel.empty() ) + : ch_references.fasta_fai ch_genome_fai_meta = params.fasta_fai ? Channel.fromPath(params.fasta_fai).map {it -> [[id:it[0].simpleName], it]}.collect() - : ( ch_references.fasta_fai_meta ?: Channel.empty() ) + : ch_references.fasta_fai_meta ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift).collect() - : ( ch_references.fasta_fai_mt_shift ?: Channel.empty() ) + : ch_references.fasta_fai_mt_shift ch_gnomad_af_idx = params.gnomad_af_idx ? Channel.fromPath(params.gnomad_af_idx).collect() - : ( ch_references.gnomad_af_idx ?: Channel.empty() ) + : ch_references.gnomad_af_idx ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_gnomad_af_idx).map {meta, tab, idx -> [tab,idx]}.collect() : Channel.empty() ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf : Channel.value([]) ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi).map {it -> [[id:it[0].simpleName], it]}.collect() - : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) + : ch_references.known_dbsnp_tbi.ifEmpty([[],[]]) ch_sequence_dictionary_no_meta = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).collect() - : ( ch_references.sequence_dict ?: Channel.empty() ) + : ch_references.sequence_dict ch_sequence_dictionary_meta = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).map {it -> [[id:it[0].simpleName], it]}.collect() - : ( ch_references.sequence_dict_meta ?: Channel.empty() ) + : ch_references.sequence_dict_meta ch_sequence_dictionary_mt_shift = params.mt_sequence_dictionary_shift ? Channel.fromPath(params.mt_sequence_dictionary_shift).collect() - : ( ch_references.sequence_dict_mt_shift ?: Channel.empty() ) + : ch_references.sequence_dict_mt_shift ch_target_bed = ch_references.target_bed ch_target_intervals = ch_references.target_intervals ch_vep_cache = params.vep_cache.endsWith("tar.gz") ? ch_references.vep_resources From cf77d1df70ed3d1df761a9a6f77e32b40df24fc4 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 11 Mar 2023 22:15:49 +0100 Subject: [PATCH 1034/1169] align sentieon --- .../local/alignment/align_sentieon.nf | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index 04a03d7c..e1b484ba 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -74,16 +74,16 @@ workflow ALIGN_SENTIEON { ch_versions = ch_versions.mix(SENTIEON_DEDUP.out.versions.first()) emit: - marked_bam = SENTIEON_DEDUP.out.bam - marked_bai = SENTIEON_DEDUP.out.bai - recal_bam = ch_bqsr_bam.ifEmpty(null) - recal_bai = ch_bqsr_bai.ifEmpty(null) - recal_csv = ch_bqsr_csv.ifEmpty(null) - mq_metrics = SENTIEON_DATAMETRICS.out.mq_metrics.ifEmpty(null) - qd_metrics = SENTIEON_DATAMETRICS.out.qd_metrics.ifEmpty(null) - gc_metrics = SENTIEON_DATAMETRICS.out.gc_metrics.ifEmpty(null) - gc_summary = SENTIEON_DATAMETRICS.out.gc_summary.ifEmpty(null) - aln_metrics = SENTIEON_DATAMETRICS.out.aln_metrics.ifEmpty(null) - is_metrics = SENTIEON_DATAMETRICS.out.is_metrics.ifEmpty(null) - versions = ch_versions + marked_bam = SENTIEON_DEDUP.out.bam // channel: [ val(meta), path(bam) ] + marked_bai = SENTIEON_DEDUP.out.bai // channel: [ val(meta), path(bai) ] + recal_bam = ch_bqsr_bam.ifEmpty(null) // channel: [ val(meta), path(bam) ] + recal_bai = ch_bqsr_bai.ifEmpty(null) // channel: [ val(meta), path(bai) ] + recal_csv = ch_bqsr_csv.ifEmpty(null) // channel: [ val(meta), path(csv) ] + mq_metrics = SENTIEON_DATAMETRICS.out.mq_metrics.ifEmpty(null) // channel: [ val(meta), path(mq_metrics) ] + qd_metrics = SENTIEON_DATAMETRICS.out.qd_metrics.ifEmpty(null) // channel: [ val(meta), path(qd_metrics) ] + gc_metrics = SENTIEON_DATAMETRICS.out.gc_metrics.ifEmpty(null) // channel: [ val(meta), path(gc_metrics) ] + gc_summary = SENTIEON_DATAMETRICS.out.gc_summary.ifEmpty(null) // channel: [ val(meta), path(gc_summary) ] + aln_metrics = SENTIEON_DATAMETRICS.out.aln_metrics.ifEmpty(null) // channel: [ val(meta), path(aln_metrics) ] + is_metrics = SENTIEON_DATAMETRICS.out.is_metrics.ifEmpty(null) // channel: [ val(meta), path(is_metrics) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From d57316f6e78185b9833037f0cdfb48d7f2e5df4a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 00:25:15 +0100 Subject: [PATCH 1035/1169] mito subs --- subworkflows/local/alignment/align_bwamem2.nf | 2 +- .../local/alignment/align_sentieon.nf | 2 +- subworkflows/local/analyse_MT.nf | 128 +++++++++--------- .../local/mitochondria/align_and_call_MT.nf | 46 +++---- .../mitochondria/convert_mt_bam_to_fastq.nf | 16 +-- .../local/mitochondria/merge_annotate_MT.nf | 64 ++++----- 6 files changed, 129 insertions(+), 129 deletions(-) diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 774089b3..293f02c3 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -14,7 +14,7 @@ workflow ALIGN_BWAMEM2 { take: ch_reads_input // channel: [mandatory] [ val(meta), path(reads_input) ] ch_index // channel: [mandatory] [ path(bwamem2_index) ] - ch_fasta // channel: [mandatory] [ path(genome.fasta) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] ch_fai // channel: [mandatory] [ path(fai) ] val_platform // string: [mandatory] val(platform) diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index e1b484ba..437141ff 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -12,7 +12,7 @@ include { SENTIEON_READWRITER } from '../../../modules/local/sentieon/readwr workflow ALIGN_SENTIEON { take: ch_reads_input // channel: [mandatory] [ val(meta), path(reads_input) ] - ch_fasta // channel: [mandatory] [ path(genome.fasta) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] ch_fai // channel: [mandatory] [ path(fai) ] ch_index // channel: [mandatory] [ path(bwamem2_index) ] ch_known_dbsnp // channel: [mandatory] [ path(known_dbsnp) ] diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 5b6c38de..397576b7 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -9,85 +9,85 @@ include { MERGE_ANNOTATE_MT } from './mitochondria/ workflow ANALYSE_MT { take: - bam // channel: [ val(meta), file(bam), file(bai) ] - genome_bwa_index // channel: [ /path/to/bwa/index/ ] - genome_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] - genome_fasta_meta // channel: [ [], genome.fasta ] - genome_fasta_no_meta // channel: [ genome.fasta ] - genome_dict_meta // channel: [ genome.dict ] - genome_dict_no_meta // channel: [ genome.dict ] - genome_fai // channel: [ genome.fai ] - mt_intervals // channel: [ file(non_control_region.chrM.interval_list) ] - shift_mt_bwa_index // channel: [ /path/to/bwa/index/ ] - shift_mt_bwamem2_index // channel: [ /path/to/bwamem2/index/ ] - shift_mt_fasta // channel: [ genome.fasta ] - shift_mt_dict // channel: [ genome.dict ] - shift_mt_fai // channel: [ genome.fai ] - shift_mt_intervals // channel: [ file(control_region_shifted.chrM.interval_list) ] - shift_mt_backchain // channel: [ file(shift.back_chain) ] - vcfanno_resources - vcfanno_toml - vep_genome - vep_cache_version - vep_cache - case_info // channel: [ val(case_info) ] + ch_bam // channel: [mandatory] [ val(meta), file(bam), file(bai) ] + ch_genome_bwa_index // channel: [mandatory] [ path(index) ] + ch_genome_bwamem2_index // channel: [mandatory] [ path(index) ] + ch_genome_fasta_meta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_genome_fasta_no_meta // channel: [mandatory] [ path(fasta) ] + ch_genome_dict_meta // channel: [mandatory] [ val(meta), path(dict) ] + ch_genome_dict_no_meta // channel: [mandatory] [ path(dict) ] + ch_genome_fai // channel: [mandatory] [ path(fai) ] + ch_mt_intervals // channel: [mandatory] [ path(interval_list) ] + ch_shift_mt_bwa_index // channel: [mandatory] [ path(index) ] + ch_shift_mt_bwamem2_index // channel: [mandatory] [ path(index) ] + ch_shift_mt_fasta // channel: [mandatory] [ path(fasta) ] + ch_shift_mt_dict // channel: [mandatory] [ path(dict) ] + ch_shift_mt_fai // channel: [mandatory] [ path(fai) ] + ch_shift_mt_intervals // channel: [mandatory] [ path(interval_list) ] + ch_shift_mt_backchain // channel: [mandatory] [ path(back_chain) ] + ch_vcfanno_resources // channel: [mandatory] [ path(resources) ] + ch_vcfanno_toml // channel: [mandatory] [ path(toml) ] + val_vep_genome // string: [mandatory] GRCh37 or GRCh38 + val_vep_cache_version // string: [mandatory] 107 + ch_vep_cache // channel: [mandatory] [ path(cache) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] main: ch_versions = Channel.empty() // PREPARING READS FOR MT ALIGNMENT CONVERT_MT_BAM_TO_FASTQ ( - bam, - genome_fasta_meta, - genome_fai, - genome_dict_no_meta + ch_bam, + ch_genome_fasta_meta, + ch_genome_fai, + ch_genome_dict_no_meta ) // MT ALIGNMENT AND VARIANT CALLING ALIGN_AND_CALL_MT ( CONVERT_MT_BAM_TO_FASTQ.out.fastq, CONVERT_MT_BAM_TO_FASTQ.out.bam, - genome_bwa_index, - genome_bwamem2_index, - genome_fasta_no_meta, - genome_dict_no_meta, - genome_fai, - mt_intervals + ch_genome_bwa_index, + ch_genome_bwamem2_index, + ch_genome_fasta_no_meta, + ch_genome_dict_no_meta, + ch_genome_fai, + ch_mt_intervals ) ALIGN_AND_CALL_MT_SHIFT ( CONVERT_MT_BAM_TO_FASTQ.out.fastq, CONVERT_MT_BAM_TO_FASTQ.out.bam, - shift_mt_bwa_index, - shift_mt_bwamem2_index, - shift_mt_fasta, - shift_mt_dict, - shift_mt_fai, - shift_mt_intervals + ch_shift_mt_bwa_index, + ch_shift_mt_bwamem2_index, + ch_shift_mt_fasta, + ch_shift_mt_dict, + ch_shift_mt_fai, + ch_shift_mt_intervals ) // LIFTOVER VCF FROM REFERENCE MT TO SHIFTED MT PICARD_LIFTOVERVCF ( ALIGN_AND_CALL_MT_SHIFT.out.vcf, - genome_dict_no_meta, - shift_mt_backchain, - genome_fasta_no_meta + ch_genome_dict_no_meta, + ch_shift_mt_backchain, + ch_genome_fasta_no_meta ) // MT MERGE AND ANNOTATE VARIANTS MERGE_ANNOTATE_MT( ALIGN_AND_CALL_MT.out.vcf, PICARD_LIFTOVERVCF.out.vcf_lifted, - genome_fasta_no_meta, - genome_dict_meta, - genome_dict_no_meta, - genome_fai, - vcfanno_resources, - vcfanno_toml, - vep_genome, - vep_cache_version, - vep_cache, - case_info + ch_genome_fasta_no_meta, + ch_genome_dict_meta, + ch_genome_dict_no_meta, + ch_genome_fai, + ch_vcfanno_resources, + ch_vcfanno_toml, + val_vep_genome, + val_vep_cache_version, + ch_vep_cache, + ch_case_info ) ch_versions = ch_versions.mix(CONVERT_MT_BAM_TO_FASTQ.out.versions) @@ -97,17 +97,17 @@ workflow ANALYSE_MT { ch_versions = ch_versions.mix(MERGE_ANNOTATE_MT.out.versions) emit: - vcf = MERGE_ANNOTATE_MT.out.vcf - tbi = MERGE_ANNOTATE_MT.out.tbi - stats = ALIGN_AND_CALL_MT.out.stats - filt_sats = ALIGN_AND_CALL_MT.out.filt_sats - stats_sh = ALIGN_AND_CALL_MT_SHIFT.out.stats - filt_sats_sh = ALIGN_AND_CALL_MT_SHIFT.out.filt_sats - haplog = MERGE_ANNOTATE_MT.out.haplog - report = MERGE_ANNOTATE_MT.out.report - txt = ALIGN_AND_CALL_MT.out.txt - html = ALIGN_AND_CALL_MT.out.html - txt_sh = ALIGN_AND_CALL_MT_SHIFT.out.txt - html_sh = ALIGN_AND_CALL_MT_SHIFT.out.html - versions = ch_versions + vcf = MERGE_ANNOTATE_MT.out.vcf // channel: [ val(meta), path(vcf) ] + tbi = MERGE_ANNOTATE_MT.out.tbi // channel: [ val(meta), path(tbi) ] + stats = ALIGN_AND_CALL_MT.out.stats // channel: [ val(meta), path(stats) ] + filt_stats = ALIGN_AND_CALL_MT.out.filt_stats // channel: [ val(meta), path(tsv) ] + stats_sh = ALIGN_AND_CALL_MT_SHIFT.out.stats // channel: [ val(meta), path(stats) ] + filt_stats_sh = ALIGN_AND_CALL_MT_SHIFT.out.filt_stats // channel: [ val(meta), path(tsv) ] + haplog = MERGE_ANNOTATE_MT.out.haplog // channel: [ val(meta), path(txt) ] + report = MERGE_ANNOTATE_MT.out.report // channel: [ path(html) ] + txt = ALIGN_AND_CALL_MT.out.txt // channel: [ val(meta), path(txt) ] + html = ALIGN_AND_CALL_MT.out.html // channel: [ val(meta), path(html) ] + txt_sh = ALIGN_AND_CALL_MT_SHIFT.out.txt // channel: [ val(meta), path(txt) ] + html_sh = ALIGN_AND_CALL_MT_SHIFT.out.html // channel: [ val(meta), path(html) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 5a64cf3b..c138a4d9 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -16,38 +16,38 @@ include { TABIX_TABIX as TABIX_TABIX_MT } fr workflow ALIGN_AND_CALL_MT { take: - fastq // channel: [ val(meta), path('*.fastq.gz') ] - ubam // channel: [ val(meta), path('*.bam') ] - index_bwa // channel: [ /path/to/bwamem2/index/ ] - index_bwamem2 // channel: [ /path/to/bwamem2/index/ ] - fasta // channel: [ genome.fasta ] - dict // channel: [ genome.dict ] - fai // channel: [ genome.fai ] - intervals_mt // channel: [ file(non_control_region.chrM.interval_list) ] + ch_fastq // channel: [mandatory] [ val(meta), [ path(reads) ] ] + ch_ubam // channel: [mandatory] [ val(meta), path(bam) ] + ch_index_bwa // channel: [mandatory for sentieon] [ path(index) ] + ch_index_bwamem2 // channel: [mandatory for bwamem2] [ path(index) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_dict // channel: [mandatory] [ path(dict) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_intervals_mt // channel: [mandatory] [ path(interval_list) ] main: ch_versions = Channel.empty() - BWAMEM2_MEM_MT (fastq , index_bwamem2, true) + BWAMEM2_MEM_MT (ch_fastq , ch_index_bwamem2, true) - SENTIEON_BWAMEM_MT ( fastq, fasta, fai, index_bwa ) + SENTIEON_BWAMEM_MT ( ch_fastq, ch_fasta, ch_fai, ch_index_bwa ) ch_mt_bam = Channel.empty().mix(BWAMEM2_MEM_MT.out.bam, SENTIEON_BWAMEM_MT.out.bam) - ch_fastq_ubam = ch_mt_bam.join(ubam, by: [0]) + ch_fastq_ubam = ch_mt_bam.join(ch_ubam, by: [0]) - GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, fasta, dict) + GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, ch_fasta, ch_dict) PICARD_ADDORREPLACEREADGROUPS_MT (GATK4_MERGEBAMALIGNMENT_MT.out.bam) - PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam, fasta, fai) + PICARD_MARKDUPLICATES_MT (PICARD_ADDORREPLACEREADGROUPS_MT.out.bam, ch_fasta, ch_fai) SAMTOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) SAMTOOLS_INDEX_MT(SAMTOOLS_SORT_MT.out.bam) ch_sort_index_bam = SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) - ch_sort_index_bam_int_mt = ch_sort_index_bam.combine(intervals_mt) + ch_sort_index_bam_int_mt = ch_sort_index_bam.combine(ch_intervals_mt) - GATK4_MUTECT2_MT (ch_sort_index_bam_int_mt, fasta, fai, dict, [], [], [],[]) + GATK4_MUTECT2_MT (ch_sort_index_bam_int_mt, ch_fasta, ch_fai, ch_dict, [], [], [],[]) // Haplocheck // TODO: probably it will be outside this subworkflow as we want to run @@ -62,7 +62,7 @@ workflow ALIGN_AND_CALL_MT { return [meta, vcf, tbi, stats, [], [], [], []] } - GATK4_FILTERMUTECTCALLS_MT (ch_to_filt, fasta, fai, dict) + GATK4_FILTERMUTECTCALLS_MT (ch_to_filt, ch_fasta, ch_fai, ch_dict) ch_versions = ch_versions.mix(BWAMEM2_MEM_MT.out.versions.first()) ch_versions = ch_versions.mix(GATK4_MERGEBAMALIGNMENT_MT.out.versions.first()) @@ -75,11 +75,11 @@ workflow ALIGN_AND_CALL_MT { ch_versions = ch_versions.mix(GATK4_FILTERMUTECTCALLS_MT.out.versions.first()) emit: - vcf = GATK4_FILTERMUTECTCALLS_MT.out.vcf - tbi = GATK4_FILTERMUTECTCALLS_MT.out.tbi - stats = GATK4_MUTECT2_MT.out.stats - filt_sats = GATK4_FILTERMUTECTCALLS_MT.out.stats - txt = HAPLOCHECK_MT.out.txt - html = HAPLOCHECK_MT.out.html - versions = ch_versions + vcf = GATK4_FILTERMUTECTCALLS_MT.out.vcf // channel: [ val(meta), path(vcf) ] + tbi = GATK4_FILTERMUTECTCALLS_MT.out.tbi // channel: [ val(meta), path(tbi) ] + stats = GATK4_MUTECT2_MT.out.stats // channel: [ val(meta), path(stats) ] + filt_stats = GATK4_FILTERMUTECTCALLS_MT.out.stats // channel: [ val(meta), path(tsv) ] + txt = HAPLOCHECK_MT.out.txt // channel: [ val(meta), path(txt) ] + html = HAPLOCHECK_MT.out.html // channel: [ val(meta), path(html) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf index 81de9d19..537c84e6 100644 --- a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf +++ b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf @@ -8,16 +8,16 @@ include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../../modules/nf-co workflow CONVERT_MT_BAM_TO_FASTQ { take: - bam // channel: [ val(meta), file(bam), file(bai) ] - genome_fasta_meta // channel: [ [], genome.fasta ] - genome_fai // channel: [ genome.fai ] - genome_dict // channel: [ genome.dict ] + ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_genome_fasta_meta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_genome_fai // channel: [mandatory] [ path(fai) ] + ch_genome_dict // channel: [mandatory] [ path(dict) ] main: ch_versions = Channel.empty() // Outputs bam containing only MT - GATK4_PRINTREADS_MT ( bam, genome_fasta_meta, genome_fai, genome_dict ) + GATK4_PRINTREADS_MT ( ch_bam, ch_genome_fasta_meta, ch_genome_fai, ch_genome_dict ) // Removes alignment information GATK4_REVERTSAM_MT ( GATK4_PRINTREADS_MT.out.bam ) @@ -30,7 +30,7 @@ workflow CONVERT_MT_BAM_TO_FASTQ { ch_versions = ch_versions.mix(GATK4_SAMTOFASTQ_MT.out.versions.first()) emit: - fastq = GATK4_SAMTOFASTQ_MT.out.fastq - bam = GATK4_REVERTSAM_MT.out.bam - versions = ch_versions // channel: [ versions.yml ] + fastq = GATK4_SAMTOFASTQ_MT.out.fastq // channel: [ val(meta), [ path(fastq) ] ] + bam = GATK4_REVERTSAM_MT.out.bam // channel: [ val(meta), path(bam) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index e594c97a..1b8367d9 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -18,41 +18,41 @@ include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../. workflow MERGE_ANNOTATE_MT { take: - vcf1 // channel: [ val(meta), path('*.vcf.gz') ] - vcf2 // channel: [ val(meta), path('*.vcf.gz') ] - genome_fasta // channel: [ genome.fasta ] - genome_dict_meta // channel: [ genome.dict ] - genome_dict_no_meta // channel: [ genome.dict ] - genome_fai // channel: [ genome.fai ] - vcfanno_resources - vcfanno_toml - vep_genome - vep_cache_version - vep_cache - case_info // channel: [ val(case_info) ] + ch_vcf1 // channel: [mandatory] [ val(meta), path(vcf) ] + ch_vcf2 // channel: [mandatory] [ val(meta), path(vcf) ] + ch_genome_fasta // channel: [mandatory] [ path(fasta) ] + ch_genome_dict_meta // channel: [mandatory] [ val(meta), path(dict) ] + ch_genome_dict_no_meta // channel: [mandatory] [ path(dict) ] + ch_genome_fai // channel: [mandatory] [ path(fai) ] + ch_vcfanno_resources // channel: [mandatory] [ path(resources) ] + ch_vcfanno_toml // channel: [mandatory] [ path(toml) ] + val_vep_genome // string: [mandatory] GRCh37 or GRCh38 + val_vep_cache_version // string: [mandatory] 107 + ch_vep_cache // channel: [mandatory] [ path(cache) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] main: ch_versions = Channel.empty() - ch_vcfs = vcf1 - .join(vcf2, remainder: true) + ch_vcfs = ch_vcf1 + .join(ch_vcf2, remainder: true) .map{ meta, vcf1, vcf2 -> [meta, [vcf1, vcf2]] } - GATK4_MERGEVCFS_LIFT_UNLIFT_MT( ch_vcfs, genome_dict_meta) + GATK4_MERGEVCFS_LIFT_UNLIFT_MT( ch_vcfs, ch_genome_dict_meta) // Filtering Variants GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.vcf.join(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.tbi, by:[0]).set { ch_filt_vcf } - GATK4_VARIANTFILTRATION_MT (ch_filt_vcf, genome_fasta, genome_fai, genome_dict_no_meta) + GATK4_VARIANTFILTRATION_MT (ch_filt_vcf, ch_genome_fasta, ch_genome_fai, ch_genome_dict_no_meta) // Spliting multiallelic calls GATK4_VARIANTFILTRATION_MT.out.vcf.join(GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]).set { ch_in_split } - SPLIT_MULTIALLELICS_MT (ch_in_split, genome_fasta) + SPLIT_MULTIALLELICS_MT (ch_in_split, ch_genome_fasta) TABIX_TABIX_MT(SPLIT_MULTIALLELICS_MT.out.vcf) // Removing duplicates and merging if there is more than one sample SPLIT_MULTIALLELICS_MT.out.vcf.join(TABIX_TABIX_MT.out.tbi).set { ch_in_remdup } - REMOVE_DUPLICATES_MT(ch_in_remdup, genome_fasta) + REMOVE_DUPLICATES_MT(ch_in_remdup, ch_genome_fasta) TABIX_TABIX_MT2(REMOVE_DUPLICATES_MT.out.vcf) REMOVE_DUPLICATES_MT.out.vcf @@ -67,7 +67,7 @@ workflow MERGE_ANNOTATE_MT { .toList() .set { file_list_tbi } - case_info + ch_case_info .combine(file_list_vcf) .combine(file_list_tbi) .set { ch_rem_dup_vcf_tbi } @@ -82,8 +82,8 @@ workflow MERGE_ANNOTATE_MT { BCFTOOLS_MERGE_MT( ch_case_vcf.multiple, [], - genome_fasta, - genome_fai) + ch_genome_fasta, + ch_genome_fai) ch_merged_vcf = BCFTOOLS_MERGE_MT.out.merged_variants ch_in_vep = ch_merged_vcf.mix(ch_case_vcf.single) @@ -94,23 +94,23 @@ workflow MERGE_ANNOTATE_MT { // Annotating with ensembl Vep ENSEMBLVEP_MT( ch_in_vep, - vep_genome, + val_vep_genome, "homo_sapiens", - vep_cache_version, - vep_cache, - genome_fasta, + val_vep_cache_version, + ch_vep_cache, + ch_genome_fasta, []) // Running vcfanno TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf_gz) ch_in_vcfanno = ENSEMBLVEP_MT.out.vcf_gz.join(TABIX_TABIX_MT3.out.tbi, by: [0]) - VCFANNO_MT(ch_in_vcfanno, vcfanno_toml, [], vcfanno_resources) + VCFANNO_MT(ch_in_vcfanno, ch_vcfanno_toml, [], ch_vcfanno_resources) ZIP_TABIX_VCFANNO(VCFANNO_MT.out.vcf) // Prepare output ch_vcf_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, vcf] } ch_tbi_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, tbi] } - + // Running haplogrep2 HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") @@ -124,9 +124,9 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) emit: - haplog = HAPLOGREP2_CLASSIFY_MT.out.txt - vcf = ch_vcf_out - tbi = ch_tbi_out - report = ENSEMBLVEP_MT.out.report - versions = ch_versions // channel: [ versions.yml ] + haplog = HAPLOGREP2_CLASSIFY_MT.out.txt // channel: [ val(meta), path(txt) ] + vcf = ch_vcf_out // channel: [ val(meta), path(vcf) ] + tbi = ch_tbi_out // channel: [ val(meta), path(tbi) ] + report = ENSEMBLVEP_MT.out.report // channel: [ path(html) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From b88f857dd501373abb07d5e44c5427552b09954d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 00:33:59 +0100 Subject: [PATCH 1036/1169] remove aligner --- subworkflows/local/align.nf | 49 ++++++++++++++++++------------------- workflows/raredisease.nf | 1 - 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 928a6a06..716e1db1 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -7,35 +7,34 @@ include { ALIGN_SENTIEON } from './alignment/align_sentieon' workflow ALIGN { take: - aligner // string: params.aligner - reads_input // channel: [ val(meta), reads_input ] - fasta // channel: [genome.fasta] - fai // channel: [genome.fai] - index_bwa // channel: [ /path/to/bwamem2/index/ ] - index_bwamem2 // channel: [ /path/to/bwamem2/index/ ] - known_dbsnp // channel: [ /path/to/known_dbsnp ] - known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] - platform // string: params.platform + ch_reads_input // channel: [mandatory] [ val(meta), [path(reads)] ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_index_bwa // channel: [mandatory] [ path(index) ] + ch_index_bwamem2 // channel: [mandatory] [ path(index) ] + ch_known_dbsnp // channel: [optional; used by sentieon] [ path(known_dbsnp) ] + ch_known_dbsnp_tbi // channel: [optional; used by sentieon] [ path(known_dbsnp_tbi) ] + val_platform // string: [mandatory] illumina or a different technology main: ch_versions = Channel.empty() ALIGN_BWAMEM2 ( - reads_input, - index_bwamem2, - fasta, - fai, - platform + ch_reads_input, + ch_index_bwamem2, + ch_fasta, + ch_fai, + val_platform ) ALIGN_SENTIEON ( - reads_input, - fasta, - fai, - index_bwa, - known_dbsnp, - known_dbsnp_tbi, - platform + ch_reads_input, + ch_fasta, + ch_fai, + ch_index_bwa, + ch_known_dbsnp, + ch_known_dbsnp_tbi, + val_platform ) ch_marked_bam = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bam, ALIGN_SENTIEON.out.marked_bam) @@ -44,8 +43,8 @@ workflow ALIGN { ch_versions = Channel.empty().mix(ALIGN_BWAMEM2.out.versions, ALIGN_SENTIEON.out.versions) emit: - marked_bam = ch_marked_bam - marked_bai = ch_marked_bai - bam_bai = ch_bam_bai - versions = ch_versions + marked_bam = ch_marked_bam // channel: [ val(meta), path(bam) ] + marked_bai = ch_marked_bai // channel: [ val(meta), path(bai) ] + bam_bai = ch_bam_bai // channel: [ val(meta), path(bam), path(bai) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index eec9ba20..340b43c2 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -263,7 +263,6 @@ workflow RAREDISEASE { // ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( - params.aligner, CHECK_INPUT.out.reads, ch_genome_fasta_no_meta, ch_genome_fai_no_meta, From 4334544782d1eb7d122935d2c08cbbf0745f4adc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 13:50:44 +0100 Subject: [PATCH 1037/1169] remove unused variables and subworkflows --- main.nf | 1 - nextflow_schema.json | 8 --- subworkflows/local/align.nf | 1 - subworkflows/local/prepare_references.nf | 4 -- .../local/preprocessing/prepare_vcf.nf | 52 ------------------- workflows/raredisease.nf | 8 --- 6 files changed, 74 deletions(-) delete mode 100644 subworkflows/local/preprocessing/prepare_vcf.nf diff --git a/main.nf b/main.nf index 14481bed..7e3a865a 100644 --- a/main.nf +++ b/main.nf @@ -25,7 +25,6 @@ params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') params.gnomad_af = WorkflowMain.getGenomeAttribute(params, 'gnomad_af') params.gnomad_af_idx = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_idx') -params.gnomad_vcf = WorkflowMain.getGenomeAttribute(params, 'gnomad_vcf') params.intervals_wgs = WorkflowMain.getGenomeAttribute(params, 'intervals_wgs') params.intervals_y = WorkflowMain.getGenomeAttribute(params, 'intervals_y') params.known_dbsnp = WorkflowMain.getGenomeAttribute(params, 'known_dbsnp') diff --git a/nextflow_schema.json b/nextflow_schema.json index c7a9f47c..759512b5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -103,14 +103,6 @@ "fa_icon": "fas fa-folder-open", "hidden": true }, - "gnomad_vcf": { - "type": "string", - "format": "path", - "fa_icon": "fas fa-bezier-curve", - "pattern": "^\\S+\\.vcf(\\.gz)?$", - "description": "Path to directory for gnomad vcf.", - "help_text": "Path to the gnomad annotations vcf file. If you don't provide one, gnomad annotations will not be used." - }, "gnomad_af": { "type": "string", "format": "path", diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 928a6a06..b6e04f62 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -7,7 +7,6 @@ include { ALIGN_SENTIEON } from './alignment/align_sentieon' workflow ALIGN { take: - aligner // string: params.aligner reads_input // channel: [ val(meta), reads_input ] fasta // channel: [genome.fasta] fai // channel: [genome.fai] diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index e0677f39..a382dacf 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -6,7 +6,6 @@ include { BWA_INDEX as BWA_INDEX_GENOME } from '../../modul include { BWAMEM2_INDEX as BWAMEM2_INDEX_GENOME } from '../../modules/nf-core/bwamem2/index/main' include { BWAMEM2_INDEX as BWAMEM2_INDEX_SHIFT_MT } from '../../modules/nf-core/bwamem2/index/main' include { CAT_CAT as CAT_CAT_BAIT } from '../../modules/nf-core/cat/cat/main' -include { CHECK_VCF } from './preprocessing/prepare_vcf' include { GATK4_BEDTOINTERVALLIST as GATK_BILT } from '../../modules/nf-core/gatk4/bedtointervallist/main' include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD } from '../../modules/nf-core/gatk4/createsequencedictionary/main' include { GATK4_CREATESEQUENCEDICTIONARY as GATK_SD_SHIFT_MT } from '../../modules/nf-core/gatk4/createsequencedictionary/main' @@ -60,9 +59,6 @@ workflow PREPARE_REFERENCES { TABIX_PT(target_bed).tbi.set { ch_tbi } TABIX_PBT(target_bed).gz_tbi.set { ch_bgzip_tbi } - // Check if a vcf file is normalized and create index - CHECK_VCF(gnomad_vcf_in, fasta_no_meta) - // Generate bait and target intervals GATK_BILT(target_bed, GATK_SD.out.dict).interval_list GATK_ILT(GATK_BILT.out.interval_list) diff --git a/subworkflows/local/preprocessing/prepare_vcf.nf b/subworkflows/local/preprocessing/prepare_vcf.nf deleted file mode 100644 index 5488e052..00000000 --- a/subworkflows/local/preprocessing/prepare_vcf.nf +++ /dev/null @@ -1,52 +0,0 @@ -// -// Prepare reference vcf files -// - -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_PV } from '../../../modules/nf-core/bcftools/norm/main' -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_PV } from '../../../modules/nf-core/bcftools/norm/main' -include { TABIX_TABIX as TABIX_PV } from '../../../modules/nf-core/tabix/tabix/main' -include { CHECK_INPUT_VCF } from '../../../modules/local/check_input_vcf' - -workflow CHECK_VCF { - take: - vcf_file // file: vcf file - fasta // path(fasta) - - main: - ch_versions = Channel.empty() - - CHECK_INPUT_VCF( vcf_file ).csv - .splitCsv( header:true ) - .map { row -> - def id = "${row.id}" - def filepath = "${row.filepath}" - def processed = "${row.processed}" - tuple(id,filepath,processed) - } - .branch { id, filepath, processed -> - processed: processed == 'yes' - return [['id':id],filepath] - unprocessed: processed == 'no' - return [['id':id],filepath] - } - .set { ch_vcfs_norm } - - SPLIT_MULTIALLELICS_PV (ch_vcfs_norm.unprocessed, fasta) - - REMOVE_DUPLICATES_PV (SPLIT_MULTIALLELICS_PV.out.vcf, fasta) - .vcf - .set { ch_vcfs_rmdup } - - vcf_out = ch_vcfs_rmdup.mix( ch_vcfs_norm.processed ) - - TABIX_PV (vcf_out) - - ch_versions = ch_versions.mix(CHECK_INPUT_VCF.out.versions) - ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_PV.out.versions) - ch_versions = ch_versions.mix(REMOVE_DUPLICATES_PV.out.versions) - - emit: - vcf = vcf_out // path: normalized_vcf - index = TABIX_PV.out.tbi - versions = ch_versions // channel: [ versions.yml ] -} diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index eec9ba20..7c1d1b21 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -21,7 +21,6 @@ def checkPathParamList = [ params.gens_pon, params.gnomad_af, params.gnomad_af_idx, - params.gnomad_vcf, params.input, params.intervals_wgs, params.intervals_y, @@ -147,8 +146,6 @@ workflow RAREDISEASE { ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it[0].simpleName], it] } ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) - ch_gnomad_vcf_unprocessed = params.gnomad_vcf ? Channel.fromPath(params.gnomad_vcf).collect() - : Channel.empty() ch_intervals_wgs = params.intervals_wgs ? Channel.fromPath(params.intervals_wgs).collect() : Channel.empty() ch_intervals_y = params.intervals_y ? Channel.fromPath(params.intervals_y).collect() @@ -202,11 +199,9 @@ workflow RAREDISEASE { PREPARE_REFERENCES ( ch_genome_fasta_no_meta, ch_genome_fasta_meta, - params.fasta_fai, ch_mt_fasta_shift_no_meta, ch_mt_fasta_shift_meta, ch_gnomad_af_tab, - ch_gnomad_vcf_unprocessed, ch_known_dbsnp, ch_target_bed_unprocessed, ch_vep_cache_unprocessed @@ -234,8 +229,6 @@ workflow RAREDISEASE { : ( ch_references.gnomad_af_idx ?: Channel.empty() ) ch_gnomad_af = params.gnomad_af ? ch_gnomad_af_tab.join(ch_gnomad_af_idx).map {meta, tab, idx -> [tab,idx]}.collect() : Channel.empty() - ch_gnomad_vcf = params.gnomad_vcf ? ch_references.gnomad_vcf - : Channel.value([]) ch_known_dbsnp_tbi = params.known_dbsnp_tbi ? Channel.fromPath(params.known_dbsnp_tbi).map {it -> [[id:it[0].simpleName], it]}.collect() : ( ch_references.known_dbsnp_tbi ?: Channel.empty() ) ch_sequence_dictionary_no_meta = params.sequence_dictionary ? Channel.fromPath(params.sequence_dictionary).collect() @@ -263,7 +256,6 @@ workflow RAREDISEASE { // ALIGNING READS, FETCH STATS, AND MERGE. ALIGN ( - params.aligner, CHECK_INPUT.out.reads, ch_genome_fasta_no_meta, ch_genome_fai_no_meta, From 93ba63d73e5ff4b0b7b60fbd90eb6b31de79caaf Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 14:00:30 +0100 Subject: [PATCH 1038/1169] remove mentions of check_vcf --- subworkflows/local/prepare_references.nf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index a382dacf..ed8ef721 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -25,11 +25,9 @@ workflow PREPARE_REFERENCES { take: fasta_no_meta // [mandatory] genome.fasta fasta_meta - fai // [optional ] genome.fai mt_fasta_shift_no_meta mt_fasta_shift_meta gnomad_af_tab - gnomad_vcf_in known_dbsnp target_bed vep_cache @@ -85,7 +83,6 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) ch_versions = ch_versions.mix(TABIX_DBSNP.out.versions) ch_versions = ch_versions.mix(TABIX_GNOMAD_AF.out.versions) - ch_versions = ch_versions.mix(CHECK_VCF.out.versions) ch_versions = ch_versions.mix(TABIX_PT.out.versions) ch_versions = ch_versions.mix(TABIX_PBT.out.versions) ch_versions = ch_versions.mix(GATK_BILT.out.versions) @@ -103,8 +100,6 @@ workflow PREPARE_REFERENCES { fasta_fai_meta = SAMTOOLS_FAIDX_GENOME.out.fai.collect() fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] }.collect() gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi.collect() - gnomad_tbi = CHECK_VCF.out.index.collect() - gnomad_vcf = CHECK_VCF.out.vcf.collect() known_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect() sequence_dict = GATK_SD.out.dict.collect() sequence_dict_meta = GATK_SD.out.dict.map {it -> [[id:it[0].simpleName], it]}.collect() From 92dc6b61f2912db74d9aadef83ac8c4a330f6f6e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 18:03:17 +0100 Subject: [PATCH 1039/1169] prepare refs --- subworkflows/local/prepare_references.nf | 82 ++++++++++++------------ 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index ed8ef721..1b332812 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -23,14 +23,14 @@ include { UNTAR as UNTAR_VEP_CACHE } from '../../modul workflow PREPARE_REFERENCES { take: - fasta_no_meta // [mandatory] genome.fasta - fasta_meta - mt_fasta_shift_no_meta - mt_fasta_shift_meta - gnomad_af_tab - known_dbsnp - target_bed - vep_cache + ch_fasta_no_meta // channel: [mandatory] [ path(fasta) ] + ch_fasta_meta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_mt_fasta_shift_no_meta // channel: [mandatory for dedicated mt analysis] [ path(fasta) ] + ch_mt_fasta_shift_meta // channel: [mandatory for dedicated mt analysis] [ val(meta), path(fasta) ] + ch_gnomad_af_tab // channel: [optional; used in for snv annotation] [ val(meta), path(tab) ] + ch_known_dbsnp // channel: [optional; used only by sentieon] [ val(meta), path(vcf) ] + ch_target_bed // channel: [mandatory for WES] [ path(bed) ] + ch_vep_cache // channel: [mandatory for annotation] [ path(cache) ] main: ch_versions = Channel.empty() @@ -40,25 +40,25 @@ workflow PREPARE_REFERENCES { ch_sentieonbwa = Channel.empty() // Genome indices - BWA_INDEX_GENOME(fasta_meta).index.set{ch_bwa} - BWAMEM2_INDEX_GENOME(fasta_meta) - BWAMEM2_INDEX_SHIFT_MT(mt_fasta_shift_meta) - SENTIEON_BWAINDEX_GENOME(fasta_meta).index.set{ch_sentieonbwa} - SENTIEON_BWAINDEX_SHIFT_MT(mt_fasta_shift_meta) - SAMTOOLS_FAIDX_GENOME(fasta_meta) - SAMTOOLS_FAIDX_SHIFT_MT(mt_fasta_shift_meta) - GATK_SD(fasta_no_meta) - GATK_SD_SHIFT_MT(mt_fasta_shift_no_meta) + BWA_INDEX_GENOME(ch_fasta_meta).index.set{ch_bwa} + BWAMEM2_INDEX_GENOME(ch_fasta_meta) + BWAMEM2_INDEX_SHIFT_MT(ch_mt_fasta_shift_meta) + SENTIEON_BWAINDEX_GENOME(ch_fasta_meta).index.set{ch_sentieonbwa} + SENTIEON_BWAINDEX_SHIFT_MT(ch_mt_fasta_shift_meta) + SAMTOOLS_FAIDX_GENOME(ch_fasta_meta) + SAMTOOLS_FAIDX_SHIFT_MT(ch_mt_fasta_shift_meta) + GATK_SD(ch_fasta_no_meta) + GATK_SD_SHIFT_MT(ch_mt_fasta_shift_no_meta) GET_CHROM_SIZES( SAMTOOLS_FAIDX_GENOME.out.fai ) // Vcf, tab and bed indices - TABIX_DBSNP(known_dbsnp) - TABIX_GNOMAD_AF(gnomad_af_tab) - TABIX_PT(target_bed).tbi.set { ch_tbi } - TABIX_PBT(target_bed).gz_tbi.set { ch_bgzip_tbi } + TABIX_DBSNP(ch_known_dbsnp) + TABIX_GNOMAD_AF(ch_gnomad_af_tab) + TABIX_PT(ch_target_bed).tbi.set { ch_tbi } + TABIX_PBT(ch_target_bed).gz_tbi.set { ch_bgzip_tbi } // Generate bait and target intervals - GATK_BILT(target_bed, GATK_SD.out.dict).interval_list + GATK_BILT(ch_target_bed, GATK_SD.out.dict).interval_list GATK_ILT(GATK_BILT.out.interval_list) GATK_ILT.out.interval_list .collect{ it[1] } @@ -68,7 +68,7 @@ workflow PREPARE_REFERENCES { } .set { ch_bait_intervals_cat_in } CAT_CAT_BAIT ( ch_bait_intervals_cat_in ) - UNTAR_VEP_CACHE (vep_cache) + UNTAR_VEP_CACHE (ch_vep_cache) // Gather versions ch_versions = ch_versions.mix(BWA_INDEX_GENOME.out.versions) @@ -90,24 +90,24 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(UNTAR_VEP_CACHE.out.versions) emit: - bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() - bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() - bwa_index_mt_shift = SENTIEON_BWAINDEX_SHIFT_MT.out.index.collect() - bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() - bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() - chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() - fasta_fai = SAMTOOLS_FAIDX_GENOME.out.fai.map{ meta, fai -> [fai] }.collect() - fasta_fai_meta = SAMTOOLS_FAIDX_GENOME.out.fai.collect() - fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] }.collect() - gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi.collect() - known_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect() - sequence_dict = GATK_SD.out.dict.collect() - sequence_dict_meta = GATK_SD.out.dict.map {it -> [[id:it[0].simpleName], it]}.collect() - sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict.collect() - target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi).collect() - target_intervals = GATK_BILT.out.interval_list.collect{it[1]}.collect() - vep_resources = UNTAR_VEP_CACHE.out.untar.map{meta, files -> [files]}collect() - versions = ch_versions + bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() // channel: [ path(intervals) ] + bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() // channel: [ path(index) ] + bwa_index_mt_shift = SENTIEON_BWAINDEX_SHIFT_MT.out.index.collect() // channel: [ path(index) ] + bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() // channel: [ path(index) ] + bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() // channel: [ path(index) ] + chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() // channel: [ path(sizes) ] + fasta_fai = SAMTOOLS_FAIDX_GENOME.out.fai.map{ meta, fai -> [fai] }.collect() // channel: [ path(fai) ] + fasta_fai_meta = SAMTOOLS_FAIDX_GENOME.out.fai.collect() // channel: [ val(meta), path(fai) ] + fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] }.collect() // channel: [ path(fai) ] + gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi.collect() // channel: [ val(meta), path(fasta) ] + known_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect() // channel: [ val(meta), path(fasta) ] + sequence_dict = GATK_SD.out.dict.collect() // channel: [ path(dict) ] + sequence_dict_meta = GATK_SD.out.dict.map {it -> [[id:it[0].simpleName], it]}.collect() // channel: [ val(meta), path(fasta) ] + sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict.collect() // channel: [ path(dict) ] + target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi).collect() // channel: [ val(meta), path(bed), path(tbi) ] + target_intervals = GATK_BILT.out.interval_list.collect{it[1]}.collect() // channel: [ path(interval_list) ] + vep_resources = UNTAR_VEP_CACHE.out.untar.map{meta, files -> [files]}.collect() // channel: [ path(cache) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From b507618bbefedd93ac09f004e91f3375064df42f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 21:10:50 +0100 Subject: [PATCH 1040/1169] add call sv subworkflows --- subworkflows/local/align.nf | 4 +-- subworkflows/local/alignment/align_bwamem2.nf | 2 +- .../local/alignment/align_sentieon.nf | 2 +- .../local/call_structural_variants.nf | 30 ++++++++-------- subworkflows/local/prepare_references.nf | 8 ++--- .../variant_calling/call_cnv_cnvpytor.nf | 22 ++++++------ .../local/variant_calling/call_sv_manta.nf | 36 +++++++++---------- .../local/variant_calling/call_sv_tiddit.nf | 16 ++++----- 8 files changed, 60 insertions(+), 60 deletions(-) diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 716e1db1..e010926f 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -10,8 +10,8 @@ workflow ALIGN { ch_reads_input // channel: [mandatory] [ val(meta), [path(reads)] ] ch_fasta // channel: [mandatory] [ path(fasta) ] ch_fai // channel: [mandatory] [ path(fai) ] - ch_index_bwa // channel: [mandatory] [ path(index) ] - ch_index_bwamem2 // channel: [mandatory] [ path(index) ] + ch_index_bwa // channel: [mandatory] [ val(meta), path(index) ] + ch_index_bwamem2 // channel: [mandatory] [ val(meta), path(index) ] ch_known_dbsnp // channel: [optional; used by sentieon] [ path(known_dbsnp) ] ch_known_dbsnp_tbi // channel: [optional; used by sentieon] [ path(known_dbsnp_tbi) ] val_platform // string: [mandatory] illumina or a different technology diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 293f02c3..8d78c6b2 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -13,7 +13,7 @@ include { PICARD_MARKDUPLICATES as MARKDUPLICATES } from '../../../modules/nf-c workflow ALIGN_BWAMEM2 { take: ch_reads_input // channel: [mandatory] [ val(meta), path(reads_input) ] - ch_index // channel: [mandatory] [ path(bwamem2_index) ] + ch_index // channel: [mandatory] [ val(meta), path(bwamem2_index) ] ch_fasta // channel: [mandatory] [ path(fasta) ] ch_fai // channel: [mandatory] [ path(fai) ] val_platform // string: [mandatory] val(platform) diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index 437141ff..3efc9faf 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -14,7 +14,7 @@ workflow ALIGN_SENTIEON { ch_reads_input // channel: [mandatory] [ val(meta), path(reads_input) ] ch_fasta // channel: [mandatory] [ path(fasta) ] ch_fai // channel: [mandatory] [ path(fai) ] - ch_index // channel: [mandatory] [ path(bwamem2_index) ] + ch_index // channel: [mandatory] [ val(meta), path(bwamem2_index) ] ch_known_dbsnp // channel: [mandatory] [ path(known_dbsnp) ] ch_known_dbsnp_tbi // channel: [mandatory] [ path(known_dbsnp_tbi) ] val_platform // string: [mandatory] val(platform) diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index c0e5bcab..ed25db68 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -10,26 +10,26 @@ include { CALL_CNV_CNVPYTOR } from './variant_calling/call_cnv_cnvpytor' workflow CALL_STRUCTURAL_VARIANTS { take: - bam // channel: [ val(meta), path(bam) ] - bai // channel: [ val(meta), path(bai) ] - bam_bai // channel: [ val(meta), path(bam), path(bai) ] - bwa_index // channel: [ val(meta), path(bwa_index)] - fasta_no_meta // channel: [ path(genome.fasta) ] - fasta_meta // channel: [ val(meta), path(genome.fasta) ] - fai // channel: [ path(genome.fai) ] - case_info // channel: [ val(case_info) ] - target_bed // channel: [ path(target.bed) ] - cnvpytor_bins // channel: [ val("binsizes") ] + ch_bam // channel: [mandatory] [ val(meta), path(bam) ] + ch_bai // channel: [mandatory] [ val(meta), path(bai) ] + ch_bam_bai // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_bwa_index // channel: [mandatory] [ val(meta), path(index)] + ch_fasta_no_meta // channel: [mandatory] [ path(fasta) ] + ch_fasta_meta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] + ch_target_bed // channel: [mandatory for WES] [ val(meta), path(bed), path(tbi) ] + val_cnvpytor_bins // string: [mandatory] binsizes for cnvpytor default: 1000 main: ch_versions = Channel.empty() - CALL_SV_MANTA (bam, bai, fasta_no_meta, fai, case_info, target_bed) + CALL_SV_MANTA (ch_bam, ch_bai, ch_fasta_no_meta, ch_fai, ch_case_info, ch_target_bed) .diploid_sv_vcf .collect{it[1]} .set{ manta_vcf } - CALL_SV_TIDDIT (bam_bai, fasta_meta, bwa_index, case_info) + CALL_SV_TIDDIT (ch_bam_bai, ch_fasta_meta, ch_bwa_index, ch_case_info) .vcf .collect{it[1]} .set { tiddit_vcf } @@ -53,7 +53,7 @@ workflow CALL_STRUCTURAL_VARIANTS { .toList() .set { vcf_list } - case_info + ch_case_info .combine(vcf_list) .set { merge_input_vcfs } @@ -65,6 +65,6 @@ workflow CALL_STRUCTURAL_VARIANTS { // ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) emit: - vcf = SVDB_MERGE.out.vcf - versions = ch_versions + vcf = SVDB_MERGE.out.vcf // channel: [ val(meta), path(vcf)] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index 1b332812..fdb090bb 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -91,10 +91,10 @@ workflow PREPARE_REFERENCES { emit: bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() // channel: [ path(intervals) ] - bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() // channel: [ path(index) ] - bwa_index_mt_shift = SENTIEON_BWAINDEX_SHIFT_MT.out.index.collect() // channel: [ path(index) ] - bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() // channel: [ path(index) ] - bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() // channel: [ path(index) ] + bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() // channel: [ val(meta), path(index) ] + bwa_index_mt_shift = SENTIEON_BWAINDEX_SHIFT_MT.out.index.collect() // channel: [ val(meta), path(index) ] + bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() // channel: [ val(meta), path(index) ] + bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() // channel: [ val(meta), path(index) ] chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() // channel: [ path(sizes) ] fasta_fai = SAMTOOLS_FAIDX_GENOME.out.fai.map{ meta, fai -> [fai] }.collect() // channel: [ path(fai) ] fasta_fai_meta = SAMTOOLS_FAIDX_GENOME.out.fai.collect() // channel: [ val(meta), path(fai) ] diff --git a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf index a39abb28..39cb62d0 100644 --- a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf +++ b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf @@ -10,18 +10,18 @@ include { CNVPYTOR_VIEW as VIEW } from '../../../modules/nf workflow CALL_CNV_CNVPYTOR { take: - bam // channel: [ val(meta), path(bam)] - bai // channel: [ val(meta), path(bai) ] - case_info // channel: [ case_id ] - binsizes // channel: [ val(binsize) ] - fasta // channel: [ path(fasta) ] - fai // channel: [ path(fai) ] + ch_bam // channel: [mandatory] [ val(meta), path(bam)] + ch_bai // channel: [mandatory] [ val(meta), path(bai) ] + ch_case_info // channel: [mandatory] [ val(case_id) ] + val_binsizes // channel: [optional] [ val(binsize) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] main: ch_versions = Channel.empty() - GENERATE_PYTOR(bam.join(bai, by: [0]), fasta, fai) + GENERATE_PYTOR(ch_bam.join(ch_bai, by: [0]), ch_fasta, ch_fai) HISTOGRAMS(GENERATE_PYTOR.out.pytor, binsizes) @@ -35,11 +35,11 @@ workflow CALL_CNV_CNVPYTOR { .toList() .set { file_list } - case_info + ch_case_info .combine(file_list) .set { ch_pytor } - VIEW(ch_pytor, binsizes, "vcf") + VIEW(ch_pytor, val_binsizes, "vcf") ch_versions = ch_versions.mix(GENERATE_PYTOR.out.versions.first()) ch_versions = ch_versions.mix(HISTOGRAMS.out.versions.first()) @@ -48,7 +48,7 @@ workflow CALL_CNV_CNVPYTOR { ch_versions = ch_versions.mix(VIEW.out.versions.first()) emit: - candidate_cnvs_vcf = VIEW.out.vcf // channel: [ val(meta), path(*.tsv) ] - versions = ch_versions // channel: [ versions.yml ] + candidate_cnvs_vcf = VIEW.out.vcf // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/variant_calling/call_sv_manta.nf b/subworkflows/local/variant_calling/call_sv_manta.nf index a0b2d0ee..9a10aa06 100644 --- a/subworkflows/local/variant_calling/call_sv_manta.nf +++ b/subworkflows/local/variant_calling/call_sv_manta.nf @@ -6,49 +6,49 @@ include { MANTA_GERMLINE as MANTA } from '../../../modules/nf-core/manta/germlin workflow CALL_SV_MANTA { take: - bam // channel: [ val(meta), path(bam) ] - bai // channel: [ val(meta), path(bai) ] - fasta // path(fasta) - fai // path(fai) - case_info // channel: [ case_id ] - bed // channel: [ val(meta), path(bed), path(bed_tbi) ] + ch_bam // channel: [mandatory] [ val(meta), path(bam) ] + ch_bai // channel: [mandatory] [ val(meta), path(bai) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] + ch_bed // channel: [mandatory for WES] [ val(meta), path(bed), path(tbi) ] main: - bam.collect{it[1]} + ch_bam.collect{it[1]} .toList() .set { bam_file_list } - bai.collect{it[1]} + ch_bai.collect{it[1]} .toList() .set { bai_file_list } - bed.map { + ch_bed.map { id, bed_file, index -> return [bed_file, index]} .set { bed_input } if (params.analysis_type.toUpperCase() == "WGS" ) { - case_info.combine(bam_file_list) + ch_case_info.combine(bam_file_list) .combine(bai_file_list) .map { it -> it + [ [], [] ] } .set { manta_input } - MANTA ( manta_input, fasta, fai ) + MANTA ( manta_input, ch_fasta, ch_fai ) } else { case_info.combine(bam_file_list) .combine(bai_file_list) .combine(bed_input) .set { manta_input } - MANTA ( manta_input, fasta, fai ) + MANTA ( manta_input, ch_fasta, ch_fai ) } ch_versions = MANTA.out.versions emit: - candidate_small_indels_vcf = MANTA.out.candidate_small_indels_vcf - candidate_small_indels_vcf_tbi = MANTA.out.candidate_small_indels_vcf_tbi - candidate_sv_vcf = MANTA.out.candidate_sv_vcf - candidate_sv_vcf_tbi = MANTA.out.candidate_sv_vcf_tbi - diploid_sv_vcf = MANTA.out.diploid_sv_vcf - diploid_sv_vcf_tbi = MANTA.out.diploid_sv_vcf_tbi + candidate_small_indels_vcf = MANTA.out.candidate_small_indels_vcf // channel: [ val(meta), path(vcf) ] + candidate_small_indels_vcf_tbi = MANTA.out.candidate_small_indels_vcf_tbi // channel: [ val(meta), path(tbi) ] + candidate_sv_vcf = MANTA.out.candidate_sv_vcf // channel: [ val(meta), path(vcf) ] + candidate_sv_vcf_tbi = MANTA.out.candidate_sv_vcf_tbi // channel: [ val(meta), path(tbi) ] + diploid_sv_vcf = MANTA.out.diploid_sv_vcf // channel: [ val(meta), path(vcf) ] + diploid_sv_vcf_tbi = MANTA.out.diploid_sv_vcf_tbi // channel: [ val(meta), path(tbi) ] versions = ch_versions } diff --git a/subworkflows/local/variant_calling/call_sv_tiddit.nf b/subworkflows/local/variant_calling/call_sv_tiddit.nf index 945c07a9..6729d304 100644 --- a/subworkflows/local/variant_calling/call_sv_tiddit.nf +++ b/subworkflows/local/variant_calling/call_sv_tiddit.nf @@ -7,13 +7,13 @@ include { SVDB_MERGE as SVDB_MERGE_TIDDIT } from '../../../modules/nf-core/svdb/ workflow CALL_SV_TIDDIT { take: - bam // channel: [ val(meta), path(bam) ] - fasta // channel: [ val(meta), path(fasta) ] - index // [ val(meta), path(bwa_index)] - case_info // channel: [ case_id ] + ch_bam_bai // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_index // channel: [mandatory] [ val(meta), path(index)] + ch_case_info // channel: [mandatory] [ val(case_info) ] main: - TIDDIT_SV ( bam, fasta, index ) + TIDDIT_SV ( ch_bam_bai, ch_fasta, ch_index ) TIDDIT_SV.out .vcf @@ -21,7 +21,7 @@ workflow CALL_SV_TIDDIT { .toList() .set { vcf_file_list } - case_info + ch_case_info .combine(vcf_file_list) .set { merge_input_vcfs } @@ -31,6 +31,6 @@ workflow CALL_SV_TIDDIT { ch_versions = ch_versions.mix(SVDB_MERGE_TIDDIT.out.versions) emit: - vcf = SVDB_MERGE_TIDDIT.out.vcf - versions = ch_versions + vcf = SVDB_MERGE_TIDDIT.out.vcf // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From 4b6485d445fc4dde1a2dc33b4d061f42c47b5531 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 21:12:02 +0100 Subject: [PATCH 1041/1169] upsate comments align mt --- subworkflows/local/mitochondria/align_and_call_MT.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index c138a4d9..85974af0 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -18,8 +18,8 @@ workflow ALIGN_AND_CALL_MT { take: ch_fastq // channel: [mandatory] [ val(meta), [ path(reads) ] ] ch_ubam // channel: [mandatory] [ val(meta), path(bam) ] - ch_index_bwa // channel: [mandatory for sentieon] [ path(index) ] - ch_index_bwamem2 // channel: [mandatory for bwamem2] [ path(index) ] + ch_index_bwa // channel: [mandatory for sentieon] [ val(meta), path(index) ] + ch_index_bwamem2 // channel: [mandatory for bwamem2] [ val(meta), path(index) ] ch_fasta // channel: [mandatory] [ path(fasta) ] ch_dict // channel: [mandatory] [ path(dict) ] ch_fai // channel: [mandatory] [ path(fai) ] From dd0b65eb23ac0edc686f242827a14e604eb1525f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 21:35:05 +0100 Subject: [PATCH 1042/1169] remove variant caller --- subworkflows/local/call_snv.nf | 1 - workflows/raredisease.nf | 1 - 2 files changed, 2 deletions(-) diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index fed00674..37665f64 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -9,7 +9,6 @@ include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariant workflow CALL_SNV { take: - variant_caller // string: params.variant_caller input // channel: [ val(meta), path(bam), path(bai) ] fasta // channel: [genome.fasta] fai // channel: [genome.fai] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 7c1d1b21..0804086c 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -317,7 +317,6 @@ workflow RAREDISEASE { // STEP 2: VARIANT CALLING CALL_SNV ( - params.variant_caller, ch_mapped.bam_bai, ch_genome_fasta_no_meta, ch_genome_fai_no_meta, From 121133524e0f677a095b83ccab9a920596e8842f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 22:23:11 +0100 Subject: [PATCH 1043/1169] call snv and allied subworkflows --- subworkflows/local/call_snv.nf | 46 +++++++++---------- .../variant_calling/call_snv_deepvariant.nf | 26 +++++------ .../variant_calling/call_snv_sentieon.nf | 22 ++++----- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index 37665f64..c2555c79 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -9,14 +9,14 @@ include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariant workflow CALL_SNV { take: - input // channel: [ val(meta), path(bam), path(bai) ] - fasta // channel: [genome.fasta] - fai // channel: [genome.fai] - known_dbsnp // channel: [ /path/to/known_dbsnp ] - known_dbsnp_tbi // channel: [ /path/to/known_dbsnp_tbi ] - call_interval // channel: [ /path/to/call_intervals ] - ml_model // channel: [ /path/to/ml_model ] - case_info // channel: [ case_id ] + ch_input // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_known_dbsnp // channel: [optional] [ val(meta), path(vcf) ] + ch_known_dbsnp_tbi // channel: [optional] [ val(meta), path(tbi) ] + ch_call_interval // channel: [mandatory] [ path(intervals) ] + ch_ml_model // channel: [mandatory] [ path(model) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] main: ch_versions = Channel.empty() @@ -24,21 +24,21 @@ workflow CALL_SNV { ch_tabix = Channel.empty() CALL_SNV_DEEPVARIANT ( - input, - fasta, - fai, - case_info + ch_input, + ch_fasta, + ch_fai, + ch_case_info ) CALL_SNV_SENTIEON( - input, - fasta, - fai, - known_dbsnp, - known_dbsnp_tbi, - call_interval, - ml_model, - case_info + ch_input, + ch_fasta, + ch_fai, + ch_known_dbsnp, + ch_known_dbsnp_tbi, + ch_call_interval, + ch_ml_model, + ch_case_info ) ch_vcf = Channel.empty().mix(CALL_SNV_DEEPVARIANT.out.vcf, CALL_SNV_SENTIEON.out.vcf) @@ -48,7 +48,7 @@ workflow CALL_SNV { ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) emit: - vcf = ch_vcf - tabix = ch_tabix - versions = ch_versions + vcf = ch_vcf // channel: [ val(meta), path(vcf) ] + tabix = ch_tabix // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/variant_calling/call_snv_deepvariant.nf b/subworkflows/local/variant_calling/call_snv_deepvariant.nf index fcb89efc..7e2f4706 100644 --- a/subworkflows/local/variant_calling/call_snv_deepvariant.nf +++ b/subworkflows/local/variant_calling/call_snv_deepvariant.nf @@ -10,27 +10,27 @@ include { TABIX_TABIX as TABIX_GL } from '../../../modules/nf-co workflow CALL_SNV_DEEPVARIANT { take: - bam // channel: [ val(meta), path(bam), path(bai) ] - fasta // path(fasta) - fai // path(fai) - case_info // channel: [ case_id ] + ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] main: ch_versions = Channel.empty() - bam.map { meta, bam, bai -> + ch_bam.map { meta, bam, bai -> return [meta, bam, bai, []] } - .set { ch_bam } + .set { ch_deepvar_in } - DEEPVARIANT ( ch_bam, fasta, fai ) + DEEPVARIANT ( ch_deepvar_in, ch_fasta, ch_fai ) DEEPVARIANT.out.gvcf .collect{it[1]} .toList() .collect() .set { ch_file_list } - case_info + ch_case_info .combine(ch_file_list) .set { ch_gvcfs } @@ -39,12 +39,12 @@ workflow CALL_SNV_DEEPVARIANT { ch_split_multi_in = GLNEXUS.out.bcf .map{ meta, bcf -> return [meta, bcf, []] } - SPLIT_MULTIALLELICS_GL (ch_split_multi_in, fasta) + SPLIT_MULTIALLELICS_GL (ch_split_multi_in, ch_fasta) ch_remove_dup_in = SPLIT_MULTIALLELICS_GL.out.vcf .map{ meta, vcf -> return [meta, vcf, []] } - REMOVE_DUPLICATES_GL (ch_remove_dup_in, fasta) + REMOVE_DUPLICATES_GL (ch_remove_dup_in, ch_fasta) TABIX_GL (REMOVE_DUPLICATES_GL.out.vcf) @@ -55,7 +55,7 @@ workflow CALL_SNV_DEEPVARIANT { ch_versions = ch_versions.mix(TABIX_GL.out.versions) emit: - vcf = REMOVE_DUPLICATES_GL.out.vcf - tabix = TABIX_GL.out.tbi - versions = ch_versions + vcf = REMOVE_DUPLICATES_GL.out.vcf // channel: [ val(meta), path(vcf) ] + tabix = TABIX_GL.out.tbi // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index aef4eeeb..7b16a2e0 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -14,14 +14,14 @@ include { BCFTOOLS_FILTER as BCF_FILTER_TWO } from '../../../modules/nf-c workflow CALL_SNV_SENTIEON { take: - input // channel: [ val(meta), bam, bai ] - fasta // path: genome.fasta - fai // path: genome.fai - dbsnp // path: params.known_dbsnp - dbsnp_index // path: params.known_dbsnp - call_interval // path: params.call_interval - ml_model // path: params.ml_model - case_info // channel: [ case_id ] + ch_input // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_dbsnp // channel: [mandatory] [ val(meta), path(vcf) ] + ch_dbsnp_index // channel: [mandatory] [ val(meta), path(tbi) ] + ch_call_interval // channel: [mandatory] [ path(interval) ] + ch_ml_model // channel: [mandatory] [ path(model) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] main: ch_versions = Channel.empty() @@ -76,7 +76,7 @@ workflow CALL_SNV_SENTIEON { ch_versions = ch_versions.mix(BCF_FILTER_ONE.out.versions.first()) emit: - vcf = REMOVE_DUPLICATES_SEN.out.vcf - tabix = TABIX_SEN.out.tbi - versions = ch_versions + vcf = REMOVE_DUPLICATES_SEN.out.vcf // channel: [ val(meta), path(vcf) ] + tabix = TABIX_SEN.out.tbi // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From cfa3195113af3291cbac1d7ec5fe8a82c86a07c7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 22:27:24 +0100 Subject: [PATCH 1044/1169] repeat expansions --- subworkflows/local/call_repeat_expansions.nf | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 4c1569b8..c6185824 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -15,25 +15,25 @@ include { TABIX_TABIX as TABIX_EXP_RENAME } from '../../modules/nf- workflow CALL_REPEAT_EXPANSIONS { take: - bam // channel: [ val(meta), path(bam), path(bai) ] - variant_catalog // channel: /path/to/variant_catalog.json - case_info // channel: [ case_id ] - fasta // channel: /path/to/genome.fasta - fai // channel: /path/to/genome.fasta.fai + ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_variant_catalog // channel: [mandatory] [ path(variant_catalog.json) ] + ch_case_info // channel: [mandatory] [ val(case_id) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] main: ch_versions = Channel.empty() EXPANSIONHUNTER ( - bam, - fasta, - variant_catalog + ch_bam, + ch_fasta, + ch_variant_catalog ) // Fix header and rename sample BCFTOOLS_REHEADER_EXP ( EXPANSIONHUNTER.out.vcf.map{ meta, vcf -> [ meta, vcf, [] ]}, - fai + ch_fai ) RENAMESAMPLE_EXP ( BCFTOOLS_REHEADER_EXP.out.vcf ) TABIX_EXP_RENAME ( RENAMESAMPLE_EXP.out.vcf ) @@ -41,7 +41,7 @@ workflow CALL_REPEAT_EXPANSIONS { // Split multi allelelic SPLIT_MULTIALLELICS_EXP ( RENAMESAMPLE_EXP.out.vcf.join(TABIX_EXP_RENAME.out.tbi), - fasta + ch_fasta ) // Merge indiviual repeat expansions @@ -49,7 +49,7 @@ workflow CALL_REPEAT_EXPANSIONS { .collect{it[1]} .toList() .set {ch_exp_vcfs} - case_info + ch_case_info .combine(ch_exp_vcfs) .set {ch_svdb_merge_input} SVDB_MERGE_REPEATS ( ch_svdb_merge_input, [] ) @@ -73,6 +73,6 @@ workflow CALL_REPEAT_EXPANSIONS { ch_versions = ch_versions.mix(INDEX_STRANGER.out.versions.first()) emit: - vcf = COMPRESS_STRANGER.out.vcf.join(INDEX_STRANGER.out.tbi) // channel: [ val(meta), path(*.vcf.gz), path(*.vcf.gz.tbi) ] - versions = ch_versions // channel: [ versions.yml ] + vcf = COMPRESS_STRANGER.out.vcf.join(INDEX_STRANGER.out.tbi) // channel: [ val(meta), path(vcf), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From bf8b37d0a49a58e3297ee7b4f9f09fec9013d76b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 12 Mar 2023 23:33:48 +0100 Subject: [PATCH 1045/1169] annotate svs --- .../local/annotate_consequence_pli.nf | 10 ++-- subworkflows/local/annotate_snvs.nf | 48 +++++++++---------- .../local/annotate_structural_variants.nf | 34 ++++++------- subworkflows/local/call_repeat_expansions.nf | 2 +- subworkflows/local/check_input.nf | 12 ++--- .../variant_calling/call_snv_sentieon.nf | 12 ++--- 6 files changed, 59 insertions(+), 59 deletions(-) diff --git a/subworkflows/local/annotate_consequence_pli.nf b/subworkflows/local/annotate_consequence_pli.nf index e03e0d45..d98e6040 100644 --- a/subworkflows/local/annotate_consequence_pli.nf +++ b/subworkflows/local/annotate_consequence_pli.nf @@ -7,13 +7,13 @@ include { ADD_MOST_SEVERE_PLI } from '../../modules/local/add_most_severe_pli' workflow ANNOTATE_CSQ_PLI { take: - vcf // channel: [ val(meta), vcf ] - variant_consequences // path: consequences.txt + ch_vcf // channel: [mandatory] [ val(meta), path(vcf) ] + ch_variant_consequences // channel: [mandatory] [ path(consequences) ] main: ch_versions = Channel.empty() - ADD_MOST_SEVERE_CSQ (vcf, variant_consequences) + ADD_MOST_SEVERE_CSQ (ch_vcf, ch_variant_consequences) ADD_MOST_SEVERE_PLI (ADD_MOST_SEVERE_CSQ.out.vcf) @@ -21,6 +21,6 @@ workflow ANNOTATE_CSQ_PLI { ch_versions = ch_versions.mix(ADD_MOST_SEVERE_PLI.out.versions) emit: - vcf_ann = ADD_MOST_SEVERE_PLI.out.vcf - versions = ch_versions + vcf_ann = ADD_MOST_SEVERE_PLI.out.vcf // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index d522f4f2..693c86b3 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -18,32 +18,32 @@ include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/ workflow ANNOTATE_SNVS { take: - vcf - vcfanno_resources - vcfanno_lua - vcfanno_toml - vep_genome - vep_cache_version - vep_cache - fasta - gnomad_af - split_intervals - samples + ch_vcf // channel: [mandatory] [ val(meta), path(vcf), path(tbi) ] + ch_vcfanno_resources // channel: [mandatory] [ path(resources) ] + ch_vcfanno_lua // channel: [mandatory] [ path(lua) ] + ch_vcfanno_toml // channel: [mandatory] [ path(toml) ] + val_vep_genome // string: [mandatory] GRCh37 or GRCh38 + val_vep_cache_version // string: [mandatory] default: 107 + ch_vep_cache // channel: [mandatory] [ path(cache) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_gnomad_af // channel: [optional] [ path(tab), path(tbi) ] + ch_split_intervals // channel: [mandatory] [ path(intervals) ] + ch_samples // channel: [mandatory] [ val(sample_id), val(sex), val(phenotype), val(paternal_id), val(maternal_id), val(case_id) ] main: ch_versions = Channel.empty() ch_vcf_scatter_in = Channel.empty() ch_vep_in = Channel.empty() - vcf.map { meta, vcf, idx -> return [vcf, idx] }.set { ch_roh_vcfs } - samples + ch_vcf.map { meta, vcf, idx -> return [vcf, idx] }.set { ch_roh_vcfs } + ch_samples .branch { it -> affected: it.phenotype == "2" unaffected: it.phenotype == "1" }.set { ch_phenotype } ch_phenotype.affected.combine(ch_roh_vcfs).set { ch_roh_input } - BCFTOOLS_ROH (ch_roh_input, gnomad_af, [], [], [], []) + BCFTOOLS_ROH (ch_roh_input, ch_gnomad_af, [], [], [], []) BCFTOOLS_ROH.out.roh .map { meta, roh -> @@ -53,11 +53,11 @@ workflow ANNOTATE_SNVS { } .set { ch_roh_rhocall } - RHOCALL_ANNOTATE (vcf, ch_roh_rhocall, []) + RHOCALL_ANNOTATE (ch_vcf, ch_roh_rhocall, []) ZIP_TABIX_ROHCALL (RHOCALL_ANNOTATE.out.vcf) - VCFANNO (ZIP_TABIX_ROHCALL.out.gz_tbi, vcfanno_toml, vcfanno_lua, vcfanno_resources) + VCFANNO (ZIP_TABIX_ROHCALL.out.gz_tbi, ch_vcfanno_toml, ch_vcfanno_lua, ch_vcfanno_resources) ZIP_TABIX_VCFANNO (VCFANNO.out.vcf) @@ -67,15 +67,15 @@ workflow ANNOTATE_SNVS { BCFTOOLS_VIEW.out.vcf.join(TABIX_BCFTOOLS_VIEW.out.tbi).collect().set { ch_vcf_scatter_in } - GATK4_SELECTVARIANTS (ch_vcf_scatter_in.combine(split_intervals)).vcf.set { ch_vep_in } + GATK4_SELECTVARIANTS (ch_vcf_scatter_in.combine(ch_split_intervals)).vcf.set { ch_vep_in } ENSEMBLVEP_SNV( ch_vep_in, - vep_genome, + val_vep_genome, "homo_sapiens", - vep_cache_version, - vep_cache, - fasta, + val_vep_cache_version, + ch_vep_cache, + ch_fasta, [] ) @@ -109,7 +109,7 @@ workflow ANNOTATE_SNVS { ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) emit: - vcf_ann = BCFTOOLS_CONCAT.out.vcf - tbi = TABIX_BCFTOOLS_CONCAT.out.tbi - versions = ch_versions + vcf_ann = BCFTOOLS_CONCAT.out.vcf // channel: [ val(meta), path(vcf) ] + tbi = TABIX_BCFTOOLS_CONCAT.out.tbi // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index fc37c4eb..bb669537 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -10,18 +10,18 @@ include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/m workflow ANNOTATE_STRUCTURAL_VARIANTS { take: - vcf // channel: [ val(meta), path(vcf) ] - sv_dbs // file: dbs.csv - vep_genome - vep_cache_version - vep_cache - fasta // file: genome.fasta - seq_dict // file: genome.dict + ch_vcf // channel: [mandatory] [ val(meta), path(vcf) ] + ch_sv_dbs // channel: [mandatory] [ val(csv) ] + val_vep_genome // string: [mandatory] GRCh37 or GRCh38 + val_vep_cache_version // string: [mandatory] default: 107 + ch_vep_cache // channel: [mandatory] [ path(cache) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_seq_dict // channel: [mandatory] [ path(dict) ] main: ch_versions = Channel.empty() - - Channel.fromPath(sv_dbs) + ch_vcf.view() + Channel.fromPath(ch_sv_dbs) .splitCsv ( header:true ) .multiMap { row -> vcf_dbs: row.filename @@ -33,7 +33,7 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { .set { ch_svdb_dbs } SVDB_QUERY( - vcf, + ch_vcf, ch_svdb_dbs.in_occs.toList(), ch_svdb_dbs.in_frqs.toList(), ch_svdb_dbs.out_occs.toList(), @@ -41,7 +41,7 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ch_svdb_dbs.vcf_dbs.toList() ) - PICARD_SORTVCF(SVDB_QUERY.out.vcf, fasta, seq_dict) + PICARD_SORTVCF(SVDB_QUERY.out.vcf, ch_fasta, ch_seq_dict) PICARD_SORTVCF.out.vcf.map { meta, vcf -> return [meta,vcf,[]] }.set { ch_sortvcf } @@ -49,11 +49,11 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ENSEMBLVEP_SV( BCFTOOLS_VIEW.out.vcf, - vep_genome, + val_vep_genome, "homo_sapiens", - vep_cache_version, - vep_cache, - fasta, + val_vep_cache_version, + ch_vep_cache, + ch_fasta, [] ) @@ -63,6 +63,6 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) emit: - vcf_ann = ENSEMBLVEP_SV.out.vcf_gz - versions = ch_versions + vcf_ann = ENSEMBLVEP_SV.out.vcf_gz // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index c6185824..64e31a15 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -55,7 +55,7 @@ workflow CALL_REPEAT_EXPANSIONS { SVDB_MERGE_REPEATS ( ch_svdb_merge_input, [] ) // Annotate, compress and index - STRANGER ( SVDB_MERGE_REPEATS.out.vcf, variant_catalog ) + STRANGER ( SVDB_MERGE_REPEATS.out.vcf, ch_variant_catalog ) COMPRESS_STRANGER ( STRANGER.out.vcf.map{ meta, vcf -> [meta, vcf, [] ]}, [], [], [] diff --git a/subworkflows/local/check_input.nf b/subworkflows/local/check_input.nf index fa64498a..0af95445 100644 --- a/subworkflows/local/check_input.nf +++ b/subworkflows/local/check_input.nf @@ -6,10 +6,10 @@ include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow CHECK_INPUT { take: - samplesheet // file: /path/to/samplesheet.csv + ch_samplesheet // channel: [mandatory] [ path(csv) ] main: - SAMPLESHEET_CHECK ( samplesheet ) + SAMPLESHEET_CHECK ( ch_samplesheet ) .csv .splitCsv ( header:true, sep:',' ) .set { sheet } @@ -20,10 +20,10 @@ workflow CHECK_INPUT { samples = sheet.map { create_samples_channel(it) } emit: - case_info // channel: [ case_id ] - reads // channel: [ val(meta), [ reads ] ] - samples // channel: [ sample_id, sex, phenotype, paternal_id, maternal_id, case_id ] - versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] + case_info // channel: [ val(case_info) ] + reads // channel: [ val(meta), [ path(reads) ] ] + samples // channel: [ val(sample_id), val(sex), val(phenotype), val(paternal_id), val(maternal_id), val(case_id) ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ path(versions.yml) ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 7b16a2e0..1339d96d 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -26,9 +26,9 @@ workflow CALL_SNV_SENTIEON { main: ch_versions = Channel.empty() - SENTIEON_DNASCOPE ( input, fasta, fai, dbsnp, dbsnp_index, call_interval, ml_model ) + SENTIEON_DNASCOPE ( ch_input, ch_fasta, ch_fai, ch_dbsnp, ch_dbsnp_index, ch_call_interval, ch_ml_model ) - SENTIEON_DNAMODELAPPLY ( SENTIEON_DNASCOPE.out.vcf_index, fasta, fai, ml_model ) + SENTIEON_DNAMODELAPPLY ( SENTIEON_DNASCOPE.out.vcf_index, ch_fasta, ch_fai, ch_ml_model ) BCF_FILTER_ONE (SENTIEON_DNAMODELAPPLY.out.vcf ) @@ -40,7 +40,7 @@ workflow CALL_SNV_SENTIEON { .map { meta,vcf,tbi -> return [vcf,tbi] } .set { ch_vcf_idx } - case_info + ch_case_info .combine(ch_vcf_idx) .groupTuple() .branch{ // branch the channel into multiple channels (single, multiple) depending on size of list @@ -49,7 +49,7 @@ workflow CALL_SNV_SENTIEON { } .set{ ch_vcf_idx_merge_in } - BCFTOOLS_MERGE(ch_vcf_idx_merge_in.multiple,[],fasta,fai) + BCFTOOLS_MERGE(ch_vcf_idx_merge_in.multiple, [], ch_fasta, ch_fai) ch_split_multi_in = BCFTOOLS_MERGE.out.merged_variants .map{meta, bcf -> @@ -57,13 +57,13 @@ workflow CALL_SNV_SENTIEON { ch_vcf_idx_case = ch_vcf_idx_merge_in.single.mix(ch_split_multi_in) - SPLIT_MULTIALLELICS_SEN(ch_vcf_idx_case, fasta) + SPLIT_MULTIALLELICS_SEN(ch_vcf_idx_case, ch_fasta) ch_remove_dup_in = SPLIT_MULTIALLELICS_SEN.out.vcf .map{meta, vcf -> return [meta, vcf, []]} - REMOVE_DUPLICATES_SEN(ch_remove_dup_in, fasta) + REMOVE_DUPLICATES_SEN(ch_remove_dup_in, ch_fasta) TABIX_SEN(REMOVE_DUPLICATES_SEN.out.vcf) From 3eb33647f86ad3769a8b9661b874d283d26cacc5 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 13 Mar 2023 00:46:43 +0100 Subject: [PATCH 1046/1169] gens and call sv --- .../local/call_structural_variants.nf | 2 +- subworkflows/local/gens.nf | 30 +++++++++---------- subworkflows/local/qc_bam.nf | 22 +++++++------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index ed25db68..fa3eae61 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -19,7 +19,7 @@ workflow CALL_STRUCTURAL_VARIANTS { ch_fai // channel: [mandatory] [ path(fai) ] ch_case_info // channel: [mandatory] [ val(case_info) ] ch_target_bed // channel: [mandatory for WES] [ val(meta), path(bed), path(tbi) ] - val_cnvpytor_bins // string: [mandatory] binsizes for cnvpytor default: 1000 + val_cnvpytor_bins // string: [optional] binsizes for cnvpytor default: 1000 main: ch_versions = Channel.empty() diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index da1f4ba7..95d6c5b5 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -8,31 +8,31 @@ include { GENS as GENS_GENERATE } from '../../modules/local/gens/main' workflow GENS { take: - bam // channel: [ val(meta), path(bam), path(bai) ] - vcf // channel: [ val(meta), path(vcf) ] - fasta // path(fasta) - fai // path(fai) - interval_list // path(interval_list) - pon // path(pon) - gnomad_pos // path(gnomad_pos) - case_info // channel: [ val(case_info) ] - seq_dict // path: seq_dict + ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_vcf // channel: [mandatory] [ val(meta), path(vcf) ] + ch_fasta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_interval_list // channel: [mandatory] [ path(interval_list) ] + ch_pon // channel: [mandatory] [ path(pon) ] + ch_gnomad_pos // channel: [mandatory] [ path(gnomad_pos) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] + ch_seq_dict // channel: [mandatory] [ path(dict) ] main: ch_versions = Channel.empty() - COLLECTREADCOUNTS (bam, fasta, fai, seq_dict, interval_list) + COLLECTREADCOUNTS (ch_bam, ch_fasta, ch_fai, ch_seq_dict, ch_interval_list) - DENOISEREADCOUNTS (COLLECTREADCOUNTS.out.read_counts, pon) + DENOISEREADCOUNTS (COLLECTREADCOUNTS.out.read_counts, ch_pon) - GENS_GENERATE (DENOISEREADCOUNTS.out.standardized_read_counts, vcf.map { meta, vcf -> vcf }, gnomad_pos) + GENS_GENERATE (DENOISEREADCOUNTS.out.standardized_read_counts, ch_vcf.map { meta, vcf -> vcf }, ch_gnomad_pos) ch_versions = ch_versions.mix(COLLECTREADCOUNTS.out.versions.first()) ch_versions = ch_versions.mix(DENOISEREADCOUNTS.out.versions.first()) ch_versions = ch_versions.mix(GENS_GENERATE.out.versions.first()) emit: - gens_cov_bed_gz = GENS_GENERATE.out.cov - gens_baf_bed_gz = GENS_GENERATE.out.baf - versions = ch_versions + gens_cov_bed_gz = GENS_GENERATE.out.cov // channel: [ val(meta), path(bed) ] + gens_baf_bed_gz = GENS_GENERATE.out.baf // channel: [ val(meta), path(bed) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 4d4e26d6..e76ce240 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -16,17 +16,17 @@ include { SENTIEON_WGSMETRICSALGO as SENTIEON_WGSMETRICS_Y } from '../../m workflow QC_BAM { take: - bam // channel: [ val(meta), path(bam) ] - bai // channel: [ val(meta), path(bai) ] - bam_bai - fasta // path: genome.fasta - fai // path: genome.fasta.fai - bait_intervals // path: bait.intervals_list - target_intervals // path: target.intervals_list - chrom_sizes // path: chrom.sizes - intervals_wgs // path: genome.intervals_wgs - intervals_y // path: genome.intervals_y - aligner // string: params.aligner + ch_bam // channel: [mandatory] [ val(meta), path(bam) ] + ch_bai // channel: [mandatory] [ val(meta), path(bai) ] + ch_bam_bai // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_fai // channel: [mandatory] [ val(meta), path(fai) ] + ch_bait_intervals // channel: [mandatory] [ path(intervals_list) ] + ch_target_intervals // channel: [mandatory] [ path(intervals_list) ] + ch_chrom_sizes // channel: [mandatory] [ path(sizes) ] + ch_intervals_wgs // channel: [mandatory] [ path(intervals) ] + ch_intervals_y // channel: [mandatory] [ path(intervals) ] + ch_aligner // string: params.aligner main: ch_versions = Channel.empty() From 99d5ee5ef0ed9497211a48688bd688bdcae54a4c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 13 Mar 2023 00:47:47 +0100 Subject: [PATCH 1047/1169] remove aligner from qc_bam sworkflow --- subworkflows/local/qc_bam.nf | 1 - workflows/raredisease.nf | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 4d4e26d6..a1627283 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -26,7 +26,6 @@ workflow QC_BAM { chrom_sizes // path: chrom.sizes intervals_wgs // path: genome.intervals_wgs intervals_y // path: genome.intervals_y - aligner // string: params.aligner main: ch_versions = Channel.empty() diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 0804086c..c25be005 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -279,8 +279,7 @@ workflow RAREDISEASE { ch_target_intervals, ch_chrom_sizes, ch_intervals_wgs, - ch_intervals_y, - params.aligner + ch_intervals_y ) ch_versions = ch_versions.mix(QC_BAM.out.versions) From 0baa335add9c1b7c5798257d3b10da72a26efb75 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 13 Mar 2023 00:59:18 +0100 Subject: [PATCH 1048/1169] qc bam --- subworkflows/local/qc_bam.nf | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 348d7800..1e3d622c 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -30,17 +30,17 @@ workflow QC_BAM { main: ch_versions = Channel.empty() - PICARD_COLLECTMULTIPLEMETRICS (bam_bai, fasta, fai) + PICARD_COLLECTMULTIPLEMETRICS (ch_bam_bai, ch_fasta, ch_fai) - PICARD_COLLECTHSMETRICS (bam_bai, fasta, fai, bait_intervals, target_intervals) + PICARD_COLLECTHSMETRICS (ch_bam_bai, ch_fasta, ch_fai, ch_bait_intervals, ch_target_intervals) - QUALIMAP_BAMQC (bam, []) + QUALIMAP_BAMQC (ch_bam, []) - TIDDIT_COV (bam, []) // 2nd pos. arg is req. only for cram input + TIDDIT_COV (ch_bam, []) // 2nd pos. arg is req. only for cram input - UCSC_WIGTOBIGWIG (TIDDIT_COV.out.wig, chrom_sizes) + UCSC_WIGTOBIGWIG (TIDDIT_COV.out.wig, ch_chrom_sizes) - MOSDEPTH (bam_bai, Channel.value([[], []]), Channel.value([[], []])) + MOSDEPTH (ch_bam_bai, Channel.value([[], []]), Channel.value([[], []])) ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions.first()) @@ -50,11 +50,11 @@ workflow QC_BAM { ch_versions = ch_versions.mix(MOSDEPTH.out.versions.first()) // COLLECT WGS METRICS - PICARD_COLLECTWGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) - PICARD_COLLECTWGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) + PICARD_COLLECTWGSMETRICS ( ch_bam_bai, ch_fasta, ch_fai, ch_intervals_wgs ) + PICARD_COLLECTWGSMETRICS_Y ( ch_bam_bai, ch_fasta, ch_fai, ch_intervals_y ) - SENTIEON_WGSMETRICS ( bam_bai, fasta, fai, intervals_wgs ) - SENTIEON_WGSMETRICS_Y ( bam_bai, fasta, fai, intervals_y ) + SENTIEON_WGSMETRICS ( ch_bam_bai, ch_fasta, ch_fai, ch_intervals_wgs ) + SENTIEON_WGSMETRICS_Y ( ch_bam_bai, ch_fasta, ch_fai, ch_intervals_y ) ch_cov = Channel.empty().mix(PICARD_COLLECTWGSMETRICS.out.metrics, SENTIEON_WGSMETRICS.out.wgs_metrics) ch_cov_y = Channel.empty().mix(PICARD_COLLECTWGSMETRICS_Y.out.metrics, SENTIEON_WGSMETRICS_Y.out.wgs_metrics) @@ -65,11 +65,11 @@ workflow QC_BAM { emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] hs_metrics = PICARD_COLLECTHSMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] - qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap files) ] - tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(*.wig) ] - bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(*.bw) ] - d4 = MOSDEPTH.out.per_base_d4 // channel: [ val(meta), path(*.d4) ] + qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap_dir) ] + tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(wig) ] + bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(bw) ] + d4 = MOSDEPTH.out.per_base_d4 // channel: [ val(meta), path(d4) ] cov = ch_cov // channel: [ val(meta), path(metrics) ] cov_y = ch_cov_y // channel: [ val(meta), path(metrics) ] - versions = ch_versions // channel: [ versions.yml ] + versions = ch_versions // channel: [ path(versions.yml) ] } From e0e2d0d0eee449c2abf63ab86437d7e3df8a8acd Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 13 Mar 2023 01:07:12 +0100 Subject: [PATCH 1049/1169] scatter --- subworkflows/local/scatter_genome.nf | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/subworkflows/local/scatter_genome.nf b/subworkflows/local/scatter_genome.nf index 5f136168..55e9c8cf 100644 --- a/subworkflows/local/scatter_genome.nf +++ b/subworkflows/local/scatter_genome.nf @@ -8,23 +8,24 @@ include { GATK4_SPLITINTERVALS } from '../../modules/nf-core/gatk4/splitinterval workflow SCATTER_GENOME { take: - dict - fai_meta // channel: [ val(meta), path(vcf) ] - fai_no_meta - fasta_no_meta + ch_dict // channel: [mandatory] [ path(dict) ] + ch_fai_meta // channel: [mandatory] [ val(meta), path(fai) ] + ch_fai_no_meta // channel: [mandatory] [ path(fai) ] + ch_fasta_no_meta // channel: [mandatory] [ path(fasta) ] main: ch_versions = Channel.empty() - BUILD_BED (fai_meta) + BUILD_BED (ch_fai_meta) - GATK4_SPLITINTERVALS(BUILD_BED.out.bed, fasta_no_meta, fai_no_meta, dict) + GATK4_SPLITINTERVALS(BUILD_BED.out.bed, ch_fasta_no_meta, ch_fai_no_meta, ch_dict) ch_versions = ch_versions.mix(BUILD_BED.out.versions) ch_versions = ch_versions.mix(GATK4_SPLITINTERVALS.out.versions) + GATK4_SPLITINTERVALS.out.split_intervals.view() emit: - bed = BUILD_BED.out.bed.collect() - split_intervals = GATK4_SPLITINTERVALS.out.split_intervals.map { meta, it -> it }.flatten().collate(1) - versions = ch_versions + bed = BUILD_BED.out.bed.collect() // channel: [ val(meta), path(bed) ] + split_intervals = GATK4_SPLITINTERVALS.out.split_intervals.map { meta, it -> it }.flatten().collate(1) // channel: [ val(meta), [ path(interval_lists) ] ] + versions = ch_versions // channel: [ path(versions.yml) ] } From 13672eff9a8e43a13b3a0b84296fff571bf9c54a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 13 Mar 2023 01:07:31 +0100 Subject: [PATCH 1050/1169] remove view --- subworkflows/local/scatter_genome.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/scatter_genome.nf b/subworkflows/local/scatter_genome.nf index 55e9c8cf..07a70e95 100644 --- a/subworkflows/local/scatter_genome.nf +++ b/subworkflows/local/scatter_genome.nf @@ -22,7 +22,6 @@ workflow SCATTER_GENOME { ch_versions = ch_versions.mix(BUILD_BED.out.versions) ch_versions = ch_versions.mix(GATK4_SPLITINTERVALS.out.versions) - GATK4_SPLITINTERVALS.out.split_intervals.view() emit: bed = BUILD_BED.out.bed.collect() // channel: [ val(meta), path(bed) ] From add02bd70ae49cdaa7c4eecfbb3dce3682fbdf75 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 13 Mar 2023 01:24:47 +0100 Subject: [PATCH 1051/1169] rank variants --- subworkflows/local/alignment/align_bwamem2.nf | 2 +- subworkflows/local/alignment/align_sentieon.nf | 6 +++--- subworkflows/local/rank_variants.nf | 18 +++++++++--------- .../local/variant_calling/call_cnv_cnvpytor.nf | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 8d78c6b2..1d71b388 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -16,7 +16,7 @@ workflow ALIGN_BWAMEM2 { ch_index // channel: [mandatory] [ val(meta), path(bwamem2_index) ] ch_fasta // channel: [mandatory] [ path(fasta) ] ch_fai // channel: [mandatory] [ path(fai) ] - val_platform // string: [mandatory] val(platform) + val_platform // string: [mandatory] default: illumina main: ch_versions = Channel.empty() diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index 3efc9faf..9cafadf4 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -15,9 +15,9 @@ workflow ALIGN_SENTIEON { ch_fasta // channel: [mandatory] [ path(fasta) ] ch_fai // channel: [mandatory] [ path(fai) ] ch_index // channel: [mandatory] [ val(meta), path(bwamem2_index) ] - ch_known_dbsnp // channel: [mandatory] [ path(known_dbsnp) ] - ch_known_dbsnp_tbi // channel: [mandatory] [ path(known_dbsnp_tbi) ] - val_platform // string: [mandatory] val(platform) + ch_known_dbsnp // channel: [optional] [ path(known_dbsnp) ] + ch_known_dbsnp_tbi // channel: [optional] [ path(known_dbsnp_tbi) ] + val_platform // string: [mandatory] default: illumina main: ch_versions = Channel.empty() diff --git a/subworkflows/local/rank_variants.nf b/subworkflows/local/rank_variants.nf index 8fa405fd..f96197fc 100644 --- a/subworkflows/local/rank_variants.nf +++ b/subworkflows/local/rank_variants.nf @@ -10,19 +10,19 @@ include { GENMOD_COMPOUND } from '../../modules/nf-core/genmod/compound/main' workflow RANK_VARIANTS { take: - vcf // channel: [ val(meta), path(vcf) ] - ped - reduced_penetrance - score_config + ch_vcf // channel: [mandatory] [ val(meta), path(vcf) ] + ch_ped // channel: [mandatory] [ path(ped) ] + ch_reduced_penetrance // channel: [mandatory] [ path(pentrance) ] + ch_score_config // channel: [mandatory] [ path(ini) ] main: ch_versions = Channel.empty() - GENMOD_ANNOTATE(vcf) + GENMOD_ANNOTATE(ch_vcf) - GENMOD_MODELS(GENMOD_ANNOTATE.out.vcf, ped, reduced_penetrance) + GENMOD_MODELS(GENMOD_ANNOTATE.out.vcf, ch_ped, ch_reduced_penetrance) - GENMOD_SCORE(GENMOD_MODELS.out.vcf, ped, score_config) + GENMOD_SCORE(GENMOD_MODELS.out.vcf, ch_ped, ch_score_config) GENMOD_COMPOUND(GENMOD_SCORE.out.vcf) @@ -32,6 +32,6 @@ workflow RANK_VARIANTS { ch_versions = ch_versions.mix(GENMOD_COMPOUND.out.versions) emit: - vcf = GENMOD_COMPOUND.out.vcf - versions = ch_versions + vcf = GENMOD_COMPOUND.out.vcf // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf index 39cb62d0..5b3b87f7 100644 --- a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf +++ b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf @@ -12,8 +12,8 @@ workflow CALL_CNV_CNVPYTOR { take: ch_bam // channel: [mandatory] [ val(meta), path(bam)] ch_bai // channel: [mandatory] [ val(meta), path(bai) ] - ch_case_info // channel: [mandatory] [ val(case_id) ] - val_binsizes // channel: [optional] [ val(binsize) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] + val_binsizes // string: [optional] binsizes for cnvpytor default: 1000 ch_fasta // channel: [mandatory] [ path(fasta) ] ch_fai // channel: [mandatory] [ path(fai) ] From 7e55c685d676f18282ee78290f54d9e382efc960 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 13 Mar 2023 01:47:32 +0100 Subject: [PATCH 1052/1169] remove view --- subworkflows/local/annotate_structural_variants.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index bb669537..147fe0d0 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -20,7 +20,7 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { main: ch_versions = Channel.empty() - ch_vcf.view() + Channel.fromPath(ch_sv_dbs) .splitCsv ( header:true ) .multiMap { row -> From 1631761189c412374a8567ed94bf4d00efe492c6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 00:20:25 +0100 Subject: [PATCH 1053/1169] align call qc --- conf/modules/align_bwamem2.config | 29 +++++------ conf/modules/align_sentieon.config | 22 +++------ conf/modules/call_snv_deepvariant.config | 18 ++----- conf/modules/call_snv_sentieon.config | 30 ++---------- conf/modules/qc_bam.config | 61 ++++++------------------ 5 files changed, 43 insertions(+), 117 deletions(-) diff --git a/conf/modules/align_bwamem2.config b/conf/modules/align_bwamem2.config index 81b5e785..953dc038 100644 --- a/conf/modules/align_bwamem2.config +++ b/conf/modules/align_bwamem2.config @@ -19,44 +19,37 @@ process { withName: '.*ALIGN_BWAMEM2:.*' { ext.when = params.aligner.equals("bwamem2") publishDir = [ - path: { "${params.outdir}/bwamem2" }, - mode: 'copy', - pattern: "*{stats,sorted_md.bam,sorted_md.bam.bai}", - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false ] } withName: '.*ALIGN:ALIGN_BWAMEM2:BWAMEM2_MEM' { ext.args = { "-M -K 100000000 -R ${meta.read_group}" } - publishDir = [ - path: { "${params.outdir}/bwamem2" }, - enabled: false, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] } withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_STATS' { ext.args = '-s --remove-overlaps' - publishDir = [ - path: { "${params.outdir}/bwamem2" }, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] } withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_MERGE' { ext.prefix = { "${meta.id}_sorted_merged" } - publishDir = [ - enabled: false, - ] } withName: '.*ALIGN:ALIGN_BWAMEM2:MARKDUPLICATES' { ext.prefix = { "${meta.id}_sorted_md" } publishDir = [ - path: { "${params.outdir}/bwamem2" }, + path: { "${params.outdir}/alignment" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } + + withName: '.*ALIGN:ALIGN_BWAMEM2:SAMTOOLS_INDEX_MARKDUP' { + publishDir = [ + path: { "${params.outdir}/alignment" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + } diff --git a/conf/modules/align_sentieon.config b/conf/modules/align_sentieon.config index 56b96cac..ba575031 100644 --- a/conf/modules/align_sentieon.config +++ b/conf/modules/align_sentieon.config @@ -18,38 +18,32 @@ process { withName: '.*ALIGN_SENTIEON:.*' { ext.when = params.aligner.equals("sentieon") + publishDir = [ + enabled: false + ] } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BWAMEM' { ext.args = { "-M -K 10000000 -R ${meta.read_group} " } ext.prefix = { "${meta.id}.sorted" } - publishDir = [ - path: { "${params.outdir}/sentieon_align" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DATAMETRICS' { publishDir = [ - path: { "${params.outdir}/sentieon_bam_metrics" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_LOCUSCOLLECTOR' { publishDir = [ - path: { "${params.outdir}/sentieon_dedup" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DEDUP' { ext.args = { $params.rmdup ? "--rmdup" : '' } publishDir = [ - path: { "${params.outdir}/sentieon_dedup" }, + path: { "${params.outdir}/alignment" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -57,9 +51,7 @@ process { withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BQSR' { publishDir = [ - path: { "${params.outdir}/sentieon_recal" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } } diff --git a/conf/modules/call_snv_deepvariant.config b/conf/modules/call_snv_deepvariant.config index 5825469c..65011577 100644 --- a/conf/modules/call_snv_deepvariant.config +++ b/conf/modules/call_snv_deepvariant.config @@ -19,37 +19,29 @@ process { withName: '.*CALL_SNV_DEEPVARIANT:.*' { ext.when = params.variant_caller.equals("deepvariant") + publishDir = [ + enabled: false + ] } withName: '.*CALL_SNV_DEEPVARIANT:DEEPVARIANT' { ext.args = { "--model_type=${params.analysis_type.toUpperCase()}" } ext.prefix = { "${meta.id}_deepvar" } - publishDir = [ - path: { "${params.outdir}/deepvariant" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*CALL_SNV_DEEPVARIANT:GLNEXUS' { ext.args = '--config DeepVariant_unfiltered' - publishDir = [ - enabled: false - ] } withName: '.*CALL_SNV_DEEPVARIANT:SPLIT_MULTIALLELICS_GL' { ext.args = '--output-type z --multiallelics -both' - publishDir = [ - enabled: false - ] } withName: '.*CALL_SNV_DEEPVARIANT:REMOVE_DUPLICATES_GL' { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ - path: { "${params.outdir}/glnexus" }, + path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -57,7 +49,7 @@ process { withName: '.*CALL_SNV_DEEPVARIANT:TABIX_GL' { publishDir = [ - path: { "${params.outdir}/glnexus" }, + path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/conf/modules/call_snv_sentieon.config b/conf/modules/call_snv_sentieon.config index 5ad82181..3c73f6ca 100644 --- a/conf/modules/call_snv_sentieon.config +++ b/conf/modules/call_snv_sentieon.config @@ -18,6 +18,9 @@ process { withName: '.*CALL_SNV_SENTIEON:.*' { ext.when = params.variant_caller.equals("sentieon") + publishDir = [ + enabled: false + ] } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { @@ -26,55 +29,32 @@ process { params.variant_type ? "--var_type ${params.variant_type}" : '', params.pcrfree ? "--pcr_indel_model NONE" : '' ].join(" ") } - publishDir = [ - path: { "${params.outdir}/sentieon_dnascope" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNAMODELAPPLY' { ext.prefix = { "${meta.id}_dnamodelapply" } - publishDir = [ - path: { "${params.outdir}/sentieon_dnamodelapply" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_ONE' { ext.args = "-s 'ML_FAIL' -i 'INFO/ML_PROB <= 0.95' -m x -Oz" ext.prefix = { "${meta.id}_mlfiltered_0.95" } - publishDir = [ - path: { "${params.outdir}/sentieon_filter" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:BCF_FILTER_TWO' { ext.args = "-i FILTER='\"PASS\"' -m x -Oz" ext.prefix = { "${meta.id}_passed" } - publishDir = [ - path: { "${params.outdir}/sentieon_filter" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SPLIT_MULTIALLELICS_SEN' { ext.args = '--output-type z --multiallelics -both' ext.prefix = { "${meta.id}_split" } - publishDir = [ - enabled: false - ] } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:REMOVE_DUPLICATES_SEN' { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ - path: { "${params.outdir}/sentieon_normvcf" }, + path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -82,7 +62,7 @@ process { withName: '.*CALL_SNV_SENTIEON:TABIX_SEN' { publishDir = [ - path: { "${params.outdir}/sentieon_normvcf" }, + path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/conf/modules/qc_bam.config b/conf/modules/qc_bam.config index cb1af0ea..360d479a 100644 --- a/conf/modules/qc_bam.config +++ b/conf/modules/qc_bam.config @@ -16,89 +16,58 @@ // process { - withName: '.*QC_BAM:PICARD_COLLECTMULTIPLEMETRICS' { + withName: '.*QC_BAM:.*' { publishDir = [ - path: { "${params.outdir}/bamqc_collectmultiplemetrics" }, + path: { "${params.outdir}/qc_bam" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } + withName: '.*QC_BAM:PICARD_COLLECTMULTIPLEMETRICS' { + ext.prefix = { "${meta.id}_multiplemetrics" } + } + withName: '.*QC_BAM:PICARD_COLLECTHSMETRICS' { - publishDir = [ - path: { "${params.outdir}/bamqc/collecthsmetrics" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_hsmetrics" } } withName: '.*QC_BAM:QUALIMAP_BAMQC' { - publishDir = [ - path: { "${params.outdir}/bamqc_qualimap" }, - mode: params.publish_dir_mode, - ] + ext.prefix = { "${meta.id}_qualimap" } } withName: '.*QC_BAM:TIDDIT_COV' { ext.args = '-z 500 -w' - publishDir = [ - path: { "${params.outdir}/tiddit_coverage" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_tidditcov" } } withName: '.*QC_BAM:UCSC_WIGTOBIGWIG' { ext.args = '-clip' - publishDir = [ - path: { "${params.outdir}/tiddit_coverage" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_wigtobigwig" } } withName: '.*QC_BAM:MOSDEPTH' { ext.args = '--d4' - publishDir = [ - path: { "${params.outdir}/mosdepth" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_mosdepth" } } withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS' { ext.when = params.aligner.equals("bwamem2") - publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_wgsmetrics" } } withName: '.*QC_BAM:PICARD_COLLECTWGSMETRICS_Y' { ext.when = params.aligner.equals("bwamem2") - publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_wgsmetrics_y" } } withName: '.*QC_BAM:SENTIEON_WGSMETRICS' { ext.when = params.aligner.equals("sentieon") - publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics_wg" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_wgsmetrics" } } withName: '.*QC_BAM:SENTIEON_WGSMETRICS_Y' { ext.when = params.aligner.equals("sentieon") - publishDir = [ - path: { "${params.outdir}/bamqc_collectwgsmetrics_y" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_wgsmetrics_y" } } } From f5e96b1c03add7ccaa286fdaaa4d1c098bda0b51 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 00:45:52 +0100 Subject: [PATCH 1054/1169] call sv snv --- conf/modules/align.config | 8 ++++++++ conf/modules/align_bwamem2.config | 3 --- conf/modules/align_sentieon.config | 16 ++++------------ conf/modules/call_snv.config | 10 ++++++++++ conf/modules/call_snv_deepvariant.config | 3 --- conf/modules/call_snv_sentieon.config | 4 +--- conf/modules/call_structural_variants.config | 10 +++++++++- conf/modules/call_sv_manta.config | 5 ----- conf/modules/call_sv_tiddit.config | 9 --------- 9 files changed, 32 insertions(+), 36 deletions(-) diff --git a/conf/modules/align.config b/conf/modules/align.config index 2812ef7f..be3fee28 100644 --- a/conf/modules/align.config +++ b/conf/modules/align.config @@ -10,3 +10,11 @@ ext.when = Conditional clause ---------------------------------------------------------------------------------------- */ + +process{ + withName: '.*ALIGN:.*' { + publishDir = [ + enabled: false + ] + } +} diff --git a/conf/modules/align_bwamem2.config b/conf/modules/align_bwamem2.config index 953dc038..c6310310 100644 --- a/conf/modules/align_bwamem2.config +++ b/conf/modules/align_bwamem2.config @@ -18,9 +18,6 @@ process { withName: '.*ALIGN_BWAMEM2:.*' { ext.when = params.aligner.equals("bwamem2") - publishDir = [ - enabled: false - ] } withName: '.*ALIGN:ALIGN_BWAMEM2:BWAMEM2_MEM' { diff --git a/conf/modules/align_sentieon.config b/conf/modules/align_sentieon.config index ba575031..549e2c6e 100644 --- a/conf/modules/align_sentieon.config +++ b/conf/modules/align_sentieon.config @@ -18,9 +18,6 @@ process { withName: '.*ALIGN_SENTIEON:.*' { ext.when = params.aligner.equals("sentieon") - publishDir = [ - enabled: false - ] } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BWAMEM' { @@ -29,19 +26,16 @@ process { } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DATAMETRICS' { - publishDir = [ - enabled: false - ] + ext.prefix = { "${meta.id}_datametrics" } } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_LOCUSCOLLECTOR' { - publishDir = [ - enabled: false - ] + ext.prefix = { "${meta.id}_locuscollector" } } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_DEDUP' { ext.args = { $params.rmdup ? "--rmdup" : '' } + ext.prefix = { "${meta.id}_dedup" } publishDir = [ path: { "${params.outdir}/alignment" }, mode: params.publish_dir_mode, @@ -50,8 +44,6 @@ process { } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BQSR' { - publishDir = [ - enabled: false - ] + ext.prefix = { "${meta.id}_bqsr" } } } diff --git a/conf/modules/call_snv.config b/conf/modules/call_snv.config index 2812ef7f..53cc78b4 100644 --- a/conf/modules/call_snv.config +++ b/conf/modules/call_snv.config @@ -10,3 +10,13 @@ ext.when = Conditional clause ---------------------------------------------------------------------------------------- */ + +process { + + withName: '.*CALL_SNV:.*' { + publishDir = [ + enabled: false + ] + } + +} diff --git a/conf/modules/call_snv_deepvariant.config b/conf/modules/call_snv_deepvariant.config index 65011577..0312dded 100644 --- a/conf/modules/call_snv_deepvariant.config +++ b/conf/modules/call_snv_deepvariant.config @@ -19,9 +19,6 @@ process { withName: '.*CALL_SNV_DEEPVARIANT:.*' { ext.when = params.variant_caller.equals("deepvariant") - publishDir = [ - enabled: false - ] } withName: '.*CALL_SNV_DEEPVARIANT:DEEPVARIANT' { diff --git a/conf/modules/call_snv_sentieon.config b/conf/modules/call_snv_sentieon.config index 3c73f6ca..46ba791d 100644 --- a/conf/modules/call_snv_sentieon.config +++ b/conf/modules/call_snv_sentieon.config @@ -16,11 +16,9 @@ // process { + withName: '.*CALL_SNV_SENTIEON:.*' { ext.when = params.variant_caller.equals("sentieon") - publishDir = [ - enabled: false - ] } withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { diff --git a/conf/modules/call_structural_variants.config b/conf/modules/call_structural_variants.config index d59ebb9d..8bc1c6a4 100644 --- a/conf/modules/call_structural_variants.config +++ b/conf/modules/call_structural_variants.config @@ -16,10 +16,18 @@ // process { + + withName: '.*CALL_STRUCTURAL_VARIANTS:.*' { + publishDir = [ + enabled: false + ] + } + withName: '.*CALL_STRUCTURAL_VARIANTS:SVDB_MERGE' { ext.args = '--pass_only --same_order' + ext.prefix = { "${meta.id}_merged" } publishDir = [ - path: { "${params.outdir}/sv_caller" }, + path: { "${params.outdir}/call_sv" }, mode: params.publish_dir_mode, ] } diff --git a/conf/modules/call_sv_manta.config b/conf/modules/call_sv_manta.config index 57cc3440..f55581af 100644 --- a/conf/modules/call_sv_manta.config +++ b/conf/modules/call_sv_manta.config @@ -18,10 +18,5 @@ process { withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA' { ext.prefix = { "${meta.id}_manta" } - publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] } } diff --git a/conf/modules/call_sv_tiddit.config b/conf/modules/call_sv_tiddit.config index 8e316156..2ca400a3 100644 --- a/conf/modules/call_sv_tiddit.config +++ b/conf/modules/call_sv_tiddit.config @@ -18,19 +18,10 @@ process { withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:TIDDIT_SV' { ext.args = '-p 6' - publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, - ] } withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_TIDDIT:SVDB_MERGE_TIDDIT' { ext.args = '--notag --pass_only' ext.prefix = { "${meta.id}_tiddit" } - publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] } } From 62a217eab679f32e484ca6f6b52269a40ad134f3 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 01:31:45 +0100 Subject: [PATCH 1055/1169] references repeats --- conf/modules/call_repeat_expansions.config | 43 ++-------- conf/modules/prepare_references.config | 99 ++-------------------- conf/modules/raredisease.config | 7 +- 3 files changed, 15 insertions(+), 134 deletions(-) diff --git a/conf/modules/call_repeat_expansions.config b/conf/modules/call_repeat_expansions.config index 6c4b0c33..6129ef7b 100644 --- a/conf/modules/call_repeat_expansions.config +++ b/conf/modules/call_repeat_expansions.config @@ -18,64 +18,37 @@ process { withName: '.*CALL_REPEAT_EXPANSIONS:.*' { ext.when = { params.analysis_type != "wes" } + publishDir = [ + enabled: false + ] } withName: '.*CALL_REPEAT_EXPANSIONS:EXPANSIONHUNTER' { - publishDir = [ - enabled: false, - ] + ext.prefix = { "${meta.id}_exphunter" } } withName: '.*CALL_REPEAT_EXPANSIONS:BCFTOOLS_REHEADER_EXP' { ext.prefix = { "${meta.id}_reheader" } - publishDir = [ - enabled: false, - ] } withName: '.*CALL_REPEAT_EXPANSIONS:RENAMESAMPLE_EXP' { - publishDir = [ - path: { "${params.outdir}/repeat_expansions" }, - mode: params.publish_dir_mode, - saveAs: { filename -> - filename.equals('versions.yml') ? null : - filename.contains('_renam.vcf.gz') ? "${meta.id}_repeat_expansion.vcf.gz" : - filename - }, - ] + ext.prefix = { "${meta.id}_rename" } } withName: '.*CALL_REPEAT_EXPANSIONS:TABIX_EXP_RENAME' { - publishDir = [ - path: { "${params.outdir}/repeat_expansions" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - saveAs: { filename -> - filename.equals('versions.yml') ? null : - filename.contains('_renam.vcf.gz.tbi') ? "${meta.id}_repeat_expansion.vcf.gz.tbi" : - filename - }, - ] + ext.prefix = { "${meta.id}_tabix_rename" } } withName: '.*CALL_REPEAT_EXPANSIONS:SPLIT_MULTIALLELICS_EXP' { - ext.prefix = { "${meta.id}_exp" } - publishDir = [ - enabled: false, - ] + ext.prefix = { "${meta.id}_split_exp" } } withName: '.*CALL_REPEAT_EXPANSIONS:SVDB_MERGE_REPEATS' { ext.args = {"--notag"} - publishDir = [ - enabled: false - ] } withName: '.*CALL_REPEAT_EXPANSIONS:STRANGER' { - publishDir = [ - enabled: false - ] + ext.prefix = { "${meta.id}_stranger" } } withName: '.*CALL_REPEAT_EXPANSIONS:COMPRESS_STRANGER' { diff --git a/conf/modules/prepare_references.config b/conf/modules/prepare_references.config index 8be6d38d..5acc1062 100644 --- a/conf/modules/prepare_references.config +++ b/conf/modules/prepare_references.config @@ -16,100 +16,49 @@ // process { - withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_GENOME' { - ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} + withName: '.*PREPARE_REFERENCES:.*' { publishDir = [ path: { "${params.outdir}/references" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference, - pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" ] } + withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_GENOME' { + ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} + } + withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_SHIFT_MT' { ext.when = {!params.mt_bwamem2_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes") && params.aligner == "bwamem2"} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*{0123,amb,ann,bwt.2bit.64,bwt.8bit.32,pac}" - ] } withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_GENOME' { ext.when = {!params.bwa_index && params.aligner == "sentieon"} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference - ] } withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_SHIFT_MT' { ext.when = {!params.mt_bwa_index_shift && params.mt_fasta_shift && !(params.analysis_type == "wes") && params.aligner == "sentieon"} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference - ] } withName: '.*PREPARE_REFERENCES:BWA_INDEX_GENOME' { ext.when = {!params.bwa_index && !(params.aligner == "sentieon")} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference - ] } withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_GENOME' { ext.when = {!params.fasta_fai} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*fai" - ] } withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_SHIFT_MT' { ext.when = {!params.mt_fai_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*fai" - ] } withName: '.*PREPARE_REFERENCES:GATK_SD' { ext.when = {!params.sequence_dictionary} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*dict" - ] } withName: '.*PREPARE_REFERENCES:GATK_SD_SHIFT_MT' { ext.when = {!params.mt_sequence_dictionary_shift && params.mt_fasta_shift && !(params.analysis_type == "wes")} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*dict" - ] } withName: '.*PREPARE_REFERENCES:GET_CHROM_SIZES' { @@ -120,53 +69,24 @@ process { withName: '.*PREPARE_REFERENCES:TABIX_DBSNP' { ext.when = {params.known_dbsnp && !params.known_dbsnp_tbi} - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*tbi" - ] } withName: '.*PREPARE_REFERENCES:TABIX_GNOMAD_AF' { ext.when = {params.gnomad_af && !params.gnomad_af_idx} ext.args = '-s 1 -b 2 -e 2' - publishDir = [ - path: { "${params.outdir}/references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference, - pattern: "*tbi" - ] } withName: '.*PREPARE_REFERENCES:TABIX_PT' { ext.when = { params.target_bed && params.target_bed.endsWith(".gz") } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*PREPARE_REFERENCES:TABIX_PBT' { ext.when = { params.target_bed && !params.target_bed.endsWith(".gz") } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*PREPARE_REFERENCES:GATK_BILT' { ext.when = { params.target_bed } ext.prefix = { "${meta.id}_target" } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*PREPARE_REFERENCES:GATK_ILT' { @@ -180,19 +100,12 @@ process { withName: '.*PREPARE_REFERENCES:CAT_CAT_BAIT' { ext.when = { params.target_bed } ext.prefix = { "${meta.id}" } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*PREPARE_REFERENCES:UNTAR_VEP_CACHE' { ext.when = { params.vep_cache.endsWith("tar.gz") } publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } } diff --git a/conf/modules/raredisease.config b/conf/modules/raredisease.config index 3514144a..1bb0da94 100644 --- a/conf/modules/raredisease.config +++ b/conf/modules/raredisease.config @@ -16,11 +16,6 @@ // process { - publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] withName: '.*CHECK_INPUT:SAMPLESHEET_CHECK' { publishDir = [ @@ -47,7 +42,7 @@ process { withName: '.*RAREDISEASE:FASTQC' { ext.args = '--quiet' publishDir = [ - path: { "${params.outdir}/reports/fastqc/${meta.id}" }, + path: { "${params.outdir}/fastqc/${meta.id}" }, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] } From 1254dd4412f764516e8b3349e54d6e99f73827df Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 02:19:01 +0100 Subject: [PATCH 1056/1169] annotate sv csq pli --- conf/modules/annotate_consequence_pli.config | 41 +++++++++++++++++++ .../annotate_structural_variants.config | 18 ++++---- modules/local/add_most_severe_consequence.nf | 6 +-- modules/local/add_most_severe_pli.nf | 6 +-- 4 files changed, 55 insertions(+), 16 deletions(-) diff --git a/conf/modules/annotate_consequence_pli.config b/conf/modules/annotate_consequence_pli.config index 2812ef7f..61f0f260 100644 --- a/conf/modules/annotate_consequence_pli.config +++ b/conf/modules/annotate_consequence_pli.config @@ -10,3 +10,44 @@ ext.when = Conditional clause ---------------------------------------------------------------------------------------- */ + + +process { + withName: '.*ANN_CSQ_PLI_SV:.*' { + ext.when = params.annotate_sv_switch + publishDir = [ + path: { "${params.outdir}/annotate_sv" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANN_CSQ_PLI_SV:ADD_MOST_SEVERE_CSQ' { + ext.prefix = { "${meta.id}_vep_csq" } + } + + withName: '.*ANN_CSQ_PLI_SV:ADD_MOST_SEVERE_PLI' { + ext.prefix = { "${meta.id}_vep_csq_pli" } + } + +} + +process { + withName: '.*ANN_CSQ_PLI_SNV:.*' { + ext.when = params.annotate_snv_switch + publishDir = [ + path: { "${params.outdir}/annotate_snv" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANN_CSQ_PLI_SNV:ADD_MOST_SEVERE_CSQ' { + ext.prefix = { "${meta.id}_vep_csq" } + } + + withName: '.*ANN_CSQ_PLI_SNV:ADD_MOST_SEVERE_PLI' { + ext.prefix = { "${meta.id}_vep_csq_pli" } + } + +} diff --git a/conf/modules/annotate_structural_variants.config b/conf/modules/annotate_structural_variants.config index 07d43734..c37bc92a 100644 --- a/conf/modules/annotate_structural_variants.config +++ b/conf/modules/annotate_structural_variants.config @@ -18,25 +18,21 @@ process { withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:.*' { ext.when = params.annotate_sv_switch + publishDir = [ + enabled: false + ] } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:SVDB_QUERY' { - publishDir = [ - enabled: false, - ] + ext.prefix = { "${meta.id}_svdbquery" } } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:PICARD_SORTVCF' { - publishDir = [ - enabled: false, - ] + ext.prefix = { "${meta.id}_sortvcf" } } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:BCFTOOLS_VIEW' { ext.prefix = { "${meta.id}_view" } - publishDir = [ - enabled: false, - ] } withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:ENSEMBLVEP_SV' { @@ -52,9 +48,11 @@ process { '--protein --offline --regulatory --sift p', '--symbol --tsl --uniprot --vcf' ].join(' ') + ext.prefix = { "${meta.id}_vep" } publishDir = [ - path: { "${params.outdir}/sv_annotate" }, + path: { "${params.outdir}/annotate_sv" }, mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } diff --git a/modules/local/add_most_severe_consequence.nf b/modules/local/add_most_severe_consequence.nf index 9d2d9551..c70eedeb 100644 --- a/modules/local/add_most_severe_consequence.nf +++ b/modules/local/add_most_severe_consequence.nf @@ -12,8 +12,8 @@ process ADD_MOST_SEVERE_CSQ { path (variant_consequences) output: - tuple val(meta), path("*_csq.vcf") , emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf") , emit: vcf + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -22,7 +22,7 @@ process ADD_MOST_SEVERE_CSQ { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - add_most_severe_consequence.py --file_in ${vcf} --file_out ${prefix}_csq.vcf --variant_csq ${variant_consequences} + add_most_severe_consequence.py --file_in ${vcf} --file_out ${prefix}.vcf --variant_csq ${variant_consequences} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/add_most_severe_pli.nf b/modules/local/add_most_severe_pli.nf index dd492331..1167a1b1 100644 --- a/modules/local/add_most_severe_pli.nf +++ b/modules/local/add_most_severe_pli.nf @@ -11,8 +11,8 @@ process ADD_MOST_SEVERE_PLI { tuple val(meta), path(vcf) output: - tuple val(meta), path("*_pli.vcf") , emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf") , emit: vcf + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -21,7 +21,7 @@ process ADD_MOST_SEVERE_PLI { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - add_most_severe_pli.py --file_in ${vcf} --file_out ${prefix}_pli.vcf + add_most_severe_pli.py --file_in ${vcf} --file_out ${prefix}.vcf cat <<-END_VERSIONS > versions.yml "${task.process}": From 13dd334a8be962d8fe87fb9470597d5ba7d62f14 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 10:29:48 +0100 Subject: [PATCH 1057/1169] add annotate snv sv --- conf/modules/annotate_snvs.config | 74 +++++++++++++++++------------ subworkflows/local/annotate_snvs.nf | 35 +++++++++----- workflows/raredisease.nf | 1 + 3 files changed, 66 insertions(+), 44 deletions(-) diff --git a/conf/modules/annotate_snvs.config b/conf/modules/annotate_snvs.config index 9db85f23..4587d6a7 100644 --- a/conf/modules/annotate_snvs.config +++ b/conf/modules/annotate_snvs.config @@ -18,58 +18,37 @@ process { withName: '.*ANNOTATE_SNVS:.*' { ext.when = params.annotate_snv_switch - } - - withName: '.*ANNOTATE_SNVS:VCFANNO' { - ext.prefix = { "${meta.id}_vcfanno" } publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false ] } withName: '.*ANNOTATE_SNVS:BCFTOOLS_ROH' { ext.args = { "--samples ${meta.id} --skip-indels " } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_roh" } } withName: '.*ANNOTATE_SNVS:RHOCALL_ANNOTATE' { ext.args = { "--v14 " } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] + ext.prefix = { "${meta.id}_rohann" } + } + + withName: '.*ANNOTATE_SNVS:VCFANNO' { + ext.prefix = { "${meta.id}_rohann_vcfanno" } } withName: '.*ANNOTATE_SNVS:BCFTOOLS_VIEW' { - ext.prefix = { "${meta.id}_view" } + ext.prefix = { "${meta.id}_rohann_vcfanno_filter" } ext.args = { '--output-type z --exclude "INFO/GNOMADAF > 0.70 | INFO/GNOMADAF_popmax > 0.70" ' } - publishDir = [ - path: { "${params.outdir}/snv_annotation" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - ] } withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { ext.prefix = { "${meta.id}_${intervals.simpleName}" } ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} - publishDir = [ - enabled: params.save_reference, - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { - ext.prefix = { "${vcf.simpleName}_vep" } + ext.prefix = { "${vcf.simpleName}_rohann_vcfanno_filter_vep" } ext.args = [ '--dir_plugins vep_cache/Plugins', '--plugin LoFtool,vep_cache/LoFtool_scores.txt', @@ -86,8 +65,41 @@ process { '--uniprot --vcf' ].join(' ') publishDir = [ - path: { "${params.outdir}/snv_annotation" }, + enabled: params.analysis_type.equals('wes'), + path: { "${params.outdir}/annotate_snv" }, mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANNOTATE_SNVS:TABIX_VEP' { + publishDir = [ + enabled: params.analysis_type.equals('wes'), + path: { "${params.outdir}/annotate_snv" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANNOTATE_SNVS:BCFTOOLS_CONCAT' { + ext.prefix = { "${meta.id}_rohann_vcfanno_filter_vep" } + ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes") } + publishDir = [ + enabled: !params.analysis_type.equals('wes'), + path: { "${params.outdir}/annotate_snv" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANNOTATE_SNVS:TABIX_BCFTOOLS_CONCAT' { + ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes") } + publishDir = [ + enabled: !params.analysis_type.equals('wes'), + path: { "${params.outdir}/annotate_snv" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + } diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index d522f4f2..eafb2f84 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -19,6 +19,7 @@ workflow ANNOTATE_SNVS { take: vcf + analysis_type vcfanno_resources vcfanno_lua vcfanno_toml @@ -81,20 +82,28 @@ workflow ANNOTATE_SNVS { TABIX_VEP (ENSEMBLVEP_SNV.out.vcf_gz) - ENSEMBLVEP_SNV.out.vcf_gz - .join(TABIX_VEP.out.tbi) - .groupTuple() - .map { meta, vcfs, tbis -> - def sortedvcfs = vcfs.sort { it.baseName } - def sortedtbis = tbis.sort { it.baseName } - return [ meta, sortedvcfs, sortedtbis ] - } - .set { ch_vep_ann } + ch_vep_ann = ENSEMBLVEP_SNV.out.vcf_gz + ch_vep_index = TABIX_VEP.out.tbi + + if (params.analysis_type == 'wgs') { + + ENSEMBLVEP_SNV.out.vcf_gz + .join(TABIX_VEP.out.tbi) + .groupTuple() + .map { meta, vcfs, tbis -> + def sortedvcfs = vcfs.sort { it.baseName } + def sortedtbis = tbis.sort { it.baseName } + return [ meta, sortedvcfs, sortedtbis ] + } + .set { ch_concat_in } - BCFTOOLS_CONCAT (ch_vep_ann) + BCFTOOLS_CONCAT (ch_concat_in) - TABIX_BCFTOOLS_CONCAT (BCFTOOLS_CONCAT.out.vcf) + TABIX_BCFTOOLS_CONCAT (BCFTOOLS_CONCAT.out.vcf) + ch_vep_ann = BCFTOOLS_CONCAT.out.vcf + ch_vep_index = TABIX_BCFTOOLS_CONCAT.out.tbi + } ch_versions = ch_versions.mix(BCFTOOLS_ROH.out.versions) ch_versions = ch_versions.mix(RHOCALL_ANNOTATE.out.versions) ch_versions = ch_versions.mix(ZIP_TABIX_ROHCALL.out.versions) @@ -109,7 +118,7 @@ workflow ANNOTATE_SNVS { ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) emit: - vcf_ann = BCFTOOLS_CONCAT.out.vcf - tbi = TABIX_BCFTOOLS_CONCAT.out.tbi + vcf_ann = ch_vep_ann + tbi = ch_vep_index versions = ch_versions } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index a735ab33..2a0851d3 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -440,6 +440,7 @@ workflow RAREDISEASE { ANNOTATE_SNVS ( ch_vcf, + params.analysis_type, ch_vcfanno_resources, ch_vcfanno_lua, ch_vcfanno_toml, From 2b498fdf0683bd283a22f73af367ec943cbb2053 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 10:51:30 +0100 Subject: [PATCH 1058/1169] rank and filter --- conf/modules/rank_variants.config | 12 ++++++++++-- conf/modules/raredisease.config | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/conf/modules/rank_variants.config b/conf/modules/rank_variants.config index 3b786955..fab5fdc7 100644 --- a/conf/modules/rank_variants.config +++ b/conf/modules/rank_variants.config @@ -18,6 +18,9 @@ process { withName: '.*RANK_VARIANTS_SV:.*' { ext.when = params.annotate_sv_switch + publishDir = [ + enabled: false + ] } withName: '.*RANK_VARIANTS_SV:GENMOD_ANNOTATE' { @@ -31,8 +34,9 @@ process { } withName: '.*RANK_VARIANTS_SV:GENMOD_COMPOUND' { + ext.prefix = { "${meta.id}_rankedvar_sv" } publishDir = [ - path: { "${params.outdir}/genmod" }, + path: { "${params.outdir}/rank_and_filter" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -46,6 +50,9 @@ process { process { withName: '.*RANK_VARIANTS_SNV:.*' { ext.when = params.annotate_snv_switch + publishDir = [ + enabled: false + ] } withName: '.*RANK_VARIANTS_SNV:GENMOD_ANNOTATE' { @@ -63,8 +70,9 @@ process { } withName: '.*RANK_VARIANTS_SNV:GENMOD_COMPOUND' { + ext.prefix = { "${meta.id}_rankedvar_snv" } publishDir = [ - path: { "${params.outdir}/genmod" }, + path: { "${params.outdir}/rank_and_filter" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/conf/modules/raredisease.config b/conf/modules/raredisease.config index 1bb0da94..47d94270 100644 --- a/conf/modules/raredisease.config +++ b/conf/modules/raredisease.config @@ -105,3 +105,25 @@ process { ] } } + +process { + withName: '.*FILTER_VEP_SNV' { + ext.prefix = { "${meta.id}_rankedvar_snv" } + publishDir = [ + path: { "${params.outdir}/rank_and_filter" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} + +process { + withName: '.*FILTER_VEP_SV' { + ext.prefix = { "${meta.id}_rankedvar_sv" } + publishDir = [ + path: { "${params.outdir}/rank_and_filter" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} From 61097259e3b4ca4e54e14162e11be578128b9477 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 11:07:49 +0100 Subject: [PATCH 1059/1169] review suggestions Co-authored-by: Lucpen --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 59ccc5c4..0987e71e 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -199,7 +199,7 @@ The mandatory and optional parameters for each category are tabulated below. 1Genome version is used by vep. You have the option to choose between GRCh37 and GRCh38.
    2Path to vcf files and their indices used by vcfanno. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_resources.txt).
    3Path to a vcfanno configration file. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_config.toml).
    -4Gnomad vcf file can be downloaded from here https://gnomad.broadinstitute.org/downloads.
    +4Gnomad vcf file can be downloaded from [here] (https://gnomad.broadinstitute.org/downloads).
    5Used by genmod while modeling the variants. Contains a list of loci that show [reduced penetrance](https://medlineplus.gov/genetics/understanding/inheritance/penetranceexpressivity/) in people. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv).
    6 This file contains a list of candidate genes(HGNC ids) that is used to split the variants into a canditate variants and research variants. Research variants contain all the variants. While candidate variants are a subset of research variants and are associated with candidate genes. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/hgnc.txt).
    7Used by genmod for ranking the variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/rank_model_snv.ini).
    From 31465d8e12b9a859d2a994b6b7f68b08ddd1a268 Mon Sep 17 00:00:00 2001 From: jemten Date: Tue, 14 Mar 2023 13:49:59 +0100 Subject: [PATCH 1060/1169] removing tabs and aligning text --- subworkflows/local/align.nf | 8 ++--- subworkflows/local/alignment/align_bwamem2.nf | 10 +++--- .../local/alignment/align_sentieon.nf | 24 ++++++------- subworkflows/local/analyse_MT.nf | 10 +++--- .../local/annotate_consequence_pli.nf | 16 ++++----- subworkflows/local/annotate_snvs.nf | 30 ++++++++-------- .../local/annotate_structural_variants.nf | 12 +++---- subworkflows/local/call_repeat_expansions.nf | 16 ++++----- subworkflows/local/call_snv.nf | 22 ++++++------ .../local/call_structural_variants.nf | 4 +-- subworkflows/local/check_input.nf | 2 +- subworkflows/local/gens.nf | 20 +++++------ .../local/mitochondria/align_and_call_MT.nf | 30 ++++++++-------- .../mitochondria/convert_mt_bam_to_fastq.nf | 8 ++--- .../local/mitochondria/merge_annotate_MT.nf | 36 +++++++++---------- subworkflows/local/prepare_references.nf | 36 +++++++++---------- subworkflows/local/qc_bam.nf | 18 +++++----- subworkflows/local/rank_variants.nf | 12 +++---- subworkflows/local/scatter_genome.nf | 8 ++--- .../variant_calling/call_cnv_cnvpytor.nf | 16 ++++----- .../variant_calling/call_snv_deepvariant.nf | 14 ++++---- .../variant_calling/call_snv_sentieon.nf | 34 +++++++++--------- .../local/variant_calling/call_sv_manta.nf | 26 +++++++------- .../local/variant_calling/call_sv_tiddit.nf | 12 +++---- 24 files changed, 212 insertions(+), 212 deletions(-) diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index e010926f..354f1a4b 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -43,8 +43,8 @@ workflow ALIGN { ch_versions = Channel.empty().mix(ALIGN_BWAMEM2.out.versions, ALIGN_SENTIEON.out.versions) emit: - marked_bam = ch_marked_bam // channel: [ val(meta), path(bam) ] - marked_bai = ch_marked_bai // channel: [ val(meta), path(bai) ] - bam_bai = ch_bam_bai // channel: [ val(meta), path(bam), path(bai) ] - versions = ch_versions // channel: [ path(versions.yml) ] + marked_bam = ch_marked_bam // channel: [ val(meta), path(bam) ] + marked_bai = ch_marked_bai // channel: [ val(meta), path(bai) ] + bam_bai = ch_bam_bai // channel: [ val(meta), path(bam), path(bai) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 1d71b388..72283556 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -61,9 +61,9 @@ workflow ALIGN_BWAMEM2 { ch_versions = ch_versions.mix(SAMTOOLS_INDEX_MARKDUP.out.versions.first()) emit: - stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] - metrics = MARKDUPLICATES.out.metrics // channel: [ val(meta), path(metrics) ] - marked_bam = MARKDUPLICATES.out.bam // channel: [ val(meta), path(bam) ] - marked_bai = SAMTOOLS_INDEX_MARKDUP.out.bai // channel: [ val(meta), path(bai) ] - versions = ch_versions // channel: [ path(versions.yml) ] + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] + metrics = MARKDUPLICATES.out.metrics // channel: [ val(meta), path(metrics) ] + marked_bam = MARKDUPLICATES.out.bam // channel: [ val(meta), path(bam) ] + marked_bai = SAMTOOLS_INDEX_MARKDUP.out.bai // channel: [ val(meta), path(bai) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index 9cafadf4..c0903c9d 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -74,16 +74,16 @@ workflow ALIGN_SENTIEON { ch_versions = ch_versions.mix(SENTIEON_DEDUP.out.versions.first()) emit: - marked_bam = SENTIEON_DEDUP.out.bam // channel: [ val(meta), path(bam) ] - marked_bai = SENTIEON_DEDUP.out.bai // channel: [ val(meta), path(bai) ] - recal_bam = ch_bqsr_bam.ifEmpty(null) // channel: [ val(meta), path(bam) ] - recal_bai = ch_bqsr_bai.ifEmpty(null) // channel: [ val(meta), path(bai) ] - recal_csv = ch_bqsr_csv.ifEmpty(null) // channel: [ val(meta), path(csv) ] - mq_metrics = SENTIEON_DATAMETRICS.out.mq_metrics.ifEmpty(null) // channel: [ val(meta), path(mq_metrics) ] - qd_metrics = SENTIEON_DATAMETRICS.out.qd_metrics.ifEmpty(null) // channel: [ val(meta), path(qd_metrics) ] - gc_metrics = SENTIEON_DATAMETRICS.out.gc_metrics.ifEmpty(null) // channel: [ val(meta), path(gc_metrics) ] - gc_summary = SENTIEON_DATAMETRICS.out.gc_summary.ifEmpty(null) // channel: [ val(meta), path(gc_summary) ] - aln_metrics = SENTIEON_DATAMETRICS.out.aln_metrics.ifEmpty(null) // channel: [ val(meta), path(aln_metrics) ] - is_metrics = SENTIEON_DATAMETRICS.out.is_metrics.ifEmpty(null) // channel: [ val(meta), path(is_metrics) ] - versions = ch_versions // channel: [ path(versions.yml) ] + marked_bam = SENTIEON_DEDUP.out.bam // channel: [ val(meta), path(bam) ] + marked_bai = SENTIEON_DEDUP.out.bai // channel: [ val(meta), path(bai) ] + recal_bam = ch_bqsr_bam.ifEmpty(null) // channel: [ val(meta), path(bam) ] + recal_bai = ch_bqsr_bai.ifEmpty(null) // channel: [ val(meta), path(bai) ] + recal_csv = ch_bqsr_csv.ifEmpty(null) // channel: [ val(meta), path(csv) ] + mq_metrics = SENTIEON_DATAMETRICS.out.mq_metrics.ifEmpty(null) // channel: [ val(meta), path(mq_metrics) ] + qd_metrics = SENTIEON_DATAMETRICS.out.qd_metrics.ifEmpty(null) // channel: [ val(meta), path(qd_metrics) ] + gc_metrics = SENTIEON_DATAMETRICS.out.gc_metrics.ifEmpty(null) // channel: [ val(meta), path(gc_metrics) ] + gc_summary = SENTIEON_DATAMETRICS.out.gc_summary.ifEmpty(null) // channel: [ val(meta), path(gc_summary) ] + aln_metrics = SENTIEON_DATAMETRICS.out.aln_metrics.ifEmpty(null) // channel: [ val(meta), path(aln_metrics) ] + is_metrics = SENTIEON_DATAMETRICS.out.is_metrics.ifEmpty(null) // channel: [ val(meta), path(is_metrics) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/analyse_MT.nf b/subworkflows/local/analyse_MT.nf index 397576b7..0ad82f1a 100644 --- a/subworkflows/local/analyse_MT.nf +++ b/subworkflows/local/analyse_MT.nf @@ -1,11 +1,11 @@ // // Analyse MT // -include { CONVERT_MT_BAM_TO_FASTQ } from './mitochondria/convert_mt_bam_to_fastq' -include { ALIGN_AND_CALL_MT } from './mitochondria/align_and_call_MT' -include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './mitochondria/align_and_call_MT' -include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/picard/liftovervcf/main' -include { MERGE_ANNOTATE_MT } from './mitochondria/merge_annotate_MT' +include { CONVERT_MT_BAM_TO_FASTQ } from './mitochondria/convert_mt_bam_to_fastq' +include { ALIGN_AND_CALL_MT } from './mitochondria/align_and_call_MT' +include { ALIGN_AND_CALL_MT as ALIGN_AND_CALL_MT_SHIFT } from './mitochondria/align_and_call_MT' +include { PICARD_LIFTOVERVCF } from '../../modules/nf-core/picard/liftovervcf/main' +include { MERGE_ANNOTATE_MT } from './mitochondria/merge_annotate_MT' workflow ANALYSE_MT { take: diff --git a/subworkflows/local/annotate_consequence_pli.nf b/subworkflows/local/annotate_consequence_pli.nf index d98e6040..93ab181b 100644 --- a/subworkflows/local/annotate_consequence_pli.nf +++ b/subworkflows/local/annotate_consequence_pli.nf @@ -6,12 +6,12 @@ include { ADD_MOST_SEVERE_CSQ } from '../../modules/local/add_most_severe_conseq include { ADD_MOST_SEVERE_PLI } from '../../modules/local/add_most_severe_pli' workflow ANNOTATE_CSQ_PLI { - take: - ch_vcf // channel: [mandatory] [ val(meta), path(vcf) ] - ch_variant_consequences // channel: [mandatory] [ path(consequences) ] + take: + ch_vcf // channel: [mandatory] [ val(meta), path(vcf) ] + ch_variant_consequences // channel: [mandatory] [ path(consequences) ] - main: - ch_versions = Channel.empty() + main: + ch_versions = Channel.empty() ADD_MOST_SEVERE_CSQ (ch_vcf, ch_variant_consequences) @@ -20,7 +20,7 @@ workflow ANNOTATE_CSQ_PLI { ch_versions = ch_versions.mix(ADD_MOST_SEVERE_CSQ.out.versions) ch_versions = ch_versions.mix(ADD_MOST_SEVERE_PLI.out.versions) - emit: - vcf_ann = ADD_MOST_SEVERE_PLI.out.vcf // channel: [ val(meta), path(vcf) ] - versions = ch_versions // channel: [ path(versions.yml) ] + emit: + vcf_ann = ADD_MOST_SEVERE_PLI.out.vcf // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 693c86b3..56aae6ba 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -2,18 +2,18 @@ // A subworkflow to annotate snvs // -include { VCFANNO } from '../../modules/nf-core/vcfanno/main' -include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' -include { BCFTOOLS_ROH } from '../../modules/nf-core/bcftools/roh/main' -include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' -include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhocall/annotate/main' -include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' -include { TABIX_BGZIPTABIX as ZIP_TABIX_ROHCALL } from '../../modules/nf-core/tabix/bgziptabix/main' -include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' -include { TABIX_TABIX as TABIX_VEP } from '../../modules/nf-core/tabix/tabix/main' -include { TABIX_TABIX as TABIX_BCFTOOLS_CONCAT } from '../../modules/nf-core/tabix/tabix/main' -include { TABIX_TABIX as TABIX_BCFTOOLS_VIEW } from '../../modules/nf-core/tabix/tabix/main' -include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariants/main' +include { VCFANNO } from '../../modules/nf-core/vcfanno/main' +include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' +include { BCFTOOLS_ROH } from '../../modules/nf-core/bcftools/roh/main' +include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' +include { RHOCALL_ANNOTATE } from '../../modules/nf-core/rhocall/annotate/main' +include { ENSEMBLVEP as ENSEMBLVEP_SNV } from '../../modules/local/ensemblvep/main' +include { TABIX_BGZIPTABIX as ZIP_TABIX_ROHCALL } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_TABIX as TABIX_VEP } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_BCFTOOLS_CONCAT } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_BCFTOOLS_VIEW } from '../../modules/nf-core/tabix/tabix/main' +include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariants/main' workflow ANNOTATE_SNVS { @@ -109,7 +109,7 @@ workflow ANNOTATE_SNVS { ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) emit: - vcf_ann = BCFTOOLS_CONCAT.out.vcf // channel: [ val(meta), path(vcf) ] - tbi = TABIX_BCFTOOLS_CONCAT.out.tbi // channel: [ val(meta), path(tbi) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf_ann = BCFTOOLS_CONCAT.out.vcf // channel: [ val(meta), path(vcf) ] + tbi = TABIX_BCFTOOLS_CONCAT.out.tbi // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index 147fe0d0..ab170fcf 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -2,10 +2,10 @@ // A subworkflow to annotate structural variants. // -include { SVDB_QUERY } from '../../modules/nf-core/svdb/query/main' -include { PICARD_SORTVCF } from '../../modules/nf-core/picard/sortvcf/main' -include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' -include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' +include { SVDB_QUERY } from '../../modules/nf-core/svdb/query/main' +include { PICARD_SORTVCF } from '../../modules/nf-core/picard/sortvcf/main' +include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' +include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { @@ -63,6 +63,6 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) emit: - vcf_ann = ENSEMBLVEP_SV.out.vcf_gz // channel: [ val(meta), path(vcf) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf_ann = ENSEMBLVEP_SV.out.vcf_gz // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 64e31a15..4741272f 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -15,11 +15,11 @@ include { TABIX_TABIX as TABIX_EXP_RENAME } from '../../modules/nf- workflow CALL_REPEAT_EXPANSIONS { take: - ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] - ch_variant_catalog // channel: [mandatory] [ path(variant_catalog.json) ] - ch_case_info // channel: [mandatory] [ val(case_id) ] - ch_fasta // channel: [mandatory] [ path(fasta) ] - ch_fai // channel: [mandatory] [ path(fai) ] + ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_variant_catalog // channel: [mandatory] [ path(variant_catalog.json) ] + ch_case_info // channel: [mandatory] [ val(case_id) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] main: ch_versions = Channel.empty() @@ -72,7 +72,7 @@ workflow CALL_REPEAT_EXPANSIONS { ch_versions = ch_versions.mix(COMPRESS_STRANGER.out.versions.first()) ch_versions = ch_versions.mix(INDEX_STRANGER.out.versions.first()) - emit: - vcf = COMPRESS_STRANGER.out.vcf.join(INDEX_STRANGER.out.tbi) // channel: [ val(meta), path(vcf), path(tbi) ] - versions = ch_versions // channel: [ path(versions.yml) ] + emit: + vcf = COMPRESS_STRANGER.out.vcf.join(INDEX_STRANGER.out.tbi) // channel: [ val(meta), path(vcf), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index c2555c79..c8493a49 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -9,14 +9,14 @@ include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/gatk4/selectvariant workflow CALL_SNV { take: - ch_input // channel: [mandatory] [ val(meta), path(bam), path(bai) ] - ch_fasta // channel: [mandatory] [ path(fasta) ] - ch_fai // channel: [mandatory] [ path(fai) ] - ch_known_dbsnp // channel: [optional] [ val(meta), path(vcf) ] - ch_known_dbsnp_tbi // channel: [optional] [ val(meta), path(tbi) ] - ch_call_interval // channel: [mandatory] [ path(intervals) ] - ch_ml_model // channel: [mandatory] [ path(model) ] - ch_case_info // channel: [mandatory] [ val(case_info) ] + ch_input // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_known_dbsnp // channel: [optional] [ val(meta), path(vcf) ] + ch_known_dbsnp_tbi // channel: [optional] [ val(meta), path(tbi) ] + ch_call_interval // channel: [mandatory] [ path(intervals) ] + ch_ml_model // channel: [mandatory] [ path(model) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] main: ch_versions = Channel.empty() @@ -48,7 +48,7 @@ workflow CALL_SNV { ch_versions = ch_versions.mix(CALL_SNV_SENTIEON.out.versions) emit: - vcf = ch_vcf // channel: [ val(meta), path(vcf) ] - tabix = ch_tabix // channel: [ val(meta), path(tbi) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf = ch_vcf // channel: [ val(meta), path(vcf) ] + tabix = ch_tabix // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index fa3eae61..4e4a7d6f 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -65,6 +65,6 @@ workflow CALL_STRUCTURAL_VARIANTS { // ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) emit: - vcf = SVDB_MERGE.out.vcf // channel: [ val(meta), path(vcf)] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf = SVDB_MERGE.out.vcf // channel: [ val(meta), path(vcf)] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/check_input.nf b/subworkflows/local/check_input.nf index 0af95445..0faa087c 100644 --- a/subworkflows/local/check_input.nf +++ b/subworkflows/local/check_input.nf @@ -6,7 +6,7 @@ include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow CHECK_INPUT { take: - ch_samplesheet // channel: [mandatory] [ path(csv) ] + ch_samplesheet // channel: [mandatory] [ path(csv) ] main: SAMPLESHEET_CHECK ( ch_samplesheet ) diff --git a/subworkflows/local/gens.nf b/subworkflows/local/gens.nf index 95d6c5b5..6cc87a12 100644 --- a/subworkflows/local/gens.nf +++ b/subworkflows/local/gens.nf @@ -4,19 +4,19 @@ include { GATK4_COLLECTREADCOUNTS as COLLECTREADCOUNTS } from '../../modules/local/gatk4/collectreadcounts/main' include { GATK4_DENOISEREADCOUNTS as DENOISEREADCOUNTS } from '../../modules/local/gatk4/denoisereadcounts/main' -include { GENS as GENS_GENERATE } from '../../modules/local/gens/main' +include { GENS as GENS_GENERATE } from '../../modules/local/gens/main' workflow GENS { take: - ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] - ch_vcf // channel: [mandatory] [ val(meta), path(vcf) ] - ch_fasta // channel: [mandatory] [ val(meta), path(fasta) ] - ch_fai // channel: [mandatory] [ path(fai) ] - ch_interval_list // channel: [mandatory] [ path(interval_list) ] - ch_pon // channel: [mandatory] [ path(pon) ] - ch_gnomad_pos // channel: [mandatory] [ path(gnomad_pos) ] - ch_case_info // channel: [mandatory] [ val(case_info) ] - ch_seq_dict // channel: [mandatory] [ path(dict) ] + ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_vcf // channel: [mandatory] [ val(meta), path(vcf) ] + ch_fasta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_interval_list // channel: [mandatory] [ path(interval_list) ] + ch_pon // channel: [mandatory] [ path(pon) ] + ch_gnomad_pos // channel: [mandatory] [ path(gnomad_pos) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] + ch_seq_dict // channel: [mandatory] [ path(dict) ] main: ch_versions = Channel.empty() diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 85974af0..a20726de 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -16,14 +16,14 @@ include { TABIX_TABIX as TABIX_TABIX_MT } fr workflow ALIGN_AND_CALL_MT { take: - ch_fastq // channel: [mandatory] [ val(meta), [ path(reads) ] ] - ch_ubam // channel: [mandatory] [ val(meta), path(bam) ] - ch_index_bwa // channel: [mandatory for sentieon] [ val(meta), path(index) ] - ch_index_bwamem2 // channel: [mandatory for bwamem2] [ val(meta), path(index) ] - ch_fasta // channel: [mandatory] [ path(fasta) ] - ch_dict // channel: [mandatory] [ path(dict) ] - ch_fai // channel: [mandatory] [ path(fai) ] - ch_intervals_mt // channel: [mandatory] [ path(interval_list) ] + ch_fastq // channel: [mandatory] [ val(meta), [ path(reads) ] ] + ch_ubam // channel: [mandatory] [ val(meta), path(bam) ] + ch_index_bwa // channel: [mandatory for sentieon] [ val(meta), path(index) ] + ch_index_bwamem2 // channel: [mandatory for bwamem2] [ val(meta), path(index) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_dict // channel: [mandatory] [ path(dict) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_intervals_mt // channel: [mandatory] [ path(interval_list) ] main: ch_versions = Channel.empty() @@ -75,11 +75,11 @@ workflow ALIGN_AND_CALL_MT { ch_versions = ch_versions.mix(GATK4_FILTERMUTECTCALLS_MT.out.versions.first()) emit: - vcf = GATK4_FILTERMUTECTCALLS_MT.out.vcf // channel: [ val(meta), path(vcf) ] - tbi = GATK4_FILTERMUTECTCALLS_MT.out.tbi // channel: [ val(meta), path(tbi) ] - stats = GATK4_MUTECT2_MT.out.stats // channel: [ val(meta), path(stats) ] - filt_stats = GATK4_FILTERMUTECTCALLS_MT.out.stats // channel: [ val(meta), path(tsv) ] - txt = HAPLOCHECK_MT.out.txt // channel: [ val(meta), path(txt) ] - html = HAPLOCHECK_MT.out.html // channel: [ val(meta), path(html) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf = GATK4_FILTERMUTECTCALLS_MT.out.vcf // channel: [ val(meta), path(vcf) ] + tbi = GATK4_FILTERMUTECTCALLS_MT.out.tbi // channel: [ val(meta), path(tbi) ] + stats = GATK4_MUTECT2_MT.out.stats // channel: [ val(meta), path(stats) ] + filt_stats = GATK4_FILTERMUTECTCALLS_MT.out.stats // channel: [ val(meta), path(tsv) ] + txt = HAPLOCHECK_MT.out.txt // channel: [ val(meta), path(txt) ] + html = HAPLOCHECK_MT.out.html // channel: [ val(meta), path(html) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf index 537c84e6..adbee07b 100644 --- a/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf +++ b/subworkflows/local/mitochondria/convert_mt_bam_to_fastq.nf @@ -8,10 +8,10 @@ include { GATK4_SAMTOFASTQ as GATK4_SAMTOFASTQ_MT } from '../../../modules/nf-co workflow CONVERT_MT_BAM_TO_FASTQ { take: - ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] - ch_genome_fasta_meta // channel: [mandatory] [ val(meta), path(fasta) ] - ch_genome_fai // channel: [mandatory] [ path(fai) ] - ch_genome_dict // channel: [mandatory] [ path(dict) ] + ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_genome_fasta_meta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_genome_fai // channel: [mandatory] [ path(fai) ] + ch_genome_dict // channel: [mandatory] [ path(dict) ] main: ch_versions = Channel.empty() diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 1b8367d9..36f95ff3 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -2,19 +2,19 @@ // Merge and annotate MT // -include { GATK4_MERGEVCFS as GATK4_MERGEVCFS_LIFT_UNLIFT_MT } from '../../../modules/nf-core/gatk4/mergevcfs/main' -include { GATK4_VARIANTFILTRATION as GATK4_VARIANTFILTRATION_MT } from '../../../modules/nf-core/gatk4/variantfiltration/main' -include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_MT } from '../../../modules/nf-core/bcftools/norm/main' -include { TABIX_TABIX as TABIX_TABIX_MT } from '../../../modules/nf-core/tabix/tabix/main' -include { BCFTOOLS_NORM as REMOVE_DUPLICATES_MT } from '../../../modules/nf-core/bcftools/norm/main' -include { TABIX_TABIX as TABIX_TABIX_MT2 } from '../../../modules/nf-core/tabix/tabix/main' -include { BCFTOOLS_MERGE as BCFTOOLS_MERGE_MT } from '../../../modules/nf-core/bcftools/merge/main' -include { HMTNOTE as HMTNOTE_MT } from '../../../modules/nf-core/hmtnote/main' -include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../../modules/nf-core/tabix/tabix/main' -include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../../modules/local/ensemblvep/main' -include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../../modules/nf-core/haplogrep2/classify/main' -include { VCFANNO as VCFANNO_MT } from '../../../modules/nf-core/vcfanno/main' -include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../../modules/nf-core/tabix/bgziptabix/main' +include { GATK4_MERGEVCFS as GATK4_MERGEVCFS_LIFT_UNLIFT_MT } from '../../../modules/nf-core/gatk4/mergevcfs/main' +include { GATK4_VARIANTFILTRATION as GATK4_VARIANTFILTRATION_MT } from '../../../modules/nf-core/gatk4/variantfiltration/main' +include { BCFTOOLS_NORM as SPLIT_MULTIALLELICS_MT } from '../../../modules/nf-core/bcftools/norm/main' +include { TABIX_TABIX as TABIX_TABIX_MT } from '../../../modules/nf-core/tabix/tabix/main' +include { BCFTOOLS_NORM as REMOVE_DUPLICATES_MT } from '../../../modules/nf-core/bcftools/norm/main' +include { TABIX_TABIX as TABIX_TABIX_MT2 } from '../../../modules/nf-core/tabix/tabix/main' +include { BCFTOOLS_MERGE as BCFTOOLS_MERGE_MT } from '../../../modules/nf-core/bcftools/merge/main' +include { HMTNOTE as HMTNOTE_MT } from '../../../modules/nf-core/hmtnote/main' +include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../../modules/nf-core/tabix/tabix/main' +include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../../modules/local/ensemblvep/main' +include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../../modules/nf-core/haplogrep2/classify/main' +include { VCFANNO as VCFANNO_MT } from '../../../modules/nf-core/vcfanno/main' +include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../../modules/nf-core/tabix/bgziptabix/main' workflow MERGE_ANNOTATE_MT { take: @@ -124,9 +124,9 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) emit: - haplog = HAPLOGREP2_CLASSIFY_MT.out.txt // channel: [ val(meta), path(txt) ] - vcf = ch_vcf_out // channel: [ val(meta), path(vcf) ] - tbi = ch_tbi_out // channel: [ val(meta), path(tbi) ] - report = ENSEMBLVEP_MT.out.report // channel: [ path(html) ] - versions = ch_versions // channel: [ path(versions.yml) ] + haplog = HAPLOGREP2_CLASSIFY_MT.out.txt // channel: [ val(meta), path(txt) ] + vcf = ch_vcf_out // channel: [ val(meta), path(vcf) ] + tbi = ch_tbi_out // channel: [ val(meta), path(tbi) ] + report = ENSEMBLVEP_MT.out.report // channel: [ path(html) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/prepare_references.nf b/subworkflows/local/prepare_references.nf index fdb090bb..0eb68049 100644 --- a/subworkflows/local/prepare_references.nf +++ b/subworkflows/local/prepare_references.nf @@ -90,24 +90,24 @@ workflow PREPARE_REFERENCES { ch_versions = ch_versions.mix(UNTAR_VEP_CACHE.out.versions) emit: - bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() // channel: [ path(intervals) ] - bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() // channel: [ val(meta), path(index) ] - bwa_index_mt_shift = SENTIEON_BWAINDEX_SHIFT_MT.out.index.collect() // channel: [ val(meta), path(index) ] - bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() // channel: [ val(meta), path(index) ] - bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() // channel: [ val(meta), path(index) ] - chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() // channel: [ path(sizes) ] - fasta_fai = SAMTOOLS_FAIDX_GENOME.out.fai.map{ meta, fai -> [fai] }.collect() // channel: [ path(fai) ] - fasta_fai_meta = SAMTOOLS_FAIDX_GENOME.out.fai.collect() // channel: [ val(meta), path(fai) ] - fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] }.collect() // channel: [ path(fai) ] - gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi.collect() // channel: [ val(meta), path(fasta) ] - known_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect() // channel: [ val(meta), path(fasta) ] - sequence_dict = GATK_SD.out.dict.collect() // channel: [ path(dict) ] - sequence_dict_meta = GATK_SD.out.dict.map {it -> [[id:it[0].simpleName], it]}.collect() // channel: [ val(meta), path(fasta) ] - sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict.collect() // channel: [ path(dict) ] - target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi).collect() // channel: [ val(meta), path(bed), path(tbi) ] - target_intervals = GATK_BILT.out.interval_list.collect{it[1]}.collect() // channel: [ path(interval_list) ] - vep_resources = UNTAR_VEP_CACHE.out.untar.map{meta, files -> [files]}.collect() // channel: [ path(cache) ] - versions = ch_versions // channel: [ path(versions.yml) ] + bait_intervals = CAT_CAT_BAIT.out.file_out.map { id, it -> [it] }.collect() // channel: [ path(intervals) ] + bwa_index = Channel.empty().mix(ch_bwa, ch_sentieonbwa).collect() // channel: [ val(meta), path(index) ] + bwa_index_mt_shift = SENTIEON_BWAINDEX_SHIFT_MT.out.index.collect() // channel: [ val(meta), path(index) ] + bwamem2_index = BWAMEM2_INDEX_GENOME.out.index.collect() // channel: [ val(meta), path(index) ] + bwamem2_index_mt_shift = BWAMEM2_INDEX_SHIFT_MT.out.index.collect() // channel: [ val(meta), path(index) ] + chrom_sizes = GET_CHROM_SIZES.out.sizes.collect() // channel: [ path(sizes) ] + fasta_fai = SAMTOOLS_FAIDX_GENOME.out.fai.map{ meta, fai -> [fai] }.collect() // channel: [ path(fai) ] + fasta_fai_meta = SAMTOOLS_FAIDX_GENOME.out.fai.collect() // channel: [ val(meta), path(fai) ] + fasta_fai_mt_shift = SAMTOOLS_FAIDX_SHIFT_MT.out.fai.map{ meta, fai -> [fai] }.collect() // channel: [ path(fai) ] + gnomad_af_idx = TABIX_GNOMAD_AF.out.tbi.collect() // channel: [ val(meta), path(fasta) ] + known_dbsnp_tbi = TABIX_DBSNP.out.tbi.collect() // channel: [ val(meta), path(fasta) ] + sequence_dict = GATK_SD.out.dict.collect() // channel: [ path(dict) ] + sequence_dict_meta = GATK_SD.out.dict.map {it -> [[id:it[0].simpleName], it]}.collect() // channel: [ val(meta), path(fasta) ] + sequence_dict_mt_shift = GATK_SD_SHIFT_MT.out.dict.collect() // channel: [ path(dict) ] + target_bed = Channel.empty().mix(ch_tbi, ch_bgzip_tbi).collect() // channel: [ val(meta), path(bed), path(tbi) ] + target_intervals = GATK_BILT.out.interval_list.collect{it[1]}.collect() // channel: [ path(interval_list) ] + vep_resources = UNTAR_VEP_CACHE.out.untar.map{meta, files -> [files]}.collect() // channel: [ path(cache) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 1e3d622c..49564594 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -63,13 +63,13 @@ workflow QC_BAM { ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions, SENTIEON_WGSMETRICS_Y.out.versions) emit: - multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] - hs_metrics = PICARD_COLLECTHSMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] - qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap_dir) ] - tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(wig) ] - bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(bw) ] - d4 = MOSDEPTH.out.per_base_d4 // channel: [ val(meta), path(d4) ] - cov = ch_cov // channel: [ val(meta), path(metrics) ] - cov_y = ch_cov_y // channel: [ val(meta), path(metrics) ] - versions = ch_versions // channel: [ path(versions.yml) ] + multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] + hs_metrics = PICARD_COLLECTHSMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] + qualimap_results = QUALIMAP_BAMQC.out.results // channel: [ val(meta), path(qualimap_dir) ] + tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(wig) ] + bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(bw) ] + d4 = MOSDEPTH.out.per_base_d4 // channel: [ val(meta), path(d4) ] + cov = ch_cov // channel: [ val(meta), path(metrics) ] + cov_y = ch_cov_y // channel: [ val(meta), path(metrics) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/rank_variants.nf b/subworkflows/local/rank_variants.nf index f96197fc..b9f63c42 100644 --- a/subworkflows/local/rank_variants.nf +++ b/subworkflows/local/rank_variants.nf @@ -2,10 +2,10 @@ // A subworkflow to score and rank variants. // -include { GENMOD_ANNOTATE } from '../../modules/nf-core/genmod/annotate/main' -include { GENMOD_MODELS } from '../../modules/nf-core/genmod/models/main' -include { GENMOD_SCORE } from '../../modules/nf-core/genmod/score/main' -include { GENMOD_COMPOUND } from '../../modules/nf-core/genmod/compound/main' +include { GENMOD_ANNOTATE } from '../../modules/nf-core/genmod/annotate/main' +include { GENMOD_MODELS } from '../../modules/nf-core/genmod/models/main' +include { GENMOD_SCORE } from '../../modules/nf-core/genmod/score/main' +include { GENMOD_COMPOUND } from '../../modules/nf-core/genmod/compound/main' workflow RANK_VARIANTS { @@ -32,6 +32,6 @@ workflow RANK_VARIANTS { ch_versions = ch_versions.mix(GENMOD_COMPOUND.out.versions) emit: - vcf = GENMOD_COMPOUND.out.vcf // channel: [ val(meta), path(vcf) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf = GENMOD_COMPOUND.out.vcf // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/scatter_genome.nf b/subworkflows/local/scatter_genome.nf index 07a70e95..6f5dac41 100644 --- a/subworkflows/local/scatter_genome.nf +++ b/subworkflows/local/scatter_genome.nf @@ -8,10 +8,10 @@ include { GATK4_SPLITINTERVALS } from '../../modules/nf-core/gatk4/splitinterval workflow SCATTER_GENOME { take: - ch_dict // channel: [mandatory] [ path(dict) ] - ch_fai_meta // channel: [mandatory] [ val(meta), path(fai) ] - ch_fai_no_meta // channel: [mandatory] [ path(fai) ] - ch_fasta_no_meta // channel: [mandatory] [ path(fasta) ] + ch_dict // channel: [mandatory] [ path(dict) ] + ch_fai_meta // channel: [mandatory] [ val(meta), path(fai) ] + ch_fai_no_meta // channel: [mandatory] [ path(fai) ] + ch_fasta_no_meta // channel: [mandatory] [ path(fasta) ] main: ch_versions = Channel.empty() diff --git a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf index 5b3b87f7..975d139c 100644 --- a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf +++ b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf @@ -10,12 +10,12 @@ include { CNVPYTOR_VIEW as VIEW } from '../../../modules/nf workflow CALL_CNV_CNVPYTOR { take: - ch_bam // channel: [mandatory] [ val(meta), path(bam)] - ch_bai // channel: [mandatory] [ val(meta), path(bai) ] - ch_case_info // channel: [mandatory] [ val(case_info) ] - val_binsizes // string: [optional] binsizes for cnvpytor default: 1000 - ch_fasta // channel: [mandatory] [ path(fasta) ] - ch_fai // channel: [mandatory] [ path(fai) ] + ch_bam // channel: [mandatory] [ val(meta), path(bam)] + ch_bai // channel: [mandatory] [ val(meta), path(bai) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] + val_binsizes // string: [optional] binsizes for cnvpytor default: 1000 + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] main: @@ -48,7 +48,7 @@ workflow CALL_CNV_CNVPYTOR { ch_versions = ch_versions.mix(VIEW.out.versions.first()) emit: - candidate_cnvs_vcf = VIEW.out.vcf // channel: [ val(meta), path(vcf) ] - versions = ch_versions // channel: [ path(versions.yml) ] + candidate_cnvs_vcf = VIEW.out.vcf // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/variant_calling/call_snv_deepvariant.nf b/subworkflows/local/variant_calling/call_snv_deepvariant.nf index 7e2f4706..a401329a 100644 --- a/subworkflows/local/variant_calling/call_snv_deepvariant.nf +++ b/subworkflows/local/variant_calling/call_snv_deepvariant.nf @@ -10,10 +10,10 @@ include { TABIX_TABIX as TABIX_GL } from '../../../modules/nf-co workflow CALL_SNV_DEEPVARIANT { take: - ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] - ch_fasta // channel: [mandatory] [ path(fasta) ] - ch_fai // channel: [mandatory] [ path(fai) ] - ch_case_info // channel: [mandatory] [ val(case_info) ] + ch_bam // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] main: ch_versions = Channel.empty() @@ -55,7 +55,7 @@ workflow CALL_SNV_DEEPVARIANT { ch_versions = ch_versions.mix(TABIX_GL.out.versions) emit: - vcf = REMOVE_DUPLICATES_GL.out.vcf // channel: [ val(meta), path(vcf) ] - tabix = TABIX_GL.out.tbi // channel: [ val(meta), path(tbi) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf = REMOVE_DUPLICATES_GL.out.vcf // channel: [ val(meta), path(vcf) ] + tabix = TABIX_GL.out.tbi // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 1339d96d..0b163740 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -13,18 +13,18 @@ include { BCFTOOLS_FILTER as BCF_FILTER_ONE } from '../../../modules/nf-c include { BCFTOOLS_FILTER as BCF_FILTER_TWO } from '../../../modules/nf-core/bcftools/filter/main' workflow CALL_SNV_SENTIEON { - take: - ch_input // channel: [mandatory] [ val(meta), path(bam), path(bai) ] - ch_fasta // channel: [mandatory] [ path(fasta) ] - ch_fai // channel: [mandatory] [ path(fai) ] - ch_dbsnp // channel: [mandatory] [ val(meta), path(vcf) ] - ch_dbsnp_index // channel: [mandatory] [ val(meta), path(tbi) ] + take: + ch_input // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_dbsnp // channel: [mandatory] [ val(meta), path(vcf) ] + ch_dbsnp_index // channel: [mandatory] [ val(meta), path(tbi) ] ch_call_interval // channel: [mandatory] [ path(interval) ] ch_ml_model // channel: [mandatory] [ path(model) ] ch_case_info // channel: [mandatory] [ val(case_info) ] - main: - ch_versions = Channel.empty() + main: + ch_versions = Channel.empty() SENTIEON_DNASCOPE ( ch_input, ch_fasta, ch_fai, ch_dbsnp, ch_dbsnp_index, ch_call_interval, ch_ml_model ) @@ -67,16 +67,16 @@ workflow CALL_SNV_SENTIEON { TABIX_SEN(REMOVE_DUPLICATES_SEN.out.vcf) - ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions.first()) + ch_versions = ch_versions.mix(SENTIEON_DNASCOPE.out.versions.first()) ch_versions = ch_versions.mix(SENTIEON_DNAMODELAPPLY.out.versions.first()) - ch_versions = ch_versions.mix(BCFTOOLS_MERGE.out.versions.first()) - ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_SEN.out.versions.first()) - ch_versions = ch_versions.mix(REMOVE_DUPLICATES_SEN.out.versions.first()) - ch_versions = ch_versions.mix(TABIX_SEN.out.versions.first()) + ch_versions = ch_versions.mix(BCFTOOLS_MERGE.out.versions.first()) + ch_versions = ch_versions.mix(SPLIT_MULTIALLELICS_SEN.out.versions.first()) + ch_versions = ch_versions.mix(REMOVE_DUPLICATES_SEN.out.versions.first()) + ch_versions = ch_versions.mix(TABIX_SEN.out.versions.first()) ch_versions = ch_versions.mix(BCF_FILTER_ONE.out.versions.first()) - emit: - vcf = REMOVE_DUPLICATES_SEN.out.vcf // channel: [ val(meta), path(vcf) ] - tabix = TABIX_SEN.out.tbi // channel: [ val(meta), path(tbi) ] - versions = ch_versions // channel: [ path(versions.yml) ] + emit: + vcf = REMOVE_DUPLICATES_SEN.out.vcf // channel: [ val(meta), path(vcf) ] + tabix = TABIX_SEN.out.tbi // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/variant_calling/call_sv_manta.nf b/subworkflows/local/variant_calling/call_sv_manta.nf index 9a10aa06..1fe5caf3 100644 --- a/subworkflows/local/variant_calling/call_sv_manta.nf +++ b/subworkflows/local/variant_calling/call_sv_manta.nf @@ -6,12 +6,12 @@ include { MANTA_GERMLINE as MANTA } from '../../../modules/nf-core/manta/germlin workflow CALL_SV_MANTA { take: - ch_bam // channel: [mandatory] [ val(meta), path(bam) ] - ch_bai // channel: [mandatory] [ val(meta), path(bai) ] - ch_fasta // channel: [mandatory] [ path(fasta) ] - ch_fai // channel: [mandatory] [ path(fai) ] - ch_case_info // channel: [mandatory] [ val(case_info) ] - ch_bed // channel: [mandatory for WES] [ val(meta), path(bed), path(tbi) ] + ch_bam // channel: [mandatory] [ val(meta), path(bam) ] + ch_bai // channel: [mandatory] [ val(meta), path(bai) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_fai // channel: [mandatory] [ path(fai) ] + ch_case_info // channel: [mandatory] [ val(case_info) ] + ch_bed // channel: [mandatory for WES] [ val(meta), path(bed), path(tbi) ] main: ch_bam.collect{it[1]} @@ -44,11 +44,11 @@ workflow CALL_SV_MANTA { ch_versions = MANTA.out.versions emit: - candidate_small_indels_vcf = MANTA.out.candidate_small_indels_vcf // channel: [ val(meta), path(vcf) ] - candidate_small_indels_vcf_tbi = MANTA.out.candidate_small_indels_vcf_tbi // channel: [ val(meta), path(tbi) ] - candidate_sv_vcf = MANTA.out.candidate_sv_vcf // channel: [ val(meta), path(vcf) ] - candidate_sv_vcf_tbi = MANTA.out.candidate_sv_vcf_tbi // channel: [ val(meta), path(tbi) ] - diploid_sv_vcf = MANTA.out.diploid_sv_vcf // channel: [ val(meta), path(vcf) ] - diploid_sv_vcf_tbi = MANTA.out.diploid_sv_vcf_tbi // channel: [ val(meta), path(tbi) ] - versions = ch_versions + candidate_small_indels_vcf = MANTA.out.candidate_small_indels_vcf // channel: [ val(meta), path(vcf) ] + candidate_small_indels_vcf_tbi = MANTA.out.candidate_small_indels_vcf_tbi // channel: [ val(meta), path(tbi) ] + candidate_sv_vcf = MANTA.out.candidate_sv_vcf // channel: [ val(meta), path(vcf) ] + candidate_sv_vcf_tbi = MANTA.out.candidate_sv_vcf_tbi // channel: [ val(meta), path(tbi) ] + diploid_sv_vcf = MANTA.out.diploid_sv_vcf // channel: [ val(meta), path(vcf) ] + diploid_sv_vcf_tbi = MANTA.out.diploid_sv_vcf_tbi // channel: [ val(meta), path(tbi) ] + versions = ch_versions } diff --git a/subworkflows/local/variant_calling/call_sv_tiddit.nf b/subworkflows/local/variant_calling/call_sv_tiddit.nf index 6729d304..329b11b4 100644 --- a/subworkflows/local/variant_calling/call_sv_tiddit.nf +++ b/subworkflows/local/variant_calling/call_sv_tiddit.nf @@ -7,10 +7,10 @@ include { SVDB_MERGE as SVDB_MERGE_TIDDIT } from '../../../modules/nf-core/svdb/ workflow CALL_SV_TIDDIT { take: - ch_bam_bai // channel: [mandatory] [ val(meta), path(bam), path(bai) ] - ch_fasta // channel: [mandatory] [ val(meta), path(fasta) ] - ch_index // channel: [mandatory] [ val(meta), path(index)] - ch_case_info // channel: [mandatory] [ val(case_info) ] + ch_bam_bai // channel: [mandatory] [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_index // channel: [mandatory] [ val(meta), path(index)] + ch_case_info // channel: [mandatory] [ val(case_info) ] main: TIDDIT_SV ( ch_bam_bai, ch_fasta, ch_index ) @@ -31,6 +31,6 @@ workflow CALL_SV_TIDDIT { ch_versions = ch_versions.mix(SVDB_MERGE_TIDDIT.out.versions) emit: - vcf = SVDB_MERGE_TIDDIT.out.vcf // channel: [ val(meta), path(vcf) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf = SVDB_MERGE_TIDDIT.out.vcf // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From f1ea0154b3b8c3d2e576cedc4862fe60856bc482 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 14:27:30 +0100 Subject: [PATCH 1061/1169] mt and gens --- conf/modules/analyse_MT.config | 7 +++ conf/modules/call_snv_deepvariant.config | 2 + conf/modules/call_snv_sentieon.config | 2 + conf/modules/gens.config | 10 ++-- conf/modules/merge_annotate_MT.config | 61 ++++++------------------ conf/modules/raredisease.config | 3 +- 6 files changed, 33 insertions(+), 52 deletions(-) diff --git a/conf/modules/analyse_MT.config b/conf/modules/analyse_MT.config index 7c3adbb2..ec082bcd 100644 --- a/conf/modules/analyse_MT.config +++ b/conf/modules/analyse_MT.config @@ -15,6 +15,13 @@ // Liftover // +process { + withName: '.*ANALYSE_MT:.*' { + publishDir = [ + enabled: false + ] + } +} process { withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { diff --git a/conf/modules/call_snv_deepvariant.config b/conf/modules/call_snv_deepvariant.config index 0312dded..af57cfe8 100644 --- a/conf/modules/call_snv_deepvariant.config +++ b/conf/modules/call_snv_deepvariant.config @@ -38,6 +38,7 @@ process { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ + enabled: !params.dedicated_mt_analysis, path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -46,6 +47,7 @@ process { withName: '.*CALL_SNV_DEEPVARIANT:TABIX_GL' { publishDir = [ + enabled: !params.dedicated_mt_analysis, path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } diff --git a/conf/modules/call_snv_sentieon.config b/conf/modules/call_snv_sentieon.config index 46ba791d..67dec7aa 100644 --- a/conf/modules/call_snv_sentieon.config +++ b/conf/modules/call_snv_sentieon.config @@ -52,6 +52,7 @@ process { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ + enabled: !params.dedicated_mt_analysis, path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -60,6 +61,7 @@ process { withName: '.*CALL_SNV_SENTIEON:TABIX_SEN' { publishDir = [ + enabled: !params.dedicated_mt_analysis, path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } diff --git a/conf/modules/gens.config b/conf/modules/gens.config index f1a8ec8f..b918a6b2 100644 --- a/conf/modules/gens.config +++ b/conf/modules/gens.config @@ -16,15 +16,15 @@ // process { - withName: '.*GENS:COLLECTREADCOUNTS' { - ext.args = '--interval-merging-rule OVERLAPPING_ONLY' - } - - withName: GENS { + withName: '.*GENS:.*' { publishDir = [ path: { "${params.outdir}/gens" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + + withName: '.*GENS:COLLECTREADCOUNTS' { + ext.args = '--interval-merging-rule OVERLAPPING_ONLY' + } } diff --git a/conf/modules/merge_annotate_MT.config b/conf/modules/merge_annotate_MT.config index d574fcaa..5287dc59 100644 --- a/conf/modules/merge_annotate_MT.config +++ b/conf/modules/merge_annotate_MT.config @@ -31,49 +31,15 @@ process { withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:SPLIT_MULTIALLELICS_MT' { ext.args = '--output-type z --multiallelics -both' ext.prefix = { "${meta.id}_split" } - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT' { - publishDir = [ - enabled: false - ] } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:REMOVE_DUPLICATES_MT' { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } - publishDir = [ - path: { "${params.outdir}/gatk4" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT2' { - publishDir = [ - enabled: false - ] } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:BCFTOOLS_MERGE_MT' { - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HMTNOTE_MT' { - publishDir = [ - enabled: false - ] - } - - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:TABIX_TABIX_MT3' { - publishDir = [ - enabled: false - ] + ext.prefix = { "${meta.id}_merge_mt" } } withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ENSEMBLVEP_MT' { @@ -92,29 +58,32 @@ process { '--merged --polyphen p --protein --offline --regulatory --sift p --symbol --tsl --vcf', '--uniprot' ].join(' ') - publishDir = [ - path: { "${params.outdir}/mt_annotation_vep" }, - mode: params.publish_dir_mode - ] } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HAPLOGREP2_CLASSIFY_MT' { + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:VCFANNO_MT' { + ext.prefix = { "${meta.id}_vep_vcfanno_mt" } publishDir = [ - enabled: false + path: { "${params.outdir}/annotate_mt" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:VCFANNO_MT' { - ext.prefix = { "${meta.id}_mito_ann" } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ZIP_TABIX_VCFANNO' { publishDir = [ - path: { "${params.outdir}/mt_annotation" }, + path: { "${params.outdir}/annotate_mt" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ZIP_TABIX_VCFANNO' { - ext.prefix = { "${meta.id}_mito_ann" } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HAPLOGREP2_CLASSIFY_MT' { + ext.prefix = { "${meta.id}_haplogrep" } + publishDir = [ + path: { "${params.outdir}/annotate_mt" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } } diff --git a/conf/modules/raredisease.config b/conf/modules/raredisease.config index 47d94270..23604fc4 100644 --- a/conf/modules/raredisease.config +++ b/conf/modules/raredisease.config @@ -58,7 +58,8 @@ process { ext.prefix = { "${meta.id}_nomito" } ext.when = { params.annotate_snv_switch } publishDir = [ - path: { "${params.outdir}/glnexus/no_mito" }, + enabled: params.dedicated_mt_analysis, + path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From 11e76e2724dda90d6831f13052eb1e408a82d3c9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 15:25:46 +0100 Subject: [PATCH 1062/1169] add multiqc --- conf/modules/call_structural_variants.config | 1 + conf/modules/raredisease.config | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/conf/modules/call_structural_variants.config b/conf/modules/call_structural_variants.config index 8bc1c6a4..f4a8c427 100644 --- a/conf/modules/call_structural_variants.config +++ b/conf/modules/call_structural_variants.config @@ -29,6 +29,7 @@ process { publishDir = [ path: { "${params.outdir}/call_sv" }, mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } diff --git a/conf/modules/raredisease.config b/conf/modules/raredisease.config index 23604fc4..42c9b958 100644 --- a/conf/modules/raredisease.config +++ b/conf/modules/raredisease.config @@ -107,6 +107,10 @@ process { } } +// +// Filter out clincal and research variants +// + process { withName: '.*FILTER_VEP_SNV' { ext.prefix = { "${meta.id}_rankedvar_snv" } @@ -128,3 +132,17 @@ process { ] } } + +// +// Multiqc options +// + +process { + withName: '.*RAREDISEASE:MULTIQC' { + publishDir = [ + path: { "${params.outdir}/multiqc/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] + } +} From 9131d21fa0a5c7fd826fee080254cc997e9491ba Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 20:42:43 +0100 Subject: [PATCH 1063/1169] organize annotate_mt --- conf/modules/merge_annotate_MT.config | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/conf/modules/merge_annotate_MT.config b/conf/modules/merge_annotate_MT.config index 5287dc59..d62cf73c 100644 --- a/conf/modules/merge_annotate_MT.config +++ b/conf/modules/merge_annotate_MT.config @@ -60,19 +60,12 @@ process { ].join(' ') } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:VCFANNO_MT' { - ext.prefix = { "${meta.id}_vep_vcfanno_mt" } - publishDir = [ - path: { "${params.outdir}/annotate_mt" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ZIP_TABIX_VCFANNO' { + ext.prefix = { "${meta.id}_vep_vcfanno_mt" } publishDir = [ path: { "${params.outdir}/annotate_mt" }, mode: params.publish_dir_mode, + pattern: "*{vcf.gz,vcf.gz.tbi}", saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } From 7b5b5db1d800c4af008379b44840154bba456928 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 14 Mar 2023 21:22:38 +0100 Subject: [PATCH 1064/1169] compress vcf outputs --- subworkflows/local/annotate_consequence_pli.nf | 6 +++++- subworkflows/local/annotate_structural_variants.nf | 5 +++++ subworkflows/local/call_structural_variants.nf | 9 +++++++-- subworkflows/local/rank_variants.nf | 8 ++++++-- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/annotate_consequence_pli.nf b/subworkflows/local/annotate_consequence_pli.nf index 93ab181b..aa0f257e 100644 --- a/subworkflows/local/annotate_consequence_pli.nf +++ b/subworkflows/local/annotate_consequence_pli.nf @@ -4,6 +4,7 @@ include { ADD_MOST_SEVERE_CSQ } from '../../modules/local/add_most_severe_consequence' include { ADD_MOST_SEVERE_PLI } from '../../modules/local/add_most_severe_pli' +include { TABIX_BGZIPTABIX } from '../../modules/nf-core/tabix/bgziptabix/main' workflow ANNOTATE_CSQ_PLI { take: @@ -17,10 +18,13 @@ workflow ANNOTATE_CSQ_PLI { ADD_MOST_SEVERE_PLI (ADD_MOST_SEVERE_CSQ.out.vcf) + TABIX_BGZIPTABIX (ADD_MOST_SEVERE_PLI.out.vcf) + ch_versions = ch_versions.mix(ADD_MOST_SEVERE_CSQ.out.versions) ch_versions = ch_versions.mix(ADD_MOST_SEVERE_PLI.out.versions) + ch_versions = ch_versions.mix(TABIX_BGZIPTABIX.out.versions) emit: - vcf_ann = ADD_MOST_SEVERE_PLI.out.vcf // channel: [ val(meta), path(vcf) ] + vcf_ann = TABIX_BGZIPTABIX.out.gz_tbi.map { meta, vcf, tbi -> return [ meta, vcf ] }.collect() // channel: [ val(meta), path(vcf) ] versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/annotate_structural_variants.nf b/subworkflows/local/annotate_structural_variants.nf index ab170fcf..6af0519f 100644 --- a/subworkflows/local/annotate_structural_variants.nf +++ b/subworkflows/local/annotate_structural_variants.nf @@ -6,6 +6,7 @@ include { SVDB_QUERY } from '../../modules/nf-core/svdb/query/m include { PICARD_SORTVCF } from '../../modules/nf-core/picard/sortvcf/main' include { BCFTOOLS_VIEW } from '../../modules/nf-core/bcftools/view/main' include { ENSEMBLVEP as ENSEMBLVEP_SV } from '../../modules/local/ensemblvep/main' +include { TABIX_TABIX as TABIX_VEP } from '../../modules/nf-core/tabix/tabix/main' workflow ANNOTATE_STRUCTURAL_VARIANTS { @@ -57,12 +58,16 @@ workflow ANNOTATE_STRUCTURAL_VARIANTS { [] ) + TABIX_VEP (ENSEMBLVEP_SV.out.vcf_gz) + ch_versions = ch_versions.mix(SVDB_QUERY.out.versions) ch_versions = ch_versions.mix(PICARD_SORTVCF.out.versions) ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions) ch_versions = ch_versions.mix(ENSEMBLVEP_SV.out.versions) + ch_versions = ch_versions.mix(TABIX_VEP.out.versions) emit: vcf_ann = ENSEMBLVEP_SV.out.vcf_gz // channel: [ val(meta), path(vcf) ] + tbi = TABIX_VEP.out.tbi // channel: [ val(meta), path(tbi) ] versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index 4e4a7d6f..17f6e593 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -6,6 +6,7 @@ include { CALL_SV_MANTA } from './variant_calling/call_sv_manta' include { CALL_SV_TIDDIT } from './variant_calling/call_sv_tiddit' include { SVDB_MERGE } from '../../modules/nf-core/svdb/merge/main' include { CALL_CNV_CNVPYTOR } from './variant_calling/call_cnv_cnvpytor' +include { TABIX_TABIX } from '../../modules/nf-core/tabix/tabix/main' workflow CALL_STRUCTURAL_VARIANTS { @@ -60,11 +61,15 @@ workflow CALL_STRUCTURAL_VARIANTS { // SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta","cnvpytor"] ) SVDB_MERGE (merge_input_vcfs, ["tiddit","manta"]) + TABIX_TABIX (SVDB_MERGE.out.vcf) + ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) + ch_versions = ch_versions.mix(TABIX_TABIX.out.versions) // ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) emit: - vcf = SVDB_MERGE.out.vcf // channel: [ val(meta), path(vcf)] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf = SVDB_MERGE.out.vcf // channel: [ val(meta), path(vcf)] + tbi = TABIX_TABIX.out.tbi // channel: [ val(meta), path(vcf)] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/rank_variants.nf b/subworkflows/local/rank_variants.nf index b9f63c42..b25371c8 100644 --- a/subworkflows/local/rank_variants.nf +++ b/subworkflows/local/rank_variants.nf @@ -6,6 +6,7 @@ include { GENMOD_ANNOTATE } from '../../modules/nf-core/genmod/annotate/main' include { GENMOD_MODELS } from '../../modules/nf-core/genmod/models/main' include { GENMOD_SCORE } from '../../modules/nf-core/genmod/score/main' include { GENMOD_COMPOUND } from '../../modules/nf-core/genmod/compound/main' +include { TABIX_BGZIPTABIX } from '../../modules/nf-core/tabix/bgziptabix/main' workflow RANK_VARIANTS { @@ -26,12 +27,15 @@ workflow RANK_VARIANTS { GENMOD_COMPOUND(GENMOD_SCORE.out.vcf) + TABIX_BGZIPTABIX (GENMOD_COMPOUND.out.vcf) + ch_versions = ch_versions.mix(GENMOD_ANNOTATE.out.versions) ch_versions = ch_versions.mix(GENMOD_MODELS.out.versions) ch_versions = ch_versions.mix(GENMOD_SCORE.out.versions) ch_versions = ch_versions.mix(GENMOD_COMPOUND.out.versions) + ch_versions = ch_versions.mix(TABIX_BGZIPTABIX.out.versions) emit: - vcf = GENMOD_COMPOUND.out.vcf // channel: [ val(meta), path(vcf) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf = TABIX_BGZIPTABIX.out.gz_tbi.map { meta, vcf, tbi -> return [ meta, vcf ] }.collect() // channel: [ val(meta), path(vcf) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From ecf8e76308a1e579698722c8dad6ebcb440fe10e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Mar 2023 13:38:37 +0100 Subject: [PATCH 1065/1169] review suggestions --- conf/modules/annotate_consequence_pli.config | 25 ++++++++++++---- .../annotate_structural_variants.config | 10 ++++++- conf/modules/call_repeat_expansions.config | 14 +++++++-- conf/modules/call_structural_variants.config | 9 +++++- conf/modules/qc_bam.config | 1 - conf/modules/rank_variants.config | 12 ++++++-- conf/modules/raredisease.config | 4 +-- subworkflows/local/annotate_snvs.nf | 30 +++++++++---------- 8 files changed, 75 insertions(+), 30 deletions(-) diff --git a/conf/modules/annotate_consequence_pli.config b/conf/modules/annotate_consequence_pli.config index 61f0f260..cec9f942 100644 --- a/conf/modules/annotate_consequence_pli.config +++ b/conf/modules/annotate_consequence_pli.config @@ -16,9 +16,7 @@ process { withName: '.*ANN_CSQ_PLI_SV:.*' { ext.when = params.annotate_sv_switch publishDir = [ - path: { "${params.outdir}/annotate_sv" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } @@ -30,15 +28,22 @@ process { ext.prefix = { "${meta.id}_vep_csq_pli" } } + withName: '.*ANN_CSQ_PLI_SV:TABIX_BGZIPTABIX' { + ext.prefix = { "${meta.id}_vep_csq_pli" } + publishDir = [ + path: { "${params.outdir}/annotate_sv" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } process { withName: '.*ANN_CSQ_PLI_SNV:.*' { ext.when = params.annotate_snv_switch publishDir = [ - path: { "${params.outdir}/annotate_snv" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } @@ -50,4 +55,12 @@ process { ext.prefix = { "${meta.id}_vep_csq_pli" } } + withName: '.*ANN_CSQ_PLI_SNV:TABIX_BGZIPTABIX' { + ext.prefix = { "${meta.id}_vep_csq_pli" } + publishDir = [ + path: { "${params.outdir}/annotate_snv" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } diff --git a/conf/modules/annotate_structural_variants.config b/conf/modules/annotate_structural_variants.config index c37bc92a..4e508bcb 100644 --- a/conf/modules/annotate_structural_variants.config +++ b/conf/modules/annotate_structural_variants.config @@ -48,7 +48,15 @@ process { '--protein --offline --regulatory --sift p', '--symbol --tsl --uniprot --vcf' ].join(' ') - ext.prefix = { "${meta.id}_vep" } + ext.prefix = { "${meta.id}_svdbquery_vep" } + publishDir = [ + path: { "${params.outdir}/annotate_sv" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:TABIX_VEP' { publishDir = [ path: { "${params.outdir}/annotate_sv" }, mode: params.publish_dir_mode, diff --git a/conf/modules/call_repeat_expansions.config b/conf/modules/call_repeat_expansions.config index 6129ef7b..a03f605b 100644 --- a/conf/modules/call_repeat_expansions.config +++ b/conf/modules/call_repeat_expansions.config @@ -32,11 +32,21 @@ process { } withName: '.*CALL_REPEAT_EXPANSIONS:RENAMESAMPLE_EXP' { - ext.prefix = { "${meta.id}_rename" } + publishDir = [ + path: { "${params.outdir}/repeat_expansions" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + ] } withName: '.*CALL_REPEAT_EXPANSIONS:TABIX_EXP_RENAME' { - ext.prefix = { "${meta.id}_tabix_rename" } + publishDir = [ + path: { "${params.outdir}/repeat_expansions" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : + filename.contains('_renam.vcf.gz.tbi') ? "${meta.id}_repeat_expansion.vcf.gz.tbi" : + filename }, + ] } withName: '.*CALL_REPEAT_EXPANSIONS:SPLIT_MULTIALLELICS_EXP' { diff --git a/conf/modules/call_structural_variants.config b/conf/modules/call_structural_variants.config index f4a8c427..a8c10175 100644 --- a/conf/modules/call_structural_variants.config +++ b/conf/modules/call_structural_variants.config @@ -25,7 +25,14 @@ process { withName: '.*CALL_STRUCTURAL_VARIANTS:SVDB_MERGE' { ext.args = '--pass_only --same_order' - ext.prefix = { "${meta.id}_merged" } + publishDir = [ + path: { "${params.outdir}/call_sv" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*CALL_STRUCTURAL_VARIANTS:TABIX_TABIX' { publishDir = [ path: { "${params.outdir}/call_sv" }, mode: params.publish_dir_mode, diff --git a/conf/modules/qc_bam.config b/conf/modules/qc_bam.config index 360d479a..0f5f411f 100644 --- a/conf/modules/qc_bam.config +++ b/conf/modules/qc_bam.config @@ -43,7 +43,6 @@ process { withName: '.*QC_BAM:UCSC_WIGTOBIGWIG' { ext.args = '-clip' - ext.prefix = { "${meta.id}_wigtobigwig" } } withName: '.*QC_BAM:MOSDEPTH' { diff --git a/conf/modules/rank_variants.config b/conf/modules/rank_variants.config index fab5fdc7..8f17d2e2 100644 --- a/conf/modules/rank_variants.config +++ b/conf/modules/rank_variants.config @@ -34,7 +34,11 @@ process { } withName: '.*RANK_VARIANTS_SV:GENMOD_COMPOUND' { - ext.prefix = { "${meta.id}_rankedvar_sv" } + ext.prefix = { "${meta.id}_ranked_sv" } + } + + withName: '.*RANK_VARIANTS_SV:TABIX_BGZIPTABIX' { + ext.prefix = { "${meta.id}_ranked_sv" } publishDir = [ path: { "${params.outdir}/rank_and_filter" }, mode: params.publish_dir_mode, @@ -70,7 +74,11 @@ process { } withName: '.*RANK_VARIANTS_SNV:GENMOD_COMPOUND' { - ext.prefix = { "${meta.id}_rankedvar_snv" } + ext.prefix = { "${meta.id}_ranked_snv" } + } + + withName: '.*RANK_VARIANTS_SNV:TABIX_BGZIPTABIX' { + ext.prefix = { "${meta.id}_ranked_snv" } publishDir = [ path: { "${params.outdir}/rank_and_filter" }, mode: params.publish_dir_mode, diff --git a/conf/modules/raredisease.config b/conf/modules/raredisease.config index 42c9b958..3b18fa95 100644 --- a/conf/modules/raredisease.config +++ b/conf/modules/raredisease.config @@ -113,7 +113,7 @@ process { process { withName: '.*FILTER_VEP_SNV' { - ext.prefix = { "${meta.id}_rankedvar_snv" } + ext.prefix = { "${meta.id}_clinical_snv" } publishDir = [ path: { "${params.outdir}/rank_and_filter" }, mode: params.publish_dir_mode, @@ -124,7 +124,7 @@ process { process { withName: '.*FILTER_VEP_SV' { - ext.prefix = { "${meta.id}_rankedvar_sv" } + ext.prefix = { "${meta.id}_clinical_sv" } publishDir = [ path: { "${params.outdir}/rank_and_filter" }, mode: params.publish_dir_mode, diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 30ee493b..d7e918de 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -18,18 +18,18 @@ include { GATK4_SELECTVARIANTS } from '../../modules/nf-core/ga workflow ANNOTATE_SNVS { take: - ch_vcf // channel: [mandatory] [ val(meta), path(vcf), path(tbi) ] - analysis_type // string: [mandatory] 'wgs' or 'wes' - ch_vcfanno_resources // channel: [mandatory] [ path(resources) ] - ch_vcfanno_lua // channel: [mandatory] [ path(lua) ] - ch_vcfanno_toml // channel: [mandatory] [ path(toml) ] - val_vep_genome // string: [mandatory] GRCh37 or GRCh38 - val_vep_cache_version // string: [mandatory] default: 107 - ch_vep_cache // channel: [mandatory] [ path(cache) ] - ch_fasta // channel: [mandatory] [ path(fasta) ] - ch_gnomad_af // channel: [optional] [ path(tab), path(tbi) ] - ch_split_intervals // channel: [mandatory] [ path(intervals) ] - ch_samples // channel: [mandatory] [ val(sample_id), val(sex), val(phenotype), val(paternal_id), val(maternal_id), val(case_id) ] + ch_vcf // channel: [mandatory] [ val(meta), path(vcf), path(tbi) ] + analysis_type // string: [mandatory] 'wgs' or 'wes' + ch_vcfanno_resources // channel: [mandatory] [ path(resources) ] + ch_vcfanno_lua // channel: [mandatory] [ path(lua) ] + ch_vcfanno_toml // channel: [mandatory] [ path(toml) ] + val_vep_genome // string: [mandatory] GRCh37 or GRCh38 + val_vep_cache_version // string: [mandatory] default: 107 + ch_vep_cache // channel: [mandatory] [ path(cache) ] + ch_fasta // channel: [mandatory] [ path(fasta) ] + ch_gnomad_af // channel: [optional] [ path(tab), path(tbi) ] + ch_split_intervals // channel: [mandatory] [ path(intervals) ] + ch_samples // channel: [mandatory] [ val(sample_id), val(sex), val(phenotype), val(paternal_id), val(maternal_id), val(case_id) ] main: ch_versions = Channel.empty() @@ -118,7 +118,7 @@ workflow ANNOTATE_SNVS { ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) emit: - vcf_ann = ch_vep_ann // channel: [ val(meta), path(vcf) ] - tbi = ch_vep_index // channel: [ val(meta), path(tbi) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf_ann = ch_vep_ann // channel: [ val(meta), path(vcf) ] + tbi = ch_vep_index // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From ef0856ad0a6b934749b870e49f11b82257d8f5b7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Mar 2023 13:46:35 +0100 Subject: [PATCH 1066/1169] rename rep exp vcf --- conf/modules/call_repeat_expansions.config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/modules/call_repeat_expansions.config b/conf/modules/call_repeat_expansions.config index a03f605b..1f71bef6 100644 --- a/conf/modules/call_repeat_expansions.config +++ b/conf/modules/call_repeat_expansions.config @@ -35,7 +35,9 @@ process { publishDir = [ path: { "${params.outdir}/repeat_expansions" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> filename.equals('versions.yml') ? null : + filename.contains('_renam.vcf.gz') ? "${meta.id}_repeat_expansion.vcf.gz" : + filename }, ] } From 3119d65ea57c798e49ad2da460521584d73b6d22 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Mar 2023 13:48:26 +0100 Subject: [PATCH 1067/1169] review suggestions --- subworkflows/local/call_structural_variants.nf | 2 +- subworkflows/local/rank_variants.nf | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index 17f6e593..803a9a20 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -70,6 +70,6 @@ workflow CALL_STRUCTURAL_VARIANTS { emit: vcf = SVDB_MERGE.out.vcf // channel: [ val(meta), path(vcf)] - tbi = TABIX_TABIX.out.tbi // channel: [ val(meta), path(vcf)] + tbi = TABIX_TABIX.out.tbi // channel: [ val(meta), path(tbi)] versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/rank_variants.nf b/subworkflows/local/rank_variants.nf index b25371c8..f1a9c788 100644 --- a/subworkflows/local/rank_variants.nf +++ b/subworkflows/local/rank_variants.nf @@ -2,11 +2,11 @@ // A subworkflow to score and rank variants. // -include { GENMOD_ANNOTATE } from '../../modules/nf-core/genmod/annotate/main' -include { GENMOD_MODELS } from '../../modules/nf-core/genmod/models/main' -include { GENMOD_SCORE } from '../../modules/nf-core/genmod/score/main' -include { GENMOD_COMPOUND } from '../../modules/nf-core/genmod/compound/main' -include { TABIX_BGZIPTABIX } from '../../modules/nf-core/tabix/bgziptabix/main' +include { GENMOD_ANNOTATE } from '../../modules/nf-core/genmod/annotate/main' +include { GENMOD_MODELS } from '../../modules/nf-core/genmod/models/main' +include { GENMOD_SCORE } from '../../modules/nf-core/genmod/score/main' +include { GENMOD_COMPOUND } from '../../modules/nf-core/genmod/compound/main' +include { TABIX_BGZIPTABIX } from '../../modules/nf-core/tabix/bgziptabix/main' workflow RANK_VARIANTS { From fefae879c13c522357a527790ddcbd1cece794bf Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Mar 2023 14:51:03 +0100 Subject: [PATCH 1068/1169] review suggestion --- subworkflows/local/annotate_snvs.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index d7e918de..cfbb4b04 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -118,7 +118,7 @@ workflow ANNOTATE_SNVS { ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) emit: - vcf_ann = ch_vep_ann // channel: [ val(meta), path(vcf) ] - tbi = ch_vep_index // channel: [ val(meta), path(tbi) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf_ann = ch_vep_ann // channel: [ val(meta), path(vcf) ] + tbi = ch_vep_index // channel: [ val(meta), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From ec813cca13711da4ed96e14a764a8a4d5548236e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Mar 2023 15:43:32 +0100 Subject: [PATCH 1069/1169] commit citations --- CITATIONS.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 4 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 4d6298e5..c23c02da 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,18 +10,107 @@ ## Pipeline tools +- [BCFtools](https://academic.oup.com/gigascience/article/10/2/giab008/6137722) + + > Danecek P, Bonfield JK, Liddle J, et al. Twelve years of SAMtools and BCFtools. GigaScience. 2021;10(2):giab008. doi:10.1093/gigascience/giab008 + +- [BWA-MEM](https://arxiv.org/abs/1303.3997) + + > Li H. Aligning sequence reads, clone sequences and assembly contigs with BWA-MEM. Published online May 26, 2013. Accessed March 14, 2023. http://arxiv.org/abs/1303.3997 + +- [BWA-MEM2](https://ieeexplore.ieee.org/abstract/document/8820962) + + > Vasimuddin Md, Misra S, Li H, Aluru S. Efficient Architecture-Aware Acceleration of BWA-MEM for Multicore Systems. In: 2019 IEEE International Parallel and Distributed Processing Symposium (IPDPS). IEEE; 2019:314-324. doi:10.1109/IPDPS.2019.00041 + +- [CNVpytor](https://academic.oup.com/gigascience/article/10/11/giab074/6431715?login=true) + + > Suvakov M, Panda A, Diesh C, Holmes I, Abyzov A. CNVpytor: a tool for copy number variation detection and analysis from read depth and allele imbalance in whole-genome sequencing. GigaScience. 2021;10(11):giab074. doi:10.1093/gigascience/giab074 + +- [DeepVariant](https://www.nature.com/articles/nbt.4235) + + > Poplin R, Chang PC, Alexander D, et al. A universal SNP and small-indel variant caller using deep neural networks. Nat Biotechnol. 2018;36(10):983-987. doi:10.1038/nbt.4235 + +- [ExpansionHunter](https://academic.oup.com/bioinformatics/article/doi/10.1093/bioinformatics/btz431/5499079) + + > Dolzhenko E, Deshpande V, Schlesinger F, et al. ExpansionHunter: a sequence-graph-based tool to analyze variation in short tandem repeat regions. Birol I, ed. Bioinformatics. 2019;35(22):4754-4756. doi:10.1093/bioinformatics/btz431 + - [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -- [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) +- [GATK](https://genome.cshlp.org/content/20/9/1297) + + > McKenna A, Hanna M, Banks E, et al. The Genome Analysis Toolkit: A MapReduce framework for analyzing next-generation DNA sequencing data. Genome Res. 2010;20(9):1297-1303. doi:10.1101/gr.107524.110 + +- [Genmod](https://github.com/Clinical-Genomics/genmod) + + > Magnusson M, Hughes T, Glabilloy, Bitdeli Chef. genmod: Version 3.7.3. Published online November 15, 2018. doi:10.5281/ZENODO.3841142 + +- [GLnexus](https://academic.oup.com/bioinformatics/article/36/24/5582/6064144) + + > Yun T, Li H, Chang PC, Lin MF, Carroll A, McLean CY. Accurate, scalable cohort variant calls using DeepVariant and GLnexus. Robinson P, ed. Bioinformatics. 2021;36(24):5582-5589. doi:10.1093/bioinformatics/btaa1081 + +- [Haplocheck](https://genome.cshlp.org/content/31/2/309.long) + + > Weissensteiner H, Forer L, Fendt L, et al. Contamination detection in sequencing studies using the mitochondrial phylogeny. Genome Res. 2021;31(2):309-316. doi:10.1101/gr.256545.119 + +- [HaploGrep 2](https://academic.oup.com/nar/article/44/W1/W58/2499296) + + > Weissensteiner H, Pacher D, Kloss-Brandstätter A, et al. HaploGrep 2: mitochondrial haplogroup classification in the era of high-throughput sequencing. Nucleic Acids Res. 2016;44(W1):W58-W63. doi:10.1093/nar/gkw233 + +- [Hmtnote](https://www.biorxiv.org/content/10.1101/600619v1) + + > Preste R, Clima R, Attimonelli M. Human Mitochondrial Variant Annotation with HmtNote. Bioinformatics; 2019. doi:10.1101/600619 - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. +- [Manta](https://academic.oup.com/bioinformatics/article/32/8/1220/1743909?login=true) + + > Chen X, Schulz-Trieglaff O, Shaw R, et al. Manta: rapid detection of structural variants and indels for germline and cancer sequencing applications. Bioinformatics. 2016;32(8):1220-1222. doi:10.1093/bioinformatics/btv710 + +- [Mosdepth](https://academic.oup.com/bioinformatics/article/34/5/867/4583630?login=true) + + > Pedersen BS, Quinlan AR. Mosdepth: quick coverage calculation for genomes and exomes. Hancock J, ed. Bioinformatics. 2018;34(5):867-868. doi:10.1093/bioinformatics/btx699 + +- [MultiQC](https://academic.oup.com/bioinformatics/article/32/19/3047/2196507) + + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016;32(19):3047-3048. doi:10.1093/bioinformatics/btw354 + +- [Picard](https://broadinstitute.github.io/picard/) + +- [Qualimap](https://academic.oup.com/bioinformatics/article/32/2/292/1744356?login=true) + + > Okonechnikov K, Conesa A, García-Alcalde F. Qualimap 2: advanced multi-sample quality control for high-throughput sequencing data. Bioinformatics. 2016;32(2):292-294. doi:10.1093/bioinformatics/btv566 + +- [rhocall](https://github.com/dnil/rhocall) + +- [SAMtools](https://academic.oup.com/bioinformatics/article/25/16/2078/204688) + + > Li H, Handsaker B, Wysoker A, et al. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009;25(16):2078-2079. doi:10.1093/bioinformatics/btp352 - [SMNCopyNumberCaller](https://www.nature.com/articles/s41436-020-0754-0) > Chen X, Sanchis-Juan A, French CE, Connel AJ, Delon I, Kingsbury Z, Chawla A, Halpern AL, Taft RJ, NIHR BioResource, Bentley DR, Butchbach MER, Raymond FL, Eberle MA. Spinal muscular atrophy diagnosis and carrier screening from genome sequencing data. Genet Med. February 2020:1-9. doi:10.1038/s41436-020-0754-0 -- [ExpansionHunter](https://academic.oup.com/bioinformatics/article/doi/10.1093/bioinformatics/btz431/5499079) - > Egor Dolzhenko, Viraj Deshpande, Felix Schlesinger, Peter Krusche, Roman Petrovski, Sai Chen, Dorothea Emig-Agius, Andrew Gross, Giuseppe Narzisi, Brett Bowman, Konrad Scheffler, Joke J F A van Vugt, Courtney French, Alba Sanchis-Juan, Kristina Ibáñez, Arianna Tucci, Bryan R Lajoie, Jan H Veldink, F Lucy Raymond, Ryan J Taft, David R Bentley, Michael A Eberle, ExpansionHunter: a sequence-graph-based tool to analyze variation in short tandem repeat regions, Bioinformatics, Volume 35, Issue 22, November 2019, Pages 4754–4756, https://doi.org/10.1093/bioinformatics/btz431 +- [stranger](https://github.com/Clinical-Genomics/stranger) + + > Nilsson D, Magnusson M. moonso/stranger v0.7.1. Published online February 18, 2021. doi:10.5281/ZENODO.4548873 + +- [svdb](https://github.com/J35P312/SVDB) + + > Eisfeldt J, Vezzi F, Olason P, Nilsson D, Lindstrand A. TIDDIT, an efficient and comprehensive structural variant caller for massive parallel sequencing data. F1000Res. 2017;6:664. doi:10.12688/f1000research.11168.2 + +- [Tabix](https://academic.oup.com/bioinformatics/article/27/5/718/262743) + + > Li H. Tabix: fast retrieval of sequence features from generic TAB-delimited files. Bioinformatics. 2011;27(5):718-719. doi:10.1093/bioinformatics/btq671 + +- [TIDDIT](https://f1000research.com/articles/6-664/v2) + + > Eisfeldt J, Vezzi F, Olason P, Nilsson D, Lindstrand A. TIDDIT, an efficient and comprehensive structural variant caller for massive parallel sequencing data. F1000Res. 2017;6:664. doi:10.12688/f1000research.11168.2 + +- [UCSC Bigwig and Bigbed](https://academic.oup.com/bioinformatics/article/26/17/2204/199001?login=true) + + > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010;26(17):2204-2207. doi:10.1093/bioinformatics/btq351 + +- [Vcfanno](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-016-0973-5) + + > Pedersen BS, Layer RM, Quinlan AR. Vcfanno: fast, flexible annotation of genetic variants. Genome Biol. 2016;17(1):118. doi:10.1186/s13059-016-0973-5 ## Software packaging/containerisation tools From d2a83c80bb0bd35b373866fdc2d7ca962d787310 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 15 Mar 2023 16:22:08 +0100 Subject: [PATCH 1070/1169] update readme --- README.md | 67 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 55d2598f..e4f6c7dd 100644 --- a/README.md +++ b/README.md @@ -28,19 +28,58 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Pipeline summary -1. Metrics: [`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/), [`MultiQC`](http://multiqc.info/) -2. Data preprocessing: [`bwamem2`](http://bio-bwa.sourceforge.net/bwa.shtml) (can [`merge`](http://www.htslib.org/doc/samtools-merge.html)), [`MarkDuplicates`](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) -3. Variant calling + multiple calls are aggregated: - 1. SNVs + short indels: [`DeepVariant`](https://github.com/google/deepvariant), [`DNAscope`](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) - 2. SVs: [`CNVpytor`](https://github.com/abyzovlab/CNVpytor/), [`ExpansionHunter`](https://github.com/Illumina/ExpansionHunter), [`MANTA`](https://github.com/Illumina/manta), [`tiddit/sv`](https://github.com/SciLifeLab/TIDDIT), - 3. Mitochondria: [`eKLIPse`](https://github.com/dooguypapua/eKLIPse), [`Mutect2`](https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2) -4. Annotation: [`VCFanno`](https://github.com/brentp/vcfanno),[`VEP`](https://www.ensembl.org/info/docs/tools/vep/index.html) - 1. SNVs: [`CADD`](https://cadd.gs.washington.edu/) - 2. SVs: - 3. Mitochondria: [`gnomAD_mt`](https://gnomad.broadinstitute.org/downloads#v3-mitochondrial-dna), [`Haplogrep`](https://github.com/seppinho/haplogrep-cmd/tree/v2.1.21), [`HmtNote`](https://github.com/robertopreste/HmtNote) -5. Variant ranking: something will be here - -> Databases: [`gnomAD`](https://gnomad.broadinstitute.org/) +**1. Metrics:** + +- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) +- [Mosdepth](https://github.com/brentp/mosdepth) +- [MultiQC](http://multiqc.info/) +- [Picard's CollectMutipleMetrics, CollectHsMetrics, and CollectWgsMetrics](https://broadinstitute.github.io/picard/) +- [Qualimap](http://qualimap.conesalab.org/) +- [TIDDIT's cov](https://github.com/J35P312/) + +**2. Alignment:** + +- [bwa](https://github.com/lh3/bwa) +- [bwamem2](http://bio-bwa.sourceforge.net/bwa.shtml) +- [Sentieon DNAseq](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/) + +**3. Variant calling - SNV:** + +- [DeepVariant](https://github.com/google/deepvariant) +- [Sentieon DNAscope](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) + +**4. Variant calling - SV:** + +- [CNVpytor](https://github.com/abyzovlab/CNVpytor/) +- [MANTA](https://github.com/Illumina/manta) +- [TIDDIT's sv](https://github.com/SciLifeLab/TIDDIT) + +**5. Annotation - SNV:** + +- [bcftools roh](https://samtools.github.io/bcftools/bcftools.html#roh) +- [VCFanno](https://github.com/brentp/vcfanno) +- [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) + +**6. Annotation - SV:** + +- [VCFanno](https://github.com/brentp/vcfanno) +- [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) + +**7. Mitochondrial analysis:** + +- [Alignment and variant calling - GATK Mitochondrial short variant discovery pipeline ](https://gatk.broadinstitute.org/hc/en-us/articles/4403870837275-Mitochondrial-short-variant-discovery-SNVs-Indels-) +- Annotation: + - [VCFanno](https://github.com/brentp/vcfanno) + - [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) + +**8. Variant calling - repeat expansions:** + +- [ExpansionHunter](https://github.com/Illumina/ExpansionHunter) +- [stranger](https://github.com/Clinical-Genomics/stranger) + +**9. Rank variants - SV and SNV:** + +- [Genmod](https://github.com/Clinical-Genomics/genmod)

    @@ -79,7 +118,7 @@ Note that some form of configuration will be needed so that Nextflow knows how t ```bash nextflow run nf-core/raredisease \ --input samplesheet.csv --outdir --genome GRCh38 \ - --analysis_type \ + --analysis_type \ -revision dev \ -profile ``` From 53f556e8186be727d64b29c61f71670a83460966 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Mar 2023 09:40:41 +0100 Subject: [PATCH 1071/1169] review suggestions --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e4f6c7dd..7a0044fb 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ On release, automated continuous integration tests run the pipeline on a full-si - [MultiQC](http://multiqc.info/) - [Picard's CollectMutipleMetrics, CollectHsMetrics, and CollectWgsMetrics](https://broadinstitute.github.io/picard/) - [Qualimap](http://qualimap.conesalab.org/) +- [Sentieon's WgsMetricsAlgo](https://support.sentieon.com/manual/usages/general/) - [TIDDIT's cov](https://github.com/J35P312/) **2. Alignment:** @@ -69,6 +70,7 @@ On release, automated continuous integration tests run the pipeline on a full-si - [Alignment and variant calling - GATK Mitochondrial short variant discovery pipeline ](https://gatk.broadinstitute.org/hc/en-us/articles/4403870837275-Mitochondrial-short-variant-discovery-SNVs-Indels-) - Annotation: + - [Haplogrep2](https://github.com/seppinho/haplogrep-cmd) - [VCFanno](https://github.com/brentp/vcfanno) - [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) From 862a32d87ba4223e5eaa330487269977eac19c37 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Mar 2023 09:53:36 +0100 Subject: [PATCH 1072/1169] review suggestions --- CITATIONS.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CITATIONS.md b/CITATIONS.md index c23c02da..7b554f04 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -30,6 +30,10 @@ > Poplin R, Chang PC, Alexander D, et al. A universal SNP and small-indel variant caller using deep neural networks. Nat Biotechnol. 2018;36(10):983-987. doi:10.1038/nbt.4235 +- [Ensembl VEP](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-016-0974-4) + + > McLaren W, Gil L, Hunt SE, et al. The Ensembl Variant Effect Predictor. Genome Biol. 2016;17(1):122. doi:10.1186/s13059-016-0974-4 + - [ExpansionHunter](https://academic.oup.com/bioinformatics/article/doi/10.1093/bioinformatics/btz431/5499079) > Dolzhenko E, Deshpande V, Schlesinger F, et al. ExpansionHunter: a sequence-graph-based tool to analyze variation in short tandem repeat regions. Birol I, ed. Bioinformatics. 2019;35(22):4754-4756. doi:10.1093/bioinformatics/btz431 @@ -84,6 +88,14 @@ > Li H, Handsaker B, Wysoker A, et al. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009;25(16):2078-2079. doi:10.1093/bioinformatics/btp352 +- [Sentieon DNAscope](https://www.biorxiv.org/content/10.1101/2022.05.20.492556v1.abstract) + + > Freed D, Pan R, Chen H, Li Z, Hu J, Aldana R. DNAscope: High Accuracy Small Variant Calling Using Machine Learning. Bioinformatics; 2022. doi:10.1101/2022.05.20.492556 + +- [Sentieon DNASeq](https://www.frontiersin.org/articles/10.3389/fgene.2019.00736/full) + + > Kendig KI, Baheti S, Bockol MA, et al. Sentieon DNASeq Variant Calling Workflow Demonstrates Strong Computational Performance and Accuracy. Front Genet. 2019;10:736. doi:10.3389/fgene.2019.00736 + - [SMNCopyNumberCaller](https://www.nature.com/articles/s41436-020-0754-0) > Chen X, Sanchis-Juan A, French CE, Connel AJ, Delon I, Kingsbury Z, Chawla A, Halpern AL, Taft RJ, NIHR BioResource, Bentley DR, Butchbach MER, Raymond FL, Eberle MA. Spinal muscular atrophy diagnosis and carrier screening from genome sequencing data. Genet Med. February 2020:1-9. doi:10.1038/s41436-020-0754-0 From 375cd30b16715b5a3f372c69102f7296fc545b79 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Mar 2023 16:20:55 +0100 Subject: [PATCH 1073/1169] switch to skip --- conf/modules/annotate_snvs.config | 8 ++++++-- .../annotate_structural_variants.config | 2 +- conf/modules/rank_variants.config | 4 ++-- conf/modules/raredisease.config | 2 +- conf/modules/scatter_genome.config | 4 ++-- docs/usage.md | 6 +++--- nextflow.config | 6 +++--- nextflow_schema.json | 18 +++++++++--------- workflows/raredisease.nf | 10 +++++----- 9 files changed, 32 insertions(+), 28 deletions(-) diff --git a/conf/modules/annotate_snvs.config b/conf/modules/annotate_snvs.config index 4587d6a7..9e9e2f0e 100644 --- a/conf/modules/annotate_snvs.config +++ b/conf/modules/annotate_snvs.config @@ -17,7 +17,11 @@ process { withName: '.*ANNOTATE_SNVS:.*' { - ext.when = params.annotate_snv_switch + ext.when = !params.skip_snv_annotation + } + + withName: '.*ANNOTATE_SNVS:VCFANNO' { + ext.prefix = { "${meta.id}_vcfanno" } publishDir = [ enabled: false ] @@ -44,7 +48,7 @@ process { withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { ext.prefix = { "${meta.id}_${intervals.simpleName}" } - ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} + ext.when = { !params.skip_snv_annotation && !(params.analysis_type == "wes")} } withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { diff --git a/conf/modules/annotate_structural_variants.config b/conf/modules/annotate_structural_variants.config index 4e508bcb..a951172e 100644 --- a/conf/modules/annotate_structural_variants.config +++ b/conf/modules/annotate_structural_variants.config @@ -17,7 +17,7 @@ process { withName: '.*ANNOTATE_STRUCTURAL_VARIANTS:.*' { - ext.when = params.annotate_sv_switch + ext.when = !params.skip_sv_annotation publishDir = [ enabled: false ] diff --git a/conf/modules/rank_variants.config b/conf/modules/rank_variants.config index 8f17d2e2..33a34733 100644 --- a/conf/modules/rank_variants.config +++ b/conf/modules/rank_variants.config @@ -17,7 +17,7 @@ process { withName: '.*RANK_VARIANTS_SV:.*' { - ext.when = params.annotate_sv_switch + ext.when = !params.skip_sv_annotation publishDir = [ enabled: false ] @@ -53,7 +53,7 @@ process { process { withName: '.*RANK_VARIANTS_SNV:.*' { - ext.when = params.annotate_snv_switch + ext.when = !params.skip_snv_annotation publishDir = [ enabled: false ] diff --git a/conf/modules/raredisease.config b/conf/modules/raredisease.config index 3b18fa95..9b05ffbb 100644 --- a/conf/modules/raredisease.config +++ b/conf/modules/raredisease.config @@ -56,7 +56,7 @@ process { withName: '.*RAREDISEASE:GATK4_SELECTVARIANTS' { ext.args = "--exclude-intervals ${params.mt_contig_name}" ext.prefix = { "${meta.id}_nomito" } - ext.when = { params.annotate_snv_switch } + ext.when = { !params.skip_snv_annotation } publishDir = [ enabled: params.dedicated_mt_analysis, path: { "${params.outdir}/call_snv" }, diff --git a/conf/modules/scatter_genome.config b/conf/modules/scatter_genome.config index cb804163..f8ecf792 100644 --- a/conf/modules/scatter_genome.config +++ b/conf/modules/scatter_genome.config @@ -17,12 +17,12 @@ process { withName: '.*SCATTER_GENOME:BUILD_BED' { - ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} + ext.when = { !params.skip_snv_annotation && !(params.analysis_type == "wes")} } withName: '.*SCATTER_GENOME:GATK4_SPLITINTERVALS' { ext.args = { "--subdivision-mode BALANCING_WITHOUT_INTERVAL_SUBDIVISION --scatter-count 22" } - ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes")} + ext.when = { !params.skip_snv_annotation && !(params.analysis_type == "wes")} ext.prefix = { "${meta.id}_genome_intervals" } publishDir = [ enabled: params.save_reference, diff --git a/docs/usage.md b/docs/usage.md index 0987e71e..59312a06 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -118,7 +118,7 @@ If you would like to see more examples of what a typical samplesheet looks like In nf-core/raredisease, references can be supplied using parameters listed [here](https://nf-co.re/raredisease/dev/parameters). -Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (example, you can align with either bwamem2 or sentieon, call SNVs with DeepVariant or sentieon). You also have the option to turn off sections of the pipeline if you do not want to run them (example, snv annotation can be turned off by setting `--annotate_snv_switch` flag to false). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by sentieon. +Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (example, you can align with either bwamem2 or sentieon, call SNVs with DeepVariant or sentieon). You also have the option to turn off sections of the pipeline if you do not want to run them (example, snv annotation can be turned off by setting `--skip_snv_annotation` flag to true). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by sentieon. nf-core/raredisease consists of several tools used for various purposes. For convenience, we have grouped those tools under the following catergories: @@ -246,8 +246,8 @@ nextflow run nf-core/raredisease \ -profile test, \ --input samplesheet.csv \ --fasta reference.fasta \ - --annotate_snv_switch false \ - --annotate_sv_switch false \ + --skip_snv_annotation true \ + --skip_sv_annotation true \ --outdir ``` diff --git a/nextflow.config b/nextflow.config index a1ed8187..4c8783e0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,9 +22,9 @@ params { // Main options analysis_type = 'wgs' - annotate_snv_switch = true - annotate_sv_switch = true - dedicated_mt_analysis = true + skip_snv_annotation = false + skip_sv_annotation = false + skip_mt_analysis = false gens_switch = false platform = 'illumina' diff --git a/nextflow_schema.json b/nextflow_schema.json index 759512b5..b9cf716f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -388,22 +388,22 @@ "fa_icon": "fas fa-book", "enum": ["wgs", "wes", "mito"] }, - "annotate_snv_switch": { + "skip_snv_annotation": { "type": "boolean", - "default": true, - "description": "Specifies whether or not to run annotate SNV subworkflow.", + "default": false, + "description": "Specifies whether or not to skip annotate SNV subworkflow.", "fa_icon": "fas fa-book" }, - "annotate_sv_switch": { + "skip_sv_annotation": { "type": "boolean", - "default": true, - "description": "Specifies whether or not to run annotate structural variant subworkflow.", + "default": false, + "description": "Specifies whether or not to skip annotate structural variant subworkflow.", "fa_icon": "fas fa-book" }, - "dedicated_mt_analysis": { + "skip_mt_analysis": { "type": "boolean", - "default": true, - "description": "Specifies whether or not to run a separate subworkflow for mitochondrial analysis.", + "default": false, + "description": "Specifies whether or not to skip the subworkflow that analyses mitochondrial genome separate from the nuclear genome.", "fa_icon": "fas fa-book" }, "gens_switch": { diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 2a0851d3..f7e5fcbe 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -357,7 +357,7 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(GENS.out.versions) } - if (params.annotate_sv_switch) { + if (!params.skip_sv_annotation) { ANNOTATE_STRUCTURAL_VARIANTS ( CALL_STRUCTURAL_VARIANTS.out.vcf, params.svdb_query_dbs, @@ -391,7 +391,7 @@ workflow RAREDISEASE { } - if (params.dedicated_mt_analysis) { + if (!params.skip_mt_analysis) { ANALYSE_MT ( ch_mapped.bam_bai, ch_bwa_index, @@ -423,11 +423,11 @@ workflow RAREDISEASE { // VARIANT ANNOTATION - if (params.annotate_snv_switch) { + if (!params.skip_snv_annotation) { ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) - if (params.dedicated_mt_analysis) { + if (!params.skip_mt_analysis) { ch_vcf .map { meta, vcf, tbi -> return [meta, vcf, tbi, []]} .set { ch_selvar_in } @@ -456,7 +456,7 @@ workflow RAREDISEASE { ch_snv_annotate = ANNOTATE_SNVS.out.vcf_ann - if (params.dedicated_mt_analysis) { + if (!params.skip_mt_analysis) { ANNOTATE_SNVS.out.vcf_ann .concat(ANALYSE_MT.out.vcf) From 82cac1e2c99d5250d835ef61127588edcd08b8a7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Mar 2023 16:26:34 +0100 Subject: [PATCH 1074/1169] embed license --- bin/add_most_severe_consequence.py | 6 +++++- bin/add_most_severe_pli.py | 6 +++++- bin/check_samplesheet.py | 5 ++++- bin/sentieon_init.sh | 5 ++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/bin/add_most_severe_consequence.py b/bin/add_most_severe_consequence.py index 08d7d66d..cb1538c7 100755 --- a/bin/add_most_severe_consequence.py +++ b/bin/add_most_severe_consequence.py @@ -1,4 +1,8 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 + +# Written by Ramprasad Neethiraj and released under the MIT license. +# See git repository (https://github.com/nf-core/raredisease) for full license text. + import argparse import gzip import sys diff --git a/bin/add_most_severe_pli.py b/bin/add_most_severe_pli.py index 8f528389..ce36768e 100755 --- a/bin/add_most_severe_pli.py +++ b/bin/add_most_severe_pli.py @@ -1,4 +1,8 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 + +# Written by Ramprasad Neethiraj and released under the MIT license. +# See git repository (https://github.com/nf-core/raredisease) for full license text. + import argparse import gzip import sys diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 041b4e58..93ade86c 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -1,4 +1,7 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 + +# Released under the MIT license. +# See git repository (https://github.com/nf-core/raredisease) for full license text. """Provide a command line tool to validate and transform tabular samplesheets.""" diff --git a/bin/sentieon_init.sh b/bin/sentieon_init.sh index ea8f393a..4508141d 100644 --- a/bin/sentieon_init.sh +++ b/bin/sentieon_init.sh @@ -1,5 +1,8 @@ #!/bin/bash -# + +# Written by Ramprasad Neethiraj and released under the MIT license. +# See git repository (https://github.com/nf-core/raredisease) for full license text. + # Sentieon initialization script # This script takes as input the name of a environment # variable holding the Sentieon license encoded as Base64 text From 621651cb5cb1d58390544cb0cd2b3c141892369c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:01:59 +0100 Subject: [PATCH 1075/1169] Credits --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7a0044fb..c95caa97 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,17 @@ [![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/raredisease)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +####TOC + +- [Introduction](#introduction) +- [Pipeline summary](#pipeline-summary) + - [Work in progress flowchart](#work-in-progress-flowchart) +- [Quick Start](#quick-start) +- [Documentation](#documentation) +- [Credits](#credits) +- [Contributions and Support](#contributions-and-support) +- [Citations](#citations) + ## Introduction > NOTE @@ -131,9 +142,9 @@ The nf-core/raredisease pipeline comes with documentation about the pipeline [us ## Credits -nf-core/raredisease was originally written by Clinical Genomics Stockholm. +nf-core/raredisease was mostly written by [Ramprasad Neethiraj](https://github.com/ramprasadn), [Anders Jemt](https://github.com/jemten), [Lucia Pena Perez](https://github.com/Lucpen), and [Mei Wu](https://github.com/projectoriented) at Clinical Genomics Stockholm. -Big thanks to the contributors for their extensive assistance in the development of this pipeline. +Big thanks to the [Sima Rahimi](https://github.com/sima-r), [Gwenna Breton](https://github.com/Gwennid), [Lauri Mesilaakso](https://github.com/ljmesi), [Subazini Thankaswamy Kosalai](https://github.com/sysbiocoder), [Annick Renevey](https://github.com/rannick), [Peter Pruisscher](https://github.com/peterpru), [Lucas Taniguti](https://github.com/lmtani), [Ryan Kennedy](https://github.com/ryanjameskennedy), and the nf-core community for their extensive assistance in the development of this pipeline. ## Contributions and Support From 78a078139fa30500a2d8492aac8e341a39a475ea Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:16:49 +0100 Subject: [PATCH 1076/1169] pcrfree --- conf/modules/call_snv_sentieon.config | 4 ++-- nextflow.config | 2 +- nextflow_schema.json | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/conf/modules/call_snv_sentieon.config b/conf/modules/call_snv_sentieon.config index 67dec7aa..efea9301 100644 --- a/conf/modules/call_snv_sentieon.config +++ b/conf/modules/call_snv_sentieon.config @@ -24,8 +24,8 @@ process { withName: '.*CALL_SNV:CALL_SNV_SENTIEON:SENTIEON_DNASCOPE' { ext.prefix = { "${meta.id}_dnascope" } ext.args2 = { [ - params.variant_type ? "--var_type ${params.variant_type}" : '', - params.pcrfree ? "--pcr_indel_model NONE" : '' + params.variant_type ? "--var_type ${params.variant_type}" : '', + params.pcr_amplification ? '' : "--pcr_indel_model NONE" ].join(" ") } } diff --git a/nextflow.config b/nextflow.config index 4c8783e0..ba98ae1c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -39,7 +39,7 @@ params { ml_model = '' // Dnascope SNV calling - pcrfree = true + pcr_amplification = false variant_type = 'snp,indel' // CNVpytor diff --git a/nextflow_schema.json b/nextflow_schema.json index b9cf716f..e63a7bf6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -456,10 +456,10 @@ "description": "Interval in the reference that will be used in the software", "hidden": true }, - "pcrfree": { + "pcr_amplification": { "type": "boolean", - "default": true, - "description": "indicates whether the sample is PCR Free or not. Set to true for PCR Free samples.", + "default": false, + "description": "indicates whether the sample library is amplified using PCR or not. Set to false for PCR Free samples.", "fa_icon": "fas fa-map-signs" }, "variant_type": { From c64e99996f6ebd91e550822f24f4c9333b0a5370 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:25:17 +0100 Subject: [PATCH 1077/1169] update conf --- conf/modules/annotate_consequence_pli.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules/annotate_consequence_pli.config b/conf/modules/annotate_consequence_pli.config index cec9f942..ca4db826 100644 --- a/conf/modules/annotate_consequence_pli.config +++ b/conf/modules/annotate_consequence_pli.config @@ -14,7 +14,7 @@ process { withName: '.*ANN_CSQ_PLI_SV:.*' { - ext.when = params.annotate_sv_switch + ext.when = !params.skip_sv_annotation publishDir = [ enabled: false ] @@ -41,7 +41,7 @@ process { process { withName: '.*ANN_CSQ_PLI_SNV:.*' { - ext.when = params.annotate_snv_switch + ext.when = !params.skip_snv_annotation publishDir = [ enabled: false ] From 076051743cc9c842ccd9d67a19c8ea8fb9a8640a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:30:44 +0100 Subject: [PATCH 1078/1169] update configs --- conf/modules/call_snv_deepvariant.config | 4 ++-- conf/modules/call_snv_sentieon.config | 4 ++-- conf/modules/raredisease.config | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/modules/call_snv_deepvariant.config b/conf/modules/call_snv_deepvariant.config index af57cfe8..0493534e 100644 --- a/conf/modules/call_snv_deepvariant.config +++ b/conf/modules/call_snv_deepvariant.config @@ -38,7 +38,7 @@ process { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ - enabled: !params.dedicated_mt_analysis, + enabled: params.skip_mt_analysis, path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -47,7 +47,7 @@ process { withName: '.*CALL_SNV_DEEPVARIANT:TABIX_GL' { publishDir = [ - enabled: !params.dedicated_mt_analysis, + enabled: params.skip_mt_analysis, path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } diff --git a/conf/modules/call_snv_sentieon.config b/conf/modules/call_snv_sentieon.config index efea9301..ec4d4480 100644 --- a/conf/modules/call_snv_sentieon.config +++ b/conf/modules/call_snv_sentieon.config @@ -52,7 +52,7 @@ process { ext.args = '--output-type z --rm-dup none' ext.prefix = { "${meta.id}_split_rmdup" } publishDir = [ - enabled: !params.dedicated_mt_analysis, + enabled: params.skip_mt_analysis, path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -61,7 +61,7 @@ process { withName: '.*CALL_SNV_SENTIEON:TABIX_SEN' { publishDir = [ - enabled: !params.dedicated_mt_analysis, + enabled: params.skip_mt_analysis, path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } diff --git a/conf/modules/raredisease.config b/conf/modules/raredisease.config index 9b05ffbb..a73ea3f4 100644 --- a/conf/modules/raredisease.config +++ b/conf/modules/raredisease.config @@ -58,7 +58,7 @@ process { ext.prefix = { "${meta.id}_nomito" } ext.when = { !params.skip_snv_annotation } publishDir = [ - enabled: params.dedicated_mt_analysis, + enabled: !params.skip_mt_analysis, path: { "${params.outdir}/call_snv" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } From 7e622b441a2b732ba01e3ec26d98f4c1a1f7c8aa Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 16 Mar 2023 21:06:46 +0100 Subject: [PATCH 1079/1169] update config --- conf/modules/annotate_snvs.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules/annotate_snvs.config b/conf/modules/annotate_snvs.config index 9e9e2f0e..6046311f 100644 --- a/conf/modules/annotate_snvs.config +++ b/conf/modules/annotate_snvs.config @@ -87,7 +87,7 @@ process { withName: '.*ANNOTATE_SNVS:BCFTOOLS_CONCAT' { ext.prefix = { "${meta.id}_rohann_vcfanno_filter_vep" } - ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes") } + ext.when = { !(params.analysis_type == "wes") } publishDir = [ enabled: !params.analysis_type.equals('wes'), path: { "${params.outdir}/annotate_snv" }, @@ -97,7 +97,7 @@ process { } withName: '.*ANNOTATE_SNVS:TABIX_BCFTOOLS_CONCAT' { - ext.when = { params.annotate_snv_switch && !(params.analysis_type == "wes") } + ext.when = { !(params.analysis_type == "wes") } publishDir = [ enabled: !params.analysis_type.equals('wes'), path: { "${params.outdir}/annotate_snv" }, From b9b6a6fa8eaddf6d66272f64dbe775da010bf862 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Mar 2023 06:53:05 +0100 Subject: [PATCH 1080/1169] alignment --- README.md | 3 +-- docs/output.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7a0044fb..e1b4dbf3 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,7 @@ On release, automated continuous integration tests run the pipeline on a full-si **2. Alignment:** -- [bwa](https://github.com/lh3/bwa) -- [bwamem2](http://bio-bwa.sourceforge.net/bwa.shtml) +- [Bwa-mem2](https://github.com/bwa-mem2/bwa-mem2) - [Sentieon DNAseq](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/) **3. Variant calling - SNV:** diff --git a/docs/output.md b/docs/output.md index 36391053..e5e3f0c3 100644 --- a/docs/output.md +++ b/docs/output.md @@ -16,6 +16,53 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +### Alignment + +#### Mapping + +##### Bwa-mem2 + +[Bwa-mem2](https://github.com/bwa-mem2/bwa-mem2) + +##### Sentieon + +[Sentieon DNAseq](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/) + +#### Duplicate marking + +##### Picard's MarkDuplicates + +[Picard MarkDuplicates](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) + +##### Sentieon dedup + +[Sentieon dedup](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#remove-or-mark-duplicates) + +

    +Output files from Alignment + +- `{outputdir}/alignment/` + - `*.bam`: FastQC report containing quality metrics. + - `*.bai`: Zip archive containing the FastQC report, tab-delimited data file and plot images. + - `.metrics.txt`: Text file containing the dedup metrics. +
    + +### Quality control and metrics + +### Variant calling - SNV + +### Variant calling - SV + +### Variant calling - repeat expansions + +### Annotation - SNV + +### Annotation - SV + +### Mitochondrial analysis + +### Rank variants and filtering + ### FastQC
    From 5ea52ab306e3ac62db45ed496d87c514b7d55f3c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Mar 2023 08:26:22 +0100 Subject: [PATCH 1081/1169] fix sentieon prefixes --- conf/modules/align_sentieon.config | 4 +++ modules/local/ensemblvep/main.nf | 30 +++++++++---------- modules/local/sentieon/bqsr.nf | 38 ++++++++++++------------ modules/local/sentieon/datametrics.nf | 14 ++++----- modules/local/sentieon/dedup.nf | 18 +++++------ modules/local/sentieon/dnamodelapply.nf | 14 ++++----- modules/local/sentieon/dnascope.nf | 14 ++++----- modules/local/sentieon/locuscollector.nf | 14 ++++----- modules/local/sentieon/readwriter.nf | 14 ++++----- modules/local/sentieon/tnscope.nf | 12 ++++---- modules/local/sentieon/wgsmetricsalgo.nf | 6 ++-- 11 files changed, 91 insertions(+), 87 deletions(-) diff --git a/conf/modules/align_sentieon.config b/conf/modules/align_sentieon.config index 549e2c6e..42073097 100644 --- a/conf/modules/align_sentieon.config +++ b/conf/modules/align_sentieon.config @@ -29,6 +29,10 @@ process { ext.prefix = { "${meta.id}_datametrics" } } + withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_READWRITER' { + ext.prefix = { "${meta.id}_merged" } + } + withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_LOCUSCOLLECTOR' { ext.prefix = { "${meta.id}_locuscollector" } } diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index ecff7854..47219c5f 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -19,14 +19,14 @@ process ENSEMBLVEP { path extra_files output: - tuple val(meta), path("*.ann.vcf") , optional:true, emit: vcf - tuple val(meta), path("*.ann.tab") , optional:true, emit: tab - tuple val(meta), path("*.ann.json") , optional:true, emit: json - tuple val(meta), path("*.ann.vcf.gz") , optional:true, emit: vcf_gz - tuple val(meta), path("*.ann.tab.gz") , optional:true, emit: tab_gz - tuple val(meta), path("*.ann.json.gz") , optional:true, emit: json_gz - path "*.summary.html" , optional:true, emit: report - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf") , optional:true, emit: vcf + tuple val(meta), path("*.tab") , optional:true, emit: tab + tuple val(meta), path("*.json") , optional:true, emit: json + tuple val(meta), path("*.vcf.gz") , optional:true, emit: vcf_gz + tuple val(meta), path("*.tab.gz") , optional:true, emit: tab_gz + tuple val(meta), path("*.json.gz"), optional:true, emit: json_gz + path "*.summary.html" , optional:true, emit: report + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -43,7 +43,7 @@ process ENSEMBLVEP { """ vep \\ -i $vcf \\ - -o ${prefix}.ann.${file_extension}${compress_out} \\ + -o ${prefix}.${file_extension}${compress_out} \\ $args \\ $reference \\ --assembly $genome \\ @@ -64,12 +64,12 @@ process ENSEMBLVEP { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.ann.vcf - touch ${prefix}.ann.tab - touch ${prefix}.ann.json - touch ${prefix}.ann.vcf.gz - touch ${prefix}.ann.tab.gz - touch ${prefix}.ann.json.gz + touch ${prefix}.vcf + touch ${prefix}.tab + touch ${prefix}.json + touch ${prefix}.vcf.gz + touch ${prefix}.tab.gz + touch ${prefix}.json.gz touch ${prefix}.summary.html cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/sentieon/bqsr.nf b/modules/local/sentieon/bqsr.nf index 72ba06b4..dc659871 100644 --- a/modules/local/sentieon/bqsr.nf +++ b/modules/local/sentieon/bqsr.nf @@ -13,18 +13,18 @@ process SENTIEON_BQSR { tuple val(meta3), path(known_dbsnp_tbi) output: - tuple val(meta), path('*_recal.bam') , emit: bam - tuple val(meta), path('*_recal.bam.bai') , emit: bai - tuple val(meta), path('*_recal_data.table') , emit: recal_pre - tuple val(meta), path('*_recal_data.table_post') , emit: recal_post - tuple val(meta), path('*_recal_result.csv') , emit: recal_csv - path "versions.yml" , emit: versions + tuple val(meta), path('*.bam') , emit: bam + tuple val(meta), path('*.bam.bai') , emit: bai + tuple val(meta), path('*.table') , emit: recal_pre + tuple val(meta), path('*.table_post'), emit: recal_post + tuple val(meta), path('*.csv') , emit: recal_csv + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def args3 = task.ext.args3 ?: '' def input = bam.sort().collect{"-i $it"}.join(' ') @@ -43,27 +43,27 @@ process SENTIEON_BQSR { $input \\ --algo QualCal \\ $dbsnp \\ - ${prefix}_recal_data.table + ${prefix}.table sentieon driver \\ -t ${task.cpus} \\ -r $fasta \\ $args2 \\ $input \\ - -q ${prefix}_recal_data.table \\ + -q ${prefix}.table \\ --algo QualCal \\ $dbsnp \\ - ${prefix}_recal_data.table_post \\ - --algo ReadWriter ${prefix}_recal.bam + ${prefix}.table_post \\ + --algo ReadWriter ${prefix}.bam sentieon driver \\ -t ${task.cpus} \\ $args3 \\ --algo QualCal \\ --plot \\ - --before ${prefix}_recal_data.table \\ - --after ${prefix}_recal_data.table_post \\ - ${prefix}_recal_result.csv + --before ${prefix}.table \\ + --after ${prefix}.table_post \\ + ${prefix}.csv cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -74,11 +74,11 @@ process SENTIEON_BQSR { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_recal.bam - touch ${prefix}_recal.bam.bai - touch ${prefix}_recal_data.table - touch ${prefix}_recal_data.table_post - touch ${prefix}_recal_result.csv + touch ${prefix}.bam + touch ${prefix}.bam.bai + touch ${prefix}.table + touch ${prefix}.table_post + touch ${prefix}.csv cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/datametrics.nf b/modules/local/sentieon/datametrics.nf index 012054b7..498338f1 100644 --- a/modules/local/sentieon/datametrics.nf +++ b/modules/local/sentieon/datametrics.nf @@ -11,13 +11,13 @@ process SENTIEON_DATAMETRICS { path fai output: - tuple val(meta), path('*mq_metrics.txt') , emit: mq_metrics - tuple val(meta), path('*qd_metrics.txt') , emit: qd_metrics - tuple val(meta), path('*gc_summary.txt') , emit: gc_summary - tuple val(meta), path('*gc_metrics.txt') , emit: gc_metrics - tuple val(meta), path('*aln_metrics.txt') , emit: aln_metrics - tuple val(meta), path('*is_metrics.txt') , emit: is_metrics - path "versions.yml" , emit: versions + tuple val(meta), path('*mq_metrics.txt') , emit: mq_metrics + tuple val(meta), path('*qd_metrics.txt') , emit: qd_metrics + tuple val(meta), path('*gc_summary.txt') , emit: gc_summary + tuple val(meta), path('*gc_metrics.txt') , emit: gc_metrics + tuple val(meta), path('*aln_metrics.txt'), emit: aln_metrics + tuple val(meta), path('*is_metrics.txt') , emit: is_metrics + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/sentieon/dedup.nf b/modules/local/sentieon/dedup.nf index 074df701..6730e7b5 100644 --- a/modules/local/sentieon/dedup.nf +++ b/modules/local/sentieon/dedup.nf @@ -11,10 +11,10 @@ process SENTIEON_DEDUP { path fai output: - tuple val(meta), path('*dedup.bam') , emit: bam - tuple val(meta), path('*dedup.bam.bai') , emit: bai - tuple val(meta), path('*dedup_metrics.txt') , emit: metrics_dedup - path "versions.yml" , emit: versions + tuple val(meta), path('*.bam') , emit: bam + tuple val(meta), path('*.bam.bai') , emit: bai + tuple val(meta), path('*_metrics.txt'), emit: metrics_dedup + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -36,8 +36,8 @@ process SENTIEON_DEDUP { $args \\ --algo Dedup \\ --score_info $score \\ - --metrics ${prefix}_dedup_metrics.txt \\ - ${prefix}_dedup.bam + --metrics ${prefix}_metrics.txt \\ + ${prefix}.bam cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -48,9 +48,9 @@ process SENTIEON_DEDUP { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_dedup.bam - touch ${prefix}_dedup.bam.bai - touch ${prefix}_dedup_metrics.txt + touch ${prefix}.bam + touch ${prefix}.bam.bai + touch ${prefix}_metrics.txt cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/dnamodelapply.nf b/modules/local/sentieon/dnamodelapply.nf index 3da61591..d2aaebff 100644 --- a/modules/local/sentieon/dnamodelapply.nf +++ b/modules/local/sentieon/dnamodelapply.nf @@ -10,10 +10,10 @@ process SENTIEON_DNAMODELAPPLY { path ml_model output: - tuple val(meta), path("*.vcf.gz") , emit: vcf - tuple val(meta), path("*.vcf.gz.tbi") , emit: index - tuple val(meta), path("*.vcf.gz"), path("*.vcf.gz.tbi") , emit: vcf_index - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: index + tuple val(meta), path("*.vcf.gz"), path("*.vcf.gz.tbi"), emit: vcf_index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -28,7 +28,7 @@ process SENTIEON_DNAMODELAPPLY { --algo DNAModelApply \\ --model $ml_model \\ -v $vcf \\ - ${prefix}_dnascope_ml.vcf.gz + ${prefix}.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -39,8 +39,8 @@ process SENTIEON_DNAMODELAPPLY { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_dnascope_ml.vcf.gz - touch ${prefix}_dnascope_ml.vcf.gz.tbi + touch ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/dnascope.nf b/modules/local/sentieon/dnascope.nf index 5bd5ac15..f9896c76 100644 --- a/modules/local/sentieon/dnascope.nf +++ b/modules/local/sentieon/dnascope.nf @@ -13,10 +13,10 @@ process SENTIEON_DNASCOPE { path ml_model output: - tuple val(meta), path("*.vcf.gz") , emit: vcf - tuple val(meta), path("*.vcf.gz.tbi") , emit: index - tuple val(meta), path("*.vcf.gz"), path("*.vcf.gz.tbi") , emit: vcf_index - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: index + tuple val(meta), path("*.vcf.gz"), path("*.vcf.gz.tbi"), emit: vcf_index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -40,7 +40,7 @@ process SENTIEON_DNASCOPE { $interval \\ $args2 \\ $model \\ - ${prefix}_dnascope.vcf.gz + ${prefix}.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -51,8 +51,8 @@ process SENTIEON_DNASCOPE { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_dnascope.vcf.gz - touch ${prefix}_dnascope.vcf.gz.tbi + touch ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/locuscollector.nf b/modules/local/sentieon/locuscollector.nf index c5448117..fa54756d 100644 --- a/modules/local/sentieon/locuscollector.nf +++ b/modules/local/sentieon/locuscollector.nf @@ -9,16 +9,16 @@ process SENTIEON_LOCUSCOLLECTOR { tuple val(meta), path(bam), path(bai) output: - tuple val(meta), path('*score.txt.gz') , emit: score , optional: true - tuple val(meta), path('*score.txt.gz.tbi') , emit: score_idx , optional: true - path "versions.yml" , emit: versions + tuple val(meta), path('*txt.gz') , emit: score , optional: true + tuple val(meta), path('*txt.gz.tbi'), emit: score_idx, optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: def input = bam.sort().collect{"-i $it"}.join(' ') - def prefix = task.ext.prefix ? "${task.ext.prefix}_score.txt.gz" : "${meta.id}_score.txt.gz" + def prefix = task.ext.prefix ? "${task.ext.prefix}.txt.gz" : "${meta.id}.txt.gz" """ if [ \${SENTIEON_LICENSE_BASE64:-"unset"} != "unset" ]; then echo "Initializing SENTIEON_LICENSE env variable" @@ -39,10 +39,10 @@ process SENTIEON_LOCUSCOLLECTOR { """ stub: - def prefix = task.ext.prefix ? "${task.ext.prefix}_score.gz" : "${meta.id}_score.gz" + def prefix = task.ext.prefix ? "${task.ext.prefix}.txt.gz" : "${meta.id}.txt.gz" """ - touch ${prefix}_score.txt.gz - touch ${prefix}_score.txt.gz.tbi + touch ${prefix}.txt.gz + touch ${prefix}.txt.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/readwriter.nf b/modules/local/sentieon/readwriter.nf index 3eaf8590..5490dd75 100644 --- a/modules/local/sentieon/readwriter.nf +++ b/modules/local/sentieon/readwriter.nf @@ -9,10 +9,10 @@ process SENTIEON_READWRITER { tuple val(meta), path(bam), path(bai) output: - tuple val(meta), path('*merged.bam') , emit: bam - tuple val(meta), path('*merged.bam.bai') , emit: bai - tuple val(meta), path('*merged.bam'), path('*merged.bam.bai') , emit: bam_bai - path "versions.yml" , emit: versions + tuple val(meta), path('*.bam') , emit: bam + tuple val(meta), path('*.bam.bai') , emit: bai + tuple val(meta), path('*.bam'), path('*.bam.bai'), emit: bam_bai + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -32,7 +32,7 @@ process SENTIEON_READWRITER { -t $task.cpus \\ $input \\ --algo ReadWriter \\ - ${prefix}_merged.bam + ${prefix}.bam cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -43,8 +43,8 @@ process SENTIEON_READWRITER { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_merged.bam - touch ${prefix}_merged.bam.bai + touch ${prefix}.bam + touch ${prefix}.bam.bai cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/tnscope.nf b/modules/local/sentieon/tnscope.nf index d16b5ab9..7cfc1c06 100644 --- a/modules/local/sentieon/tnscope.nf +++ b/modules/local/sentieon/tnscope.nf @@ -9,9 +9,9 @@ process SENTIEON_TNSCOPE { path fai output: - tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz") , emit: vcf - tuple val(meta), path("*_TNscope_MTcalls_unfiltered.vcf.gz.tbi") , emit: vcf_index - path "versions.yml" , emit: versions + tuple val(meta), path("*vcf.gz") , emit: vcf + tuple val(meta), path("*vcf.gz.tbi"), emit: vcf_index + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -30,7 +30,7 @@ process SENTIEON_TNSCOPE { --algo TNscope \\ --tumor_sample ${meta.id} \\ $call_settings \\ - ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz + ${prefix}.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -41,8 +41,8 @@ process SENTIEON_TNSCOPE { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz - touch ${prefix}_TNscope_MTcalls_unfiltered.vcf.gz.tbi + touch ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sentieon/wgsmetricsalgo.nf b/modules/local/sentieon/wgsmetricsalgo.nf index 2165741c..12348b1f 100644 --- a/modules/local/sentieon/wgsmetricsalgo.nf +++ b/modules/local/sentieon/wgsmetricsalgo.nf @@ -12,8 +12,8 @@ process SENTIEON_WGSMETRICSALGO { path intervals_list output: - tuple val(meta), path('*wgs_metrics.txt'), emit: wgs_metrics - path "versions.yml" , emit: versions + tuple val(meta), path('*.txt'), emit: wgs_metrics + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -36,7 +36,7 @@ process SENTIEON_WGSMETRICSALGO { $input \\ $interval \\ $args \\ - --algo WgsMetricsAlgo ${prefix}_wgs_metrics.txt + --algo WgsMetricsAlgo ${prefix}.txt cat <<-END_VERSIONS > versions.yml "${task.process}": From d0a9f692d16a1d2832b59f80cc1477ce451a50b6 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Mar 2023 11:02:42 +0100 Subject: [PATCH 1082/1169] add headings --- README.md | 2 +- docs/output.md | 112 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 103 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e1b4dbf3..f2eb9e39 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ On release, automated continuous integration tests run the pipeline on a full-si **4. Variant calling - SV:** - [CNVpytor](https://github.com/abyzovlab/CNVpytor/) -- [MANTA](https://github.com/Illumina/manta) +- [Manta](https://github.com/Illumina/manta) - [TIDDIT's sv](https://github.com/SciLifeLab/TIDDIT) **5. Annotation - SNV:** diff --git a/docs/output.md b/docs/output.md index e5e3f0c3..52bd5855 100644 --- a/docs/output.md +++ b/docs/output.md @@ -6,27 +6,21 @@ This document describes the output produced by the pipeline. Most of the plots a The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. - - ## Pipeline overview The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -- [FastQC](#fastqc) - Raw read QC -- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline -- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution - ### Alignment #### Mapping ##### Bwa-mem2 -[Bwa-mem2](https://github.com/bwa-mem2/bwa-mem2) +[Bwa-mem2](https://github.com/bwa-mem2/bwa-mem2) used to map the reads to a reference genome. The aligned reads are coordinate sorted with samtools sort. These files are treated as intermediates and are not placed in the output folder by default. ##### Sentieon -[Sentieon DNAseq](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/) +[Sentieon's bwa mem](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#map-reads-to-reference) is the software accelerated version of the bwa-mem algorithm. It is used to efficiently perform the alignment using BWA. Aligned reads are then coordinate sorted using Sentieon's [sort](https://support.sentieon.com/manual/usages/general/#util-syntax) utility. It is not the default aligner, but it can be chosen over bwamem2 by setting `--aligner` option to sentieon. #### Duplicate marking @@ -44,25 +38,123 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - `{outputdir}/alignment/` - `*.bam`: FastQC report containing quality metrics. - `*.bai`: Zip archive containing the FastQC report, tab-delimited data file and plot images. - - `.metrics.txt`: Text file containing the dedup metrics. + - `*.txt`: Text file containing the dedup metrics.
    -### Quality control and metrics +### Quality control and reporting + +#### Quality control + +##### FastQC + +[FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) + +##### Mosdepth + +[Mosdepth](https://github.com/brentp/mosdepth) + +##### Picardtools + +[Picard's CollectMutipleMetrics, CollectHsMetrics, and CollectWgsMetrics](https://broadinstitute.github.io/picard/) + +##### Qualimap + +[Qualimap](http://qualimap.conesalab.org/) + +##### Sention WgsMetricsAlgo + +[Sentieon's WgsMetricsAlgo](https://support.sentieon.com/manual/usages/general/) + +#### TIDDIT cov + +[TIDDIT's cov](https://github.com/J35P312/) + +#### Reporting + +##### MultiQC + +[MultiQC](http://multiqc.info/) ### Variant calling - SNV +#### DeepVariant + +[DeepVariant](https://github.com/google/deepvariant) + +#### Sentieon DNAscope + +[Sentieon DNAscope](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) + ### Variant calling - SV +#### Manta + +[Manta](https://github.com/Illumina/manta) + +#### TIDDIT sv + +[TIDDIT's sv](https://github.com/SciLifeLab/TIDDIT) + ### Variant calling - repeat expansions +#### ExpansionsHunter + +[ExpansionHunter](https://github.com/Illumina/ExpansionHunter) + +#### stranger + +[stranger](https://github.com/Clinical-Genomics/stranger) + ### Annotation - SNV +#### bcftools roh + +[bcftools roh](https://samtools.github.io/bcftools/bcftools.html#roh) + +#### VCFanno + +[VCFanno](https://github.com/brentp/vcfanno) + +#### VEP + +[VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) + ### Annotation - SV +#### VCFanno + +[VCFanno](https://github.com/brentp/vcfanno) + +#### VEP + +[VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) + ### Mitochondrial analysis +#### Alignment and variant calling + +[Alignment and variant calling - GATK Mitochondrial short variant discovery pipeline ](https://gatk.broadinstitute.org/hc/en-us/articles/4403870837275-Mitochondrial-short-variant-discovery-SNVs-Indels-) + +#### Annotation: + +##### Haplogrep2 + +[Haplogrep2](https://github.com/seppinho/haplogrep-cmd) + +##### VCFanno + +[VCFanno](https://github.com/brentp/vcfanno) + +##### VEP + +[VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) + ### Rank variants and filtering +#### Genmod + +[Genmod](https://github.com/Clinical-Genomics/genmod) + ### FastQC
    From 0790d40575a1566b990e5078ce61e5ddb6add778 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Mar 2023 13:45:44 +0100 Subject: [PATCH 1083/1169] updates --- README.md | 2 +- conf/modules/align.config | 8 -------- conf/modules/align_bwamem2.config | 7 +++++-- conf/modules/align_sentieon.config | 3 +++ conf/modules/analyse_MT.config | 2 +- conf/modules/annotate_snvs.config | 2 +- docs/usage.md | 6 +++--- 7 files changed, 14 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index c95caa97..ee582359 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/raredisease)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) -####TOC +#### TOC - [Introduction](#introduction) - [Pipeline summary](#pipeline-summary) diff --git a/conf/modules/align.config b/conf/modules/align.config index be3fee28..2812ef7f 100644 --- a/conf/modules/align.config +++ b/conf/modules/align.config @@ -10,11 +10,3 @@ ext.when = Conditional clause ---------------------------------------------------------------------------------------- */ - -process{ - withName: '.*ALIGN:.*' { - publishDir = [ - enabled: false - ] - } -} diff --git a/conf/modules/align_bwamem2.config b/conf/modules/align_bwamem2.config index c6310310..8d9a5473 100644 --- a/conf/modules/align_bwamem2.config +++ b/conf/modules/align_bwamem2.config @@ -18,6 +18,9 @@ process { withName: '.*ALIGN_BWAMEM2:.*' { ext.when = params.aligner.equals("bwamem2") + publishDir = [ + enabled: false + ] } withName: '.*ALIGN:ALIGN_BWAMEM2:BWAMEM2_MEM' { @@ -37,7 +40,7 @@ process { publishDir = [ path: { "${params.outdir}/alignment" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -45,7 +48,7 @@ process { publishDir = [ path: { "${params.outdir}/alignment" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } diff --git a/conf/modules/align_sentieon.config b/conf/modules/align_sentieon.config index 42073097..2943ccb5 100644 --- a/conf/modules/align_sentieon.config +++ b/conf/modules/align_sentieon.config @@ -18,6 +18,9 @@ process { withName: '.*ALIGN_SENTIEON:.*' { ext.when = params.aligner.equals("sentieon") + publishDir = [ + enabled: false + ] } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BWAMEM' { diff --git a/conf/modules/analyse_MT.config b/conf/modules/analyse_MT.config index ec082bcd..85568e3e 100644 --- a/conf/modules/analyse_MT.config +++ b/conf/modules/analyse_MT.config @@ -22,8 +22,8 @@ process { ] } } -process { +process { withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_liftover" } diff --git a/conf/modules/annotate_snvs.config b/conf/modules/annotate_snvs.config index 6046311f..7df621a8 100644 --- a/conf/modules/annotate_snvs.config +++ b/conf/modules/annotate_snvs.config @@ -48,7 +48,7 @@ process { withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { ext.prefix = { "${meta.id}_${intervals.simpleName}" } - ext.when = { !params.skip_snv_annotation && !(params.analysis_type == "wes")} + ext.when = { !(params.analysis_type == "wes") } } withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { diff --git a/docs/usage.md b/docs/usage.md index 59312a06..e5fa333f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -118,7 +118,7 @@ If you would like to see more examples of what a typical samplesheet looks like In nf-core/raredisease, references can be supplied using parameters listed [here](https://nf-co.re/raredisease/dev/parameters). -Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (example, you can align with either bwamem2 or sentieon, call SNVs with DeepVariant or sentieon). You also have the option to turn off sections of the pipeline if you do not want to run them (example, snv annotation can be turned off by setting `--skip_snv_annotation` flag to true). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by sentieon. +Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (example, you can align with either bwamem2 or sentieon, call SNVs with DeepVariant or sentieon). You also have the option to turn off sections of the pipeline if you do not want to run them (example, snv annotation can be turned off by adding `--skip_snv_annotation` flag in the command line, or by setting it to true in a parameter file). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by sentieon. nf-core/raredisease consists of several tools used for various purposes. For convenience, we have grouped those tools under the following catergories: @@ -246,8 +246,8 @@ nextflow run nf-core/raredisease \ -profile test, \ --input samplesheet.csv \ --fasta reference.fasta \ - --skip_snv_annotation true \ - --skip_sv_annotation true \ + --skip_snv_annotation \ + --skip_sv_annotation \ --outdir ``` From a83724bcb575595cb442653392b488be4896a34a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Mar 2023 13:57:03 +0100 Subject: [PATCH 1084/1169] review suggestions --- README.md | 2 +- conf/modules/align.config | 8 -------- conf/modules/analyse_MT.config | 2 +- conf/modules/annotate_snvs.config | 2 +- docs/usage.md | 6 +++--- nextflow.config | 8 ++++---- 6 files changed, 10 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index c95caa97..ee582359 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/raredisease)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) -####TOC +#### TOC - [Introduction](#introduction) - [Pipeline summary](#pipeline-summary) diff --git a/conf/modules/align.config b/conf/modules/align.config index be3fee28..2812ef7f 100644 --- a/conf/modules/align.config +++ b/conf/modules/align.config @@ -10,11 +10,3 @@ ext.when = Conditional clause ---------------------------------------------------------------------------------------- */ - -process{ - withName: '.*ALIGN:.*' { - publishDir = [ - enabled: false - ] - } -} diff --git a/conf/modules/analyse_MT.config b/conf/modules/analyse_MT.config index ec082bcd..85568e3e 100644 --- a/conf/modules/analyse_MT.config +++ b/conf/modules/analyse_MT.config @@ -22,8 +22,8 @@ process { ] } } -process { +process { withName: '.*ANALYSE_MT:PICARD_LIFTOVERVCF' { ext.when = { params.mt_fasta_shift && params.mt_intervals_shift && !(params.analysis_type == "wes") } ext.prefix = { "${meta.id}_liftover" } diff --git a/conf/modules/annotate_snvs.config b/conf/modules/annotate_snvs.config index 6046311f..7df621a8 100644 --- a/conf/modules/annotate_snvs.config +++ b/conf/modules/annotate_snvs.config @@ -48,7 +48,7 @@ process { withName: '.*ANNOTATE_SNVS:GATK4_SELECTVARIANTS' { ext.prefix = { "${meta.id}_${intervals.simpleName}" } - ext.when = { !params.skip_snv_annotation && !(params.analysis_type == "wes")} + ext.when = { !(params.analysis_type == "wes") } } withName: '.*ANNOTATE_SNVS:ENSEMBLVEP_SNV' { diff --git a/docs/usage.md b/docs/usage.md index 59312a06..e5fa333f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -118,7 +118,7 @@ If you would like to see more examples of what a typical samplesheet looks like In nf-core/raredisease, references can be supplied using parameters listed [here](https://nf-co.re/raredisease/dev/parameters). -Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (example, you can align with either bwamem2 or sentieon, call SNVs with DeepVariant or sentieon). You also have the option to turn off sections of the pipeline if you do not want to run them (example, snv annotation can be turned off by setting `--skip_snv_annotation` flag to true). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by sentieon. +Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (example, you can align with either bwamem2 or sentieon, call SNVs with DeepVariant or sentieon). You also have the option to turn off sections of the pipeline if you do not want to run them (example, snv annotation can be turned off by adding `--skip_snv_annotation` flag in the command line, or by setting it to true in a parameter file). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by sentieon. nf-core/raredisease consists of several tools used for various purposes. For convenience, we have grouped those tools under the following catergories: @@ -246,8 +246,8 @@ nextflow run nf-core/raredisease \ -profile test, \ --input samplesheet.csv \ --fasta reference.fasta \ - --skip_snv_annotation true \ - --skip_sv_annotation true \ + --skip_snv_annotation \ + --skip_sv_annotation \ --outdir ``` diff --git a/nextflow.config b/nextflow.config index ba98ae1c..857887e8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -245,17 +245,18 @@ manifest { // Load DSL2 module options from config files, where each file contains the options for modules used in the eponymous subworkflow. +includeConfig 'conf/modules/raredisease.config' +includeConfig 'conf/modules/align.config' +includeConfig 'conf/modules/analyse_MT.config' +includeConfig 'conf/modules/call_snv.config' includeConfig 'conf/modules/align_and_call_MT.config' includeConfig 'conf/modules/align_bwamem2.config' -includeConfig 'conf/modules/align.config' includeConfig 'conf/modules/align_sentieon.config' -includeConfig 'conf/modules/analyse_MT.config' includeConfig 'conf/modules/annotate_consequence_pli.config' includeConfig 'conf/modules/annotate_snvs.config' includeConfig 'conf/modules/annotate_structural_variants.config' includeConfig 'conf/modules/call_cnv_cnvpytor.config' includeConfig 'conf/modules/call_repeat_expansions.config' -includeConfig 'conf/modules/call_snv.config' includeConfig 'conf/modules/call_snv_deepvariant.config' includeConfig 'conf/modules/call_snv_sentieon.config' includeConfig 'conf/modules/call_structural_variants.config' @@ -269,7 +270,6 @@ includeConfig 'conf/modules/prepare_references.config' includeConfig 'conf/modules/prepare_vcf.config' includeConfig 'conf/modules/qc_bam.config' includeConfig 'conf/modules/rank_variants.config' -includeConfig 'conf/modules/raredisease.config' includeConfig 'conf/modules/scatter_genome.config' // Function to ensure that resource requirements don't go beyond From 8ac99f9c3448a3ab2f29738b87c1497af76890ec Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Mar 2023 14:02:43 +0100 Subject: [PATCH 1085/1169] align config --- conf/modules/align.config | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/conf/modules/align.config b/conf/modules/align.config index 2812ef7f..be3fee28 100644 --- a/conf/modules/align.config +++ b/conf/modules/align.config @@ -10,3 +10,11 @@ ext.when = Conditional clause ---------------------------------------------------------------------------------------- */ + +process{ + withName: '.*ALIGN:.*' { + publishDir = [ + enabled: false + ] + } +} From 922290c5d284774f8b229f71b6cc0125336b872e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 20 Mar 2023 14:04:30 +0100 Subject: [PATCH 1086/1169] update align configs --- conf/modules/align.config | 8 ++++++++ conf/modules/align_bwamem2.config | 3 --- conf/modules/align_sentieon.config | 3 --- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/conf/modules/align.config b/conf/modules/align.config index 2812ef7f..be3fee28 100644 --- a/conf/modules/align.config +++ b/conf/modules/align.config @@ -10,3 +10,11 @@ ext.when = Conditional clause ---------------------------------------------------------------------------------------- */ + +process{ + withName: '.*ALIGN:.*' { + publishDir = [ + enabled: false + ] + } +} diff --git a/conf/modules/align_bwamem2.config b/conf/modules/align_bwamem2.config index 8d9a5473..f4f062e6 100644 --- a/conf/modules/align_bwamem2.config +++ b/conf/modules/align_bwamem2.config @@ -18,9 +18,6 @@ process { withName: '.*ALIGN_BWAMEM2:.*' { ext.when = params.aligner.equals("bwamem2") - publishDir = [ - enabled: false - ] } withName: '.*ALIGN:ALIGN_BWAMEM2:BWAMEM2_MEM' { diff --git a/conf/modules/align_sentieon.config b/conf/modules/align_sentieon.config index 2943ccb5..42073097 100644 --- a/conf/modules/align_sentieon.config +++ b/conf/modules/align_sentieon.config @@ -18,9 +18,6 @@ process { withName: '.*ALIGN_SENTIEON:.*' { ext.when = params.aligner.equals("sentieon") - publishDir = [ - enabled: false - ] } withName: '.*ALIGN:ALIGN_SENTIEON:SENTIEON_BWAMEM' { From b10f5025d54c99991f7ae0af483c72c4d64cf021 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 21 Mar 2023 09:48:30 +0100 Subject: [PATCH 1087/1169] mosdepth --- docs/output.md | 64 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/docs/output.md b/docs/output.md index 52bd5855..b673f43b 100644 --- a/docs/output.md +++ b/docs/output.md @@ -26,17 +26,17 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ##### Picard's MarkDuplicates -[Picard MarkDuplicates](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) +[Picard MarkDuplicates](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) is used for the removal of PCR duplicates that can occur during library amplification. This is essential as the presence of such duplicates results in false inflated coverages, which in turn can lead to overly-confident genotyping calls during variant calling. Only reads aligned by Bwa-mem2 are processed by this tool. ##### Sentieon dedup -[Sentieon dedup](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#remove-or-mark-duplicates) +[Sentieon dedup](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#remove-or-mark-duplicates) is the algorithm used by Sentieon's driver to remove duplicate reads. Only reads aligned by Sentieon's implementation of bwa are processed by this algorithm.
    Output files from Alignment - `{outputdir}/alignment/` - - `*.bam`: FastQC report containing quality metrics. + - `*.bam`: Bam file containing report containing quality metrics. - `*.bai`: Zip archive containing the FastQC report, tab-delimited data file and plot images. - `*.txt`: Text file containing the dedup metrics.
    @@ -47,11 +47,44 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ##### FastQC -[FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) +[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). + +![MultiQC - FastQC sequence counts plot](images/mqc_fastqc_counts.png) + +![MultiQC - FastQC mean quality scores plot](images/mqc_fastqc_quality.png) + +![MultiQC - FastQC adapter content plot](images/mqc_fastqc_adapter.png) + +> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. + +
    +Output files + +- `{outputdir}/fastqc/{sampleid}_T*/` + - `*_fastqc.html`: FastQC report containing quality metrics. + - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. + +
    ##### Mosdepth -[Mosdepth](https://github.com/brentp/mosdepth) +[Mosdepth](https://github.com/brentp/mosdepth) is used to report quality control metrics such as coverage, and GC content from alignment files. The files generated by mosdepth are published as is, and passed to MultiQC for reporting as well. + +> **NB:** `*region*` files are generated using a a bed file provided using `--target_bed` parameter. + +
    +Output files + +- `{outputdir}/qc_bam/` + - `_mosdepth.global.dist.txt`: This file contains a cumulative distribution indicating the proportion of total bases that were covered for at least a given coverage value across each chromosome and the whole genome. + - `_mosdepth.per-base.`: This file contains a coverage for each base in the genome. + - `_mosdepth.quantized.bed.gz>`: This file contains depth in [quantized bins](https://github.com/brentp/mosdepth#quantize). + - `_mosdepth.region.dist.txt`: This file contains a cumulative distribution indicating the proportion of total bases that were covered for in the regions specified using `--by` option. + - `_mosdepth.regions.bed.gz`: This file contains the mean coverage. + - `_mosdepth.summary.txt`: . + - `_mosdepth.thresholds.bed.gz`: . + +
    ##### Picardtools @@ -155,27 +188,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [Genmod](https://github.com/Clinical-Genomics/genmod) -### FastQC - -
    -Output files - -- `fastqc/` - - `*_fastqc.html`: FastQC report containing quality metrics. - - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. - -
    - -[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). - -![MultiQC - FastQC sequence counts plot](images/mqc_fastqc_counts.png) - -![MultiQC - FastQC mean quality scores plot](images/mqc_fastqc_quality.png) - -![MultiQC - FastQC adapter content plot](images/mqc_fastqc_adapter.png) - -> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. - ### MultiQC
    From 542d4165428c1d0fad14edf604867f0a279b1e2e Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 21 Mar 2023 10:18:04 +0100 Subject: [PATCH 1088/1169] mosdepth --- subworkflows/local/qc_bam.nf | 1 + workflows/raredisease.nf | 1 + 2 files changed, 2 insertions(+) diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 49564594..274d92be 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -69,6 +69,7 @@ workflow QC_BAM { tiddit_wig = TIDDIT_COV.out.wig // channel: [ val(meta), path(wig) ] bigwig = UCSC_WIGTOBIGWIG.out.bw // channel: [ val(meta), path(bw) ] d4 = MOSDEPTH.out.per_base_d4 // channel: [ val(meta), path(d4) ] + global_dist = MOSDEPTH.out.global_txt // channel: [ val(meta), path(txt) ] cov = ch_cov // channel: [ val(meta), path(metrics) ] cov_y = ch_cov_y // channel: [ val(meta), path(metrics) ] versions = ch_versions // channel: [ path(versions.yml) ] diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f7e5fcbe..e9affa4a 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -522,6 +522,7 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.multiple_metrics.map{it[1]}.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.hs_metrics.map{it[1]}.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.qualimap_results.map{it[1]}.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.global_dist.map{it[1]}.collect().ifEmpty([])) MULTIQC ( From c902b5b06b94765f4931e591e08411b708371bdd Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 21 Mar 2023 10:30:53 +0100 Subject: [PATCH 1089/1169] wgsmetrics --- workflows/raredisease.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e9affa4a..b8f684fc 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -523,6 +523,7 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.hs_metrics.map{it[1]}.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.qualimap_results.map{it[1]}.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.global_dist.map{it[1]}.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.cov.map{it[1]}.collect().ifEmpty([])) MULTIQC ( From c24d865d3ff8af2666c9894912682011779b47e9 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 21 Mar 2023 16:17:54 +0100 Subject: [PATCH 1090/1169] picardtools --- docs/output.md | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/docs/output.md b/docs/output.md index b673f43b..78d01317 100644 --- a/docs/output.md +++ b/docs/output.md @@ -68,27 +68,39 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ##### Mosdepth -[Mosdepth](https://github.com/brentp/mosdepth) is used to report quality control metrics such as coverage, and GC content from alignment files. The files generated by mosdepth are published as is, and passed to MultiQC for reporting as well. +[Mosdepth](https://github.com/brentp/mosdepth) is used to report quality control metrics such as coverage, and GC content from alignment files. Global distribution file, generated by this program is passed to MultiQC for generating the following plots, -> **NB:** `*region*` files are generated using a a bed file provided using `--target_bed` parameter. +- Cumulative coverage distribution +- Coverage distribution +- Average coverage per contig
    Output files - `{outputdir}/qc_bam/` - `_mosdepth.global.dist.txt`: This file contains a cumulative distribution indicating the proportion of total bases that were covered for at least a given coverage value across each chromosome and the whole genome. - - `_mosdepth.per-base.`: This file contains a coverage for each base in the genome. - - `_mosdepth.quantized.bed.gz>`: This file contains depth in [quantized bins](https://github.com/brentp/mosdepth#quantize). - - `_mosdepth.region.dist.txt`: This file contains a cumulative distribution indicating the proportion of total bases that were covered for in the regions specified using `--by` option. - - `_mosdepth.regions.bed.gz`: This file contains the mean coverage. - - `_mosdepth.summary.txt`: . - - `_mosdepth.thresholds.bed.gz`: . + - `_mosdepth.per-base.d4`: This file contains a coverage for each base in the genome in d4 format. + - `_mosdepth.summary.txt`: This file contains summary statistics, such as mean, minimum and maximum coverage per genomic contig.
    ##### Picardtools -[Picard's CollectMutipleMetrics, CollectHsMetrics, and CollectWgsMetrics](https://broadinstitute.github.io/picard/) +[Picard's CollectMutipleMetrics, CollectHsMetrics, and CollectWgsMetrics](https://broadinstitute.github.io/picard/) We use Picardtools' CollectWgsMetrics and CollectHsMetrics utilities to calculate metrics about coverage and performance of WGS & WES experiments. In addition to those metrics, we use CollectMultipleMetrics to gather information about alignment summary, insert size, GC content etc., The metrics generated by these three utilites are passed along to MultiQC to generate several plots as well. + +
    +Output files + +- `{outputdir}/qc_bam/` + - `_hsmetrics.CollectHsMetrics.coverage_metrics`: + - `_multiplemetrics.CollectMultipleMetrics.alignment_summary_metrics`: + - `_multiplemetrics.CollectMultipleMetrics.base_distribution_by_cycle_metrics`: + - `_multiplemetrics.CollectMultipleMetrics.insert_size_metrics`: + - `_multiplemetrics.CollectMultipleMetrics.quality_by_cycle_metrics`: + - `_multiplemetrics.CollectMultipleMetrics.quality_distribution_metrics`: + - `_wgsmetrics.CollectWgsMetrics.coverage_metrics`: + - `_wgsmetrics_y.CollectWgsMetrics.coverage_metrics`: +
    ##### Qualimap From 4f52866198c40301f03bea7411f2fe6da527b4a8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 22 Mar 2023 11:38:54 +0100 Subject: [PATCH 1091/1169] update --- docs/output.md | 277 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 232 insertions(+), 45 deletions(-) diff --git a/docs/output.md b/docs/output.md index 78d01317..9fb4b18e 100644 --- a/docs/output.md +++ b/docs/output.md @@ -10,6 +10,50 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: +- [Alignment](#alignment) + - [Mapping](#mapping) + - [Bwa-mem2](#bwa-mem2) + - [Sentieon](#sentieon) + - [Duplicate marking](#duplicate-marking) + - [Picard's MarkDuplicates](#picard-s-markduplicates) + - [Sentieon dedup](#sentieon-dedup) +- [Quality control and reporting](#quality-control-and-reporting) + - [Quality control](#quality-control) + - [FastQC](#fastqc) + - [Mosdepth](#mosdepth) + - [Picardtools](#picardtools) + - [Qualimap](#qualimap) + - [Sention WgsMetricsAlgo](#sention-wgsmetricsalgo) + - [TIDDIT's cov and UCSC WigToBigWig](#tiddit-s-cov-and-ucsc-wigtobigwig) + - [Reporting](#reporting) + - [MultiQC](#multiqc) +- [Variant calling - SNV](#variant-calling---snv) + - [DeepVariant](#deepvariant) + - [Sentieon DNAscope](#sentieon-dnascope) +- [Variant calling - SV](#variant-calling---sv) + - [Manta](#manta) + - [TIDDIT sv](#tiddit-sv) + - [SVDB merge](#svdb-merge) +- [Variant calling - repeat expansions](#variant-calling---repeat-expansions) + - [ExpansionsHunter](#expansionshunter) + - [stranger](#stranger) +- [Annotation - SNV](#annotation---snv) + - [bcftools roh](#bcftools-roh) + - [VCFanno](#vcfanno) + - [VEP](#vep) +- [Annotation - SV](#annotation---sv) + - [SVDB query](#svdb-query) + - [VEP](#vep-1) +- [Mitochondrial analysis](#mitochondrial-analysis) + - [Alignment and variant calling](#alignment-and-variant-calling) + - [Annotation:](#annotation-) + - [Haplogrep2](#haplogrep2) + - [VCFanno](#vcfanno-1) + - [VEP](#vep-2) +- [Rank variants and filtering](#rank-variants-and-filtering) + - [GENMOD](#genmod) +- [Pipeline information](#pipeline-information) + ### Alignment #### Mapping @@ -20,7 +64,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ##### Sentieon -[Sentieon's bwa mem](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#map-reads-to-reference) is the software accelerated version of the bwa-mem algorithm. It is used to efficiently perform the alignment using BWA. Aligned reads are then coordinate sorted using Sentieon's [sort](https://support.sentieon.com/manual/usages/general/#util-syntax) utility. It is not the default aligner, but it can be chosen over bwamem2 by setting `--aligner` option to sentieon. +[Sentieon's bwa mem](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#map-reads-to-reference) is the software accelerated version of the bwa-mem algorithm. It is used to efficiently perform the alignment using BWA. Aligned reads are then coordinate sorted using Sentieon's [sort](https://support.sentieon.com/manual/usages/general/#util-syntax) utility. These files are treated as intermediates and are not placed in the output folder by default. It is not the default aligner, but it can be chosen over bwamem2 by setting `--aligner` option to sentieon. #### Duplicate marking @@ -28,6 +72,15 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [Picard MarkDuplicates](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) is used for the removal of PCR duplicates that can occur during library amplification. This is essential as the presence of such duplicates results in false inflated coverages, which in turn can lead to overly-confident genotyping calls during variant calling. Only reads aligned by Bwa-mem2 are processed by this tool. +
    +Output files from Alignment + +- `{outputdir}/alignment/` + - `*.bam`: Bam file containing report containing quality metrics. + - `*.bai`: Zip archive containing the FastQC report, tab-delimited data file and plot images. + - `*.txt`: Text file containing the dedup metrics. +
    + ##### Sentieon dedup [Sentieon dedup](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#remove-or-mark-duplicates) is the algorithm used by Sentieon's driver to remove duplicate reads. Only reads aligned by Sentieon's implementation of bwa are processed by this algorithm. @@ -49,14 +102,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). -![MultiQC - FastQC sequence counts plot](images/mqc_fastqc_counts.png) - -![MultiQC - FastQC mean quality scores plot](images/mqc_fastqc_quality.png) - -![MultiQC - FastQC adapter content plot](images/mqc_fastqc_adapter.png) - -> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. -
    Output files @@ -91,7 +136,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d
    Output files -- `{outputdir}/qc_bam/` +- `{outputdir}/qc_bam/_qualimap/` - `_hsmetrics.CollectHsMetrics.coverage_metrics`: - `_multiplemetrics.CollectMultipleMetrics.alignment_summary_metrics`: - `_multiplemetrics.CollectMultipleMetrics.base_distribution_by_cycle_metrics`: @@ -104,120 +149,264 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ##### Qualimap -[Qualimap](http://qualimap.conesalab.org/) +[Qualimap](http://qualimap.conesalab.org/) also allows you to assess the alignment coverage. Qualimap results are used by MultiQC to generate the following plots. + +- Coverage histogram +- Cumulative genome coverage +- Insert size histogram +- GC content distribution + +
    +Output files + +- `{outputdir}/qc_bam/_qualimap/` this directory includes a qualimap report and associated raw statistic files. You can open the .html file in your internet browser to see the in-depth report. +
    ##### Sention WgsMetricsAlgo -[Sentieon's WgsMetricsAlgo](https://support.sentieon.com/manual/usages/general/) +[Sentieon's WgsMetricsAlgo](https://support.sentieon.com/manual/usages/general/) is the sentieon's equivalent of Picard's CollectWgsMetrics. -#### TIDDIT cov +
    +Output files -[TIDDIT's cov](https://github.com/J35P312/) +- `{outputdir}/qc_bam/` + - `_wgsmetrics.txt`: +
    + +##### TIDDIT's cov and UCSC WigToBigWig + +[TIDDIT's cov](https://github.com/J35P312/) is used to analyse the read depth of a bam file and generates a coverage report in wig format. This file is later passed to [UCSC WigToBigWig](https://genome.ucsc.edu/goldenPath/help/bigWig.html) to convert the file into a bigwig. + +
    +Output files + +- `{outputdir}/qc_bam/` + - `_tidditcov.wig`: + - `.bw`: +
    #### Reporting ##### MultiQC -[MultiQC](http://multiqc.info/) +[MultiQC](http://multiqc.info) is a visualization 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 the report data directory. + +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . + +
    +Output files + +- `multiqc/` + - `multiqc_report.html`: 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_plots/`: directory containing static images from the report in various formats. + +
    ### Variant calling - SNV #### DeepVariant -[DeepVariant](https://github.com/google/deepvariant) +[DeepVariant](https://github.com/google/deepvariant) is a deep learning-based variant caller that takes aligned reads, produces pileup image tensors from them, classifies each tensor using a convolutional neural network and finally reports the results in a standard VCF or gVCF file. Variant calls generated by DeepVariant are joint genotyped using GLnexus, and then normalized using bcftools norm. Only the normalized vcfs are placed in the output folder by default. + +> **NB**: In case you are running the separate mitochondrial analysis, mitochondrial calls are filtered from the normalized vcfs before they are published using GATK SelectVariants. + +
    +Output files + +- `call_snv/` + - `_split_rmdup.vcf.gz`: normalized vcf file containing MT variants. Only published when `--skip_mt_analysis` is set. + - `_split_rmdup.vcf.gz.tbi`: index of the normalized vcf file containing MT variants. Only published when `--skip_mt_analysis` is set. + - `_nomito.selectvariants.vcf.gz`: normalized vcf file containing no MT variants. + - `_nomito.selectvariants.vcf.gz.tbi`: index of the vcf file containing no MT variants. + +
    #### Sentieon DNAscope -[Sentieon DNAscope](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) +The pipeline performs variant calling using [Sentieon DNAscope](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) with a machine learning model. This approach identifies the candidate sites with a higher accuracy, and calculates genotypes for each sample at that site. These files are treated as intermediates and are not placed in the output folder by default. DNAscope is not run by default. To use DNAscope instead of DeepVariant, set `--variant_caller` to sentieon. + +
    +Output files + +- `call_snv/` + - `_split_rmdup.vcf.gz`: normalized vcf file containing MT variants. Only published when `--skip_mt_analysis` is set. + - `_split_rmdup.vcf.gz.tbi`: index of the normalized vcf file containing MT variants. Only published when `--skip_mt_analysis` is set. + - `_nomito.selectvariants.vcf.gz`: normalized vcf file containing no MT variants. + - `_nomito.selectvariants.vcf.gz.tbi`: index of the vcf file containing no MT variants. + +
    ### Variant calling - SV #### Manta -[Manta](https://github.com/Illumina/manta) +[Manta](https://github.com/Illumina/manta) calls structural variants (SVs) and indels from mapped paired-end sequencing reads. It combines paired and split-read evidence during SV discovery and scoring to improve accuracy, but does not require split-reads or successful breakpoint assemblies to report a variant in cases where there is strong evidence otherwise. Output vcf files are treated as intermediates and are not placed in the output folder by default. #### TIDDIT sv -[TIDDIT's sv](https://github.com/SciLifeLab/TIDDIT) +[TIDDIT's sv](https://github.com/SciLifeLab/TIDDIT) is used to identify chromosomal rearrangements using sequencing data. TIDDIT identifies intra and inter-chromosomal translocations, deletions, tandem-duplications and inversions, using supplementary alignments as well as discordant pairs. TIDDIT searches for discordant reads and split reads (supplementary alignments). Output vcf files are treated as intermediates and are not placed in the output folder by default. + +#### SVDB merge + +[SVDB merge](https://github.com/J35P312/SVDB#merge) is used to merge the variant calls from both Manta and TIDDIT. Output files are published in the output folder. + +
    +Output files + +- `call_sv/` + - `_sv_merge.vcf.gz`: file containing the merged variant calls. + - `_sv_merge.vcf.gz.tbi`: index of the file containing the merged variant calls. + +
    ### Variant calling - repeat expansions #### ExpansionsHunter -[ExpansionHunter](https://github.com/Illumina/ExpansionHunter) +[ExpansionHunter](https://github.com/Illumina/ExpansionHunter) aims to estimate sizes of repeat sequences by performing a targeted search through alignments that span, flank, and are fully contained in each repeat. + +
    +Output files + +- `repeat_expansions/` + - `_repeat_expansion.vcf.gz`: file containing variant calls. + - `_repeat_expansion.vcf.gz.tbi`: index of the file containing variant calls. + +
    #### stranger -[stranger](https://github.com/Clinical-Genomics/stranger) +[stranger](https://github.com/Clinical-Genomics/stranger) annotates output files from ExpansionHunter with the pathologic implications of the repeat sizes. + +
    +Output files + +- `repeat_expansions/` + - `_repeat_expansion.vcf.gz`: file containing variant calls. + - `_repeat_expansion.vcf.gz.tbi`: index of the file containing variant calls. + +
    ### Annotation - SNV #### bcftools roh -[bcftools roh](https://samtools.github.io/bcftools/bcftools.html#roh) +[bcftools roh](https://samtools.github.io/bcftools/bcftools.html#roh) is a program for detecting runs of homo/autozygosity.from only bi-allelic sites. The output files are not published in the output folder by default, and is passed to vcfanno for further annotation. #### VCFanno -[VCFanno](https://github.com/brentp/vcfanno) +[VCFanno](https://github.com/brentp/vcfanno) allows you to quickly annotate your VCF with any number of INFO fields from any number of VCFs. It uses a simple conf file to allow the user to specify the source annotation files and fields and how they will be added to the info of the query VCF. Values are pulled by name from the INFO field with special-cases of ID and FILTER to pull from those VCF columns. The output files are not published in the output folder by default, and is passed to vep for further annotation. #### VEP -[VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) +[VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) determines the effect of your variants on genes, transcripts, and protein sequence, as well as regulatory regions. We recommend annotating with the following plugins: + +- LoFtool +- pLI +- SpliceAI +- MaxEntScan + +Based on VEP annotations, custom scripts used by the pipeline further annotate each record with the most severe consequence, and pli scores. + +> **NB**: Output files described below include mitochondrial annotations only if --skip_mt_analysis is set to true. + +
    +Output files + +- `annotate_snv/` + - `_rohann_vcfanno_filter_vep.vcf.gz`: file containing bcftools roh, vcfanno, and vep annotations. + - `_rohann_vcfanno_filter_vep.vcf.gz.tbi`: index of the file containing bcftools roh, vcfanno, and vep annotations. + - `_vep_csq_pli.vcf.gz`: file containing bcftools roh, vcfanno, vep, consequence and pli annotations. + - `_vep_csq_pli.vcf.gz.tbi`: index of the file containing bcftools roh, vcfanno, vep, consequence and pli annotations. + +
    ### Annotation - SV -#### VCFanno +#### SVDB query -[VCFanno](https://github.com/brentp/vcfanno) +[SVDB query](https://github.com/J35P312/SVDB#Query) allows you to quickly annotate your VCF with data from one or more structural variant databases. The output files are not published in the output folder by default, and is passed to vep for further annotation. #### VEP -[VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) +[VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) determines the effect of your variants on genes, transcripts, and protein sequence, as well as regulatory regions. We recommend annotating with pLI plugin, along with any other custom plugins you may want too use. Based on VEP annotations, custom scripts used by the pipeline further annotate each record with the most severe consequence, and pli scores. + +
    +Output files + +- `annotate_sv/` + - `_svdbquery_vep.vcf.gz`: file containing svdb query, and vep annotations. + - `_svdbquery_vep.vcf.gz.tbi`: index of the file containing bcftools roh, vcfanno, and vep annotations. + - `_vep_csq_pli.vcf.gz`: file containing bcftools roh, vcfanno, vep, consequence and pli annotations. + - `_vep_csq_pli.vcf.gz.tbi`: index of the file containing bcftools roh, vcfanno, vep, consequence and pli annotations. + +
    ### Mitochondrial analysis +Mitochondrial analysis is run by default, to turn it off set `--skip_mt_analysis` to true. + #### Alignment and variant calling -[Alignment and variant calling - GATK Mitochondrial short variant discovery pipeline ](https://gatk.broadinstitute.org/hc/en-us/articles/4403870837275-Mitochondrial-short-variant-discovery-SNVs-Indels-) +[Alignment and variant calling - GATK Mitochondrial short variant discovery pipeline ](https://gatk.broadinstitute.org/hc/en-us/articles/4403870837275-Mitochondrial-short-variant-discovery-SNVs-Indels-) The mitochondrial genome poses several challenges to the identification and understanding of somatic variants. The circularity of the mitochondrial genome means that the breakpoint in the reference genome is at an arbitrary position in the non-coding control region, creating a challenge in analyzing variation. Additionally, insertions of mitochondrial DNA into the nuclear genome (NuMTs) complicate the mapping of the mitochondrial genome and the distinction between NuMTs and the mitochondrial contig of interest. Lastly, mitochondrial variants often have very low heteroplasmy. Such low allele fraction (AF) variants can thus be mistaken for inherent sequencer noise. + +The pipeline for mitochondrial variant discovery, using Mutect2, uses a high sensitivity to low AF and separate alignments using opposite genome breakpoints to allow for the tracing of lineages of rare mitochondrial variants. #### Annotation: ##### Haplogrep2 -[Haplogrep2](https://github.com/seppinho/haplogrep-cmd) +[Haplogrep2](https://github.com/seppinho/haplogrep-cmd) allows detecting artificial recombinants and missing variants as well as annotating rare and phantom mutations in mitochondria. Haplogrep generates a text report, which is published by default. + +
    +Output files + +- `annotate_mt/` + - `_haplogrep.txt`: file containing haplogroup information. + +
    ##### VCFanno -[VCFanno](https://github.com/brentp/vcfanno) +[VCFanno](https://github.com/brentp/vcfanno) allows you to quickly annotate your VCF with any number of INFO fields from any number of VCFs. It uses a simple conf file to allow the user to specify the source annotation files and fields and how they will be added to the info of the query VCF. Values are pulled by name from the INFO field with special-cases of ID and FILTER to pull from those VCF columns. The output files are not published in the output folder by default, and is passed to vep for further annotation. ##### VEP -[VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) +[VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) determines the effect of your variants on genes, transcripts, and protein sequence, as well as regulatory regions. -### Rank variants and filtering +
    +Output files + +- `annotate_mt/` + - `_vep_vcfanno_mt.vcf.gz`: file containing mitochondrial annotations. + - `_vep_vcfanno_mt.vcf.gz.tbi`: index of the file containing mitochondrial annotations. -#### Genmod +
    + +### Rank variants and filtering -[Genmod](https://github.com/Clinical-Genomics/genmod) +#### GENMOD -### MultiQC +[GENMOD](https://github.com/Clinical-Genomics/genmod) is a simple to use command line tool for annotating and analyzing genomic variations in the VCF file format. GENMOD can annotate genetic patterns of inheritance in vcf:s with single or multiple families of arbitrary size. VCF file annotated by GENMOD are further filtered to separate clinically relevant variants.
    Output files -- `multiqc/` - - `multiqc_report.html`: 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_plots/`: directory containing static images from the report in various formats. +- `rank_and_filter/` + - `_clinical_snv.ann_filter.vcf.gz`: file containing clincal relevant SNVs. + - `_clinical_sv.ann_filter.vcf.gz`: file containing clincal relevant SVs. + - `_ranked_snv.vcf.gz`: file containing SNV annotations with their rank scores. + - `_ranked_snv.vcf.gz.tbi`: file containing SNV annotations with their rank scores. + - `_ranked_sv.ann_filter.vcf.gz`: file containing SV annotations with their rank scores. + - `_ranked_sv.ann_filter.vcf.gz.tbi`: file containing SV annotations with their rank scores.
    -[MultiQC](http://multiqc.info) is a visualization 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 the report data directory. - -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . - ### Pipeline information +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. +
    Output files @@ -227,5 +416,3 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`.
    - -[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. From 7d7a3e469fbfffc9579c3ad3f8f6109e22a581e3 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Thu, 23 Mar 2023 16:20:35 +0100 Subject: [PATCH 1092/1169] Changed case in tool names --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2f807192..97a59e83 100644 --- a/README.md +++ b/README.md @@ -68,30 +68,30 @@ On release, automated continuous integration tests run the pipeline on a full-si **5. Annotation - SNV:** - [bcftools roh](https://samtools.github.io/bcftools/bcftools.html#roh) -- [VCFanno](https://github.com/brentp/vcfanno) +- [vcfanno](https://github.com/brentp/vcfanno) - [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) **6. Annotation - SV:** -- [VCFanno](https://github.com/brentp/vcfanno) +- [vcfanno](https://github.com/brentp/vcfanno) - [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) **7. Mitochondrial analysis:** - [Alignment and variant calling - GATK Mitochondrial short variant discovery pipeline ](https://gatk.broadinstitute.org/hc/en-us/articles/4403870837275-Mitochondrial-short-variant-discovery-SNVs-Indels-) - Annotation: - - [Haplogrep2](https://github.com/seppinho/haplogrep-cmd) - - [VCFanno](https://github.com/brentp/vcfanno) + - [HaploGrep2](https://github.com/seppinho/haplogrep-cmd) + - [vcfanno](https://github.com/brentp/vcfanno) - [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) **8. Variant calling - repeat expansions:** -- [ExpansionHunter](https://github.com/Illumina/ExpansionHunter) -- [stranger](https://github.com/Clinical-Genomics/stranger) +- [Expansion Hunter](https://github.com/Illumina/ExpansionHunter) +- [Stranger](https://github.com/Clinical-Genomics/stranger) **9. Rank variants - SV and SNV:** -- [Genmod](https://github.com/Clinical-Genomics/genmod) +- [GENMOD](https://github.com/Clinical-Genomics/genmod)

    From d4bc9da181be8bce0b4d221d2bb807d25c1ec380 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Thu, 23 Mar 2023 16:31:16 +0100 Subject: [PATCH 1093/1169] Case change etc --- docs/output.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/output.md b/docs/output.md index 9fb4b18e..312ea3be 100644 --- a/docs/output.md +++ b/docs/output.md @@ -13,7 +13,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Alignment](#alignment) - [Mapping](#mapping) - [Bwa-mem2](#bwa-mem2) - - [Sentieon](#sentieon) + - [Sentieon bwa mem](#sentieon) - [Duplicate marking](#duplicate-marking) - [Picard's MarkDuplicates](#picard-s-markduplicates) - [Sentieon dedup](#sentieon-dedup) @@ -21,9 +21,9 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Quality control](#quality-control) - [FastQC](#fastqc) - [Mosdepth](#mosdepth) - - [Picardtools](#picardtools) + - [Picard tools](#picardtools) - [Qualimap](#qualimap) - - [Sention WgsMetricsAlgo](#sention-wgsmetricsalgo) + - [Sentieon WgsMetricsAlgo](#sention-wgsmetricsalgo) - [TIDDIT's cov and UCSC WigToBigWig](#tiddit-s-cov-and-ucsc-wigtobigwig) - [Reporting](#reporting) - [MultiQC](#multiqc) @@ -35,11 +35,11 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [TIDDIT sv](#tiddit-sv) - [SVDB merge](#svdb-merge) - [Variant calling - repeat expansions](#variant-calling---repeat-expansions) - - [ExpansionsHunter](#expansionshunter) - - [stranger](#stranger) + - [Expansion Hunter](#expansionshunter) + - [Stranger](#stranger) - [Annotation - SNV](#annotation---snv) - [bcftools roh](#bcftools-roh) - - [VCFanno](#vcfanno) + - [vcfanno](#vcfanno) - [VEP](#vep) - [Annotation - SV](#annotation---sv) - [SVDB query](#svdb-query) @@ -47,8 +47,8 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Mitochondrial analysis](#mitochondrial-analysis) - [Alignment and variant calling](#alignment-and-variant-calling) - [Annotation:](#annotation-) - - [Haplogrep2](#haplogrep2) - - [VCFanno](#vcfanno-1) + - [HaploGrep2](#haplogrep2) + - [vcfanno](#vcfanno-1) - [VEP](#vep-2) - [Rank variants and filtering](#rank-variants-and-filtering) - [GENMOD](#genmod) @@ -62,7 +62,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [Bwa-mem2](https://github.com/bwa-mem2/bwa-mem2) used to map the reads to a reference genome. The aligned reads are coordinate sorted with samtools sort. These files are treated as intermediates and are not placed in the output folder by default. -##### Sentieon +##### Sentieon bwa mem [Sentieon's bwa mem](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#map-reads-to-reference) is the software accelerated version of the bwa-mem algorithm. It is used to efficiently perform the alignment using BWA. Aligned reads are then coordinate sorted using Sentieon's [sort](https://support.sentieon.com/manual/usages/general/#util-syntax) utility. These files are treated as intermediates and are not placed in the output folder by default. It is not the default aligner, but it can be chosen over bwamem2 by setting `--aligner` option to sentieon. @@ -81,9 +81,9 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - `*.txt`: Text file containing the dedup metrics.

    -##### Sentieon dedup +##### Sentieon Dedup -[Sentieon dedup](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#remove-or-mark-duplicates) is the algorithm used by Sentieon's driver to remove duplicate reads. Only reads aligned by Sentieon's implementation of bwa are processed by this algorithm. +[Sentieon Dedup](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/#remove-or-mark-duplicates) is the algorithm used by Sentieon's driver to remove duplicate reads. Only reads aligned by Sentieon's implementation of bwa are processed by this algorithm.
    Output files from Alignment @@ -129,7 +129,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d
    -##### Picardtools +##### Picard tools [Picard's CollectMutipleMetrics, CollectHsMetrics, and CollectWgsMetrics](https://broadinstitute.github.io/picard/) We use Picardtools' CollectWgsMetrics and CollectHsMetrics utilities to calculate metrics about coverage and performance of WGS & WES experiments. In addition to those metrics, we use CollectMultipleMetrics to gather information about alignment summary, insert size, GC content etc., The metrics generated by these three utilites are passed along to MultiQC to generate several plots as well. From 67932ae6a96bdc880f7aaaf333e9128475894b5d Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Thu, 23 Mar 2023 16:38:13 +0100 Subject: [PATCH 1094/1169] Updated intralinks and case --- docs/output.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/output.md b/docs/output.md index 312ea3be..3b1a3ad7 100644 --- a/docs/output.md +++ b/docs/output.md @@ -13,7 +13,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Alignment](#alignment) - [Mapping](#mapping) - [Bwa-mem2](#bwa-mem2) - - [Sentieon bwa mem](#sentieon) + - [Sentieon bwa mem](#sentieon-bwa-mem) - [Duplicate marking](#duplicate-marking) - [Picard's MarkDuplicates](#picard-s-markduplicates) - [Sentieon dedup](#sentieon-dedup) @@ -21,10 +21,10 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Quality control](#quality-control) - [FastQC](#fastqc) - [Mosdepth](#mosdepth) - - [Picard tools](#picardtools) + - [Picard tools](#picard-tools) - [Qualimap](#qualimap) - [Sentieon WgsMetricsAlgo](#sention-wgsmetricsalgo) - - [TIDDIT's cov and UCSC WigToBigWig](#tiddit-s-cov-and-ucsc-wigtobigwig) + - [TIDDIT's cov and UCSC WigToBigWig](#tiddits-cov-and-ucsc-wigtobigwig) - [Reporting](#reporting) - [MultiQC](#multiqc) - [Variant calling - SNV](#variant-calling---snv) @@ -35,7 +35,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [TIDDIT sv](#tiddit-sv) - [SVDB merge](#svdb-merge) - [Variant calling - repeat expansions](#variant-calling---repeat-expansions) - - [Expansion Hunter](#expansionshunter) + - [Expansion Hunter](#expansion-hunter) - [Stranger](#stranger) - [Annotation - SNV](#annotation---snv) - [bcftools roh](#bcftools-roh) @@ -262,9 +262,9 @@ The pipeline performs variant calling using [Sentieon DNAscope](https://support. ### Variant calling - repeat expansions -#### ExpansionsHunter +#### Expansion Hunter -[ExpansionHunter](https://github.com/Illumina/ExpansionHunter) aims to estimate sizes of repeat sequences by performing a targeted search through alignments that span, flank, and are fully contained in each repeat. +[Expansion Hunter](https://github.com/Illumina/ExpansionHunter) aims to estimate sizes of repeat sequences by performing a targeted search through alignments that span, flank, and are fully contained in each repeat.
    Output files @@ -275,9 +275,9 @@ The pipeline performs variant calling using [Sentieon DNAscope](https://support.
    -#### stranger +#### Stranger -[stranger](https://github.com/Clinical-Genomics/stranger) annotates output files from ExpansionHunter with the pathologic implications of the repeat sizes. +[Stranger](https://github.com/Clinical-Genomics/stranger) annotates output files from Expansion Hunter with the pathologic implications of the repeat sizes.
    Output files @@ -294,9 +294,9 @@ The pipeline performs variant calling using [Sentieon DNAscope](https://support. [bcftools roh](https://samtools.github.io/bcftools/bcftools.html#roh) is a program for detecting runs of homo/autozygosity.from only bi-allelic sites. The output files are not published in the output folder by default, and is passed to vcfanno for further annotation. -#### VCFanno +#### vcfanno -[VCFanno](https://github.com/brentp/vcfanno) allows you to quickly annotate your VCF with any number of INFO fields from any number of VCFs. It uses a simple conf file to allow the user to specify the source annotation files and fields and how they will be added to the info of the query VCF. Values are pulled by name from the INFO field with special-cases of ID and FILTER to pull from those VCF columns. The output files are not published in the output folder by default, and is passed to vep for further annotation. +[vcfanno](https://github.com/brentp/vcfanno) allows you to quickly annotate your VCF with any number of INFO fields from any number of VCFs. It uses a simple conf file to allow the user to specify the source annotation files and fields and how they will be added to the info of the query VCF. Values are pulled by name from the INFO field with special-cases of ID and FILTER to pull from those VCF columns. The output files are not published in the output folder by default, and is passed to vep for further annotation. #### VEP @@ -355,9 +355,9 @@ The pipeline for mitochondrial variant discovery, using Mutect2, uses a high sen #### Annotation: -##### Haplogrep2 +##### HaploGrep2 -[Haplogrep2](https://github.com/seppinho/haplogrep-cmd) allows detecting artificial recombinants and missing variants as well as annotating rare and phantom mutations in mitochondria. Haplogrep generates a text report, which is published by default. +[HaploGrep2](https://github.com/seppinho/haplogrep-cmd) allows detecting artificial recombinants and missing variants as well as annotating rare and phantom mutations in mitochondria. Haplogrep generates a text report, which is published by default.
    Output files @@ -367,9 +367,9 @@ The pipeline for mitochondrial variant discovery, using Mutect2, uses a high sen
    -##### VCFanno +##### vcfanno -[VCFanno](https://github.com/brentp/vcfanno) allows you to quickly annotate your VCF with any number of INFO fields from any number of VCFs. It uses a simple conf file to allow the user to specify the source annotation files and fields and how they will be added to the info of the query VCF. Values are pulled by name from the INFO field with special-cases of ID and FILTER to pull from those VCF columns. The output files are not published in the output folder by default, and is passed to vep for further annotation. +[vcfanno](https://github.com/brentp/vcfanno) allows you to quickly annotate your VCF with any number of INFO fields from any number of VCFs. It uses a simple conf file to allow the user to specify the source annotation files and fields and how they will be added to the info of the query VCF. Values are pulled by name from the INFO field with special-cases of ID and FILTER to pull from those VCF columns. The output files are not published in the output folder by default, and is passed to vep for further annotation. ##### VEP From 720948749afb244971c638cc50c5cd7198033a88 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 23 Mar 2023 23:09:39 +0100 Subject: [PATCH 1095/1169] review suggestions --- README.md | 2 +- docs/output.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2f807192..4314298d 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ On release, automated continuous integration tests run the pipeline on a full-si **6. Annotation - SV:** -- [VCFanno](https://github.com/brentp/vcfanno) +- [SVDB query](https://github.com/J35P312/SVDB#Query) - [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) **7. Mitochondrial analysis:** diff --git a/docs/output.md b/docs/output.md index 9fb4b18e..42248cbf 100644 --- a/docs/output.md +++ b/docs/output.md @@ -70,7 +70,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ##### Picard's MarkDuplicates -[Picard MarkDuplicates](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) is used for the removal of PCR duplicates that can occur during library amplification. This is essential as the presence of such duplicates results in false inflated coverages, which in turn can lead to overly-confident genotyping calls during variant calling. Only reads aligned by Bwa-mem2 are processed by this tool. +[Picard MarkDuplicates](https://broadinstitute.github.io/picard/command-line-overview.html#MarkDuplicates) is used for marking PCR duplicates that can occur during library amplification. This is essential as the presence of such duplicates results in false inflated coverages, which in turn can lead to overly-confident genotyping calls during variant calling. Only reads aligned by Bwa-mem2 are processed by this tool.
    Output files from Alignment @@ -113,7 +113,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ##### Mosdepth -[Mosdepth](https://github.com/brentp/mosdepth) is used to report quality control metrics such as coverage, and GC content from alignment files. Global distribution file, generated by this program is passed to MultiQC for generating the following plots, +[Mosdepth](https://github.com/brentp/mosdepth) is used to report quality control metrics such as coverage, and GC content from alignment files. The global distribution file, generated by this program is passed to MultiQC for generating the following plots, - Cumulative coverage distribution - Coverage distribution @@ -207,7 +207,7 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ #### DeepVariant -[DeepVariant](https://github.com/google/deepvariant) is a deep learning-based variant caller that takes aligned reads, produces pileup image tensors from them, classifies each tensor using a convolutional neural network and finally reports the results in a standard VCF or gVCF file. Variant calls generated by DeepVariant are joint genotyped using GLnexus, and then normalized using bcftools norm. Only the normalized vcfs are placed in the output folder by default. +[DeepVariant](https://github.com/google/deepvariant) is a deep learning-based variant caller that takes aligned reads, produces pileup image tensors from them, classifies each tensor using a convolutional neural network and finally reports the results in a standard VCF or gVCF file. Variant calls generated by DeepVariant are joint genotyped using [GLnexus](https://github.com/dnanexus-rnd/GLnexus), and then normalized using bcftools norm. Only the normalized vcfs are placed in the output folder by default. > **NB**: In case you are running the separate mitochondrial analysis, mitochondrial calls are filtered from the normalized vcfs before they are published using GATK SelectVariants. @@ -388,7 +388,7 @@ The pipeline for mitochondrial variant discovery, using Mutect2, uses a high sen #### GENMOD -[GENMOD](https://github.com/Clinical-Genomics/genmod) is a simple to use command line tool for annotating and analyzing genomic variations in the VCF file format. GENMOD can annotate genetic patterns of inheritance in vcf:s with single or multiple families of arbitrary size. VCF file annotated by GENMOD are further filtered to separate clinically relevant variants. +[GENMOD](https://github.com/Clinical-Genomics/genmod) is a simple to use command line tool for annotating and analyzing genomic variations in the VCF file format. GENMOD can annotate genetic patterns of inheritance in vcf:s with single or multiple families of arbitrary size. VCF file annotated by GENMOD are further filtered using [filter_vep from VEP](https://www.ensembl.org/info/docs/tools/vep/script/vep_filter.html) to separate clinically relevant variants.
    Output files From a9a20bb7f80474a4823a95dca59ed3aa565f4274 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Mar 2023 11:07:04 +0100 Subject: [PATCH 1096/1169] todo --- README.md | 2 -- conf/base.config | 2 -- 2 files changed, 4 deletions(-) diff --git a/README.md b/README.md index 818f55cd..1e096de7 100644 --- a/README.md +++ b/README.md @@ -156,8 +156,6 @@ For further information or help, don't hesitate to get in touch on the [Slack `# - - An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. You can cite the `nf-core` publication as follows: diff --git a/conf/base.config b/conf/base.config index d84b67a8..3479669b 100644 --- a/conf/base.config +++ b/conf/base.config @@ -10,7 +10,6 @@ process { - // TODO nf-core: Check the defaults for all processes cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 6.GB * task.attempt, 'memory' ) } time = { check_max( 4.h * task.attempt, 'time' ) } @@ -24,7 +23,6 @@ process { // These labels are used and recognised by default in DSL2 files hosted on nf-core/modules. // If possible, it would be nice to keep the same label naming convention when // adding in your local modules too. - // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_single { cpus = { check_max( 1 , 'cpus' ) } From 4c48853b1e9aa4cff887dda2deb29f13237564a8 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Mar 2023 15:29:46 +0100 Subject: [PATCH 1097/1169] update modules --- modules.json | 90 +++++++++---------- modules/nf-core/bcftools/norm/main.nf | 22 +++-- modules/nf-core/bcftools/norm/meta.yml | 4 +- modules/nf-core/cat/cat/meta.yml | 4 +- modules/nf-core/cnvpytor/callcnvs/meta.yml | 1 + .../nf-core/cnvpytor/importreaddepth/meta.yml | 6 +- .../custom/dumpsoftwareversions/main.nf | 6 +- .../templates/dumpsoftwareversions.py | 3 +- modules/nf-core/deepvariant/meta.yml | 2 +- modules/nf-core/expansionhunter/meta.yml | 2 +- .../nf-core/gatk4/bedtointervallist/main.nf | 12 +-- .../gatk4/createsequencedictionary/main.nf | 10 +-- .../gatk4/createsequencedictionary/meta.yml | 34 +++---- .../nf-core/gatk4/filtermutectcalls/main.nf | 12 +-- .../nf-core/gatk4/intervallisttools/main.nf | 12 +-- .../nf-core/gatk4/mergebamalignment/main.nf | 12 +-- modules/nf-core/gatk4/mergevcfs/main.nf | 12 +-- modules/nf-core/gatk4/mutect2/main.nf | 12 +-- modules/nf-core/gatk4/printreads/main.nf | 12 +-- modules/nf-core/gatk4/revertsam/main.nf | 12 +-- modules/nf-core/gatk4/samtofastq/main.nf | 12 +-- modules/nf-core/gatk4/selectvariants/main.nf | 12 +-- modules/nf-core/gatk4/splitintervals/main.nf | 12 +-- modules/nf-core/gatk4/splitintervals/meta.yml | 1 + .../nf-core/gatk4/variantfiltration/main.nf | 12 +-- modules/nf-core/genmod/annotate/meta.yml | 2 +- modules/nf-core/genmod/compound/meta.yml | 2 +- modules/nf-core/genmod/models/meta.yml | 2 +- modules/nf-core/genmod/score/meta.yml | 2 +- modules/nf-core/glnexus/meta.yml | 4 +- modules/nf-core/haplogrep2/classify/meta.yml | 5 +- modules/nf-core/hmtnote/meta.yml | 4 +- modules/nf-core/mosdepth/main.nf | 5 +- .../picard/addorreplacereadgroups/main.nf | 14 +-- .../nf-core/picard/collecthsmetrics/main.nf | 12 +-- .../picard/collectmultiplemetrics/main.nf | 12 +-- .../nf-core/picard/collectwgsmetrics/main.nf | 12 +-- .../nf-core/picard/collectwgsmetrics/meta.yml | 2 + modules/nf-core/picard/liftovervcf/main.nf | 14 +-- modules/nf-core/picard/liftovervcf/meta.yml | 2 +- modules/nf-core/picard/markduplicates/main.nf | 12 +-- .../nf-core/picard/renamesampleinvcf/main.nf | 12 +-- .../nf-core/picard/renamesampleinvcf/meta.yml | 2 +- modules/nf-core/picard/sortvcf/main.nf | 12 +-- modules/nf-core/qualimap/bamqc/main.nf | 2 +- modules/nf-core/rhocall/annotate/meta.yml | 2 +- modules/nf-core/samtools/index/meta.yml | 2 +- modules/nf-core/samtools/merge/meta.yml | 2 +- modules/nf-core/samtools/sort/meta.yml | 2 +- modules/nf-core/samtools/stats/meta.yml | 14 +-- modules/nf-core/smncopynumbercaller/meta.yml | 2 +- modules/nf-core/ucsc/wigtobigwig/meta.yml | 5 +- modules/nf-core/vcfanno/meta.yml | 2 +- subworkflows/local/qc_bam.nf | 20 ++--- 54 files changed, 263 insertions(+), 251 deletions(-) diff --git a/modules.json b/modules.json index c7d7d205..c837fa25 100644 --- a/modules.json +++ b/modules.json @@ -22,7 +22,7 @@ }, "bcftools/norm": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "bcad95fb35e567ad25840d3297c3e17eff211a3a", "installed_by": ["modules"] }, "bcftools/reheader": { @@ -57,12 +57,12 @@ }, "cat/cat": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "cnvpytor/callcnvs": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "cnvpytor/histogram": { @@ -72,7 +72,7 @@ }, "cnvpytor/importreaddepth": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "cnvpytor/partition": { @@ -87,17 +87,17 @@ }, "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "b6d4d476aee074311c89d82a69c1921bd70c8180", "installed_by": ["modules"] }, "deepvariant": { "branch": "master", - "git_sha": "c62b41a07a00fee11ec73e2a0d4a1aec771a742b", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "expansionhunter": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "fastqc": { @@ -107,92 +107,92 @@ }, "gatk4/bedtointervallist": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/createsequencedictionary": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/filtermutectcalls": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/intervallisttools": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/mergebamalignment": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/mergevcfs": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/mutect2": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/printreads": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/revertsam": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/samtofastq": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/selectvariants": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/splitintervals": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "gatk4/variantfiltration": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", "installed_by": ["modules"] }, "genmod/annotate": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "genmod/compound": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "genmod/models": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "genmod/score": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "glnexus": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "haplocheck": { @@ -202,12 +202,12 @@ }, "haplogrep2/classify": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "hmtnote": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "manta/germline": { @@ -217,7 +217,7 @@ }, "mosdepth": { "branch": "master", - "git_sha": "def5f182583df0c20f43ec3d4355e8ebd341aaa9", + "git_sha": "783cc040350dbee673fd57f6a6300aea3d085b7c", "installed_by": ["modules"] }, "multiqc": { @@ -227,52 +227,52 @@ }, "picard/addorreplacereadgroups": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "28995552268a117551ded48dadcf42b0caf0e834", "installed_by": ["modules"] }, "picard/collecthsmetrics": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", "installed_by": ["modules"] }, "picard/collectmultiplemetrics": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", "installed_by": ["modules"] }, "picard/collectwgsmetrics": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", "installed_by": ["modules"] }, "picard/liftovervcf": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", "installed_by": ["modules"] }, "picard/markduplicates": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", "installed_by": ["modules"] }, "picard/renamesampleinvcf": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", "installed_by": ["modules"] }, "picard/sortvcf": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", "installed_by": ["modules"] }, "qualimap/bamqc": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", "installed_by": ["modules"] }, "rhocall/annotate": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "samtools/faidx": { @@ -282,27 +282,27 @@ }, "samtools/index": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "smncopynumbercaller": { "branch": "master", - "git_sha": "c5620578276a1927f5b4afbc2b4266c9cf7b43ca", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "stranger": { @@ -342,7 +342,7 @@ }, "ucsc/wigtobigwig": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, "untar": { @@ -352,7 +352,7 @@ }, "vcfanno": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] } } diff --git a/modules/nf-core/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf index ef95bee4..90387d6c 100644 --- a/modules/nf-core/bcftools/norm/main.nf +++ b/modules/nf-core/bcftools/norm/main.nf @@ -12,19 +12,25 @@ process BCFTOOLS_NORM { path(fasta) output: - tuple val(meta), path("*.gz") , emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}") , emit: vcf + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf.gz" + """ bcftools norm \\ --fasta-ref ${fasta} \\ - --output ${prefix}.vcf.gz \\ + --output ${prefix}.${extension}\\ $args \\ --threads $task.cpus \\ ${vcf} @@ -36,9 +42,15 @@ process BCFTOOLS_NORM { """ stub: + def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf.gz" """ - touch ${prefix}.vcf.gz + touch ${prefix}.${extension} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/bcftools/norm/meta.yml b/modules/nf-core/bcftools/norm/meta.yml index 2b3c8eae..c3ea2c03 100644 --- a/modules/nf-core/bcftools/norm/meta.yml +++ b/modules/nf-core/bcftools/norm/meta.yml @@ -42,8 +42,8 @@ output: e.g. [ id:'test', single_end:false ] - vcf: type: file - description: VCF normalized output file - pattern: "*.vcf.gz" + description: One of uncompressed VCF (.vcf), compressed VCF (.vcf.gz), compressed BCF (.bcf.gz) or uncompressed BCF (.bcf) normalized output file + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" - versions: type: file description: File containing software versions diff --git a/modules/nf-core/cat/cat/meta.yml b/modules/nf-core/cat/cat/meta.yml index 5eeff5a6..8acc0bfa 100644 --- a/modules/nf-core/cat/cat/meta.yml +++ b/modules/nf-core/cat/cat/meta.yml @@ -7,9 +7,9 @@ keywords: tools: - cat: description: Just concatenation - homepage: None + documentation: https://man7.org/linux/man-pages/man1/cat.1.html - tool_dev_url: None + licence: ["GPL-3.0-or-later"] input: - meta: diff --git a/modules/nf-core/cnvpytor/callcnvs/meta.yml b/modules/nf-core/cnvpytor/callcnvs/meta.yml index 6ba46b6f..132defb3 100644 --- a/modules/nf-core/cnvpytor/callcnvs/meta.yml +++ b/modules/nf-core/cnvpytor/callcnvs/meta.yml @@ -1,5 +1,6 @@ name: cnvpytor_callcnvs description: command line tool for calling CNVs in whole genome sequencing data +keywords: - CNV calling tools: - cnvpytor: diff --git a/modules/nf-core/cnvpytor/importreaddepth/meta.yml b/modules/nf-core/cnvpytor/importreaddepth/meta.yml index 8b58887e..3f8e2136 100644 --- a/modules/nf-core/cnvpytor/importreaddepth/meta.yml +++ b/modules/nf-core/cnvpytor/importreaddepth/meta.yml @@ -31,9 +31,9 @@ input: description: specifies reference genome file (only for cram file without reference genome) pattern: "*.{fasta,fasta.gz,fa,fa.gz}" - fai: - type: file - description: Index of reference fasta file - pattern: "*.fai" + type: file + description: Index of reference fasta file + pattern: "*.fai" output: - meta: diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 3df21765..800a6099 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.13" + conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index e55b8d43..da033408 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -4,11 +4,10 @@ """Provide functions to merge multiple versions.yml files.""" +import yaml import platform from textwrap import dedent -import yaml - def _make_versions_html(versions): """Generate a tabular HTML output of all versions for MultiQC.""" diff --git a/modules/nf-core/deepvariant/meta.yml b/modules/nf-core/deepvariant/meta.yml index b2d480a3..7ecb40f2 100644 --- a/modules/nf-core/deepvariant/meta.yml +++ b/modules/nf-core/deepvariant/meta.yml @@ -9,7 +9,7 @@ tools: homepage: https://github.com/google/deepvariant documentation: https://github.com/google/deepvariant tool_dev_url: https://github.com/google/deepvariant - doi: "https://doi.org/10.1038/nbt.4235" + doi: "10.1038/nbt.4235" licence: ["BSD-3-clause"] input: diff --git a/modules/nf-core/expansionhunter/meta.yml b/modules/nf-core/expansionhunter/meta.yml index c5a89c10..ebb3016c 100644 --- a/modules/nf-core/expansionhunter/meta.yml +++ b/modules/nf-core/expansionhunter/meta.yml @@ -8,7 +8,7 @@ tools: description: A tool for estimating repeat sizes homepage: https://github.com/Illumina/ExpansionHunter documentation: https://github.com/Illumina/ExpansionHunter/blob/master/docs/01_Introduction.md - tool_dev_url: None + doi: "10.1093/bioinformatics/btz431" licence: ["Apache-2.0"] diff --git a/modules/nf-core/gatk4/bedtointervallist/main.nf b/modules/nf-core/gatk4/bedtointervallist/main.nf index 41fab003..41830019 100644 --- a/modules/nf-core/gatk4/bedtointervallist/main.nf +++ b/modules/nf-core/gatk4/bedtointervallist/main.nf @@ -2,10 +2,10 @@ process GATK4_BEDTOINTERVALLIST { tag "$meta.id" label 'process_medium' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(bed) @@ -22,14 +22,14 @@ process GATK4_BEDTOINTERVALLIST { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK BedToIntervalList] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" BedToIntervalList \\ + gatk --java-options "-Xmx${avail_mem}M" BedToIntervalList \\ --INPUT $bed \\ --OUTPUT ${prefix}.interval_list \\ --SEQUENCE_DICTIONARY $dict \\ diff --git a/modules/nf-core/gatk4/createsequencedictionary/main.nf b/modules/nf-core/gatk4/createsequencedictionary/main.nf index bc324ada..1e78f017 100644 --- a/modules/nf-core/gatk4/createsequencedictionary/main.nf +++ b/modules/nf-core/gatk4/createsequencedictionary/main.nf @@ -2,10 +2,10 @@ process GATK4_CREATESEQUENCEDICTIONARY { tag "$fasta" label 'process_medium' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: path fasta @@ -24,10 +24,10 @@ process GATK4_CREATESEQUENCEDICTIONARY { if (!task.memory) { log.info '[GATK CreateSequenceDictionary] Available memory not known - defaulting to 6GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" CreateSequenceDictionary \\ + gatk --java-options "-Xmx${avail_mem}M" CreateSequenceDictionary \\ --REFERENCE $fasta \\ --URI $fasta \\ --TMP_DIR . \\ diff --git a/modules/nf-core/gatk4/createsequencedictionary/meta.yml b/modules/nf-core/gatk4/createsequencedictionary/meta.yml index bd247888..69c23581 100644 --- a/modules/nf-core/gatk4/createsequencedictionary/meta.yml +++ b/modules/nf-core/gatk4/createsequencedictionary/meta.yml @@ -5,28 +5,28 @@ keywords: - fasta tools: - gatk: - description: | - Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools - with a primary focus on variant discovery and genotyping. Its powerful processing engine - and high-performance computing features make it capable of taking on projects of any size. - homepage: https://gatk.broadinstitute.org/hc/en-us - documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s - doi: 10.1158/1538-7445.AM2017-3590 - licence: ["Apache-2.0"] + description: | + Developed in the Data Sciences Platform at the Broad Institute, the toolkit offers a wide variety of tools + with a primary focus on variant discovery and genotyping. Its powerful processing engine + and high-performance computing features make it capable of taking on projects of any size. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 + licence: ["Apache-2.0"] input: - fasta: - type: file - description: Input fasta file - pattern: "*.{fasta,fa}" + type: file + description: Input fasta file + pattern: "*.{fasta,fa}" output: - dict: - type: file - description: gatk dictionary file - pattern: "*.{dict}" + type: file + description: gatk dictionary file + pattern: "*.{dict}" - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@maxulysse" diff --git a/modules/nf-core/gatk4/filtermutectcalls/main.nf b/modules/nf-core/gatk4/filtermutectcalls/main.nf index f3585bb3..09643857 100644 --- a/modules/nf-core/gatk4/filtermutectcalls/main.nf +++ b/modules/nf-core/gatk4/filtermutectcalls/main.nf @@ -2,10 +2,10 @@ process GATK4_FILTERMUTECTCALLS { tag "$meta.id" label 'process_low' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(vcf), path(vcf_tbi), path(stats), path(orientationbias), path(segmentation), path(table), val(estimate) @@ -31,14 +31,14 @@ process GATK4_FILTERMUTECTCALLS { def estimate_command = estimate ? " --contamination-estimate ${estimate} " : '' def table_command = table ? " --contamination-table ${table} " : '' - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK FilterMutectCalls] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" FilterMutectCalls \\ + gatk --java-options "-Xmx${avail_mem}M" FilterMutectCalls \\ --variant $vcf \\ --output ${prefix}.vcf.gz \\ --reference $fasta \\ diff --git a/modules/nf-core/gatk4/intervallisttools/main.nf b/modules/nf-core/gatk4/intervallisttools/main.nf index 84da7bf7..e221dc01 100644 --- a/modules/nf-core/gatk4/intervallisttools/main.nf +++ b/modules/nf-core/gatk4/intervallisttools/main.nf @@ -2,10 +2,10 @@ process GATK4_INTERVALLISTTOOLS { tag "$meta.id" label 'process_medium' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(intervals) @@ -21,17 +21,17 @@ process GATK4_INTERVALLISTTOOLS { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK IntervalListTools] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ mkdir ${prefix}_split - gatk --java-options "-Xmx${avail_mem}g" IntervalListTools \\ + gatk --java-options "-Xmx${avail_mem}M" IntervalListTools \\ --INPUT $intervals \\ --OUTPUT ${prefix}_split \\ --TMP_DIR . \\ diff --git a/modules/nf-core/gatk4/mergebamalignment/main.nf b/modules/nf-core/gatk4/mergebamalignment/main.nf index 6bbab76c..9ee676ce 100644 --- a/modules/nf-core/gatk4/mergebamalignment/main.nf +++ b/modules/nf-core/gatk4/mergebamalignment/main.nf @@ -2,10 +2,10 @@ process GATK4_MERGEBAMALIGNMENT { tag "$meta.id" label 'process_low' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(aligned), path(unmapped) @@ -23,14 +23,14 @@ process GATK4_MERGEBAMALIGNMENT { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK MergeBamAlignment] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" MergeBamAlignment \\ + gatk --java-options "-Xmx${avail_mem}M" MergeBamAlignment \\ --UNMAPPED_BAM $unmapped \\ --ALIGNED_BAM $aligned \\ --OUTPUT ${prefix}.bam \\ diff --git a/modules/nf-core/gatk4/mergevcfs/main.nf b/modules/nf-core/gatk4/mergevcfs/main.nf index d418468f..d0f48757 100644 --- a/modules/nf-core/gatk4/mergevcfs/main.nf +++ b/modules/nf-core/gatk4/mergevcfs/main.nf @@ -2,10 +2,10 @@ process GATK4_MERGEVCFS { tag "$meta.id" label 'process_medium' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(vcf) @@ -25,14 +25,14 @@ process GATK4_MERGEVCFS { def input_list = vcf.collect{ "--INPUT $it"}.join(' ') def reference_command = dict ? "--SEQUENCE_DICTIONARY $dict" : "" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK MergeVcfs] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" MergeVcfs \\ + gatk --java-options "-Xmx${avail_mem}M" MergeVcfs \\ $input_list \\ --OUTPUT ${prefix}.vcf.gz \\ $reference_command \\ diff --git a/modules/nf-core/gatk4/mutect2/main.nf b/modules/nf-core/gatk4/mutect2/main.nf index c2085266..97e3408f 100644 --- a/modules/nf-core/gatk4/mutect2/main.nf +++ b/modules/nf-core/gatk4/mutect2/main.nf @@ -2,10 +2,10 @@ process GATK4_MUTECT2 { tag "$meta.id" label 'process_medium' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(input), path(input_index), path(intervals) @@ -35,14 +35,14 @@ process GATK4_MUTECT2 { def pon_command = panel_of_normals ? "--panel-of-normals $panel_of_normals" : "" def gr_command = germline_resource ? "--germline-resource $germline_resource" : "" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK Mutect2] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" Mutect2 \\ + gatk --java-options "-Xmx${avail_mem}M" Mutect2 \\ $inputs \\ --output ${prefix}.vcf.gz \\ --reference $fasta \\ diff --git a/modules/nf-core/gatk4/printreads/main.nf b/modules/nf-core/gatk4/printreads/main.nf index 26a70681..13e722bd 100644 --- a/modules/nf-core/gatk4/printreads/main.nf +++ b/modules/nf-core/gatk4/printreads/main.nf @@ -2,10 +2,10 @@ process GATK4_PRINTREADS { tag "$meta.id" label 'process_single' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(input), path(index) @@ -25,18 +25,18 @@ process GATK4_PRINTREADS { script: def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK PrintReads] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } if ("${input}" == "${prefix}.${input.extension}") { error("Output filename is the same as input filename. Please specify a different prefix.") } """ - gatk --java-options "-Xmx${avail_mem}g" PrintReads \\ + gatk --java-options "-Xmx${avail_mem}M" PrintReads \\ $args \\ --reference $fasta \\ --input $input \\ diff --git a/modules/nf-core/gatk4/revertsam/main.nf b/modules/nf-core/gatk4/revertsam/main.nf index 9fe041c4..5481ea49 100644 --- a/modules/nf-core/gatk4/revertsam/main.nf +++ b/modules/nf-core/gatk4/revertsam/main.nf @@ -2,10 +2,10 @@ process GATK4_REVERTSAM { tag "$meta.id" label 'process_medium' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -21,14 +21,14 @@ process GATK4_REVERTSAM { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK RevertSam] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" RevertSam \\ + gatk --java-options "-Xmx${avail_mem}M" RevertSam \\ --INPUT $bam \\ --OUTPUT ${prefix}.reverted.bam \\ --TMP_DIR . \\ diff --git a/modules/nf-core/gatk4/samtofastq/main.nf b/modules/nf-core/gatk4/samtofastq/main.nf index 9ba5ea8d..585fc582 100644 --- a/modules/nf-core/gatk4/samtofastq/main.nf +++ b/modules/nf-core/gatk4/samtofastq/main.nf @@ -2,10 +2,10 @@ process GATK4_SAMTOFASTQ { tag "$meta.id" label 'process_medium' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -22,14 +22,14 @@ process GATK4_SAMTOFASTQ { def prefix = task.ext.prefix ?: "${meta.id}" def output = meta.single_end ? "--FASTQ ${prefix}.fastq.gz" : "--FASTQ ${prefix}_1.fastq.gz --SECOND_END_FASTQ ${prefix}_2.fastq.gz" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK SamToFastq] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" SamToFastq \\ + gatk --java-options "-Xmx${avail_mem}M" SamToFastq \\ --INPUT $bam \\ $output \\ --TMP_DIR . \\ diff --git a/modules/nf-core/gatk4/selectvariants/main.nf b/modules/nf-core/gatk4/selectvariants/main.nf index 0c4fcceb..001b7f68 100644 --- a/modules/nf-core/gatk4/selectvariants/main.nf +++ b/modules/nf-core/gatk4/selectvariants/main.nf @@ -2,10 +2,10 @@ process GATK4_SELECTVARIANTS { tag "$meta.id" label 'process_medium' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(vcf), path(vcf_idx), path (intervals) @@ -22,14 +22,14 @@ process GATK4_SELECTVARIANTS { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def interval = intervals ? "--intervals ${intervals}" : "" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK SelectVariants] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.toGiga() + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}G" SelectVariants \\ + gatk --java-options "-Xmx${avail_mem}M" SelectVariants \\ --variant $vcf \\ --output ${prefix}.selectvariants.vcf.gz \\ $interval \\ diff --git a/modules/nf-core/gatk4/splitintervals/main.nf b/modules/nf-core/gatk4/splitintervals/main.nf index 1640806b..a40abe45 100644 --- a/modules/nf-core/gatk4/splitintervals/main.nf +++ b/modules/nf-core/gatk4/splitintervals/main.nf @@ -2,10 +2,10 @@ process GATK4_SPLITINTERVALS { tag "$meta.id" label 'process_low' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(intervals) @@ -25,15 +25,15 @@ process GATK4_SPLITINTERVALS { def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference $fasta" : "" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK SplitIntervals] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" SplitIntervals \\ + gatk --java-options "-Xmx${avail_mem}M" SplitIntervals \\ --output ${prefix} \\ --intervals $intervals \\ $reference \\ diff --git a/modules/nf-core/gatk4/splitintervals/meta.yml b/modules/nf-core/gatk4/splitintervals/meta.yml index ba557544..701c6893 100644 --- a/modules/nf-core/gatk4/splitintervals/meta.yml +++ b/modules/nf-core/gatk4/splitintervals/meta.yml @@ -1,4 +1,5 @@ name: gatk4_splitintervals +description: Split intervals into sub-interval files. keywords: - interval - bed diff --git a/modules/nf-core/gatk4/variantfiltration/main.nf b/modules/nf-core/gatk4/variantfiltration/main.nf index e2837a91..cc03ff3c 100644 --- a/modules/nf-core/gatk4/variantfiltration/main.nf +++ b/modules/nf-core/gatk4/variantfiltration/main.nf @@ -2,10 +2,10 @@ process GATK4_VARIANTFILTRATION { tag "$meta.id" label 'process_medium' - conda "bioconda::gatk4=4.3.0.0" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.3.0.0--py36hdfd78af_0': - 'quay.io/biocontainers/gatk4:4.3.0.0--py36hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(vcf), path(tbi) @@ -25,14 +25,14 @@ process GATK4_VARIANTFILTRATION { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[GATK VariantFiltration] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.toGiga() + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}G" VariantFiltration \\ + gatk --java-options "-Xmx${avail_mem}M" VariantFiltration \\ --variant $vcf \\ --output ${prefix}.vcf.gz \\ --reference $fasta \\ diff --git a/modules/nf-core/genmod/annotate/meta.yml b/modules/nf-core/genmod/annotate/meta.yml index 5df7f666..b142f96b 100644 --- a/modules/nf-core/genmod/annotate/meta.yml +++ b/modules/nf-core/genmod/annotate/meta.yml @@ -9,7 +9,7 @@ tools: homepage: "https://github.com/Clinical-Genomics/genmod" documentation: "https://github.com/Clinical-Genomics/genmod" tool_dev_url: "https://github.com/moonso" - doi: "" + licence: "['MIT']" input: - meta: diff --git a/modules/nf-core/genmod/compound/meta.yml b/modules/nf-core/genmod/compound/meta.yml index 27fb3cdf..831ba341 100644 --- a/modules/nf-core/genmod/compound/meta.yml +++ b/modules/nf-core/genmod/compound/meta.yml @@ -9,7 +9,7 @@ tools: homepage: "https://github.com/Clinical-Genomics/genmod" documentation: "https://github.com/Clinical-Genomics/genmod" tool_dev_url: "https://github.com/moonso" - doi: "" + licence: "['MIT']" input: - meta: diff --git a/modules/nf-core/genmod/models/meta.yml b/modules/nf-core/genmod/models/meta.yml index 42c80f7a..240f79df 100644 --- a/modules/nf-core/genmod/models/meta.yml +++ b/modules/nf-core/genmod/models/meta.yml @@ -9,7 +9,7 @@ tools: homepage: "https://github.com/Clinical-Genomics/genmod" documentation: "https://github.com/Clinical-Genomics/genmod" tool_dev_url: "https://github.com/moonso" - doi: "" + licence: "['MIT']" input: - meta: diff --git a/modules/nf-core/genmod/score/meta.yml b/modules/nf-core/genmod/score/meta.yml index 3c0ae932..26bb22ae 100644 --- a/modules/nf-core/genmod/score/meta.yml +++ b/modules/nf-core/genmod/score/meta.yml @@ -9,7 +9,7 @@ tools: homepage: "https://github.com/Clinical-Genomics/genmod" documentation: "https://github.com/Clinical-Genomics/genmod" tool_dev_url: "https://github.com/moonso" - doi: "" + licence: "['MIT']" input: - meta: diff --git a/modules/nf-core/glnexus/meta.yml b/modules/nf-core/glnexus/meta.yml index 0fc19452..89e4c74e 100644 --- a/modules/nf-core/glnexus/meta.yml +++ b/modules/nf-core/glnexus/meta.yml @@ -8,8 +8,8 @@ tools: description: scalable gVCF merging and joint variant calling for population sequencing projects. homepage: https://github.com/dnanexus-rnd/GLnexus documentation: https://github.com/dnanexus-rnd/GLnexus/wiki/Getting-Started - tool_dev_url: None - doi: https://doi.org/10.1101/343970 + + doi: 10.1101/343970 licence: ["Apache-2.0"] input: diff --git a/modules/nf-core/haplogrep2/classify/meta.yml b/modules/nf-core/haplogrep2/classify/meta.yml index b4c2ec66..d21cc9b5 100644 --- a/modules/nf-core/haplogrep2/classify/meta.yml +++ b/modules/nf-core/haplogrep2/classify/meta.yml @@ -8,7 +8,7 @@ tools: homepage: "https://github.com/seppinho/haplogrep-cmd" documentation: "https://github.com/seppinho/haplogrep-cmd" tool_dev_url: "https://github.com/seppinho/haplogrep-cmd" - doi: "" + licence: "['MIT']" input: @@ -22,7 +22,8 @@ input: description: valid options are hsd, vcf, or fasta files pattern: "*.{vcf,vcf.gz,fasta,hsd}" - format: - type: stringformat of file either vcf fasta or hsd + type: string + description: either "vcf", "fasta" or "hsd" output: - meta: diff --git a/modules/nf-core/hmtnote/meta.yml b/modules/nf-core/hmtnote/meta.yml index 92b4be1b..4221ff2b 100644 --- a/modules/nf-core/hmtnote/meta.yml +++ b/modules/nf-core/hmtnote/meta.yml @@ -7,8 +7,8 @@ tools: description: Human mitochondrial variants annotation using HmtVar. homepage: https://github.com/robertopreste/HmtNote documentation: https://hmtnote.readthedocs.io/en/latest/usage.html - tool_dev_url: None - doi: "https://doi.org/10.1101/600619" + + doi: "10.1101/600619" licence: ["MIT"] input: diff --git a/modules/nf-core/mosdepth/main.nf b/modules/nf-core/mosdepth/main.nf index be4be831..827c489e 100644 --- a/modules/nf-core/mosdepth/main.nf +++ b/modules/nf-core/mosdepth/main.nf @@ -8,9 +8,8 @@ process MOSDEPTH { 'quay.io/biocontainers/mosdepth:0.3.3--hdfd78af_1'}" input: - tuple val(meta), path(bam), path(bai) - tuple val(meta2), path(bed) - tuple val(meta3), path(fasta) + tuple val(meta), path(bam), path(bai), path(bed) + tuple val(meta2), path(fasta) output: tuple val(meta), path('*.global.dist.txt') , emit: global_txt diff --git a/modules/nf-core/picard/addorreplacereadgroups/main.nf b/modules/nf-core/picard/addorreplacereadgroups/main.nf index 01a97428..c6b1be37 100644 --- a/modules/nf-core/picard/addorreplacereadgroups/main.nf +++ b/modules/nf-core/picard/addorreplacereadgroups/main.nf @@ -2,10 +2,10 @@ process PICARD_ADDORREPLACEREADGROUPS { tag "$meta.id" label 'process_low' - conda "bioconda::picard=2.27.4" + conda "bioconda::picard=3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : + 'quay.io/biocontainers/picard:3.0.0--hdfd78af_1' }" input: tuple val(meta), path(bam) @@ -21,15 +21,15 @@ process PICARD_ADDORREPLACEREADGROUPS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[Picard AddOrReplaceReadGroups] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ picard \\ - -Xmx${avail_mem}g \\ + -Xmx${avail_mem}M \\ AddOrReplaceReadGroups \\ $args \\ --INPUT ${bam} \\ @@ -37,7 +37,7 @@ process PICARD_ADDORREPLACEREADGROUPS { cat <<-END_VERSIONS > versions.yml "${task.process}": - picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o -E '[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+') + picard: \$(picard AddOrReplaceReadGroups --version 2>&1 | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ diff --git a/modules/nf-core/picard/collecthsmetrics/main.nf b/modules/nf-core/picard/collecthsmetrics/main.nf index ee8116ec..5f1e9c90 100644 --- a/modules/nf-core/picard/collecthsmetrics/main.nf +++ b/modules/nf-core/picard/collecthsmetrics/main.nf @@ -2,10 +2,10 @@ process PICARD_COLLECTHSMETRICS { tag "$meta.id" label 'process_single' - conda "bioconda::picard=2.27.4" + conda "bioconda::picard=3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : + 'quay.io/biocontainers/picard:3.0.0--hdfd78af_1' }" input: tuple val(meta), path(bam), path(bai) @@ -26,15 +26,15 @@ process PICARD_COLLECTHSMETRICS { def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[Picard CollectHsMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ picard \\ - -Xmx${avail_mem}g \\ + -Xmx${avail_mem}M \\ CollectHsMetrics \\ $args \\ $reference \\ diff --git a/modules/nf-core/picard/collectmultiplemetrics/main.nf b/modules/nf-core/picard/collectmultiplemetrics/main.nf index 73cdaf3a..ed88dbe7 100644 --- a/modules/nf-core/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/picard/collectmultiplemetrics/main.nf @@ -2,10 +2,10 @@ process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_single' - conda "bioconda::picard=2.27.4" + conda "bioconda::picard=3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : + 'quay.io/biocontainers/picard:3.0.0--hdfd78af_1' }" input: tuple val(meta) , path(bam), path(bai) @@ -24,15 +24,15 @@ process PICARD_COLLECTMULTIPLEMETRICS { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ picard \\ - -Xmx${avail_mem}g \\ + -Xmx${avail_mem}M \\ CollectMultipleMetrics \\ $args \\ --INPUT $bam \\ diff --git a/modules/nf-core/picard/collectwgsmetrics/main.nf b/modules/nf-core/picard/collectwgsmetrics/main.nf index b767b99c..5d2a39b8 100644 --- a/modules/nf-core/picard/collectwgsmetrics/main.nf +++ b/modules/nf-core/picard/collectwgsmetrics/main.nf @@ -2,10 +2,10 @@ process PICARD_COLLECTWGSMETRICS { tag "$meta.id" label 'process_single' - conda "bioconda::picard=2.27.4 r::r-base" + conda "bioconda::picard=3.0.0 r::r-base" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : + 'quay.io/biocontainers/picard:3.0.0--hdfd78af_1' }" input: tuple val(meta), path(bam), path(bai) @@ -23,16 +23,16 @@ process PICARD_COLLECTWGSMETRICS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 def interval = intervallist ? "--INTERVALS ${intervallist}" : '' if (!task.memory) { log.info '[Picard CollectWgsMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ picard \\ - -Xmx${avail_mem}g \\ + -Xmx${avail_mem}M \\ CollectWgsMetrics \\ $args \\ --INPUT $bam \\ diff --git a/modules/nf-core/picard/collectwgsmetrics/meta.yml b/modules/nf-core/picard/collectwgsmetrics/meta.yml index 57ab9cfe..2f8dbd3c 100644 --- a/modules/nf-core/picard/collectwgsmetrics/meta.yml +++ b/modules/nf-core/picard/collectwgsmetrics/meta.yml @@ -29,6 +29,7 @@ input: description: (Optional) Aligned reads file index pattern: "*.{bai,crai}" - meta2: + type: map description: | Groovy Map containing reference information e.g. [ id:'genome' ] @@ -37,6 +38,7 @@ input: description: Genome fasta file pattern: "*.{fa,fasta,fna}" - meta2: + type: map description: | Groovy Map containing reference information e.g. [ id:'genome' ] diff --git a/modules/nf-core/picard/liftovervcf/main.nf b/modules/nf-core/picard/liftovervcf/main.nf index 04336271..935fb544 100644 --- a/modules/nf-core/picard/liftovervcf/main.nf +++ b/modules/nf-core/picard/liftovervcf/main.nf @@ -2,10 +2,10 @@ process PICARD_LIFTOVERVCF { tag "$meta.id" label 'process_low' - conda "bioconda::picard=2.27.4" + conda "bioconda::picard=3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : + 'quay.io/biocontainers/picard:3.0.0--hdfd78af_1' }" input: tuple val(meta), path(input_vcf) @@ -24,15 +24,15 @@ process PICARD_LIFTOVERVCF { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 1 + def avail_mem = 3072 if (!task.memory) { - log.info '[Picard LiftoverVcf] Available memory not known - defaulting to 1GB. Specify process memory requirements to change this.' + log.info '[Picard LiftoverVcf] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ picard \\ - -Xmx${avail_mem}g \\ + -Xmx${avail_mem}M \\ LiftoverVcf \\ $args \\ --INPUT $input_vcf \\ diff --git a/modules/nf-core/picard/liftovervcf/meta.yml b/modules/nf-core/picard/liftovervcf/meta.yml index 55f04963..be42aba4 100644 --- a/modules/nf-core/picard/liftovervcf/meta.yml +++ b/modules/nf-core/picard/liftovervcf/meta.yml @@ -9,7 +9,7 @@ tools: homepage: https://gatk.broadinstitute.org/hc/en-us/articles/360037060932-LiftoverVcf-Picard documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360037060932-LiftoverVcf-Picard tool_dev_url: https://github.com/broadinstitute/picard - doi: "" + licence: ["MIT"] input: diff --git a/modules/nf-core/picard/markduplicates/main.nf b/modules/nf-core/picard/markduplicates/main.nf index 14800392..1fe6ee2d 100644 --- a/modules/nf-core/picard/markduplicates/main.nf +++ b/modules/nf-core/picard/markduplicates/main.nf @@ -2,10 +2,10 @@ process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - conda "bioconda::picard=2.27.4" + conda "bioconda::picard=3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : + 'quay.io/biocontainers/picard:3.0.0--hdfd78af_1' }" input: tuple val(meta), path(bam) @@ -24,15 +24,15 @@ process PICARD_MARKDUPLICATES { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ picard \\ - -Xmx${avail_mem}g \\ + -Xmx${avail_mem}M \\ MarkDuplicates \\ $args \\ --INPUT $bam \\ diff --git a/modules/nf-core/picard/renamesampleinvcf/main.nf b/modules/nf-core/picard/renamesampleinvcf/main.nf index 5fadbd40..646a953d 100644 --- a/modules/nf-core/picard/renamesampleinvcf/main.nf +++ b/modules/nf-core/picard/renamesampleinvcf/main.nf @@ -3,10 +3,10 @@ process PICARD_RENAMESAMPLEINVCF { tag "$meta.id" label 'process_single' - conda "bioconda::picard=2.27.4" + conda "bioconda::picard=3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : + 'quay.io/biocontainers/picard:3.0.0--hdfd78af_1' }" input: tuple val(meta), path(vcf) @@ -22,17 +22,17 @@ process PICARD_RENAMESAMPLEINVCF { def args = task.ext.args ?: '' def extended_args = args.contains("--NEW_SAMPLE_NAME") ? $args : "${args} --NEW_SAMPLE_NAME ${meta.id}" def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[Picard RenameSampleInVcf] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ picard \\ RenameSampleInVcf \\ - -Xmx${avail_mem}g \\ + -Xmx${avail_mem}M \\ --INPUT $vcf \\ --OUTPUT ${prefix}_renam.vcf.gz \\ $extended_args diff --git a/modules/nf-core/picard/renamesampleinvcf/meta.yml b/modules/nf-core/picard/renamesampleinvcf/meta.yml index 8f3ed6b4..ac678983 100644 --- a/modules/nf-core/picard/renamesampleinvcf/meta.yml +++ b/modules/nf-core/picard/renamesampleinvcf/meta.yml @@ -11,7 +11,7 @@ tools: homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ tool_dev_url: "https://github.com/broadinstitute/picard" - doi: "" + licence: "['MIT']" input: diff --git a/modules/nf-core/picard/sortvcf/main.nf b/modules/nf-core/picard/sortvcf/main.nf index d3a32a52..0269b0f4 100644 --- a/modules/nf-core/picard/sortvcf/main.nf +++ b/modules/nf-core/picard/sortvcf/main.nf @@ -2,10 +2,10 @@ process PICARD_SORTVCF { tag "$meta.id" label 'process_medium' - conda "bioconda::picard=2.27.4" + conda "bioconda::picard=3.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : + 'quay.io/biocontainers/picard:3.0.0--hdfd78af_1' }" input: tuple val(meta), path(vcf) @@ -24,17 +24,17 @@ process PICARD_SORTVCF { def prefix = task.ext.prefix ?: "${meta.id}" def seq_dict = sequence_dict ? "--SEQUENCE_DICTIONARY $sequence_dict" : "" def reference = reference ? "--REFERENCE_SEQUENCE $reference" : "" - def avail_mem = 3 + def avail_mem = 3072 if (!task.memory) { log.info '[Picard SortVcf] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ picard \\ SortVcf \\ - -Xmx${avail_mem}g \\ + -Xmx${avail_mem}M \\ --INPUT $vcf \\ $args \\ $seq_dict \\ diff --git a/modules/nf-core/qualimap/bamqc/main.nf b/modules/nf-core/qualimap/bamqc/main.nf index 936471ba..810cf402 100644 --- a/modules/nf-core/qualimap/bamqc/main.nf +++ b/modules/nf-core/qualimap/bamqc/main.nf @@ -23,7 +23,7 @@ process QUALIMAP_BAMQC { prefix = task.ext.prefix ?: "${meta.id}" def collect_pairs = meta.single_end ? '' : '--collect-overlap-pairs' - def memory = task.memory.toGiga() + "G" + def memory = (task.memory.mega*0.8).intValue() + 'M' def regions = gff ? "--gff $gff" : '' def strandedness = 'non-strand-specific' diff --git a/modules/nf-core/rhocall/annotate/meta.yml b/modules/nf-core/rhocall/annotate/meta.yml index 4ece9d2b..618d0017 100644 --- a/modules/nf-core/rhocall/annotate/meta.yml +++ b/modules/nf-core/rhocall/annotate/meta.yml @@ -9,7 +9,7 @@ tools: homepage: "https://github.com/dnil/rhocall" documentation: "https://github.com/dnil/rhocall" tool_dev_url: "https://github.com/dnil" - doi: "" + licence: "['GPL v3']" input: diff --git a/modules/nf-core/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml index e5cadbc2..8bd2fa6f 100644 --- a/modules/nf-core/samtools/index/meta.yml +++ b/modules/nf-core/samtools/index/meta.yml @@ -12,7 +12,7 @@ tools: short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. These files are generated as output by short read aligners like BWA. homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html + documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] input: diff --git a/modules/nf-core/samtools/merge/meta.yml b/modules/nf-core/samtools/merge/meta.yml index 5bd84bc5..644b768b 100644 --- a/modules/nf-core/samtools/merge/meta.yml +++ b/modules/nf-core/samtools/merge/meta.yml @@ -12,7 +12,7 @@ tools: short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. These files are generated as output by short read aligners like BWA. homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html + documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] input: diff --git a/modules/nf-core/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml index 09289751..07328431 100644 --- a/modules/nf-core/samtools/sort/meta.yml +++ b/modules/nf-core/samtools/sort/meta.yml @@ -12,7 +12,7 @@ tools: short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. These files are generated as output by short read aligners like BWA. homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html + documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] input: diff --git a/modules/nf-core/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml index cac50b1c..1d68a5d8 100644 --- a/modules/nf-core/samtools/stats/meta.yml +++ b/modules/nf-core/samtools/stats/meta.yml @@ -13,7 +13,7 @@ tools: short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. These files are generated as output by short read aligners like BWA. homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html + documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] input: @@ -23,13 +23,13 @@ input: Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - input: - type: file - description: BAM/CRAM file from alignment - pattern: "*.{bam,cram}" + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" - input_index: - type: file - description: BAI/CRAI file from alignment - pattern: "*.{bai,crai}" + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" - fasta: type: optional file description: Reference file the CRAM was created with diff --git a/modules/nf-core/smncopynumbercaller/meta.yml b/modules/nf-core/smncopynumbercaller/meta.yml index 21f057fa..6d4e10b3 100644 --- a/modules/nf-core/smncopynumbercaller/meta.yml +++ b/modules/nf-core/smncopynumbercaller/meta.yml @@ -8,7 +8,7 @@ tools: homepage: "https://github.com/Illumina/SMNCopyNumberCaller" documentation: "https://github.com/Illumina/SMNCopyNumberCaller" tool_dev_url: "https://github.com/Illumina/SMNCopyNumberCaller" - doi: "https://doi.org/10.1038/s41436-020-0754-0" + doi: "10.1038/s41436-020-0754-0" licence: "Apache License Version 2.0" input: diff --git a/modules/nf-core/ucsc/wigtobigwig/meta.yml b/modules/nf-core/ucsc/wigtobigwig/meta.yml index 8eed29bb..a597fde0 100644 --- a/modules/nf-core/ucsc/wigtobigwig/meta.yml +++ b/modules/nf-core/ucsc/wigtobigwig/meta.yml @@ -8,10 +8,7 @@ tools: description: | Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) to binary big wig format - homepage: None - documentation: None - tool_dev_url: None - doi: "" + homepage: http://www.genome.ucsc.edu/goldenPath/help/bigWig.html licence: ["varies; see http://genome.ucsc.edu/license"] input: diff --git a/modules/nf-core/vcfanno/meta.yml b/modules/nf-core/vcfanno/meta.yml index ea4dacce..9e6c1d72 100644 --- a/modules/nf-core/vcfanno/meta.yml +++ b/modules/nf-core/vcfanno/meta.yml @@ -10,7 +10,7 @@ keywords: tools: - vcfanno: description: annotate a VCF with other VCFs/BEDs/tabixed files - homepage: None + documentation: https://github.com/brentp/vcfanno#vcfanno tool_dev_url: https://github.com/brentp/vcfanno doi: "10.1186/s13059-016-0973-5" diff --git a/subworkflows/local/qc_bam.nf b/subworkflows/local/qc_bam.nf index 274d92be..5e3f046b 100644 --- a/subworkflows/local/qc_bam.nf +++ b/subworkflows/local/qc_bam.nf @@ -40,14 +40,8 @@ workflow QC_BAM { UCSC_WIGTOBIGWIG (TIDDIT_COV.out.wig, ch_chrom_sizes) - MOSDEPTH (ch_bam_bai, Channel.value([[], []]), Channel.value([[], []])) - - ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) - ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions.first()) - ch_versions = ch_versions.mix(QUALIMAP_BAMQC.out.versions.first()) - ch_versions = ch_versions.mix(TIDDIT_COV.out.versions.first()) - ch_versions = ch_versions.mix(UCSC_WIGTOBIGWIG.out.versions.first()) - ch_versions = ch_versions.mix(MOSDEPTH.out.versions.first()) + ch_bam_bai.map{ meta, bam, bai -> [meta, bam, bai, []]}.set{ch_mosdepth_in} + MOSDEPTH (ch_mosdepth_in, ch_fasta) // COLLECT WGS METRICS PICARD_COLLECTWGSMETRICS ( ch_bam_bai, ch_fasta, ch_fai, ch_intervals_wgs ) @@ -59,8 +53,14 @@ workflow QC_BAM { ch_cov = Channel.empty().mix(PICARD_COLLECTWGSMETRICS.out.metrics, SENTIEON_WGSMETRICS.out.wgs_metrics) ch_cov_y = Channel.empty().mix(PICARD_COLLECTWGSMETRICS_Y.out.metrics, SENTIEON_WGSMETRICS_Y.out.wgs_metrics) - ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS.out.versions, SENTIEON_WGSMETRICS.out.versions) - ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions, SENTIEON_WGSMETRICS_Y.out.versions) + ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) + ch_versions = ch_versions.mix(PICARD_COLLECTHSMETRICS.out.versions.first()) + ch_versions = ch_versions.mix(QUALIMAP_BAMQC.out.versions.first()) + ch_versions = ch_versions.mix(TIDDIT_COV.out.versions.first()) + ch_versions = ch_versions.mix(UCSC_WIGTOBIGWIG.out.versions.first()) + ch_versions = ch_versions.mix(MOSDEPTH.out.versions.first()) + ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS.out.versions.first(), SENTIEON_WGSMETRICS.out.versions.first()) + ch_versions = ch_versions.mix(PICARD_COLLECTWGSMETRICS_Y.out.versions.first(), SENTIEON_WGSMETRICS_Y.out.versions.first()) emit: multiple_metrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics // channel: [ val(meta), path(metrics) ] From 57b22bc6049f92741bd3a7fa79d61f67aa0b1f00 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Mar 2023 15:42:28 +0100 Subject: [PATCH 1098/1169] remove todo from ci.yml --- .github/workflows/ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3625c69..f7883268 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,8 +39,5 @@ jobs: version: "${{ matrix.NXF_VER }}" - name: Run pipeline with test data - # TODO nf-core: You can customise CI pipeline run tests as required - # For example: adding multiple test runs with different parameters - # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} ${{ matrix.parameters }} -stub --outdir ./results From 5734937abc5ca5bbb2ffd618268736d7564909e0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Mar 2023 22:33:57 +0100 Subject: [PATCH 1099/1169] update readme --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 1e096de7..ef0b5768 100644 --- a/README.md +++ b/README.md @@ -23,12 +23,6 @@ ## Introduction -> NOTE -> -> This pipeline is under development and no stable release has been made yet. -> -> You can follow the work in the [dev](https://github.com/nf-core/raredisease/tree/dev) branch. - **nf-core/raredisease** is a bioinformatics best-practice analysis pipeline for call and score variants from WGS/WES of rare disease patients. The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! From 3f77b052a85780f5eaf4a4ee57381511b24f7304 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Mar 2023 23:21:48 +0100 Subject: [PATCH 1100/1169] remove unused modules --- CITATIONS.md | 4 -- README.md | 1 - conf/genomes.config | 2 - conf/modules/call_cnv_cnvpytor.config | 48 --------------- conf/modules/prepare_vcf.config | 55 ----------------- modules.json | 25 -------- modules/local/check_input_vcf.nf | 60 ------------------- modules/nf-core/cnvpytor/callcnvs/main.nf | 43 ------------- modules/nf-core/cnvpytor/callcnvs/meta.yml | 43 ------------- modules/nf-core/cnvpytor/histogram/main.nf | 44 -------------- modules/nf-core/cnvpytor/histogram/meta.yml | 46 -------------- .../nf-core/cnvpytor/importreaddepth/main.nf | 49 --------------- .../nf-core/cnvpytor/importreaddepth/meta.yml | 55 ----------------- modules/nf-core/cnvpytor/partition/main.nf | 43 ------------- modules/nf-core/cnvpytor/partition/meta.yml | 46 -------------- modules/nf-core/cnvpytor/view/main.nf | 60 ------------------- modules/nf-core/cnvpytor/view/meta.yml | 56 ----------------- nextflow.config | 12 +--- nextflow_schema.json | 23 ------- .../local/call_structural_variants.nf | 17 ------ .../variant_calling/call_cnv_cnvpytor.nf | 54 ----------------- workflows/raredisease.nf | 3 +- 22 files changed, 4 insertions(+), 785 deletions(-) delete mode 100644 conf/modules/call_cnv_cnvpytor.config delete mode 100644 conf/modules/prepare_vcf.config delete mode 100644 modules/local/check_input_vcf.nf delete mode 100644 modules/nf-core/cnvpytor/callcnvs/main.nf delete mode 100644 modules/nf-core/cnvpytor/callcnvs/meta.yml delete mode 100644 modules/nf-core/cnvpytor/histogram/main.nf delete mode 100644 modules/nf-core/cnvpytor/histogram/meta.yml delete mode 100644 modules/nf-core/cnvpytor/importreaddepth/main.nf delete mode 100644 modules/nf-core/cnvpytor/importreaddepth/meta.yml delete mode 100644 modules/nf-core/cnvpytor/partition/main.nf delete mode 100644 modules/nf-core/cnvpytor/partition/meta.yml delete mode 100644 modules/nf-core/cnvpytor/view/main.nf delete mode 100644 modules/nf-core/cnvpytor/view/meta.yml delete mode 100644 subworkflows/local/variant_calling/call_cnv_cnvpytor.nf diff --git a/CITATIONS.md b/CITATIONS.md index 7b554f04..8c6d5631 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -22,10 +22,6 @@ > Vasimuddin Md, Misra S, Li H, Aluru S. Efficient Architecture-Aware Acceleration of BWA-MEM for Multicore Systems. In: 2019 IEEE International Parallel and Distributed Processing Symposium (IPDPS). IEEE; 2019:314-324. doi:10.1109/IPDPS.2019.00041 -- [CNVpytor](https://academic.oup.com/gigascience/article/10/11/giab074/6431715?login=true) - - > Suvakov M, Panda A, Diesh C, Holmes I, Abyzov A. CNVpytor: a tool for copy number variation detection and analysis from read depth and allele imbalance in whole-genome sequencing. GigaScience. 2021;10(11):giab074. doi:10.1093/gigascience/giab074 - - [DeepVariant](https://www.nature.com/articles/nbt.4235) > Poplin R, Chang PC, Alexander D, et al. A universal SNP and small-indel variant caller using deep neural networks. Nat Biotechnol. 2018;36(10):983-987. doi:10.1038/nbt.4235 diff --git a/README.md b/README.md index ef0b5768..5d0273ec 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,6 @@ On release, automated continuous integration tests run the pipeline on a full-si **4. Variant calling - SV:** -- [CNVpytor](https://github.com/abyzovlab/CNVpytor/) - [Manta](https://github.com/Illumina/manta) - [TIDDIT's sv](https://github.com/SciLifeLab/TIDDIT) diff --git a/conf/genomes.config b/conf/genomes.config index 6fab2691..1878bd8f 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -16,7 +16,6 @@ params { bwa_index = "" bwamem2_index = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" call_interval = "" - gnomad_vcf = "${params.local_genomes}/grch37_gnomad_reformated_-r2.1.1-.vcf.gz" gnomad_af = "" gnomad_af_idx = "" intervals_wgs = "${projectDir}/assets/1-22XYMT_grch37.interval_list" @@ -51,7 +50,6 @@ params { bwa_index = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.fasta.{amb,ann,bwt,pac,sa}" bwamem2_index = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" call_interval = "" - gnomad_vcf = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.vcf.gz" gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" gnomad_af_idx = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" diff --git a/conf/modules/call_cnv_cnvpytor.config b/conf/modules/call_cnv_cnvpytor.config deleted file mode 100644 index cce0b1ee..00000000 --- a/conf/modules/call_cnv_cnvpytor.config +++ /dev/null @@ -1,48 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config file for defining DSL2 per module options and publishing paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. - ext.when = Conditional clause ----------------------------------------------------------------------------------------- -*/ - -// -// cnvpytor calling options -// - -process { - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:GENERATE_PYTOR" { - ext.args = { params.cnvpytor_chr ? "-chrom ${params.cnvpytor_chr}" : '' } - } - - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:HISTOGRAMS" { - publishDir = [ - enabled: false - ] - } - - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:PARTITIONS" { - publishDir = [ - enabled: false - ] - } - - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:CALL_CNVS" { - publishDir = [ - enabled: false - ] - } - - withName: ".*CALL_STRUCTURAL_VARIANTS:CALL_CNV_CNVPYTOR:VIEW" { - ext.prefix = { "${meta.id}_cnvpytor" } - publishDir = [ - path: { "${params.outdir}/sv_caller" }, - mode: params.publish_dir_mode, - ] - } -} diff --git a/conf/modules/prepare_vcf.config b/conf/modules/prepare_vcf.config deleted file mode 100644 index 56856837..00000000 --- a/conf/modules/prepare_vcf.config +++ /dev/null @@ -1,55 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config file for defining DSL2 per module options and publishing paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. - ext.when = Conditional clause ----------------------------------------------------------------------------------------- -*/ - -// -// Normalize and index vcf files -// - -process { - - withName: '.*PREPARE_REFERENCES:CHECK_VCF:CHECK_INPUT_VCF' { - ext.when = {params.gnomad_vcf} - publishDir = [ - enabled: false, - ] - } - - withName: '.*PREPARE_REFERENCES:CHECK_VCF:SPLIT_MULTIALLELICS_PV' { - ext.when = {params.gnomad_vcf} - ext.args = '--output-type z --multiallelics -both' - ext.prefix = { "${meta.id}_split" } - publishDir = [ - enabled: false - ] - } - - withName: '.*PREPARE_REFERENCES:CHECK_VCF:REMOVE_DUPLICATES_PV' { - ext.when = {params.gnomad_vcf} - ext.args = '--output-type z --rm-dup none' - ext.prefix = { "${meta.id}_split_rmdup" } - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*PREPARE_REFERENCES:CHECK_VCF:TABIX_PV' { - ext.when = {params.gnomad_vcf} - publishDir = [ - path: { "${params.outdir}/processed_references" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} diff --git a/modules.json b/modules.json index c837fa25..3ccfbc8c 100644 --- a/modules.json +++ b/modules.json @@ -60,31 +60,6 @@ "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, - "cnvpytor/callcnvs": { - "branch": "master", - "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", - "installed_by": ["modules"] - }, - "cnvpytor/histogram": { - "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] - }, - "cnvpytor/importreaddepth": { - "branch": "master", - "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", - "installed_by": ["modules"] - }, - "cnvpytor/partition": { - "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] - }, - "cnvpytor/view": { - "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] - }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "b6d4d476aee074311c89d82a69c1921bd70c8180", diff --git a/modules/local/check_input_vcf.nf b/modules/local/check_input_vcf.nf deleted file mode 100644 index bc020ff1..00000000 --- a/modules/local/check_input_vcf.nf +++ /dev/null @@ -1,60 +0,0 @@ -process CHECK_INPUT_VCF { - tag "check_vcf" - label 'process_single' - - conda "conda-forge::python=3.9.5" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'quay.io/biocontainers/python:3.9--1' }" - - input: - path vcf - - output: - path '*.csv' , emit: csv - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: // This script is bundled with the pipeline, in nf-core/raredisease/bin/ - """ - export INPUT_FILE=${vcf} - export OUTPUT_FILE="checked_vcfs.csv" - - python3 < versions.yml - "${task.process}": - change_input_vcf: v1.0 - END_VERSIONS - """ - - stub: - """ - touch checked_vcfs.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - check_input_vcf: v1.0 - END_VERSIONS - """ -} diff --git a/modules/nf-core/cnvpytor/callcnvs/main.nf b/modules/nf-core/cnvpytor/callcnvs/main.nf deleted file mode 100644 index 2a92a3d2..00000000 --- a/modules/nf-core/cnvpytor/callcnvs/main.nf +++ /dev/null @@ -1,43 +0,0 @@ -process CNVPYTOR_CALLCNVS { - tag "$meta.id" - label 'process_medium' - - conda "bioconda::cnvpytor=1.2.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': - 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" - - input: - tuple val(meta), path(pytor) - val bin_sizes - - output: - tuple val(meta), path("${pytor.baseName}.pytor") , emit: pytor - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def bins = bin_sizes ?: '1000' - """ - cnvpytor \\ - -root $pytor \\ - -call $bin_sizes - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ - - stub: - """ - touch ${pytor.baseName}.pytor - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/cnvpytor/callcnvs/meta.yml b/modules/nf-core/cnvpytor/callcnvs/meta.yml deleted file mode 100644 index 132defb3..00000000 --- a/modules/nf-core/cnvpytor/callcnvs/meta.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: cnvpytor_callcnvs -description: command line tool for calling CNVs in whole genome sequencing data -keywords: - - CNV calling -tools: - - cnvpytor: - description: calling CNVs using read depth - homepage: https://github.com/abyzovlab/CNVpytor - documentation: https://github.com/abyzovlab/CNVpytor - tool_dev_url: https://github.com/abyzovlab/CNVpytor - doi: "10.1101/2021.01.27.428472v1" - licence: ["MIT"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test'] - - pytor: - type: file - description: pytor file containing partitions of read depth histograms using mean-shift method - pattern: "*.{pytor}" - - bin_sizes: - type: string - description: list of binsizes separated by space e.g. "1000 10000" and "1000" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - pytor: - type: file - description: pytor files containing cnv calls - pattern: "*.{pytor}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@sima-r" diff --git a/modules/nf-core/cnvpytor/histogram/main.nf b/modules/nf-core/cnvpytor/histogram/main.nf deleted file mode 100644 index aebb4f89..00000000 --- a/modules/nf-core/cnvpytor/histogram/main.nf +++ /dev/null @@ -1,44 +0,0 @@ -process CNVPYTOR_HISTOGRAM { - tag "$meta.id" - label 'process_medium' - - conda "bioconda::cnvpytor=1.2.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': - 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" - - input: - tuple val(meta), path(pytor) - val bin_sizes - - - output: - tuple val(meta), path("${pytor.baseName}.pytor") , emit: pytor - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def bins = bin_sizes ?: '1000' - """ - cnvpytor \\ - -root $pytor \\ - -his $bins - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ - - stub: - """ - touch ${pytor.baseName}.pytor - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/cnvpytor/histogram/meta.yml b/modules/nf-core/cnvpytor/histogram/meta.yml deleted file mode 100644 index ecd48b9a..00000000 --- a/modules/nf-core/cnvpytor/histogram/meta.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: cnvpytor_histogram -description: calculates read depth histograms -keywords: - - cnv calling - - histogram -tools: - - cnvpytor: - description: calling CNVs using read depth - homepage: https://github.com/abyzovlab/CNVpytor - documentation: https://github.com/abyzovlab/CNVpytor - tool_dev_url: https://github.com/abyzovlab/CNVpytor - doi: "10.1101/2021.01.27.428472v1" - licence: ["MIT"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - pytor: - type: file - description: pytor file containing read depth data - pattern: "*.{pytor}" - - bin_sizes: - type: string - description: list of binsizes separated by space e.g. "1000 10000" and "1000" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - pytor: - type: file - description: pytor file containing read depth histograms binned based on given bin size(s) - pattern: "*.{pytor}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@sima-r" - - "@ramprasadn" diff --git a/modules/nf-core/cnvpytor/importreaddepth/main.nf b/modules/nf-core/cnvpytor/importreaddepth/main.nf deleted file mode 100644 index 860f4f74..00000000 --- a/modules/nf-core/cnvpytor/importreaddepth/main.nf +++ /dev/null @@ -1,49 +0,0 @@ -process CNVPYTOR_IMPORTREADDEPTH { - tag "$meta.id" - label 'process_medium' - - conda "bioconda::cnvpytor=1.2.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': - 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" - - input: - tuple val(meta), path(input_file), path(index) - path fasta - path fai - - output: - tuple val(meta), path("*.pytor") , emit: pytor - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def reference = fasta ? "-T ${fasta}" : '' - """ - cnvpytor \\ - -root ${prefix}.pytor \\ - -rd $input_file \\ - $args \\ - $reference - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.pytor - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/cnvpytor/importreaddepth/meta.yml b/modules/nf-core/cnvpytor/importreaddepth/meta.yml deleted file mode 100644 index 3f8e2136..00000000 --- a/modules/nf-core/cnvpytor/importreaddepth/meta.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: cnvpytor_importreaddepth -description: command line tool for CNV/CNA analysis. This step imports the read depth data into a root pytor file. -keywords: - - read depth - - cnv calling -tools: - - cnvpytor -rd: - description: calling CNVs using read depth - homepage: https://github.com/abyzovlab/CNVpytor - documentation: https://github.com/abyzovlab/CNVpytor - tool_dev_url: https://github.com/abyzovlab/CNVpytor - doi: "10.1101/2021.01.27.428472v1" - licence: ["MIT"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - input_file: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram}" - - index: - type: file - description: bam file index - pattern: "*.{bai,crai}" - - fasta: - type: file - description: specifies reference genome file (only for cram file without reference genome) - pattern: "*.{fasta,fasta.gz,fa,fa.gz}" - - fai: - type: file - description: Index of reference fasta file - pattern: "*.fai" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - pytor: - type: file - description: read depth root file in which read depth data binned to 100 base pair bins will be stored. - pattern: "*.{pytor}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@sima-r" - - "@ramprasadn" diff --git a/modules/nf-core/cnvpytor/partition/main.nf b/modules/nf-core/cnvpytor/partition/main.nf deleted file mode 100644 index 46b46401..00000000 --- a/modules/nf-core/cnvpytor/partition/main.nf +++ /dev/null @@ -1,43 +0,0 @@ -process CNVPYTOR_PARTITION { - tag "$meta.id" - label 'process_medium' - - conda "bioconda::cnvpytor=1.2.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': - 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" - - input: - tuple val(meta), path(pytor) - val bin_sizes - - output: - tuple val(meta), path("${pytor.baseName}.pytor"), emit: pytor - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def bins = bin_sizes ?: '1000' - """ - cnvpytor \\ - -root $pytor \\ - -partition $bins - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ - - stub: - """ - touch ${pytor.baseName}.pytor - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/cnvpytor/partition/meta.yml b/modules/nf-core/cnvpytor/partition/meta.yml deleted file mode 100644 index 17b5e199..00000000 --- a/modules/nf-core/cnvpytor/partition/meta.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: cnvpytor_partition -description: partitioning read depth histograms -keywords: - - cnv calling - - partition histograms -tools: - - cnvpytor: - description: calling CNVs using read depth - homepage: https://github.com/abyzovlab/CNVpytor - documentation: https://github.com/abyzovlab/CNVpytor - tool_dev_url: https://github.com/abyzovlab/CNVpytor - doi: "10.1101/2021.01.27.428472v1" - licence: ["MIT"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - pytor: - type: file - description: pytor file containing read depth data - pattern: "*.{pytor}" - - bin_sizes: - type: string - description: list of binsizes separated by space e.g. "1000 10000" and "1000" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - partitions: - type: file - description: pytor file containing partitions of read depth histograms using mean-shift method - pattern: "*.{pytor}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@sima-r" - - "@ramprasadn" diff --git a/modules/nf-core/cnvpytor/view/main.nf b/modules/nf-core/cnvpytor/view/main.nf deleted file mode 100644 index bf1edc92..00000000 --- a/modules/nf-core/cnvpytor/view/main.nf +++ /dev/null @@ -1,60 +0,0 @@ -process CNVPYTOR_VIEW { - tag "$meta.id" - label 'process_medium' - - conda "bioconda::cnvpytor=1.2.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvpytor:1.2.1--pyhdfd78af_0': - 'quay.io/biocontainers/cnvpytor:1.2.1--pyhdfd78af_0' }" - - input: - tuple val(meta), path(pytor_files) - val bin_sizes - val output_format - - output: - tuple val(meta), path("*.vcf"), emit: vcf , optional: true - tuple val(meta), path("*.tsv"), emit: tsv , optional: true - tuple val(meta), path("*.xls"), emit: xls , optional: true - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def output_suffix = output_format ?: 'vcf' - def bins = bin_sizes ?: '1000' - def input = pytor_files.join(" ") - def prefix = task.ext.prefix ?: "${meta.id}" - """ - - python3 < versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ - - stub: - def output_suffix = output_format ?: 'vcf' - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.${output_suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvpytor: \$(echo \$(cnvpytor --version 2>&1) | sed 's/CNVpytor //' ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/cnvpytor/view/meta.yml b/modules/nf-core/cnvpytor/view/meta.yml deleted file mode 100644 index e4e68fad..00000000 --- a/modules/nf-core/cnvpytor/view/meta.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: cnvpytor_view -description: view function to generate vcfs -keywords: - - cnv calling -tools: - - cnvpytor: - description: calling CNVs using read depth - homepage: https://github.com/abyzovlab/CNVpytor - documentation: https://github.com/abyzovlab/CNVpytor - tool_dev_url: https://github.com/abyzovlab/CNVpytor - doi: "10.1101/2021.01.27.428472v1" - licence: ["MIT"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - pytor_files: - type: file - description: pytor file containing cnv calls. To merge calls from multiple samples use a list of files. - pattern: "*.{pytor}" - - bin_sizes: - type: string - description: list of binsizes separated by space e.g. "1000 10000" and "1000" - - output_format: - type: string - description: output format of the cnv calls. Valid entries are "tsv", "vcf", and "xls" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - tsv: - type: file - description: tsv file containing cnv calls - pattern: "*.{tsv}" - - vcf: - type: file - description: vcf file containing cnv calls - pattern: "*.{vcf}" - - xls: - type: file - description: xls file containing cnv calls - pattern: "*.{xls}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@sima-r" - - "@ramprasadn" diff --git a/nextflow.config b/nextflow.config index 857887e8..b1e22a23 100644 --- a/nextflow.config +++ b/nextflow.config @@ -42,10 +42,6 @@ params { pcr_amplification = false variant_type = 'snp,indel' - // CNVpytor - cnvpytor_chr = null - cnvpytor_binsizes = '1000' - // MultiQC options multiqc_config = null multiqc_title = null @@ -249,17 +245,16 @@ includeConfig 'conf/modules/raredisease.config' includeConfig 'conf/modules/align.config' includeConfig 'conf/modules/analyse_MT.config' includeConfig 'conf/modules/call_snv.config' +includeConfig 'conf/modules/call_structural_variants.config' +includeConfig 'conf/modules/annotate_snvs.config' +includeConfig 'conf/modules/annotate_structural_variants.config' includeConfig 'conf/modules/align_and_call_MT.config' includeConfig 'conf/modules/align_bwamem2.config' includeConfig 'conf/modules/align_sentieon.config' includeConfig 'conf/modules/annotate_consequence_pli.config' -includeConfig 'conf/modules/annotate_snvs.config' -includeConfig 'conf/modules/annotate_structural_variants.config' -includeConfig 'conf/modules/call_cnv_cnvpytor.config' includeConfig 'conf/modules/call_repeat_expansions.config' includeConfig 'conf/modules/call_snv_deepvariant.config' includeConfig 'conf/modules/call_snv_sentieon.config' -includeConfig 'conf/modules/call_structural_variants.config' includeConfig 'conf/modules/call_sv_manta.config' includeConfig 'conf/modules/call_sv_tiddit.config' includeConfig 'conf/modules/check_input.config' @@ -267,7 +262,6 @@ includeConfig 'conf/modules/convert_mt_bam_to_fastq.config' includeConfig 'conf/modules/gens.config' includeConfig 'conf/modules/merge_annotate_MT.config' includeConfig 'conf/modules/prepare_references.config' -includeConfig 'conf/modules/prepare_vcf.config' includeConfig 'conf/modules/qc_bam.config' includeConfig 'conf/modules/rank_variants.config' includeConfig 'conf/modules/scatter_genome.config' diff --git a/nextflow_schema.json b/nextflow_schema.json index e63a7bf6..c9537bbd 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -478,26 +478,6 @@ } } }, - "sv_caller_options": { - "title": "Structural variant calling options", - "type": "object", - "fa_icon": "fas fa-map-signs", - "description": "Options to adjust parameters and filtering criteria for structural variant callers.", - "properties": { - "cnvpytor_chr": { - "type": "string", - "default": null, - "description": "Chromosome names must be specified the same way as they are described in the sam/bam/cram header, e.g., chrX or X. One can specify multiple chromosomes separated by space.", - "fa_icon": "fas fa-map-signs" - }, - "cnvpytor_binsizes": { - "type": "string", - "default": "1000", - "description": "List of binsizes separated by space e.g. '1000 10000' and '1000'", - "fa_icon": "fas fa-map-signs" - } - } - }, "annotation_options": { "title": "Annotation options", "type": "object", @@ -718,9 +698,6 @@ { "$ref": "#/definitions/alignment_options" }, - { - "$ref": "#/definitions/sv_caller_options" - }, { "$ref": "#/definitions/variant_calling_options" }, diff --git a/subworkflows/local/call_structural_variants.nf b/subworkflows/local/call_structural_variants.nf index 803a9a20..e5708a65 100644 --- a/subworkflows/local/call_structural_variants.nf +++ b/subworkflows/local/call_structural_variants.nf @@ -5,7 +5,6 @@ include { CALL_SV_MANTA } from './variant_calling/call_sv_manta' include { CALL_SV_TIDDIT } from './variant_calling/call_sv_tiddit' include { SVDB_MERGE } from '../../modules/nf-core/svdb/merge/main' -include { CALL_CNV_CNVPYTOR } from './variant_calling/call_cnv_cnvpytor' include { TABIX_TABIX } from '../../modules/nf-core/tabix/tabix/main' workflow CALL_STRUCTURAL_VARIANTS { @@ -20,7 +19,6 @@ workflow CALL_STRUCTURAL_VARIANTS { ch_fai // channel: [mandatory] [ path(fai) ] ch_case_info // channel: [mandatory] [ val(case_info) ] ch_target_bed // channel: [mandatory for WES] [ val(meta), path(bed), path(tbi) ] - val_cnvpytor_bins // string: [optional] binsizes for cnvpytor default: 1000 main: ch_versions = Channel.empty() @@ -35,19 +33,6 @@ workflow CALL_STRUCTURAL_VARIANTS { .collect{it[1]} .set { tiddit_vcf } - //cnvpytor - // CALL_CNV_CNVPYTOR ( bam, bai, case_info, cnvpytor_bins, fasta_no_meta, fai) - // .candidate_cnvs_vcf - // .collect{it[1]} - // .set {cnvpytor_vcf } - - // //merge - // tiddit_vcf - // .combine(manta_vcf) - // .combine(cnvpytor_vcf) - // .toList() - // .set { vcf_list } - //merge tiddit_vcf .combine(manta_vcf) @@ -58,7 +43,6 @@ workflow CALL_STRUCTURAL_VARIANTS { .combine(vcf_list) .set { merge_input_vcfs } - // SVDB_MERGE ( merge_input_vcfs, ["tiddit","manta","cnvpytor"] ) SVDB_MERGE (merge_input_vcfs, ["tiddit","manta"]) TABIX_TABIX (SVDB_MERGE.out.vcf) @@ -66,7 +50,6 @@ workflow CALL_STRUCTURAL_VARIANTS { ch_versions = ch_versions.mix(CALL_SV_MANTA.out.versions) ch_versions = ch_versions.mix(CALL_SV_TIDDIT.out.versions) ch_versions = ch_versions.mix(TABIX_TABIX.out.versions) - // ch_versions = ch_versions.mix(CALL_CNV_CNVPYTOR.out.versions) emit: vcf = SVDB_MERGE.out.vcf // channel: [ val(meta), path(vcf)] diff --git a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf b/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf deleted file mode 100644 index 975d139c..00000000 --- a/subworkflows/local/variant_calling/call_cnv_cnvpytor.nf +++ /dev/null @@ -1,54 +0,0 @@ -// -// CNVpytor workflow - Calling CNVs -// - -include { CNVPYTOR_IMPORTREADDEPTH as GENERATE_PYTOR } from '../../../modules/nf-core/cnvpytor/importreaddepth/main' -include { CNVPYTOR_HISTOGRAM as HISTOGRAMS } from '../../../modules/nf-core/cnvpytor/histogram/main' -include { CNVPYTOR_PARTITION as PARTITIONS } from '../../../modules/nf-core/cnvpytor/partition/main' -include { CNVPYTOR_CALLCNVS as CALL_CNVS } from '../../../modules/nf-core/cnvpytor/callcnvs/main' -include { CNVPYTOR_VIEW as VIEW } from '../../../modules/nf-core/cnvpytor/view/main' - -workflow CALL_CNV_CNVPYTOR { - take: - ch_bam // channel: [mandatory] [ val(meta), path(bam)] - ch_bai // channel: [mandatory] [ val(meta), path(bai) ] - ch_case_info // channel: [mandatory] [ val(case_info) ] - val_binsizes // string: [optional] binsizes for cnvpytor default: 1000 - ch_fasta // channel: [mandatory] [ path(fasta) ] - ch_fai // channel: [mandatory] [ path(fai) ] - - - main: - ch_versions = Channel.empty() - - GENERATE_PYTOR(ch_bam.join(ch_bai, by: [0]), ch_fasta, ch_fai) - - HISTOGRAMS(GENERATE_PYTOR.out.pytor, binsizes) - - PARTITIONS(HISTOGRAMS.out.pytor, binsizes) - - CALL_CNVS(PARTITIONS.out.pytor, binsizes) - - CALL_CNVS.out - .pytor - .collect{it[1]} - .toList() - .set { file_list } - - ch_case_info - .combine(file_list) - .set { ch_pytor } - - VIEW(ch_pytor, val_binsizes, "vcf") - - ch_versions = ch_versions.mix(GENERATE_PYTOR.out.versions.first()) - ch_versions = ch_versions.mix(HISTOGRAMS.out.versions.first()) - ch_versions = ch_versions.mix(PARTITIONS.out.versions.first()) - ch_versions = ch_versions.mix(CALL_CNVS.out.versions.first()) - ch_versions = ch_versions.mix(VIEW.out.versions.first()) - - emit: - candidate_cnvs_vcf = VIEW.out.vcf // channel: [ val(meta), path(vcf) ] - versions = ch_versions // channel: [ path(versions.yml) ] -} - diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index b8f684fc..15555a4d 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -336,8 +336,7 @@ workflow RAREDISEASE { ch_genome_fasta_meta, ch_genome_fai_no_meta, CHECK_INPUT.out.case_info, - ch_target_bed, - params.cnvpytor_binsizes + ch_target_bed ) ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) From 7ba5bbfec549ef30692fbb57840eff7c7873cb2c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 24 Mar 2023 23:41:46 +0100 Subject: [PATCH 1101/1169] bump version --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index b1e22a23..597dd35a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -235,7 +235,7 @@ manifest { description = """call and score variants from WGS/WES of rare disease patients""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.0dev' + version = '1.0.0' doi = '' } From 7590a2f216e10960ab3fc720cdc502d5edb2a900 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 25 Mar 2023 00:28:11 +0100 Subject: [PATCH 1102/1169] update changelog --- CHANGELOG.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b18325f..6ba65790 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,14 +3,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## v1.0dev - [date] +## nf-core/raredisease version 1.0.0 - [2023-03-25] Initial release of nf-core/raredisease, created with the [nf-core](https://nf-co.re/) template. - -### `Added` - -### `Fixed` - -### `Dependencies` - -### `Deprecated` From 8e275a94518580383df8c10dbbcb3ac7087277f1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 25 Mar 2023 10:41:13 +0100 Subject: [PATCH 1103/1169] convert TODOs into issues --- .github/workflows/awsfulltest.yml | 2 +- README.md | 4 +--- assets/methods_description_template.yml | 2 +- conf/test_full.config | 2 -- lib/WorkflowMain.groovy | 2 +- subworkflows/local/check_input.nf | 1 - subworkflows/local/mitochondria/align_and_call_MT.nf | 3 --- workflows/raredisease.nf | 2 +- 8 files changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index c6fab293..621336b4 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Launch workflow via tower uses: nf-core/tower-action@v3 - # TODO nf-core: You can customise AWS full pipeline tests as required + # nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: diff --git a/README.md b/README.md index 5d0273ec..6b3779a7 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! - - On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources.The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/raredisease/results). ## Pipeline summary @@ -146,7 +144,7 @@ For further information or help, don't hesitate to get in touch on the [Slack `# ## Citations - + An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml index de040a07..d6ebfa6c 100644 --- a/assets/methods_description_template.yml +++ b/assets/methods_description_template.yml @@ -3,7 +3,7 @@ description: "Suggested text and references to use when describing pipeline usag section_name: "nf-core/raredisease Methods Description" section_href: "https://github.com/nf-core/raredisease" plot_type: "html" -## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline +## nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline ## You inject any metadata in the Nextflow '${workflow}' object data: |

    Methods

    diff --git a/conf/test_full.config b/conf/test_full.config index a33b4721..74c4aa73 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,8 +15,6 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) - // TODO nf-core: Give any required params for the test so that command line flags are not needed input = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' // Genome references diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 9f34c54a..cc2deaca 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -9,7 +9,7 @@ class WorkflowMain { // public static String citation(workflow) { return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - // TODO nf-core: Add Zenodo DOI for pipeline after first release + // nf-core: Add Zenodo DOI for pipeline after first release //"* The pipeline\n" + //" https://doi.org/10.5281/zenodo.XXXXXXX\n\n" + "* The nf-core framework\n" + diff --git a/subworkflows/local/check_input.nf b/subworkflows/local/check_input.nf index 0faa087c..80709c16 100644 --- a/subworkflows/local/check_input.nf +++ b/subworkflows/local/check_input.nf @@ -37,7 +37,6 @@ def create_fastq_channel(LinkedHashMap row) { meta.paternal = row.paternal_id meta.phenotype = row.phenotype meta.single_end = row.single_end.toBoolean() - //TODO: think about adding LB and PU, make sure only illumina will be used, ID can also contain a flowcell id meta.read_group = "\'@RG\\tID:"+ row.fastq_1.split('/')[-1] + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index a20726de..95dcca1c 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -49,9 +49,6 @@ workflow ALIGN_AND_CALL_MT { GATK4_MUTECT2_MT (ch_sort_index_bam_int_mt, ch_fasta, ch_fai, ch_dict, [], [], [],[]) - // Haplocheck - // TODO: probably it will be outside this subworkflow as we want to run - // with the VCF with the variants from the shifted alignment (to solve the mt circularity issue) HAPLOCHECK_MT (GATK4_MUTECT2_MT.out.vcf) // Filter Mutect2 calls diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 15555a4d..67dfdc93 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -500,7 +500,7 @@ workflow RAREDISEASE { // MODULE: Pipeline reporting // - // TODO The template v2.7.1 template update introduced: ch_versions.unique{ it.text }.collectFile(name: 'collated_versions.yml') + // The template v2.7.1 template update introduced: ch_versions.unique{ it.text }.collectFile(name: 'collated_versions.yml') // This caused the pipeline to stall CUSTOM_DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') From c1692b94306aef9eb7e25aaee29833366d146771 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 25 Mar 2023 22:35:07 +0100 Subject: [PATCH 1104/1169] update readme --- README.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/README.md b/README.md index 6b3779a7..32ba06f8 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,6 @@ - [Introduction](#introduction) - [Pipeline summary](#pipeline-summary) - - [Work in progress flowchart](#work-in-progress-flowchart) - [Quick Start](#quick-start) - [Documentation](#documentation) - [Credits](#credits) @@ -91,12 +90,6 @@ On release, automated continuous integration tests run the pipeline on a full-si Note that it is possible to include/exclude certain tools or steps. -### Work in progress flowchart - -![nf-core/raredisease work in progress](https://docs.google.com/drawings/d/e/2PACX-1vTam7xjHBQTo1QsOpMUpd5F2vUZK5aXuf51OpSBaaV_2xMwfS1oN6GgVeQEJHjNNXRtCVHdGjCVFyzO/pub?w=2268&h=2268) - -Note that this chart is meant as a tool to help with coordination during pipeline development and hence is modified regularly. Some tools might be added or removed as suitable. If you would like to modify the flowchart, please contact us on the slack channel (see "Contributions and Support" further down). - ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=22.10.1`) @@ -144,7 +137,7 @@ For further information or help, don't hesitate to get in touch on the [Slack `# ## Citations - + An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. From dc57013cdd002a42b02aba7fba1e8c0e7aec6356 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 26 Mar 2023 22:35:53 +0200 Subject: [PATCH 1105/1169] update usage --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index e5fa333f..5a225570 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -66,7 +66,7 @@ The above command downloads the pipeline from github, caches it, and tests it on > When you run the command again, it will fetch the pipeline from cache even if a more recent version of the pipeline is available. To make sure that you're running the latest version of the pipeline, update the cached version of the pipeline by including `-latest` in the command. -Test profile runs the pipeline with a proband containing three samples, but if you would like to test the pipeline with one sample, use `-profile test_one_sample,`. +Test profile runs the pipeline with a case containing three samples, but if you would like to test the pipeline with one sample, use `-profile test_one_sample,`. Running the command creates the following files in your working directory: From 26c14d7381ac5a37aea3b405205be66f6252edba Mon Sep 17 00:00:00 2001 From: sima-r Date: Tue, 28 Mar 2023 13:09:34 +0200 Subject: [PATCH 1106/1169] updated peddy module --- modules.json | 2 +- modules/nf-core/peddy/main.nf | 14 +++++++------- modules/nf-core/peddy/meta.yml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules.json b/modules.json index 1fbd2e08..2ffa4b84 100644 --- a/modules.json +++ b/modules.json @@ -222,7 +222,7 @@ }, "peddy": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "21e6e085967902fb393b27b2e7590ac4c85fab8e", "installed_by": ["modules"] }, "picard/addorreplacereadgroups": { diff --git a/modules/nf-core/peddy/main.nf b/modules/nf-core/peddy/main.nf index 6bed1621..5d1cfe2f 100644 --- a/modules/nf-core/peddy/main.nf +++ b/modules/nf-core/peddy/main.nf @@ -40,14 +40,14 @@ process PEDDY { """ stub: + def prefix = task.ext.prefix ?: "${meta.id}" """ - filename=\$(basename $vcf) - touch \$filename.ped_check.csv - touch \$filename.vs.html - touch \$filename.het_check.csv - touch \$filename.sex_check.csv - touch \$filename.peddy.ped - touch \$filename.html + touch ${prefix}.ped_check.csv + touch ${prefix}.vs.html + touch ${prefix}.het_check.csv + touch ${prefix}.sex_check.csv + touch ${prefix}.peddy.ped + touch ${prefix}.html touch versions.yml """ diff --git a/modules/nf-core/peddy/meta.yml b/modules/nf-core/peddy/meta.yml index b3f40bb5..4c72b286 100644 --- a/modules/nf-core/peddy/meta.yml +++ b/modules/nf-core/peddy/meta.yml @@ -11,7 +11,7 @@ tools: homepage: https://github.com/brentp/peddy documentation: https://peddy.readthedocs.io/en/latest/ tool_dev_url: https://github.com/brentp/peddy - doi: "https://doi.org/10.1016/j.ajhg.2017.01.017" + doi: "10.1016/j.ajhg.2017.01.017" licence: ["MIT"] input: From 078183f6d78e102c0844f6e7a3cadc2fae36b68c Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 28 Mar 2023 13:39:10 +0200 Subject: [PATCH 1107/1169] update docs --- docs/output.md | 4 +- docs/usage.md | 135 +++++++++++++++++++++++++------------------------ 2 files changed, 70 insertions(+), 69 deletions(-) diff --git a/docs/output.md b/docs/output.md index f4557bbe..ec189a02 100644 --- a/docs/output.md +++ b/docs/output.md @@ -394,8 +394,8 @@ The pipeline for mitochondrial variant discovery, using Mutect2, uses a high sen Output files - `rank_and_filter/` - - `_clinical_snv.ann_filter.vcf.gz`: file containing clincal relevant SNVs. - - `_clinical_sv.ann_filter.vcf.gz`: file containing clincal relevant SVs. + - `_clinical_snv.ann_filter.vcf.gz`: file containing clincally relevant SNVs. + - `_clinical_sv.ann_filter.vcf.gz`: file containing clincally relevant SVs. - `_ranked_snv.vcf.gz`: file containing SNV annotations with their rank scores. - `_ranked_snv.vcf.gz.tbi`: file containing SNV annotations with their rank scores. - `_ranked_sv.ann_filter.vcf.gz`: file containing SV annotations with their rank scores. diff --git a/docs/usage.md b/docs/usage.md index 5a225570..18a763ca 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -37,7 +37,7 @@ Table of contents: ## Introduction -nf-core/raredisease is a bioinformatics best-practice analysis pipeline to call, annotate and score variants from WGS/WES of rare disease patients. The pipeline is built using nextflow. +nf-core/raredisease is a bioinformatics best-practice analysis pipeline to call, annotate and score variants from WGS/WES of rare disease patients. The pipeline is built using Nextflow. ## Prerequisites @@ -59,10 +59,10 @@ nextflow run nf-core/raredisease \ --outdir ``` -> Check [nf-core/configs](https://github.com/nf-core/configs/tree/master/conf) to see if a custom config file to run nf-core pipelines already exists for your institute. If so, you can simply use `-profile test,` in your command. This enables the appropirate package manager and sets the appropriate execution settings for your machine. +> Check [nf-core/configs](https://github.com/nf-core/configs/tree/master/conf) to see if a custom config file to run nf-core pipelines already exists for your institute. If so, you can simply use `-profile test,` in your command. This enables the appropriate package manager and sets the appropriate execution settings for your machine. > NB: The order of profiles is important! They are loaded in sequence, so later profiles can overwrite earlier profiles. -The above command downloads the pipeline from github, caches it, and tests it on the test dataset. +The above command downloads the pipeline from GitHub, caches it, and tests it on the test dataset. > When you run the command again, it will fetch the pipeline from cache even if a more recent version of the pipeline is available. To make sure that you're running the latest version of the pipeline, update the cached version of the pipeline by including `-latest` in the command. @@ -71,10 +71,10 @@ Test profile runs the pipeline with a case containing three samples, but if you Running the command creates the following files in your working directory: ``` -work # Directory containing the nextflow working files +work # Directory containing the Nextflow working files # Finished results in specified location (defined with --outdir) .nextflow_log # Log file from Nextflow -# Other nextflow hidden files, like history of pipeline logs. +# Other Nextflow hidden files, like history of pipeline logs. ``` ## Run nf-core/raredisease with your data @@ -87,23 +87,23 @@ Running the pipeline involves three steps: #### Samplesheet -A samplesheet is used to pass the information about the sample(s), such as the path to the fastq files and other meta data (gender, phenotype, etc.,) to the pipeline in csv format. +A samplesheet is used to pass the information about the sample(s), such as the path to the FASTQ files and other meta data (gender, phenotype, etc.,) to the pipeline in csv format. nf-core/raredisease will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information in the samplesheet (sex/gender and phenotype) should be provided as they would be for a [ped file](https://gatk.broadinstitute.org/hc/en-us/articles/360035531972-PED-Pedigree-format) (i.e. 1 for male, 2 for female, other for unknown). | Fields | Description | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `lane` | Used to generate seperate channels during the alignment step | -| `fastq_1` | Absolute path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Absolute path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `gender` | Sex (1=male; 2=female; other=unknown) | -| `phenotype` | Affected status of patient (0 = missing; 1=unaffected; 2=affected) | +| `lane` | Used to generate separate channels during the alignment step. | +| `fastq_1` | Absolute path to FASTQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Absolute path to FASTQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `gender` | Sex (1=male; 2=female; other=unknown). | +| `phenotype` | Affected status of patient (0 = missing; 1=unaffected; 2=affected). | | `paternal_id` | Sample ID of the father, can be blank if the father isn't part of the analysis or for samples other than the proband. | | `maternal_id` | Sample ID of the mother, can be blank if the mother isn't part of the analysis or for samples other than the proband. | -| `case_id` | Case ID, for the analysis used when generating a family VCF | +| `case_id` | Case ID, for the analysis used when generating a family VCF. | -It is also possible to include multiple runs of the same sample in a samplesheet. For example, when you have re-sequenced the same sample more than once to increase sequencing depth. In that case, the `sample` identifiers in the samplesheet have to be the same. The pipeline will align the raw read/read-pairs independently before merging the alignments belonging to the same sample. Below is an example for a trio with the proband sequenced across 2 lanes: +It is also possible to include multiple runs of the same sample in a samplesheet. For example, when you have re-sequenced the same sample more than once to increase sequencing depth. In that case, the `sample` identifiers in the samplesheet have to be the same. The pipeline will align the raw read/read-pairs independently before merging the alignments belonging to the same sample. Below is an example for a trio with the proband sequenced across two lanes: | sample | lane | fastq_1 | fastq_2 | gender | phenotype | paternal_id | maternal_id | case_id | | -------- | ---- | -------------------------------- | -------------------------------- | ------ | --------- | ----------- | ----------- | ------- | @@ -118,24 +118,24 @@ If you would like to see more examples of what a typical samplesheet looks like In nf-core/raredisease, references can be supplied using parameters listed [here](https://nf-co.re/raredisease/dev/parameters). -Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools (example, you can align with either bwamem2 or sentieon, call SNVs with DeepVariant or sentieon). You also have the option to turn off sections of the pipeline if you do not want to run them (example, snv annotation can be turned off by adding `--skip_snv_annotation` flag in the command line, or by setting it to true in a parameter file). This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by sentieon. +Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools. For example, you can align with either bwamem2 or Sentieon BWA mem and call SNVs with either DeepVariant or Sentieon DNAscope. You also have the option to turn off sections of the pipeline if you do not want to run the. For example, snv annotation can be turned off by adding `--skip_snv_annotation` flag in the command line, or by setting it to true in a parameter file. This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by Sentieon DNAscope. -nf-core/raredisease consists of several tools used for various purposes. For convenience, we have grouped those tools under the following catergories: +nf-core/raredisease consists of several tools used for various purposes. For convenience, we have grouped those tools under the following categories: -1. Alignment (bwamem2/sentieon) +1. Alignment (bwamem2/Sentieon BWA mem) 2. QC stats from the alignment files -3. Repeat expansions (Expansionshunter & Stranger) -4. Variant calling - SNV (DeepVariant/Sentieon-haplotypecaller) -5. Variant calling - Structural variants (Tiddit & Manta) -6. SNV annotation & ranking (rohcall, vcfanno, ensemblvep, genmod) -7. SV annotation & ranking (svdb query, ensemblvep, genmod) +3. Repeat expansions (ExpansionsHunter & Stranger) +4. Variant calling - SNV (DeepVariant/Sentieon DNAscope) +5. Variant calling - Structural variants (SV) (Tiddit & Manta) +6. SNV annotation & ranking (rohcall, vcfanno, ensembl VEP, GENMOD) +7. SV annotation & ranking (SVDB query, ensembl VEP, GENMOD) 8. Mitochondrial analysis -> We have only listed the groups that require at least one input from the user. For example, the pipeline also runs smncopynumbercaller, but it does not require any input other than the bam files passed by the pipeline. Hence, it is not mentioned in the list above. To know more about the tools used in the pipeline check [README](../README.md). +> We have only listed the groups that require at least one input from the user. For example, the pipeline also runs SMNCopyNumberCaller, but it does not require any input other than the bam files passed by the pipeline. Hence, it is not mentioned in the list above. To know more about the tools used in the pipeline check the [README](../README.md). The mandatory and optional parameters for each category are tabulated below. -> Alignment, qc stats, repeat expansions, snv & sv variant calling are run by default. Hence, the mandatory parameters used by those features will always have to be provided to the pipeline. +> Alignment, QC stats, repeat expansions, SNV & SV variant calling are run by default. Hence, the mandatory parameters used by those features will always have to be provided to the pipeline. ##### 1. Alignment @@ -146,19 +146,20 @@ The mandatory and optional parameters for each category are tabulated below. | platform | known_dbsnp3 | | | known_dbsnp_tbi3 | -1Default value is bwamem2, but if you have a valid license for sentieon, you have the option to use sentieon as well.
    +1Default value is bwamem2, but if you have a valid license for Sentieon, you have the option to use Sentieon as well.
    2fasta_fai and bwamem2_index, if not provided by the user, will be generated by the pipeline when necessary.
    -3Used only by sentieon.
    +3Used only by Sentieon.
    ##### 2. QC stats from the alignment files | Mandatory | Optional | | ------------------------------------------------------------ | -------- | -| intervals_wgs | | -| intervals_y | | -| target_bed / (bait_intervals & target_intervals)1 | | +| intervals_wgs1 | | +| intervals_y1 | | +| target_bed / (bait_intervals & target_intervals)2 | | -1 If a target_bed file is provided, bait_intervals and target_intervals can be generated by the pipeline. +1These files are Picard's style interval list files, comprising the entire genome or only the chromosome Y. A version of these files for GRCh37 and for GRCh38 is supplied in the pipeline assets. These files are not necessary if you are using Sentieon. +2 If a target_bed file is provided, bait_intervals and target_intervals can be generated by the pipeline. ##### 3. Repeat expansions @@ -172,11 +173,11 @@ The mandatory and optional parameters for each category are tabulated below. | -------------------------- | --------------------------- | | variant_caller1 | known_dbsnp2 | | ml_model2 | known_dbsnp_tbi2 | -| analysis_type 3 | call_interval2 | +| analysis_type3 | call_interval2 | | | known_dbsnp_tbi2 | -1Default variant caller is DeepVariant, but you have the option to use sentieon as well.
    -2These parameters are only used by sentieon.
    +1Default variant caller is DeepVariant, but you have the option to use Sentieon as well.
    +2These parameters are only used by Sentieon.
    3Default is WGS, but you have the option to choose WES as well.
    ##### 5. Variant calling - Structural variants @@ -196,13 +197,13 @@ The mandatory and optional parameters for each category are tabulated below. | vep_cache_version | vep_filters6 | | vep_cache | score_config_snv7 | -1Genome version is used by vep. You have the option to choose between GRCh37 and GRCh38.
    -2Path to vcf files and their indices used by vcfanno. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_resources.txt).
    -3Path to a vcfanno configration file. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_config.toml).
    -4Gnomad vcf file can be downloaded from [here] (https://gnomad.broadinstitute.org/downloads).
    -5Used by genmod while modeling the variants. Contains a list of loci that show [reduced penetrance](https://medlineplus.gov/genetics/understanding/inheritance/penetranceexpressivity/) in people. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv).
    -6 This file contains a list of candidate genes(HGNC ids) that is used to split the variants into a canditate variants and research variants. Research variants contain all the variants. While candidate variants are a subset of research variants and are associated with candidate genes. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/hgnc.txt).
    -7Used by genmod for ranking the variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/rank_model_snv.ini).
    +1Genome version is used by VEP. You have the option to choose between GRCh37 and GRCh38.
    +2Path to VCF files and their indices used by vcfanno. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_resources.txt).
    +3Path to a vcfanno configuration file. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_config.toml).
    +4GnomAD VCF file can be downloaded from [here] (https://gnomad.broadinstitute.org/downloads).
    +5Used by GENMOD while modeling the variants. Contains a list of loci that show [reduced penetrance](https://medlineplus.gov/genetics/understanding/inheritance/penetranceexpressivity/) in people. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv).
    +6 This file contains a list of candidate genes (with [HGNC](https://www.genenames.org/) IDs) that is used to split the variants into canditate variants and research variants. Research variants contain all the variants, while candidate variants are a subset of research variants and are associated with candidate genes. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/hgnc.txt).
    +7Used by GENMOD for ranking the variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/rank_model_snv.ini).
    ##### 7. SV annotation & Ranking @@ -213,32 +214,32 @@ The mandatory and optional parameters for each category are tabulated below. | vep_cache_version | vep_filters | | vep_cache | | -1 A csv file that describes the databases(vcfs) used by svdb for annotating structural variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/svdb_querydb_files.csv). Information about the column headers can be found [here](https://github.com/J35P312/SVDB#Query). +1 A CSV file that describes the databases (VCFs) used by SVDB for annotating structural variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/svdb_querydb_files.csv). Information about the column headers can be found [here](https://github.com/J35P312/SVDB#Query). ##### 8. Mitochondrial analysis -| Mandatory | Optional | -| ------------------------------- | -------- | -| genome | | -| mt_backchain_shift 1 | | -| mt_contig_name | | -| mt_fasta_shift | | -| mt_intervals | | -| mt_intervals_shift | | -| vcfanno_resources | | -| vcfanno_toml | | -| vep_cache_version | | -| vep_cache | | - -1 Can be generated by GATK's [ShiftFasta](https://gatk.broadinstitute.org/hc/en-us/articles/9570501436827-ShiftFasta-BETA-). Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/mt_shift8000.back_chain). +| Mandatory | Optional | +| ------------------------------ | -------- | +| genome | | +| mt_backchain_shift1 | | +| mt_contig_name | | +| mt_fasta_shift | | +| mt_intervals | | +| mt_intervals_shift | | +| vcfanno_resources | | +| vcfanno_toml | | +| vep_cache_version | | +| vep_cache | | + +1Can be generated by GATK's [ShiftFasta](https://gatk.broadinstitute.org/hc/en-us/articles/9570501436827-ShiftFasta-BETA-). Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/mt_shift8000.back_chain). #### Run the pipeline -You can directly supply the parameters in the command line (cli) or use a config file from which the pipeline can import the parameters. +You can directly supply the parameters in the command line (CLI) or use a config file from which the pipeline can import the parameters. -##### Direct input in cli +##### Direct input in CLI -All of the pipeline parameters listed [here](https://nf-co.re/raredisease/dev/parameters) can be passed using the cli. For example, you can provide the samplesheet, reference fasta, and turn off annotations for SNVs and SVs by running, +All of the pipeline parameters listed [here](https://nf-co.re/raredisease/dev/parameters) can be passed using the CLI. For example, you can provide the samplesheet, reference FASTA, and turn off annotations for SNVs and SVs by running, ``` nextflow run nf-core/raredisease \ @@ -269,7 +270,7 @@ A sample config file can be found [here](https://github.com/nf-core/raredisease/ - **Singularity cache:** If you are using singularity, use the nf-core download command to download images first, before running the pipeline. Define [NXF_SINGULARITY_CACHEDIR](https://nextflow.io/docs/latest/config.html?highlight=nxf_singularity_cachedir#environment-variables) or singularity.cacheDir Nextflow options to store and re-use the images from a central location for future pipeline runs. -- **Save references:** While the pipeline can generate indices for the fasta and some vcf files when they are not provided, it can be benficial to supply them to the pipeline as it saves computing resources. You can use the `--save_reference` parameter to publish those files, and then update your config file with the paths to these files for your subsequent runs. +- **Save references:** While the pipeline can generate indices for the FASTA and some VCF files when they are not provided, it can be benficial to supply them to the pipeline as it saves computing resources. You can use the `--save_reference` parameter to publish those files, and then update your config file with the paths to these files for your subsequent runs. - **Update pipeline:** If you would like to update the pipeline code stored in cache, in addition to running the command with `-latest` option, you can also run the command below: @@ -277,7 +278,7 @@ A sample config file can be found [here](https://github.com/nf-core/raredisease/ nextflow pull nf-core/raredisease ``` -- **Reproducibility:** Specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r`, for example, `-r 1.3.1`. You can switch to another version by changing the number after the `-r` flag. This version number will be logged in reports when you run the pipeline. For example, you can view the version number at the bottom of the MultiQC reports. +- **Reproducibility:** Specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest pipeline version - numeric only (e.g. `1.3.1`). Then specify this when running the pipeline with `-r`, for example, `-r 1.3.1`. You can switch to another version by changing the number after the `-r` flag. The version number will be logged in reports when you run the pipeline. For example, you can view the version number at the bottom of the MultiQC reports. - **Restart a previous run:** Add `-resume` to your command when restarting a pipeline. Nextflow will use cached results from any pipeline steps where inputs are the same, and resume the run from where it terminated previously. For input to be considered the same, names and the files' contents must be identical. For more info about `-resume`, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. @@ -323,7 +324,7 @@ Tip: you can replicate the issue by changing to the process work dir and enterin ##### For beginners -nf-core/raredisease provides you with options to increase the amount of CPUs(`--max_cpus`), memory(`--max_memory`), and time (`--max_time`) for the whole pipeline. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of raredisease](https://nf-co.re/raredisease/dev/parameters) and click `show hidden params` button in the right panel to get the default value for `--max_memory`. Run the pipeline with updated max_memory value `--max_memory xxxGB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. +nf-core/raredisease provides you with options to increase the amount of CPUs (`--max_cpus`), memory (`--max_memory`), and time (`--max_time`) for the whole pipeline. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of raredisease](https://nf-co.re/raredisease/dev/parameters) and click `show hidden params` button in the right panel to get the default value for `--max_memory`. Run the pipeline with updated max_memory value `--max_memory xxxGB` and `-resume` to skip all processes that were already calculated. If you cannot increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. ##### Advanced option on process level @@ -396,21 +397,21 @@ See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -### Run sentieon +### Run Sentieon -To use sentieon you have to: +To use Sentieon you have to: -1. Ensure that sentieon executable is in path. -2. If necessary, store license information as a secret in nextflow's local store. +1. Ensure that Sentieon executable is in path. +2. If necessary, store license information as a secret in Nextflow's local store. 3. Set environmental variable `NXF_ENABLE_SECRETS` to an appropriate value. -To elaborate more on item #2 in the list above, if you are running nf-core/raredisease with sentieon on AWS or on a local machine where do not want other users to know your license details, we recommend that you use [nextflow's secrets feature](https://www.nextflow.io/docs/latest/secrets.html) to pass the that information. To do that run the command below after replacing LICENSE with the value corresponding to your license server (ex:1.1.1.1:4000) +To elaborate more on item #2 in the list above, if you are running nf-core/raredisease with Sentieon on AWS or on a local machine and you do not want other users to know your license details, we recommend that you use [Nextflow's secrets feature](https://www.nextflow.io/docs/latest/secrets.html) to pass the that information. To do that run the command below after replacing LICENSE with the value corresponding to your license server (for example, 1.1.1.1:4000) ``` nextflow secrets set SENTIEON_LICENSE_BASE64 ``` -If you are using nextflow secrets, you have to set the environment variable `NXF_ENABLE_SECRETS` to true. This will see to it that the pipeline can retrieve the secret from nextflow's secrets store during the pipeline execution. Keep in mind that versions of nextflow Version 22.09.2-edge and onwards have NXF_ENABLE_SECRETS to true by default. If you are not using secrets set `NXF_ENABLE_SECRETS` to false, but make sure that the environmental variable [`SENTIEON_LICENSE`](`NXF_ENABLE_SECRETS`) is set to reflect the value of your license server on your machine. +If you are using Nextflow secrets, you have to set the environment variable `NXF_ENABLE_SECRETS` to true. This will see to it that the pipeline can retrieve the secret from Nextflow's secrets store during the pipeline execution. Keep in mind that versions of Nextflow Version 22.09.2-edge and onwards have NXF_ENABLE_SECRETS to true by default. If you are not using secrets set `NXF_ENABLE_SECRETS` to false, but make sure that the environment variable [`SENTIEON_LICENSE`](`NXF_ENABLE_SECRETS`) is set to reflect the value of your license server on your machine. ### Azure Resource Requests @@ -427,7 +428,7 @@ Nextflow handles job submissions and supervises the running jobs. The Nextflow p The Nextflow `-bg` flag launches Nextflow in the background, detached from your terminal so that the workflow does not stop if you log out of your session. The logs are saved to a file. Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. -Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). +Some HPC setups also allow you to run Nextflow within a cluster job submitted to your job scheduler (from where it submits more jobs). ### Nextflow memory requirements From f759f23b5ed6e5903dbe2b66857f47aa8e43a7bd Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Tue, 28 Mar 2023 17:00:53 +0200 Subject: [PATCH 1108/1169] Typo --- docs/output.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/output.md b/docs/output.md index ec189a02..bafda861 100644 --- a/docs/output.md +++ b/docs/output.md @@ -164,7 +164,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ##### Sention WgsMetricsAlgo -[Sentieon's WgsMetricsAlgo](https://support.sentieon.com/manual/usages/general/) is the sentieon's equivalent of Picard's CollectWgsMetrics. +[Sentieon's WgsMetricsAlgo](https://support.sentieon.com/manual/usages/general/) is the Sentieon's equivalent of Picard's CollectWgsMetrics.
    Output files @@ -394,8 +394,8 @@ The pipeline for mitochondrial variant discovery, using Mutect2, uses a high sen Output files - `rank_and_filter/` - - `_clinical_snv.ann_filter.vcf.gz`: file containing clincally relevant SNVs. - - `_clinical_sv.ann_filter.vcf.gz`: file containing clincally relevant SVs. + - `_clinical_snv.ann_filter.vcf.gz`: file containing clinically relevant SNVs. + - `_clinical_sv.ann_filter.vcf.gz`: file containing clinically relevant SVs. - `_ranked_snv.vcf.gz`: file containing SNV annotations with their rank scores. - `_ranked_snv.vcf.gz.tbi`: file containing SNV annotations with their rank scores. - `_ranked_sv.ann_filter.vcf.gz`: file containing SV annotations with their rank scores. From 099affe6a1aeef9cd3fecb4682b0e244bae51c65 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Tue, 28 Mar 2023 17:48:42 +0200 Subject: [PATCH 1109/1169] Updated pipeline overview --- docs/images/raredisease_workflow_v1.0.0dev.png | Bin 0 -> 291890 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/raredisease_workflow_v1.0.0dev.png diff --git a/docs/images/raredisease_workflow_v1.0.0dev.png b/docs/images/raredisease_workflow_v1.0.0dev.png new file mode 100644 index 0000000000000000000000000000000000000000..f8afc373af0fddcffdd8eedc8ab24f55b4449c2e GIT binary patch literal 291890 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

    dyYn^o(4z(^_+Q(88IdyjNuJM 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%0AngLV{^)fI1JAt<6)3V;Y_Xmc*59vX=KxOwn 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%0A7lql#V7Wo&4IS8+p;^ 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 VA7$?lU{e0yJYD@<);T3K0RSu_N1y-z literal 0 HcmV?d00001 From 4c038a289e5323d3ca2508a0222c3abfd1005007 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Tue, 28 Mar 2023 17:49:22 +0200 Subject: [PATCH 1110/1169] Updated overview --- docs/images/raredisease_workflow.svg | 1047 ++++++++++++++------------ 1 file changed, 553 insertions(+), 494 deletions(-) diff --git a/docs/images/raredisease_workflow.svg b/docs/images/raredisease_workflow.svg index 012f2c59..38612ac2 100755 --- a/docs/images/raredisease_workflow.svg +++ b/docs/images/raredisease_workflow.svg @@ -3,8 +3,8 @@ + originx="5.7885097" + originy="24.449992" /> + + + transform="translate(5.7885085,24.449993)"> + - - - - bam - - - - Preprocessing, mapping etc + id="g52268"> + + + + + + + + bam + + + + + + Preprocessing and mapping bwamem2, MarkDuplicates + x="135.63867" + y="154.69126" + id="tspan55925">bwa-mem2, MarkDuplicates Sentieon: bwamem, Locuscollector, Dedup - - - - Reports + x="95.970703" + y="169.69126" + id="tspan55929">Sentieon: bwamem, Locuscollector, Dedup + + + + + Reports and metrics MultiQC, Peddy, plink, rhocall - - - - - Variant calling - - FastQC, MultiQC, Mosdepth, QualiMap, Picard, tiddit/cov, ... + + + + Variant calling + SV + repeat SV + id="tspan55951">expansions ExpansionHunter, CNVpytor, Manta, tiddit/sv - MitochondriaManta, tiddit/sv, Expansion Hunter, Stranger + Mitochondria + id="tspan55961"> According to GATK Best Practices + x="473.05078" + y="263.66196" + id="tspan55967">According to GATK Best Practices Mutect2, eKLIPse - SNV + short indelsMutect2 + SNV + short indels + id="tspan55977"> Deepvariant -Sentieon: DNAscope, DNAModelApply - - - - Variant annotation and prioritization - - SV + x="48.398438" + y="263.66196" + id="tspan55983">DeepVariant VCFanno, VEP, Gens - Sentieon: DNAscope, DNAModelApply + + + + + Variant annotation and ranking + + Mitochondria + id="tspan55997">SV Haplogrep, HmtNote, gnomAD_mt - svdb query, VEP, GENMOD + SNV + short indels + id="tspan56005">Mitochondria VCFanno, CADD, VEP - - - - - Outputs + x="482.41797" + y="383.87485" + id="tspan56009">HaploGrep2, vcfanno, VEP + SNV + short indels +bcftools roh, vcfanno, VEP, GENMOD + + + + + + Outputs VCFs, inputs for scout, Gens - - - - - vcf - - - - + x="73.898438" + y="482.35532" + id="tspan56029">VCFs, inputs for scout + + + + + vcf + + + + + + vcf + + + + + + vcf + + + - + + + fastq + + + + + vcf - + transform="matrix(0.26458333,0,0,0.26458333,50.69795,-26.102348)" + id="text1581" + style="font-size:18.6667px;white-space:pre;shape-inside:url(#rect1583);fill:#ff0000" /> + + - - - - vcf - + transform="matrix(0.26458333,0,0,0.26458333,75.380932,-16.666737)" + id="text49873" + style="font-size:18.6667px;font-family:'Maven Pro';-inkscape-font-specification:'Maven Pro';text-align:center;white-space:pre;shape-inside:url(#rect49875);fill:#b3deb2;stroke:#000000;stroke-width:1.88976;stroke-linejoin:round">1.0.0dev - - - - fastq - - - - dev - - - From 01b08cd8ec6aaa5ae09a069ae4d914b6a34e44fd Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Tue, 28 Mar 2023 17:50:24 +0200 Subject: [PATCH 1111/1169] Updated path to pipeline overview --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32ba06f8..da131744 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ On release, automated continuous integration tests run the pipeline on a full-si

    - +

    Note that it is possible to include/exclude certain tools or steps. From d8ad823be5d8454e98a568f2ba0ebfa7058ba640 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 28 Mar 2023 18:29:51 +0200 Subject: [PATCH 1112/1169] remove hmtnote --- CITATIONS.md | 4 -- modules.json | 5 --- modules/nf-core/hmtnote/main.nf | 45 ------------------- modules/nf-core/hmtnote/meta.yml | 39 ---------------- .../local/mitochondria/merge_annotate_MT.nf | 5 --- 5 files changed, 98 deletions(-) delete mode 100644 modules/nf-core/hmtnote/main.nf delete mode 100644 modules/nf-core/hmtnote/meta.yml diff --git a/CITATIONS.md b/CITATIONS.md index 8c6d5631..f961d579 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -56,10 +56,6 @@ > Weissensteiner H, Pacher D, Kloss-Brandstätter A, et al. HaploGrep 2: mitochondrial haplogroup classification in the era of high-throughput sequencing. Nucleic Acids Res. 2016;44(W1):W58-W63. doi:10.1093/nar/gkw233 -- [Hmtnote](https://www.biorxiv.org/content/10.1101/600619v1) - - > Preste R, Clima R, Attimonelli M. Human Mitochondrial Variant Annotation with HmtNote. Bioinformatics; 2019. doi:10.1101/600619 - - [Manta](https://academic.oup.com/bioinformatics/article/32/8/1220/1743909?login=true) > Chen X, Schulz-Trieglaff O, Shaw R, et al. Manta: rapid detection of structural variants and indels for germline and cancer sequencing applications. Bioinformatics. 2016;32(8):1220-1222. doi:10.1093/bioinformatics/btv710 diff --git a/modules.json b/modules.json index 3ccfbc8c..b31639d6 100644 --- a/modules.json +++ b/modules.json @@ -180,11 +180,6 @@ "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, - "hmtnote": { - "branch": "master", - "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", - "installed_by": ["modules"] - }, "manta/germline": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", diff --git a/modules/nf-core/hmtnote/main.nf b/modules/nf-core/hmtnote/main.nf deleted file mode 100644 index 415a44b0..00000000 --- a/modules/nf-core/hmtnote/main.nf +++ /dev/null @@ -1,45 +0,0 @@ -process HMTNOTE { - tag "$meta.id" - label 'process_low' - - conda "bioconda::hmtnote=0.7.2" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/hmtnote:0.7.2--pyhdfd78af_0': - 'quay.io/biocontainers/hmtnote:0.7.2--pyhdfd78af_0' }" - - input: - tuple val(meta), path(vcf) - - output: - tuple val(meta), path("*_annotated.vcf"), emit: vcf - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - hmtnote \\ - annotate \\ - $vcf \\ - ${prefix}_annotated.vcf \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - hmtnote: \$(echo \$(hmtnote --version 2>&1) | sed 's/^.*hmtnote, version //; s/Using.*\$//' )) - END_VERSIONS - """ - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}_annotated.vcf - cat <<-END_VERSIONS > versions.yml - "${task.process}": - hmtnote: \$(echo \$(hmtnote --version 2>&1) | sed 's/^.*hmtnote, version //; s/Using.*\$//' )) - END_VERSIONS - """ -} diff --git a/modules/nf-core/hmtnote/meta.yml b/modules/nf-core/hmtnote/meta.yml deleted file mode 100644 index 4221ff2b..00000000 --- a/modules/nf-core/hmtnote/meta.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: hmtnote -description: Human mitochondrial variants annotation using HmtVar. -keywords: - - hmtnote mitochondria annotation -tools: - - hmtnote: - description: Human mitochondrial variants annotation using HmtVar. - homepage: https://github.com/robertopreste/HmtNote - documentation: https://hmtnote.readthedocs.io/en/latest/usage.html - - doi: "10.1101/600619" - licence: ["MIT"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - - vcf: - type: file - description: vcf file - pattern: "*.vcf" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - vcf: - type: file - description: annotated vcf - pattern: "*_annotated.vcf" - -authors: - - "@sysbiocoder" diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 36f95ff3..33886f4e 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -9,7 +9,6 @@ include { TABIX_TABIX as TABIX_TABIX_MT } from '../../.. include { BCFTOOLS_NORM as REMOVE_DUPLICATES_MT } from '../../../modules/nf-core/bcftools/norm/main' include { TABIX_TABIX as TABIX_TABIX_MT2 } from '../../../modules/nf-core/tabix/tabix/main' include { BCFTOOLS_MERGE as BCFTOOLS_MERGE_MT } from '../../../modules/nf-core/bcftools/merge/main' -include { HMTNOTE as HMTNOTE_MT } from '../../../modules/nf-core/hmtnote/main' include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../../modules/nf-core/tabix/tabix/main' include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../../modules/local/ensemblvep/main' include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../../modules/nf-core/haplogrep2/classify/main' @@ -88,10 +87,6 @@ workflow MERGE_ANNOTATE_MT { ch_in_vep = ch_merged_vcf.mix(ch_case_vcf.single) - // Annotating with Hmtnote - //HMTNOTE_MT(ch_in_vep) - //ch_versions = ch_versions.mix(HMTNOTE_MT.out.versions.first()) - // Annotating with ensembl Vep ENSEMBLVEP_MT( ch_in_vep, val_vep_genome, From 45ce4038169dd2a25080b1ecdd3c06599a167d0b Mon Sep 17 00:00:00 2001 From: jemten Date: Wed, 29 Mar 2023 16:45:21 +0200 Subject: [PATCH 1113/1169] updates peddy scritps --- CITATIONS.md | 4 ++++ conf/modules/peddy_check.config | 26 ++++++++++++++++++++++++++ conf/test.config | 7 +++++++ subworkflows/local/peddy_check.nf | 20 +++++++++----------- workflows/raredisease.nf | 6 +++--- 5 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 conf/modules/peddy_check.config diff --git a/CITATIONS.md b/CITATIONS.md index 7b554f04..25a96c12 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -76,6 +76,10 @@ > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016;32(19):3047-3048. doi:10.1093/bioinformatics/btw354 +- [Peddy](https://www.cell.com/action/showFullTextImages?pii=S0002-9297(17)30017-4) + + > Pedersen, B. S. and Quinlan, A. R. (2017) ‘Who’s Who? Detecting and Resolving Sample Anomalies in Human DNA Sequencing Studies with Peddy’, The American Journal of Human Genetics, 100(3), pp. 406–413. doi: https://doi.org/10.1016/j.ajhg.2017.01.017. + - [Picard](https://broadinstitute.github.io/picard/) - [Qualimap](https://academic.oup.com/bioinformatics/article/32/2/292/1744356?login=true) diff --git a/conf/modules/peddy_check.config b/conf/modules/peddy_check.config new file mode 100644 index 00000000..bbd7eef2 --- /dev/null +++ b/conf/modules/peddy_check.config @@ -0,0 +1,26 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = Conditional clause +---------------------------------------------------------------------------------------- +*/ + +// +// Gens options +// + +process { + withName: '.*:PEDDY_CHECK:PEDDY' { + publishDir = [ + path: { "${params.outdir}/peddy_check" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/conf/test.config b/conf/test.config index de810af2..5fb4c9e8 100644 --- a/conf/test.config +++ b/conf/test.config @@ -49,4 +49,11 @@ params { vep_cache_version = 107 } +process { + // Peddy needs a bigger test set in order to run + withName: '.*:PEDDY_CHECK:PEDDY' { + ext.when = { workflow.stubRun } + } +} + diff --git a/subworkflows/local/peddy_check.nf b/subworkflows/local/peddy_check.nf index 3d9adbc2..101bc4a2 100644 --- a/subworkflows/local/peddy_check.nf +++ b/subworkflows/local/peddy_check.nf @@ -6,19 +6,17 @@ include { PEDDY } from '../../modules/nf-core/peddy/main' workflow PEDDY_CHECK { take: - vcf // channel: [ val(meta), path(vcf), path(vcf_index) ] - ped - + ch_vcf // channel: [mandatory] [ val(meta), path(vcf), path(vcf_index) ] + ch_ped // channel: [mandatory] [ path(ped) ] + main: ch_versions = Channel.empty() - PEDDY(vcf, ped) - ch_versions = ch_versions.mix(PEDDY.out.versions) - + PEDDY( ch_vcf, ch_ped ) + ch_versions = ch_versions.mix(PEDDY.out.versions.first()) + emit: - ped = PEDDY.out.ped - csv = PEDDY.out.csv - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + ped = PEDDY.out.ped // channel: [ val(meta), path(ped) ] + csv = PEDDY.out.csv // channel: [ val(meta), path(csv) ] + versions = ch_versions // channel: [ versions.yml ] } - - diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 13ab1f30..65d3bab5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -343,10 +343,8 @@ workflow RAREDISEASE { ch_versions = ch_versions.mix(CALL_STRUCTURAL_VARIANTS.out.versions) // ped correspondence, sex check, ancestry check - ch_vcf_peddy = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) - PEDDY_CHECK ( - ch_vcf_peddy, + CALL_SNV.out.vcf.join(CALL_SNV.out.tabix), MAKE_PED.out.ped ) ch_versions = ch_versions.mix(PEDDY_CHECK.out.versions) @@ -534,6 +532,8 @@ workflow RAREDISEASE { ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.qualimap_results.map{it[1]}.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.global_dist.map{it[1]}.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(QC_BAM.out.cov.map{it[1]}.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(PEDDY_CHECK.out.ped.map{it[1]}.collect().ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(PEDDY_CHECK.out.csv.map{it[1]}.collect().ifEmpty([])) MULTIQC ( From bdaa31c51cde34b4db079a4716f9a87d264b3845 Mon Sep 17 00:00:00 2001 From: jemten Date: Thu, 30 Mar 2023 09:11:24 +0200 Subject: [PATCH 1114/1169] prettier on CITATIONS.md --- CITATIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATIONS.md b/CITATIONS.md index 25a96c12..914e7eef 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -76,7 +76,7 @@ > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016;32(19):3047-3048. doi:10.1093/bioinformatics/btw354 -- [Peddy](https://www.cell.com/action/showFullTextImages?pii=S0002-9297(17)30017-4) +- [Peddy]() > Pedersen, B. S. and Quinlan, A. R. (2017) ‘Who’s Who? Detecting and Resolving Sample Anomalies in Human DNA Sequencing Studies with Peddy’, The American Journal of Human Genetics, 100(3), pp. 406–413. doi: https://doi.org/10.1016/j.ajhg.2017.01.017. From 8c8b41e10a2d8dbc0bbddc04f41687d989f443f9 Mon Sep 17 00:00:00 2001 From: Anders Jemt Date: Thu, 30 Mar 2023 09:13:37 +0200 Subject: [PATCH 1115/1169] Update conf/modules/peddy_check.config Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- conf/modules/peddy_check.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules/peddy_check.config b/conf/modules/peddy_check.config index bbd7eef2..922737e1 100644 --- a/conf/modules/peddy_check.config +++ b/conf/modules/peddy_check.config @@ -12,7 +12,7 @@ */ // -// Gens options +// Peddy options // process { From 94a4ca0475d7545df23c704c4ec781c422b629ea Mon Sep 17 00:00:00 2001 From: Anders Jemt Date: Thu, 30 Mar 2023 10:34:06 +0200 Subject: [PATCH 1116/1169] Update CITATIONS.md Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- CITATIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATIONS.md b/CITATIONS.md index 914e7eef..8181353d 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -78,7 +78,7 @@ - [Peddy]() - > Pedersen, B. S. and Quinlan, A. R. (2017) ‘Who’s Who? Detecting and Resolving Sample Anomalies in Human DNA Sequencing Studies with Peddy’, The American Journal of Human Genetics, 100(3), pp. 406–413. doi: https://doi.org/10.1016/j.ajhg.2017.01.017. + > Pedersen BS, Quinlan AR. Who’s Who? Detecting and Resolving Sample Anomalies in Human DNA Sequencing Studies with Peddy. The American Journal of Human Genetics. 2017;100(3):406-413. doi:10.1016/j.ajhg.2017.01.017 - [Picard](https://broadinstitute.github.io/picard/) From 77e699e0437c33711788f8ee36d534c9def74766 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Thu, 30 Mar 2023 12:56:26 +0200 Subject: [PATCH 1117/1169] Updated version --- docs/images/raredisease_workflow.svg | 975 ++++++++++---------- docs/images/raredisease_workflow_v1.0.0.png | Bin 0 -> 289934 bytes 2 files changed, 479 insertions(+), 496 deletions(-) create mode 100644 docs/images/raredisease_workflow_v1.0.0.png diff --git a/docs/images/raredisease_workflow.svg b/docs/images/raredisease_workflow.svg index 38612ac2..c7aa89a1 100755 --- a/docs/images/raredisease_workflow.svg +++ b/docs/images/raredisease_workflow.svg @@ -28,7 +28,7 @@ inkscape:document-units="mm" showgrid="false" inkscape:zoom="0.87610518" - inkscape:cx="201.45983" + inkscape:cx="184.3386" inkscape:cy="337.28827" inkscape:window-width="1792" inkscape:window-height="989" @@ -437,545 +437,528 @@ id="text47805" style="font-size:18.6667px;font-family:'Maven Pro';-inkscape-font-specification:'Maven Pro';text-align:center;white-space:pre;shape-inside:url(#rect47807);fill:#b3deb2;stroke:#000000;stroke-width:1.88976;stroke-linejoin:round" /> + id="g3610"> + id="g42158"> + + + + + + bam + + + id="g32762" + transform="translate(0,-4.8563979)"> + id="g102520" + transform="translate(0,0.41424555)"> + style="opacity:1;fill:#ffffff;stroke:#000000;stroke-width:0.5;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" + id="rect100673" + width="108.49908" + height="16.095213" + x="-5.38061" + y="23.966454" + inkscape:path-effect="#path-effect101654" + sodipodi:type="rect" + inkscape:transform-center-x="-15.430978" + inkscape:transform-center-y="-13.397346" /> + Preprocessing and mapping +bwa-mem2, MarkDuplicates +Sentieon: bwamem, Locuscollector, Dedup - - - - bam - - - - - - Preprocessing and mapping + + + + Reports and metrics +FastQC, MultiQC, Mosdepth, QualiMap, Picard, tiddit/cov, ... + + + + Variant calling + SV + repeat expansions +Manta, tiddit/sv, Expansion Hunter, Stranger + Mitochondria bwa-mem2, MarkDuplicates + x="473.05078" + y="263.66196" + id="tspan3833">According to GATK Best Practices Sentieon: bwamem, Locuscollector, Dedup - - - - - Reports and metrics + x="473.05078" + y="293.66196" + id="tspan3841">Mutect2 + SNV + short indels FastQC, MultiQC, Mosdepth, QualiMap, Picard, tiddit/cov, ... - + x="48.398438" + y="263.66196" + id="tspan3849">DeepVariant +Sentieon: DNAscope, DNAModelApply + + + + + Variant annotation and ranking - + id="g1631" + transform="translate(0,-0.44417142)"> Variant calling - SV + repeat expansions + id="tspan3863">SV Manta, tiddit/sv, Expansion Hunter, svdb query, VEP, Stranger - Mitochondria -According to GATK Best Practices -Mutect2 + y="283.34555" + id="tspan3869">GENMOD SNV + short indels -DeepVariant -Sentieon: DNAscope, DNAModelApply - - - - - Variant annotation and ranking - - SV + id="tspan3871">Mitochondria svdb query, VEP, GENMOD - Mitochondria -HaploGrep2, vcfanno, VEP - HaploGrep2, vcfanno, VEP + SNV + short indels + id="tspan3879">SNV + short indels bcftools roh, vcfanno, VEP, GENMOD - - + x="55" + y="377.35532" + id="tspan3883">bcftools roh, vcfanno, VEP, GENMOD - - - Outputs + + + + + Outputs VCFs, inputs for scout - - - - - vcf - - - - - - vcf - - - - - - vcf - - - + x="73.898438" + y="482.35532" + id="tspan3895">VCFs, inputs for scout + + + + + vcf + style="fill:#ffffff" + id="path11012-4" + d="m 722.03649,1354.7469 h 47.5386 v -20.9983 c 0,-1.1338 0.91983,-2.0521 2.05208,-2.0521 h 18.12807 v -10.2809 h -67.71875 z m 67.71894,-95.336 h -67.71894 v 19.7705 h 67.71875 v -19.7705 z" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccsscccccccccc" /> + + + id="g11016-1"> + d="m 541.81401,1267.1111 h -2.51304 v 12.1255 c 0,0.076 -0.0119,0.1518 -0.0221,0.2284 -0.004,0.4815 -0.15713,0.9544 -0.48679,1.3291 l -20.17826,23.0502 c -0.006,0.01 -0.0118,0.01 -0.0161,0.014 -0.12027,0.1343 -0.2605,0.246 -0.4087,0.3427 -0.0439,0.029 -0.0882,0.054 -0.13415,0.08 -0.12844,0.07 -0.26468,0.1282 -0.40491,0.1702 -0.038,0.011 -0.0722,0.026 -0.1102,0.036 -0.15238,0.036 -0.31066,0.059 -0.47103,0.059 h -49.59068 c -2.26452,0 -4.10417,-1.8417 -4.10417,-4.1044 v -33.3298 h -2.51247 c -3.23944,0 -5.86611,-2.6255 -5.86611,-5.8661 v -30.5048 c 0,-3.2383 2.62667,-5.8655 5.86611,-5.8655 h 2.51266 v -20.8815 c 0,-2.2624 1.83965,-4.1043 4.10417,-4.1043 h 67.71875 c 2.26242,0 4.10417,1.8417 4.10417,4.1043 v 20.8815 h 2.51304 c 3.23849,0 5.86573,2.6272 5.86573,5.8655 v 30.5039 c -1.9e-4,3.2404 -2.62743,5.8661 -5.86592,5.8661 z m -74.33596,33.33 h 47.5386 v -20.9983 c 0,-1.1338 0.91983,-2.0521 2.05208,-2.0521 h 18.12807 v -10.2809 h -67.71875 z m 67.71894,-95.336 h -67.71894 v 19.7705 h 67.71875 v -19.7705 z" + id="path11018-4" /> fastq + id="flowPara11026-6" + style="font-size:32px;line-height:1.25">vcf - - - + + + transform="matrix(1,0,0,-1,257.80291,3175.6791)">vcf + - + + + + 1.0.0dev + id="flowRoot5864-2" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0.01%;font-family:'Maven Pro';-inkscape-font-specification:'Maven Pro Bold';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + transform="matrix(1,0,0,-1,45.034643,3759.351)">fastq + + + + + + + 1.0.0 diff --git a/docs/images/raredisease_workflow_v1.0.0.png b/docs/images/raredisease_workflow_v1.0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..f8c108181e4dda43fc6f42e41e930d37a6c2d628 GIT binary patch literal 289934 zcmb5WWmr{R)GoZ~?v!Se0t%=g-3`*+2uOD~(v2VpN`pwZNVk+oiF7wecf*;R=Y9Wt z-*tYRbt&TBD`t$m$30f0vZ6E=IvF|y0>P4%kx+#|kihS#g{a8jlQhE&KkyHlql}IV z1oE5?_7~1GU)UXd_{3FG+f~isovVk5vpK}W!{fP?y^V{hiKF>*2WN}4eE~8Ega#rj zA*$|~zB}*XOK84=d}#4bkGsi={sS_74kENgE1?*g9b`}?KVFj&N^q0mZ6O?wO{}cK zc1Z9w689@hi|p1j+SsHw)lK~qS9hW+^!@uoKWvYEg{g(#ZunVbieRQ$EPmF4;Helh z!<{0IpoyemJbZ;8fg3@HK&C-trN9G+3hoq~I)oX)7~T=H-2@^H*@aZ%1QLFCmH4}K z814)`E|7qDKuD2|AwwiV60l<}6AJkZ(S*CC+Qg8ALfcGKWF%U@Av&@K-Z-_=s3X3{ ze!OpsGMe$zKqa_a#PV14P+?=(S-EhBG=ZCtuSmQYkLURPAa75D5FU zNcIsAp9iiPqtHUZVJ&iw;ECBD2L79S{a%t5&x?+--4!ApOc@dZj>7ke5MS&i9Z0C? zkeCE*95|u>j3&?u(kYlRRjTvyyVV%-_V%`nj7*?nL9pSlpW@?H%THNZgZs_I?Cqap zQwznEma?VudngVS9mB;SRZi5QMHbS+CYAXIE){M`$b(5jT6%RO&7o%`N1W4ggod7h z;fkH|aRL$i-lxnjUcNjUQxZ10I$kd=h~jqeA5i!{4@wi?o77(~>4s~O&HwPvr;%jx) zft_yOeK3x$^I%6GDv1BIezmiFXd_5s_kAud8pauor z-`(V?6)0XVhf^EZP1ajhvIf3{oFl@nhAwz3NN_ztT0;4I=$C6X_U-a&Gi&tQo3!?C zumywWvX&aPQPD}qh4h;hTSYt(QG&FgJSV~nC4)USg9oBRa_<)kdu~@4mgQu*fw9`- zb5&wB%XCA@9h&jD)5^Zl`oOuOWNFDra4nVfg3IC|rxp8wQh6Q!#!E)a^y(ne|2=Hx zyY)DFQBje0wVCW2aeN3VnU4l>!Y|W_A8H9t9tCZ*dunWg&;8`6a_kS~N$Om&{ zW@c`WqvW?H`$N(W41qrIz1{Wspvwuk8 zT`Kb?tbr3eZ3HjyMj4vVQX}qdp9g*#r}R8%x!~|TT!QpI>LZjlF){H&N{ZIlvp)26 zBcAVkl|>PS<*QL*(8fZnK=E-(%kg3&Y)U@F(4d27xUlJjM&;&0zkd7HY4$?HqaJ?q z^=nQPZX&#K^S6}?A6}*ifu>4z%&HX@CY%879l>K z0;7g0;`(i(y5NM1^=~ ze@VoJ^u$pPBz}M`6SD*Z1H*FTPI<}pAqQj>E=F9!jUrkM3Li+zMOlBbKz1O*_$VZ} z9PYbQU$CD-^aPf-#KT1_{#y@fGN4X&9%xwDX2j6qS(w7% zi?sd2#-#c^iTOCA9L0jM9FKzqE=nrgJ~j#UI&iDpSCAQS4h0WKr7Ub%5q<2)SjFdz zP>3alJA#BOT-y^|m9#I|uKRPmA9(*eLy6DrpZZu12V@X|G&JHL2iVyp!+8`979!p6 zmUvrij}Kczv77l@F9hLfD+cog=8!h05$D_2uOj)XNPLer7w<}R;L|f&RIxYVC3l|# zBgm-0jlNdw2Xk_Az8?~Oyo-PCsAcxJ=8dH@BmxySuO=`rm0EW6(`)M+@khZ%S4l`n z;G%?CCkXfw4;Ku@jn5$4<#EpwsK={G1KIDv4!{<-*iTvZ*)aR#isj;}57_v&UNS); zz}!Dh4g5g;zx^KgVhZl@Br-nPMB`d*WmWZ%V!4-yq7troQV~&cVKm1reqcoCm|z;P zL)5saxbu84t%}#>+4;dtWOF(NPsY$dkL4>98Jl@B1MjoWaq+MmyKw9|#~5(u+c2<7 z;81}~mui;kSCe80XGRCj&FS{)vT5+R8Vh4nPQ^=R`3J=l`@VP2XhLLu3eM(w^*;lK zr)Os(cW61p*zz5Ngc?z|=NKSP3Z+*Kz2rtl?j#bpx$k;}*5Gj%xRTxGtB9iQ1ZqZ|14;sMFAEfN&As`g76pmBq~e0) z%CJ?v!P;8Oz;+lMSEF?pLR|^LZ3qzi#*^oBFYN^+R7%}#PrehU-ps#EjggX&kQB{P zR_Bic^Y5en-^*m3OlVuLJ*gnsI@V;20(T0r49k)%wPd5Q^;T%$zDS096{?TBEc1iG zh&^Q53?4G~+6n)aiHWEpZ2amk|7R)vmmGNx$8dxpkhkQod)jx(ahxC3bq1!N;5ZI$ z;s3F!FDe8vZm+b-Q7;Nghuyc({eQOW)>!`CM!u29_B3n6qvp+Z93aeKCYfx+H1Sc7Sn_G^s=>aY9-^^EgKfVq9HSCL!Pj*IBr~`K|~a6 zDRRlXk$GY3lwkAUK}6l%QEi*fO`O}O3zs&AT|h62i^z6(+DV>g;OcT}`4@fi zXI;2v4z{~56kUZe5AQ_y=66{Y0h3Y?^TcAB9%ep6ivOPLQK=MI|J=qPAhRlh%OBFG zG<^w;GOv+@H}@p-yZ$-HP1}o>Hz4XoW1CV zJDJY;&+fs=5DE~Po2U5O6&Iqu#fNR|1#E+hQO?N~SB+3wyB#E@Y2LGHMKB-ky7Rvq z&fJ@rx}o-j@U<)qM+Oa8->nXQS#b$<@zX#Uv&D1C1zM zF>cWxsBW3~$4bksWE0U_OqiI^!t5DgXL@4D6KSobws8NDaVs2m3aEAaM44W6S2%V9 zMZviB(ULe03XRH=Od?{5nRId&a>+b;+H?%M+ExB41A}Dhb@xD@HQUNpb?lGx@OsY{ zYmiV!iaJLm2trG8zq}Rs=w8p*Du~~ii*U3JtfdM<4-i3SiD?Fu%y~iT=wVwdcS5N3 z61{Ba@9me*_m1__@aUwWz;8i{e5K)yE5B4OI+BGCxHvXLsY5@#Ak_KgR9;Nc{Ry3C z36WkT2(hL6eMBLCNI_4>XEpRR5X8(*LRj!jtojQr$q-O$4U~dLHPQ0Q@R?$+E{}Gx znI(}LyTAVwe->_RDaOPsDcLR*02bVu2d2HDG-&vSvuzO!w0PraIyxv-{(j#EoN}4p z{`uMuC$lDqh99T7X3{;KamgFNj-8xU=0>!Xm0X0B4KVlMJJdVEyVdkX+{;rtlndt{$x~rP4MJgpxd~@jtgnKqn^8w@ zlzGcA#TgL+fw*k`4jp{w!dvchvA;E4q6NYC+MHaWOLg)@;?5Wd5_k4?D@V@=L^t61 z`I9(;txhD%4_nm`?rmPDN-8exPC5!^fz#y11qZJmPp0Kde7W}}7(o5{UO!HhG`cIS z4%_$O45vauqE%T{HAphL)!k{SY=mr&W0&{k5|to)OPo1_yNfCz0aDVzFfW(Qdam;Xr_~(QqT6(t z%$6{ghu!^WLcAovTyfdL%$1nTj|S8mtb$<5;0RPm zrS-a8x`5Z8b)F2vc%WMC5AV%*Y@YXA8WrUIwZ?QOoTiuYITKstq@~cJ8tu_25Qshc zbm1pmF0$Fsu1@9b-t*qGwrgwG-KnSGwx(_~N6X9R9dXNQiZYkSYwR6yun>wi1}44{ zm3(`BoJ0d(ZX5?_acTeZNzq1(u>7qaQj)-u_xBh2#HO?2oKAz9%478cG3We1xTErg z2g%Tvbw8!Dflr(JAqLKf{K#N~LYZOik2d%BJE{D!e@6l>a?$Q8gLlAjkrfXM-4Qb8 z?Fsb~`dqqAj+vLR4Fi8%hMRg}!LgFv34jZxW z@sU7Xk76nZoSgZ*552p+xopd`F?yNH+AYUQQ<#y8c(jaA1^4JuFOyudx0KC$@eyKU z56^T!tfZf^nwy*JI6UQp@S)Fz90R9w!}ZR$Te-F=^HVlhj2GPqp@=z!<6XGH+ z-%f@zPc&>+@={={YiQ)q2vdiKh8C8VN+jo_bEi?7n2?27b!Nv$h`fCZeQRo(qs~Gb zm2-9mmBmk2WGdBUjgg{bVP&O_f_8Rw<&0Z{?{k!y;qSe`{YYbp`i6$Wa{fYG@}FpE z5Ql_X;g(}btGg1as*T}NQDKLQ;f>fXe4s~rX`$d@vnyzNAgQjNlts{AQ=3^)&##++ zQb2$72Ii%XNkO=4t!%5vKLo7uFZBr1buS((77^h0kTlGhe`sd^eh1b+yxSz$HHTR} z5?!LW6EAOqj+PDi8FXco`^A$CQ{C)PAu4N5jzzhhlYc3Vg_V`KKIgkV^SD@0BR@=nYRzuEtB%}>g1dmThObnXXE*mX&v-w)5C>sM!k%O;I%;=q-4E!oqeBFn{AL6Bg?hz6tN88o@0Vqjp1 zcwfjQh5%S#ceaUSw$7oqBe-pKD}j#3=bTMWPHxGSuOc;X+&W?I`%~SowIXRh>^NMf zI8OJ+$$=X#m{wpU_+dXE6id!+Jp03r=kn%&`RUW5vkOC9#Gk#rd8WOJTa#_VVc6th z=X;5?q|)T}nS}S_-Ns7D zl@c-6ea0)BK;lP-DF|unpo~N`T+ICrigYYlXuf<3GHsj#kLe)GDQ=k?WYth z!=j@3aEkTM73UHPV>`Hx_Bb1@*iR$u{QQw}Nw~8HI(JQlHGE3{zWpiG^)!CCNX>dg z@JFqlX~B;sB0K0u!B#0h6>aT^gVsA@kVAFH?aiv_=xmQ)xq1uox$j1lRJ4*IpkRw- zwfX_m>zi~gU@D39iQOn}SlB4guI&!FW_q{Ag$X2}VR&>-i+2}!@+r?nbvUhRroq<2 z-8R3&nkcvjaAgH#tcb! zv3fl#H}a(PPC_<5jY!b+Q)6*SqIblEw7t*+C%je~vG#8^53y^9QlbMQ5^ieV-h6RX zg1YlLb&zJNPS?Z{FGoZQCe#et!vu-^gRZgD$#c}EIw z>3;sL%x>;PYxdos;PyPaqn9cY^G-z`?CQ+Mhm;WT*cEk-vS47kPm=4Ek=>%dfTsOw z6~Y@=0^YTc2!=}0R&;7c)*{_h0uKb75rfYdjsp(^8p=R5r^&1Wru82x2lrNz$eGl@ zO`2g+OyuUP9`Z}i1%2(?=4u8v)J50AbpN32r~67v{EB8WUaZmJ{tFZof_F{(OA1C&aY19Q2Z{_Tn?yi{107* zpRAf~(w*2y?po-V{mdro4P#v8F|V}WWcqsp2O$BLi1`(W3B-vkj{1+Xs#rW;|FUas zn*T$dNN-}$;U6=7NG!B}_gbH5{P*e=A?f4PWeJ>)*ZKpE^!BrAx|Z8#AFgojPY&vC ztD^>q3dSNG+OClG>TEj-vIZ}v|A_^61S$z%A-?>kbaL}g#sSQBH3x;ded3uOy!&7> ztCsQ92(5OrCz@_S0m^P;fQE`;9MZ{V6PJ7ES6R1f-e`+KhU$$XNe06mPm+DPhU;p* z;*4|j)Tqf0>tBt#4|d6r=J8TaDgpa0S$U1JO>6?mm{^+-A2MlL)n?DQfi|TGbivNt zMzK7b;N^cjm?($(=1;#->clxHI)t6E4_CQOwKPd)fpCP35qNvT#CH@1kry?eI-esw zQrK2;e3@t7slu+CZ>%EyxXDLJ=JYe6S@0# z{Or6NI+oDxJu1+3-|j03b42KhLr4)1esb7=7P>TZpjKM&-5!rq|zZ&xJ1Agq-*?JkOF-j&@%Thp5Xk%iw-)tJ%^i=c$nMVEHLM_Ny*H@ zf__=cAlq5`BD z3VTw>c)Er<-3yafu1?|=%xLUQQm!s+{~j=@lxu;$n2ug9h^6;sEAGdGmF1w{MrF zk^PoGrC#652v;*oB5JmzO=`+o6lIj3uubc^E%;|EGC$d2?Fn=BR_ zsa!a5m0#`?rNtef2*jI2W*pf)Y>w0>@TcLRjdWubZ{)RKURu%@J}_Uq=E6G^(62^@ zpcdMA2FTzhMMO|z)eg02d}UFIw5TA9^=hFOFJ*-P)_B)O47~NY3M}8a-CbQ3?lP;m zyHY0^Kl?+Udw+t+1Jk)?f;tR?PJ%=dheZ%f1(N8{ryN=2jFExZzmQ^WbsPVzt$(;-lRTE z7l3@grLEK`9tmS^ww+EH=w7s%QQ$O1Dpqm>@LhvpTB-3B$g*C)hwB0)d8a2 zbkH2!wBHB|)R?@22d!&YrY$m$tUavqRU>0!Fi&@9 zxsjqGw$Rn3sla(%TmR5TIj_q`{h7cpm7q_q#c-zoFai3jM%UD+2}u2IEE-XI>f{SN zsD7JCPV6>AT{}!Wq#!IwJ=5-eZnN;&t zX?b~{^uI}iGV&p-jH*=XmVt0nRMv@85qS4Me^j&Pq=fbYsJ&{pqg0E2w!aT{+%)jW z@yHUAk&_G3^=tJ7@qJGeI)#ukVu@DyPf%ssA9uNQc6L6z+Qi^+`eQb|c^INw7N%Gr zuAqPk(w%HHj9{re(NspvAewgjx~~1oF6-Ld+-7(pqIC|kSdO$oke;|+ZPu6_y{*d} z(4tf!blS12Gx?PiK-2Oj&AK-!Dam-^_mj)RU>q}|FpyjH(yjK;vau;>N_l|qmUb$L z8@b#8(1I(uPzVpnRmCyahVE)uR0wQH$udXiTAotg;>7|1?PCA}`ZpUDcZ8P_tLtN9 zZon$$*MF-yYMKw}g>vCUD3}(9UzE%Wi9 zXJQi1DQxxS`mDg?zDxSU;RdTjtE`8;tu#dg@d+j}+ryFc^yjfZe>nVl6!Zm+MQZE5 zV*~|8^vSp$EKq_Zy_Y~qF!W-<4~4q
      2Kr_0GNU-{O0z|Q=7gEJqn|cN9?E_Cw5%)! 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 Date: Thu, 30 Mar 2023 12:56:54 +0200 Subject: [PATCH 1118/1169] Delete raredisease_workflow_v1.0.0dev.png --- docs/images/raredisease_workflow_v1.0.0dev.png | Bin 291890 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/raredisease_workflow_v1.0.0dev.png diff --git a/docs/images/raredisease_workflow_v1.0.0dev.png b/docs/images/raredisease_workflow_v1.0.0dev.png deleted file mode 100644 index f8afc373af0fddcffdd8eedc8ab24f55b4449c2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291890 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

      dyYn^o(4z(^_+Q(88IdyjNuJM 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%0AngLV{^)fI1JAt<6)3V;Y_Xmc*59vX=KxOwn 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%0A7lql#V7Wo&4IS8+p;^ z(r8MKxSNLEY|!x^8(ahC^h4elMC&0=1kA5}{8va6GH}wp@7+g_-3g8Y0eR`LJMvq* z3SG+@+h`UC z=5(Hh)xuczCvp6zYO{J|k!=-AdNB>;2K%a2UAWT3J|vh+8BZ3_^J^vljz`hT9U05d>?p|0{9||K`6-^4B z7#>jE;^a>fA+9&8Ix6^5G|w380|ax?uGPJ^KpY`X}A_t>NjIt5dI(!?56w zr|{)044z2;nB5cP%^r~(b9Of9HR(J5-X#UL-VQ61^y$DZw2x^kaAQ2b|r)d zUh{irS{kw#gV8|2C|1f9x&SjrR=LLR3X(~6U{-8|-{S%g=}O17-^i^;!8*ABifGnPda91(`=&CJw3B{i%d}a?lZp}i^JYW=Lbt%DT&JljM+PiYa~C;D zwE^U&Qu7qCd18rc%L_bqG^ntZE9JV}>Y}K};?h!4_;4BippWELnp7V)l8LjbZ`clr zE0VLJ<{HjA6i(60teJ>Hr(rc2#1J+NiaDQ%bKOhQ zdr0K~KA2La-1q=CUeZg4nJAKBWUT5_xPR%Rq8rTqZO#ly+*K^{KO>1HqwbVAVRxq>yDnh*rRLW3VMv>v*X(<^;Vx}<+5AAr!G&x_ozfZeRpP)6M#4K#2a>`7 z<}B7*6+>p~&_O@=FxfSk?!P;cx7oY73?Pw>=k z6v4`qmUWV*Mq*3+_{+sENTfjHf)<8G)HxvD_aYAIBlGJ8?@Wi~iaR!@;n9IbNDB-S ztRRAY@-dQ-h12VQ{dzr)O$?|^@6Ybsf@D4jLNh()hVzC*2#^nXx+Ww}GQpe)RVn~m ziPErm(orCVe(c%unr|lP-o4ZC(}ocET27^>*VoqXVfn_{dh{-+S+oERf!u?2F9*&2ktig z1hn>iAeujl%6@u`G*A#?d$u7xHQcdlK7WQSZ*}>N6w*iM6kD%}&+ke}S-{vG#8nQG z7zc9tq9fK#0z(z;nn z2@WFWJBsiw4cQjYP|bRRM7?W!8zy(Hg)PVm72US&73K?Ow?90fT&xQO%`12{Un{#1 z*(Dm~)+K*)Lk96MLSbWf2Y?EDu%xb-l9t(A-G@HxY#RU!n-dV~8BC?S1~GrHn4B`F z9*S5=I4}*pHXxII2Vclrx}yQ4nR3Xz5x+EURKlw6AcA@bj%b!*7Z1!buvqZy7-nv(zym ziqR1Obpr52?U(;dcqv0;p9hHyKWV|2{sH{A7pQZ~>p9bDVygEE|kE-JSb# za&rlKkH98KVjQ|lKu)f(WUaTiHvlJkSeJLGv?TR``mhP5C6pDEAtzN|_H#!QA|ttp z22JJ_D|EnvkIIqhNl$kyJ;??T;8tc{kSPt>0hA8-@F8VX6N1gxVm!7Q)IT`p0snXm z|9glOz_DH`+XL6Y%O-soaZpAirv(jR_$l`ia&o(q>(sr&hN z+G)(;M!|CfO~s0NnIkt44jIgJ!MX25))kpcZKx>%m_>LGrn&bL*$8$GQ0v1^jU%!) zuyr;OglG2@X?^0UBdZt?n9nVT7#$u}04kk;@kSyO5I9BnfpNFJ;dkM z|9Yr?@1*_Vk7G_ybJY-t2$*x-FYaKkYzBqhCTbqi+$q1dJ>o@WlN20q$`6cz`83dG z>?zD`On{^D1MCFKS4+9hbydR6|7y@XXiE@B2oVXE;%Z+KYV!l*=diZte09I|2N?al zITO3#;jY~vL8_z!z1cF(bSczJzCw{8KAe<@DaoqPW|?d<#(1wFGfP;Q*!vs@(+6IT9uH5I1SOy~Jezh#!svbZmFEXVD7OlC~xRL|34Uf2AaQ!Vsmg3Dogb z7f<~3$z2CPgf?VxK_#+1fedC3NL zLiv#?uLb*s`ogyJ5vrZ^m+opfB}kMDfcVfT=RwpK7Ez%OzotzzJi7LaiHW@j>(f?i zm?ZL2dj-!%NMZ>~)zJVof%kj`TdZ#8Uc_*DzJGORRDz2qhGfwAxy<>^>_xwa^!+i5 zf+b0UD6656O@CQl`}0o%xXV?$6~!Ce$A01PBOZ4}nN4w4UGzcSz-Z*=-VcMzMP8Az zz)i%%j0SW13i7s}uu8sqe{va>pY{jG3b2CkK_MYOBw~fYpZ=<>Ak>=RRaNd1qrEX; z#x%0e`~y#;I$vCbYjqk<5-H%>Kls<%;r2BE{)7zOy`^)T;%;aD>Wfh4qu!^@T8ONK z!vhBtJVD@-`D?%U)&r$T@-fld%!8x)?Rs})Pe|1=P#^I4vaR64DM4cs+{v&9(SLtn zsh|00R6v^%*$6McFKl%;Nw$g8mzHs$POsPgkcb(!4mGwSV(EweUZlzjfPquc6wsjY zGcanJ$2c>nT<6IMElQ8-c7JKI@tvP)a})~edg{UbTKPH%G}TZVvNZ-Kj=X#>7b0j5 zMIAc&OmGwf?eUk_772JL&%pfOId)w>=4(m5n}Ak8e%Iy%L>2uNeR8cItVaw92i8kc z>sURV&{Y)}b(1z6$aXsUDY7zryLM?JffS0cB}bLTY-%i3Vy7miL(B;QS{kX8Tba*`^wi2*{10$_p>ru#Q;R6^-vYY<;== z>sV-^dg}?i2D)qrR+{fQ?_ZxIZ4h97L=}&?bmlfcMQML1YNhSaTEmx8XiE4}9f&YAj6 znbW4$jMy<``U$oG4k(HVhW^T^i;`D!2%u#)cpd{lBuMpS+&SL^XvG++#{rGF2qwMI z!{!lpY4X7*-TDcl4$V)R<^9l zO3PAw&u4Y@tnO-=L+;#SUj+Hby-ihknUqFb4I7j@#AVhV} z`D);_Uf?O;1xrF$wc^h5W-fE+nu%AlcC_pkKQZGSNbh47h%1f~e3QgX%z^Y&1F(rc zHt%|9tkq0KQ=Nhj_N*KFbhdLbX&^>laP){^rI!@I)|A<+q_jlIy?uxp(hz%Q(;h*? z*e9w9(~-j<4&eP!6>6F>^Q1TUg|`x?Ab+_#JC-d+o{n?Mbrr}~*DF4=>Bq^$!QJt( zoiWexk+R^>@c4lq6J3L6tqYEx4V*Tr44A*G36c|~Y|_0Ib%gi6S7iJ46tDPCS5Efp zTw&G!`9s0@M&W7xnMY9_;d-!NB@&nE_chnyPDOX75SOB=imsA|zs!dX!!z+_*;}V? zeSV@VA3SU7Ik}N@(yPO9=6-Zqp`X2qQt7FsU+!J>Ud(aZd{w$_=SjnztcRK2Y&@~- z@OoRtOLOb5RQQMJUu@mrd_5_ED>v+Sx!;Xve4Tg9vX$?vXs+I)|4Hbqpy;!AQA&9= z&rUu#wtWb=fF33N+Kv<<{kkJ=bz=;(LoT09CLg+wxqHj2+sZEf!WeTYn8rhmXN|xa zq)u5(`wTfgzyD*G(XUTREs~*`3Xk?V9q@m;b}#QjlWkq^IH@!qY4T2i-3$e6YYvwE z`6NX$pmq(TZk?@jR-v+kn}fy-!^p7`8C+DmyzvB;7PZHiDT^Vj>T=p$F`X2Bm9IaN zx(xZ%JvP-mD!lqywcJGPK2yYk!=+i|Hbm&R;Xlc`#3ughk@xGqtYy~k`DbaX%r|;E8rpCyw9bEtTRF6!PgTcn4pbMMBUe{$zFWmPzaYjM_YejH?8|giLZ|f79^Nk zmF!|o`;L(vBj?=jRQ26k`!I6&_17*#;S>MIQdiyB&WtA=u95HbFgg?Sdzr3$E^AiJ zP8~kB)Aow1*n48HlvMG^?!+cWwK}O`6P+El@fBV=fA#5F$MMEfqrVh7m8vu?+w#X< zC%2Vtq)rQJMOdOs$i%MT;zNH;;iU&tA6pW^9dH6GoJkeiY`25As5&1 z6)FhhrkOe;$yI0NW5oFq`C0s?{GPVv+?oh$y6T`^_UyipN`8mg&Ry%)thwkBDQYW- zPxRK%&*QIou^#_hte;jskovF1)>%kjY~dUK7Hdbr1MQkFU546^B9b>~+!S6}_Udwp zh?&4?eq5Qogf1sbEjON#6OpRF5In5hZr-K^iu1p<$4S5P6WB%Zy(`GBaJ*RjW>7wx>k6HE)TYi>ThhOPso?_2zvnkDv zXB@aFe)Y$OW1KOkE?QoEmzso2>#Uf+=Yp3LEt*GE#aec=+4p6r4XZDoFr zz7<^-KGe?pqmg$+-_BX=-81Co=b(*&4f3i-l#ghfU-xrGbaOOrGeeQCIfQRrFR9~^fr5or=Ia5=M$Lg>KhNl zr!hTlIk&Qf=_r#hxw68%6gl$Bzi^ECEz};8SDF>K$yecGpC6mL*afAEWw&1_;t{*( zhtR-CUui+go`dQKp}uFFzqpP*``;Drr>}5#{{OD9fx_P_O#8|h*(H~jS;hHV%BQ#CiTO1VwRatm`)zgu+f2{gG0jiIrRE)Fkp z7t1bh2wZf)>p-HXv+#OJyTv8~QMTKvF1D*2J$Cd}*`de{pO?1b_)|N{Eo&$qGGkfk zDc12l=G$GOFW6eHUEaQK-3F@vZOR(DiKv_FxuyWgO!d2X)rY%xzew1LZXLh8*ufXs z%#pDPSG7(oJ(%`=Q|i)t%m(DT#hvuGkFahW`j`AJ1b5-zx}tidY;>$_|8Ancijh2r^!o}<(H^2HDD#Y*4fQ| z4ibyz#dq6YZqMH19OpRJE~iURdKZ0{D``2wZL_ELEGS%Xaj05l$R_F2v)m{t$3g>g z2XxD;VX{zRhAzS=ezs(wI^dEcJ)6F8vTNc7!=!{by#oRl82Y-q0z^u5< zM&l~Kn)R1LLSMf;2YdJ5;_LL+4QMX>K}kyq$@pF4Xy0DIp7qW+T#`sW!(V;)nzZDi5%KB3dF|tZe*i%hyk4 zAKeoIY;=!X-lu$9@a+%c<3zdB{foF~zt@bkl?0EP&Gbnn=%hT(N|rn?xJm9#-^j<( zPqAZ;-xrQ>?cgM4oi-dqH)R4HRXmB`vNlSW?fbT`Q-(JwC6h)ho>$4l89QPPOzFp8 zpkvdBfzb{x&(JOaZZqSDP8T-x*dN zQ>@u)`yo$E@ow7s6XIVlY#k6cXZWcZxmR%=QABI$he`V?W9p(m3s;V`m=>4SCePWv zQ$DEv(rs?=+q&N!FB2Bs*5I_p`H!ol%X6H^G6vH{u7Qhw4ah#6osONEO;=6rOR(Wc zD%tz{>k|3%{iRWKl`L$)K)!>MzKV^#TRUrgu2x?D{?0K^e(-qt#=S+Ir7!sWfA)Wy zUFwisBv)TP%av0QX-b5~Y}jy+5o;fs&RrtiDd^a>yZJ(ZS2<^kUj7a@j$?d=%tsgFD(^AVDCqF^Jezm-SL{%^K)|)Z_3Qc3wsaX zdiYa!-iztyBBg|i&2tl!umv;nNzm{t`5fk`zh@<42}#x!DX|mL-BEr5E#w z>0go~xdmo)#%uXG&Zi45ENWqvT{tsXJGNy9vr()#*9@D~QlsU@TDXdG{~RURv2)|I VA7$?lU{e0yJYD@<);T3K0RSu_N1y-z From 8759b605ec772063b7b4b90d3646af1d12dab9b7 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Thu, 30 Mar 2023 12:57:24 +0200 Subject: [PATCH 1119/1169] Updated version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index da131744..173c940d 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ On release, automated continuous integration tests run the pipeline on a full-si

      - +

      Note that it is possible to include/exclude certain tools or steps. From 5882d363e49674be404b7766c6a34c9800613ad7 Mon Sep 17 00:00:00 2001 From: Gwenna Breton Date: Fri, 31 Mar 2023 09:30:08 +0200 Subject: [PATCH 1120/1169] Typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 173c940d..749bd632 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ The nf-core/raredisease pipeline comes with documentation about the pipeline [us nf-core/raredisease was mostly written by [Ramprasad Neethiraj](https://github.com/ramprasadn), [Anders Jemt](https://github.com/jemten), [Lucia Pena Perez](https://github.com/Lucpen), and [Mei Wu](https://github.com/projectoriented) at Clinical Genomics Stockholm. -Big thanks to the [Sima Rahimi](https://github.com/sima-r), [Gwenna Breton](https://github.com/Gwennid), [Lauri Mesilaakso](https://github.com/ljmesi), [Subazini Thankaswamy Kosalai](https://github.com/sysbiocoder), [Annick Renevey](https://github.com/rannick), [Peter Pruisscher](https://github.com/peterpru), [Lucas Taniguti](https://github.com/lmtani), [Ryan Kennedy](https://github.com/ryanjameskennedy), and the nf-core community for their extensive assistance in the development of this pipeline. +Big thanks to [Sima Rahimi](https://github.com/sima-r), [Gwenna Breton](https://github.com/Gwennid), [Lauri Mesilaakso](https://github.com/ljmesi), [Subazini Thankaswamy Kosalai](https://github.com/sysbiocoder), [Annick Renevey](https://github.com/rannick), [Peter Pruisscher](https://github.com/peterpru), [Lucas Taniguti](https://github.com/lmtani), [Ryan Kennedy](https://github.com/ryanjameskennedy), and the nf-core community for their extensive assistance in the development of this pipeline. ## Contributions and Support From 2cff89829d2fcdaaa3ed2b91d240053bf4b7cb4f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 31 Mar 2023 14:19:43 +0200 Subject: [PATCH 1121/1169] remove _index suffix from params bwa and bwamem2 --- conf/modules/prepare_references.config | 8 ++++---- docs/usage.md | 6 +++--- main.nf | 4 ++-- nextflow_schema.json | 4 ++-- workflows/raredisease.nf | 12 ++++++------ 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/conf/modules/prepare_references.config b/conf/modules/prepare_references.config index 5acc1062..8ea76ec6 100644 --- a/conf/modules/prepare_references.config +++ b/conf/modules/prepare_references.config @@ -26,7 +26,7 @@ process { } withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_GENOME' { - ext.when = {!params.bwamem2_index && params.aligner == "bwamem2"} + ext.when = {!params.bwamem2 && params.aligner == "bwamem2"} } withName: '.*PREPARE_REFERENCES:BWAMEM2_INDEX_SHIFT_MT' { @@ -34,7 +34,7 @@ process { } withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_GENOME' { - ext.when = {!params.bwa_index && params.aligner == "sentieon"} + ext.when = {!params.bwa && params.aligner == "sentieon"} } withName: '.*PREPARE_REFERENCES:SENTIEON_BWAINDEX_SHIFT_MT' { @@ -42,7 +42,7 @@ process { } withName: '.*PREPARE_REFERENCES:BWA_INDEX_GENOME' { - ext.when = {!params.bwa_index && !(params.aligner == "sentieon")} + ext.when = {!params.bwa && !(params.aligner == "sentieon")} } withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_GENOME' { @@ -103,7 +103,7 @@ process { } withName: '.*PREPARE_REFERENCES:UNTAR_VEP_CACHE' { - ext.when = { params.vep_cache.endsWith("tar.gz") } + ext.when = { (params.vep_cache && params.vep_cache.endsWith("tar.gz")) } publishDir = [ enabled: false ] diff --git a/docs/usage.md b/docs/usage.md index 18a763ca..eb4cc508 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -142,12 +142,12 @@ The mandatory and optional parameters for each category are tabulated below. | Mandatory | Optional | | ------------------- | --------------------------- | | aligner1 | fasta_fai2 | -| fasta | bwamem2_index2 | +| fasta | bwamem22 | | platform | known_dbsnp3 | | | known_dbsnp_tbi3 | 1Default value is bwamem2, but if you have a valid license for Sentieon, you have the option to use Sentieon as well.
      -2fasta_fai and bwamem2_index, if not provided by the user, will be generated by the pipeline when necessary.
      +2fasta_fai and bwamem2, if not provided by the user, will be generated by the pipeline when necessary.
      3Used only by Sentieon.
      ##### 2. QC stats from the alignment files @@ -185,7 +185,7 @@ The mandatory and optional parameters for each category are tabulated below. | Mandatory | Optional | | --------- | ---------- | | | target_bed | -| | bwa_index | +| | bwa | ##### 6. SNV annotation & Ranking diff --git a/main.nf b/main.nf index 7e3a865a..64368429 100644 --- a/main.nf +++ b/main.nf @@ -20,8 +20,8 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') -params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa_index') -params.bwamem2_index = WorkflowMain.getGenomeAttribute(params, 'bwamem2') +params.bwa = WorkflowMain.getGenomeAttribute(params, 'bwa') +params.bwamem2 = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') params.gnomad_af = WorkflowMain.getGenomeAttribute(params, 'gnomad_af') params.gnomad_af_idx = WorkflowMain.getGenomeAttribute(params, 'gnomad_af_idx') diff --git a/nextflow_schema.json b/nextflow_schema.json index c9537bbd..9cebc236 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -87,7 +87,7 @@ "hidden": true, "help_text": "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`." }, - "bwa_index": { + "bwa": { "type": "string", "format": "directory-path", "description": "Directory for pre-built bwa index.", @@ -95,7 +95,7 @@ "fa_icon": "fas fa-folder-open", "hidden": true }, - "bwamem2_index": { + "bwamem2": { "type": "string", "format": "directory-path", "description": "Directory for pre-built bwamem2 index.", diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index af7003fc..eb917010 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -11,8 +11,8 @@ WorkflowRaredisease.initialise(params, log) // Check input path parameters to see if they exist def checkPathParamList = [ - params.bwa_index, - params.bwamem2_index, + params.bwa, + params.bwamem2, params.call_interval, params.fasta, params.fasta_fai, @@ -183,7 +183,7 @@ workflow RAREDISEASE { : Channel.value([]) ch_vcfanno_toml = params.vcfanno_toml ? Channel.fromPath(params.vcfanno_toml).collect() : Channel.value([]) - ch_vep_cache_unprocessed = params.vep_cache.endsWith("tar.gz") ? Channel.fromPath(params.vep_cache).map { it -> [[id:'vep_cache'], it] }.collect() + ch_vep_cache_unprocessed = params.vep_cache ? Channel.fromPath(params.vep_cache).map { it -> [[id:'vep_cache'], it] }.collect() : Channel.value([[],[]]) ch_vep_filters = params.vep_filters ? Channel.fromPath(params.vep_filters).collect() : Channel.value([]) @@ -211,11 +211,11 @@ workflow RAREDISEASE { // Gather built indices or get them from the params ch_bait_intervals = ch_references.bait_intervals - ch_bwa_index = params.bwa_index ? Channel.fromPath(params.bwa_index).map {it -> [[id:it[0].simpleName], it]}.collect() + ch_bwa_index = params.bwa ? Channel.fromPath(params.bwa).map {it -> [[id:it[0].simpleName], it]}.collect() : ch_references.bwa_index ch_bwa_index_mt_shift = params.mt_bwa_index_shift ? Channel.fromPath(params.mt_bwa_index_shift).map {it -> [[id:it[0].simpleName], it]}.collect() : ch_references.bwa_index_mt_shift - ch_bwamem2_index = params.bwamem2_index ? Channel.fromPath(params.bwamem2_index).map {it -> [[id:it[0].simpleName], it]}.collect() + ch_bwamem2_index = params.bwamem2 ? Channel.fromPath(params.bwamem2).map {it -> [[id:it[0].simpleName], it]}.collect() : ch_references.bwamem2_index ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift).collect() : ch_references.bwamem2_index_mt_shift @@ -240,7 +240,7 @@ workflow RAREDISEASE { : ch_references.sequence_dict_mt_shift ch_target_bed = ch_references.target_bed ch_target_intervals = ch_references.target_intervals - ch_vep_cache = params.vep_cache.endsWith("tar.gz") ? ch_references.vep_resources + ch_vep_cache = ( params.vep_cache && params.vep_cache.endsWith("tar.gz") ) ? ch_references.vep_resources : ( params.vep_cache ? Channel.fromPath(params.vep_cache).collect() : Channel.value([]) ) ch_versions = ch_versions.mix(ch_references.versions) From c3d4393f30bb0f336cfff9ba76b0b5c12cb0ae14 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:42:31 +0200 Subject: [PATCH 1122/1169] update test_full.config --- conf/genomes.config | 82 ------------------------------------------- conf/test_full.config | 25 +++++++++++-- nextflow.config | 2 +- 3 files changed, 24 insertions(+), 85 deletions(-) delete mode 100644 conf/genomes.config diff --git a/conf/genomes.config b/conf/genomes.config deleted file mode 100644 index 1878bd8f..00000000 --- a/conf/genomes.config +++ /dev/null @@ -1,82 +0,0 @@ -/* -======================================================================================== - Nextflow config file for local reference genomes -======================================================================================== - Defines reference genomes without using iGenomes. - Can be used by any config that customises the base path using: - $params.local_genomes / --local_genomes ----------------------------------------------------------------------------------------- -*/ - -params { - genomes { - 'GRCh37' { - fasta = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta" - fai = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.fai" - bwa_index = "" - bwamem2_index = "${params.local_genomes}/grch37_homo_sapiens_-d5-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - call_interval = "" - gnomad_af = "" - gnomad_af_idx = "" - intervals_wgs = "${projectDir}/assets/1-22XYMT_grch37.interval_list" - intervals_y = "${projectDir}/assets/Y_grch37.interval_list" - known_dbsnp = "" - known_dbsnp_tbi = "" - ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" - mt_backchain_shift = "${params.local_genomes}/ShiftBack.chain" - mt_bwamem2_index_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" - mt_fasta_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa" - mt_fai_shift = "${params.local_genomes}/grch37.chrM.shifted8000.fa" - mt_intervals = "" - mt_intervals_shift = "" - mt_sequence_dictionary_shift = "" - reduced_penetrance = "${params.local_genomes}/grch37_cust003-cmms-red-pen_-2017-.tsv" - score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" - score_config_sv = "${params.local_genomes}/svrank_model_-v1.8-.ini" - sequence_dictionary = "" - select_feature_file = "${params.local_genomes}/hgnc.txt" - svdb_query_dbs = "${params.local_genomes}/grch37_sv_svdb_query_db_files.csv" - target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg19.bed" - variant_catalog = "${params.local_genomes}/variant_catalog_grch37.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch37/grch37_vcfanno_resources.txt" - vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch37.toml" - vep_cache = "${params.local_genomes}/vep_cache" - vep_filters = "${params.local_genomes}/gene_panels.bed" - vep_cache_version = 107 - } - 'GRCh38' { - fasta = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta" - fai = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.fai" - bwa_index = "${params.local_genomes}/bwa/grch38_homo_sapiens_-assembly-.fasta.{amb,ann,bwt,pac,sa}" - bwamem2_index = "${params.local_genomes}/grch38_homo_sapiens_-assembly-.fasta.{0123,amb,ann,bwt.2bit.64,pac}" - call_interval = "" - gnomad_af = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz" - gnomad_af_idx = "${params.local_genomes}/grch38_gnomad_reformated_-r3.1.1-_split_rmdup.tab.gz.tbi" - intervals_wgs = "${projectDir}/assets/chr1-chr22chrXchrYchrM_grch38.interval_list" - intervals_y = "${projectDir}/assets/chrY_grch38.interval_list" - known_dbsnp = "${params.local_genomes}/grch38_dbsnp_-146-.vcf.gz" - known_dbsnp_tbi = "" - ml_model = "${params.local_genomes}/SentieonDNAscopeModel1.0.model" - mt_backchain_shift = "${params.local_genomes}/grch38_ShiftBack.chain" - mt_bwamem2_index_shift = "${params.local_genomes}/bwa/hg38.chrM.shifted8000.fa.{0123,amb,ann,bwt.2bit.64,pac}" - mt_fasta_shift = "${params.local_genomes}/hg38.chrM.shifted8000.fa" - mt_fai_shift = "" - mt_intervals = "${params.local_genomes}/non_control_region.chrM.interval_list" - mt_intervals_shift = "${params.local_genomes}/control_region_shifted.chrM.interval_list" - mt_sequence_dictionary_shift = "" - reduced_penetrance = "" - score_config_snv = "${params.local_genomes}/rank_model_-v1.34-.ini" - score_config_sv = "${params.local_genomes}/grch38_sv_rank_model_-v0.1-.ini" - sequence_dictionary = "" - select_feature_file = "${params.local_genomes}/hgnc.txt" - svdb_query_dbs = "${params.local_genomes}/grch38_sv_svdb_query_db_files.csv" - target_bed = "${params.local_genomes}/Twist_ComprehensiveExome_targets_hg38.bed" - variant_catalog = "${params.local_genomes}/variant_catalog_grch38.json" - vcfanno_resources = "${params.local_genomes}/vcfanno_resources_grch38/grch38_vcfanno_resources.txt" - vcfanno_toml = "${params.local_genomes}/vcfanno_toml-grch38.toml" - vep_cache = "${params.local_genomes}/vep_cache" - vep_filters = "${params.local_genomes}/gene_panels.bed" - vep_cache_version = 107 - } - } -} diff --git a/conf/test_full.config b/conf/test_full.config index 74c4aa73..df535862 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,8 +15,29 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' + input = '/home/ramprasad.neethiraj/nextflow/samplesheet_hugelymodelbat.csv' + intervals_wgs = '/home/ramprasad.neethiraj/nextflow/test_full/genome.interval_list' + intervals_y = '/home/ramprasad.neethiraj/nextflow/test_full/genomeY.interval_list' + target_bed = '/home/ramprasad.neethiraj/nextflow/test_full/target.bed' + fasta = '/home/ramprasad.neethiraj/nextflow/test_full/genome.fa' + variant_catalog = 'https://raw.githubusercontent.com/Clinical-Genomics/reference-files/e436e059f544202f46c34a8cc15f8bece5f7c6b2/rare-disease/disease_loci/ExpansionHunter-v4.0.2/variant_catalog_hg38.json' + bwamem2 = '/home/ramprasad.neethiraj/nextflow/test_full/bwamem2' // Genome references - genome = 'R64-1-1' + genome = 'GRCh38' + + // Skip annotation + skip_mt_analysis = true + skip_snv_annotation = true + skip_sv_annotation = true +} + +process { + withName: 'MARKDUPLICATES' { + memory = { check_max( 90.GB * task.attempt, 'memory' ) } + } + withName: 'DEEPVARIANT' { + cpus = 24 + memory = { check_max( 90.GB * task.attempt, 'memory' ) } + } } diff --git a/nextflow.config b/nextflow.config index 597dd35a..c0cbfbac 100644 --- a/nextflow.config +++ b/nextflow.config @@ -175,7 +175,7 @@ profiles { if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' } else { - includeConfig 'conf/genomes.config' + params.genomes = [:] } // Load nf-core/raredisease custom config From 05b31795411f8cac89f0409a91b4090d48c3ce26 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:51:06 +0200 Subject: [PATCH 1123/1169] update tiddit module --- modules.json | 4 ++-- modules/nf-core/tiddit/sv/main.nf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules.json b/modules.json index de40528d..fa00b5f6 100644 --- a/modules.json +++ b/modules.json @@ -62,7 +62,7 @@ }, "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "b6d4d476aee074311c89d82a69c1921bd70c8180", + "git_sha": "7101db4432d3268b7fcb5b8f75fa0a022dc5561b", "installed_by": ["modules"] }, "deepvariant": { @@ -312,7 +312,7 @@ }, "tiddit/sv": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "0367c23758d83fc6973a8cd35ecba40a0cfcf2af", "installed_by": ["modules"] }, "ucsc/wigtobigwig": { diff --git a/modules/nf-core/tiddit/sv/main.nf b/modules/nf-core/tiddit/sv/main.nf index 45f9588a..27b6450a 100644 --- a/modules/nf-core/tiddit/sv/main.nf +++ b/modules/nf-core/tiddit/sv/main.nf @@ -23,7 +23,7 @@ process TIDDIT_SV { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def bwa_command = bwa_index ? "[[ -d $bwa_index ]] && for i in $bwa_index/*; do [[ -f $fasta && ! \"\$i\" =~ .*\"$fasta\".* ]] && ln -s \$i ${fasta}.\${i##*.} || ln -s \$i .; done" : "" + def bwa_command = bwa_index ? "[[ -d $bwa_index ]] && for i in $bwa_index/*; do [[ -f $fasta && ! \"\$i\" =~ .*\"$fasta.\".* ]] && ln -s \$i ${fasta}.\${i##*.} || ln -s \$i .; done" : "" """ $bwa_command From b62b8b021a54b4d19171e7d1b811ae3f232eb78a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 31 Mar 2023 16:45:12 +0200 Subject: [PATCH 1124/1169] update test full --- conf/test_full.config | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/conf/test_full.config b/conf/test_full.config index df535862..dcf02d95 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,13 +15,11 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - input = '/home/ramprasad.neethiraj/nextflow/samplesheet_hugelymodelbat.csv' - intervals_wgs = '/home/ramprasad.neethiraj/nextflow/test_full/genome.interval_list' - intervals_y = '/home/ramprasad.neethiraj/nextflow/test_full/genomeY.interval_list' - target_bed = '/home/ramprasad.neethiraj/nextflow/test_full/target.bed' - fasta = '/home/ramprasad.neethiraj/nextflow/test_full/genome.fa' - variant_catalog = 'https://raw.githubusercontent.com/Clinical-Genomics/reference-files/e436e059f544202f46c34a8cc15f8bece5f7c6b2/rare-disease/disease_loci/ExpansionHunter-v4.0.2/variant_catalog_hg38.json' - bwamem2 = '/home/ramprasad.neethiraj/nextflow/test_full/bwamem2' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_full.csv' + intervals_wgs = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/test_full/genome.interval_list' + intervals_y = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/test_full/genomeY.interval_list' + target_bed = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/test_full/target.bed' + variant_catalog = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/test_full/variant_catalog_hg38.json' // Genome references genome = 'GRCh38' From 28c760645de33db773c26e71f407b7a7a6cdc31f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 31 Mar 2023 17:11:51 +0200 Subject: [PATCH 1125/1169] update readme --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 749bd632..a55e0d37 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ ## Introduction -**nf-core/raredisease** is a bioinformatics best-practice analysis pipeline for call and score variants from WGS/WES of rare disease patients. +**nf-core/raredisease** is a bioinformatics best-practice analysis pipeline for calling and scoring variants from WGS/WES data of rare disease patients. This pipeline is heavily inspired by [MIP](https://github.com/Clinical-Genomics/MIP). The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! @@ -125,9 +125,11 @@ The nf-core/raredisease pipeline comes with documentation about the pipeline [us ## Credits -nf-core/raredisease was mostly written by [Ramprasad Neethiraj](https://github.com/ramprasadn), [Anders Jemt](https://github.com/jemten), [Lucia Pena Perez](https://github.com/Lucpen), and [Mei Wu](https://github.com/projectoriented) at Clinical Genomics Stockholm. +nf-core/raredisease was written in a collaboration between the Clinical Genomics nodes in Sweden, with major contributions from [Ramprasad Neethiraj](https://github.com/ramprasadn), [Anders Jemt](https://github.com/jemten), [Lucia Pena Perez](https://github.com/Lucpen), and [Mei Wu](https://github.com/projectoriented) at Clinical Genomics Stockholm. -Big thanks to [Sima Rahimi](https://github.com/sima-r), [Gwenna Breton](https://github.com/Gwennid), [Lauri Mesilaakso](https://github.com/ljmesi), [Subazini Thankaswamy Kosalai](https://github.com/sysbiocoder), [Annick Renevey](https://github.com/rannick), [Peter Pruisscher](https://github.com/peterpru), [Lucas Taniguti](https://github.com/lmtani), [Ryan Kennedy](https://github.com/ryanjameskennedy), and the nf-core community for their extensive assistance in the development of this pipeline. +Additional contributors were [Sima Rahimi](https://github.com/sima-r), [Gwenna Breton](https://github.com/Gwennid) and [Emma Västerviga](https://github.com/EmmaCAndersson) (Clinical Genomics Gothenburg); [Lauri Mesilaakso](https://github.com/ljmesi) (Clinical Genomics Linköping); [Subazini Thankaswamy Kosalai](https://github.com/sysbiocoder) (Clinical Genomics Örebro); [Annick Renevey](https://github.com/rannick) and [Peter Pruisscher](https://github.com/peterpru) (Clinical Genomics Stockholm); [Ryan Kennedy](https://github.com/ryanjameskennedy) (Clinical Genomics Lund); and [Lucas Taniguti](https://github.com/lmtani). + +We thank the nf-core community for their extensive assistance in the development of this pipeline. ## Contributions and Support @@ -149,3 +151,7 @@ You can cite the `nf-core` publication as follows: > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > > _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). + +You can read more about MIP's use in healthcare in, + +> Stranneheim H, Lagerstedt-Robinson K, Magnusson M, et al. Integration of whole genome sequencing into a healthcare setting: high diagnostic rates across multiple clinical entities in 3219 rare disease patients. Genome Med. 2021;13(1):40. doi:10.1186/s13073-021-00855-5 From 296e5077b34ff81a153fcc2e5acd0c8137c35530 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Fri, 31 Mar 2023 17:18:22 +0200 Subject: [PATCH 1126/1169] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ba65790..878482a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## nf-core/raredisease version 1.0.0 - [2023-03-25] +## nf-core/raredisease version 1.0.0 - [2023-03-31] Initial release of nf-core/raredisease, created with the [nf-core](https://nf-co.re/) template. From 1944318abff6e2cd5ac2cf116552db384f7fe7cd Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sun, 2 Apr 2023 04:45:41 +0200 Subject: [PATCH 1127/1169] update configs --- conf/modules/convert_mt_bam_to_fastq.config | 2 +- conf/modules/peddy_check.config | 1 + conf/modules/raredisease.config | 2 +- conf/test.config | 14 ++++---------- conf/test_one_sample.config | 5 ++++- docs/usage.md | 2 +- nextflow.config | 3 ++- nextflow_schema.json | 2 +- 8 files changed, 15 insertions(+), 16 deletions(-) diff --git a/conf/modules/convert_mt_bam_to_fastq.config b/conf/modules/convert_mt_bam_to_fastq.config index 47e1f5bf..5cba99b5 100644 --- a/conf/modules/convert_mt_bam_to_fastq.config +++ b/conf/modules/convert_mt_bam_to_fastq.config @@ -23,7 +23,7 @@ process { withName: '.*ANALYSE_MT:CONVERT_MT_BAM_TO_FASTQ:GATK4_PRINTREADS_MT' { beforeScript = {"mkdir ./tmp"} ext.args = [ - "-L ${params.mt_contig_name}", + "-L ${params.mito_name}", "--read-filter MateOnSameContigOrNoMappedMateReadFilter", "--read-filter MateUnmappedAndUnmappedReadFilter" ].join(" ").trim() diff --git a/conf/modules/peddy_check.config b/conf/modules/peddy_check.config index 922737e1..b3d4e6da 100644 --- a/conf/modules/peddy_check.config +++ b/conf/modules/peddy_check.config @@ -17,6 +17,7 @@ process { withName: '.*:PEDDY_CHECK:PEDDY' { + ext.when = { !(workflow.profile.contains("test")) || workflow.stubRun } publishDir = [ path: { "${params.outdir}/peddy_check" }, mode: params.publish_dir_mode, diff --git a/conf/modules/raredisease.config b/conf/modules/raredisease.config index a73ea3f4..cf5dea7b 100644 --- a/conf/modules/raredisease.config +++ b/conf/modules/raredisease.config @@ -54,7 +54,7 @@ process { process { withName: '.*RAREDISEASE:GATK4_SELECTVARIANTS' { - ext.args = "--exclude-intervals ${params.mt_contig_name}" + ext.args = "--exclude-intervals ${params.mito_name}" ext.prefix = { "${meta.id}_nomito" } ext.when = { !params.skip_snv_annotation } publishDir = [ diff --git a/conf/test.config b/conf/test.config index 5fb4c9e8..805f84d6 100644 --- a/conf/test.config +++ b/conf/test.config @@ -18,7 +18,10 @@ params { max_cpus = 2 max_memory = '6.GB' max_time = '2.h' - mt_contig_name = 'MT' + + // reference params + igenomes_ignore = true + mito_name = 'MT' // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_trio.csv' @@ -48,12 +51,3 @@ params { vep_filters = "https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/hgnc.txt" vep_cache_version = 107 } - -process { - // Peddy needs a bigger test set in order to run - withName: '.*:PEDDY_CHECK:PEDDY' { - ext.when = { workflow.stubRun } - } -} - - diff --git a/conf/test_one_sample.config b/conf/test_one_sample.config index 9db27703..e4f73a33 100644 --- a/conf/test_one_sample.config +++ b/conf/test_one_sample.config @@ -18,7 +18,10 @@ params { max_cpus = 2 max_memory = '6.GB' max_time = '2.h' - mt_contig_name = 'MT' + + // reference params + igenomes_ignore = true + mito_name = 'MT' // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/testdata/samplesheet_single.csv' diff --git a/docs/usage.md b/docs/usage.md index eb4cc508..65e13464 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -222,7 +222,7 @@ The mandatory and optional parameters for each category are tabulated below. | ------------------------------ | -------- | | genome | | | mt_backchain_shift1 | | -| mt_contig_name | | +| mito_name | | | mt_fasta_shift | | | mt_intervals | | | mt_intervals_shift | | diff --git a/nextflow.config b/nextflow.config index c0cbfbac..db9dfa5c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -18,7 +18,7 @@ params { igenomes_ignore = false local_genomes = null save_reference = false - mt_contig_name = 'chrM' + mito_name = 'chrM' // Main options analysis_type = 'wgs' @@ -265,6 +265,7 @@ includeConfig 'conf/modules/prepare_references.config' includeConfig 'conf/modules/qc_bam.config' includeConfig 'conf/modules/rank_variants.config' includeConfig 'conf/modules/scatter_genome.config' +includeConfig 'conf/modules/peddy_check.config' // Function to ensure that resource requirements don't go beyond // a maximum limit diff --git a/nextflow_schema.json b/nextflow_schema.json index 9cebc236..ab50b9a5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -135,7 +135,7 @@ "description": "Path to the interval list of the Y chromosome.", "help_text": "Path to the interval list of the Y chromosome. This is used to calculate coverage statistics for the Y chromosome." }, - "mt_contig_name": { + "mito_name": { "type": "string", "format": "path", "description": "Name of the mitochondrial contig in the reference fasta file", From b10dfb9d30c38c502009f583bd1948e136c4d117 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 3 Apr 2023 09:39:25 +0200 Subject: [PATCH 1128/1169] review suggestions --- conf/modules/peddy_check.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/modules/peddy_check.config b/conf/modules/peddy_check.config index b3d4e6da..fcd75a21 100644 --- a/conf/modules/peddy_check.config +++ b/conf/modules/peddy_check.config @@ -17,7 +17,8 @@ process { withName: '.*:PEDDY_CHECK:PEDDY' { - ext.when = { !(workflow.profile.contains("test")) || workflow.stubRun } + // Peddy needs a bigger test set in order to run so we skip it for the two test profiles + ext.when = { !(workflow.profile.tokenize(',').intersect(['test', 'test_one_sample']).size() >= 1) || workflow.stubRun } publishDir = [ path: { "${params.outdir}/peddy_check" }, mode: params.publish_dir_mode, From a12dc25b0db5e557111b17d5a8cc08b151121cca Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Sat, 8 Apr 2023 08:39:10 +0200 Subject: [PATCH 1129/1169] fix --- subworkflows/local/variant_calling/call_sv_manta.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/variant_calling/call_sv_manta.nf b/subworkflows/local/variant_calling/call_sv_manta.nf index 1fe5caf3..2fbf4bec 100644 --- a/subworkflows/local/variant_calling/call_sv_manta.nf +++ b/subworkflows/local/variant_calling/call_sv_manta.nf @@ -34,7 +34,7 @@ workflow CALL_SV_MANTA { .set { manta_input } MANTA ( manta_input, ch_fasta, ch_fai ) } else { - case_info.combine(bam_file_list) + ch_case_info.combine(bam_file_list) .combine(bai_file_list) .combine(bed_input) .set { manta_input } From 8286b0a679c76fa324600a3eef1da13424529568 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 25 Apr 2023 16:53:46 +0200 Subject: [PATCH 1130/1169] move make_ped to raredisease.nf --- modules/local/create_pedfile.nf | 35 -------------------------------- workflows/raredisease.nf | 36 +++++++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 41 deletions(-) delete mode 100644 modules/local/create_pedfile.nf diff --git a/modules/local/create_pedfile.nf b/modules/local/create_pedfile.nf deleted file mode 100644 index d5940829..00000000 --- a/modules/local/create_pedfile.nf +++ /dev/null @@ -1,35 +0,0 @@ -process MAKE_PED { - tag "make_ped" - label 'process_single' - - conda "conda-forge::python=3.9.5" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'quay.io/biocontainers/python:3.9--1' }" - - input: - val(samples) - - output: - path '*.ped' , emit: ped - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - exec: - def pedfile = task.workDir.resolve('family.ped') - pedfile.text = ['#family_id', 'sample_id', 'father', 'mother', 'sex', 'phenotype'].join('\t') - def samples_list = [] - for(int i = 0; i Date: Tue, 25 Apr 2023 16:55:45 +0200 Subject: [PATCH 1131/1169] remove blank line --- workflows/raredisease.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index bbab03f5..bf8d9cc4 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -567,7 +567,6 @@ workflow.onComplete { def make_ped(samples) { def case_name = samples[0].case_id - def outfile = workDir.resolve("$case_name" + '.ped') outfile.text = ['#family_id', 'sample_id', 'father', 'mother', 'sex', 'phenotype'].join('\t') def samples_list = [] From b2e5b05b76b937ed29fa273a1092eef1d26083c7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 25 Apr 2023 21:19:43 +0200 Subject: [PATCH 1132/1169] remove meta.clone --- subworkflows/local/alignment/align_bwamem2.nf | 5 ++--- subworkflows/local/alignment/align_sentieon.nf | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 72283556..e887b6ed 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -33,9 +33,8 @@ workflow ALIGN_BWAMEM2 { // Merge multiple lane samples and index BWAMEM2_MEM.out.bam .map{ meta, bam -> - new_meta = meta.clone() - new_meta.id = new_meta.id.split('_')[0] - new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + val_platform + "\\tSM:" + new_meta.id + "\'" + new_id = meta.id.split('_')[0] + new_meta = meta + [id:new_id, read_group:"\'@RG\\tID:" + new_id + "\\tPL:" + val_platform + "\\tSM:" + new_id + "\'"] [new_meta, bam] } .groupTuple(by: 0) diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index c0903c9d..1f29a001 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -31,9 +31,8 @@ workflow ALIGN_SENTIEON { .bam .join(SENTIEON_BWAMEM.out.bai) .map{ meta, bam, bai -> - new_meta = meta.clone() - new_meta.id = new_meta.id.split('_')[0] - new_meta.read_group = "\'@RG\\tID:" + new_meta.id + "\\tPL:" + val_platform + "\\tSM:" + new_meta.id + "\'" + new_id = meta.id.split('_')[0] + new_meta = meta + [id:new_id, read_group:"\'@RG\\tID:" + new_id + "\\tPL:" + val_platform + "\\tSM:" + new_id + "\'"] [new_meta, bam, bai] } .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] From 7a84e66a4e2d38eda4bb4a68abc97e52ed3a301f Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 25 Apr 2023 23:46:26 +0200 Subject: [PATCH 1133/1169] add groupkey --- subworkflows/local/alignment/align_bwamem2.nf | 4 +-- .../local/alignment/align_sentieon.nf | 4 +-- subworkflows/local/check_input.nf | 35 ++++++++++++------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index e887b6ed..11b782bb 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -35,9 +35,9 @@ workflow ALIGN_BWAMEM2 { .map{ meta, bam -> new_id = meta.id.split('_')[0] new_meta = meta + [id:new_id, read_group:"\'@RG\\tID:" + new_id + "\\tPL:" + val_platform + "\\tSM:" + new_id + "\'"] - [new_meta, bam] + [groupKey(new_meta, new_meta.num_lanes), bam] } - .groupTuple(by: 0) + .groupTuple() .branch{ single: it[1].size() == 1 multiple: it[1].size() > 1 diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index 1f29a001..4f8908ba 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -33,9 +33,9 @@ workflow ALIGN_SENTIEON { .map{ meta, bam, bai -> new_id = meta.id.split('_')[0] new_meta = meta + [id:new_id, read_group:"\'@RG\\tID:" + new_id + "\\tPL:" + val_platform + "\\tSM:" + new_id + "\'"] - [new_meta, bam, bai] + [groupKey(new_meta, new_meta.num_lanes), bam, bai] } - .groupTuple(by: 0) // group them bam paths with the same [ [samplename], [bam path, bam path, ..] ] + .groupTuple() .branch{ single: it[1].size() == 1 multiple: it[1].size() > 1 diff --git a/subworkflows/local/check_input.nf b/subworkflows/local/check_input.nf index 80709c16..4199196a 100644 --- a/subworkflows/local/check_input.nf +++ b/subworkflows/local/check_input.nf @@ -14,10 +14,18 @@ workflow CHECK_INPUT { .splitCsv ( header:true, sep:',' ) .set { sheet } - case_info = sheet.first() - .map { create_case_channel(it) } - reads = sheet.map { create_fastq_channel(it) } - samples = sheet.map { create_samples_channel(it) } + case_info = sheet.first() + .map { create_case_channel(it) } + reads = sheet.map { row -> [[row.sample.split('_')[0]], row] } + .groupTuple() + .map { meta, rows -> + [rows, rows.size()] + } + .transpose() + .map { row, numLanes -> + create_fastq_channel(row + [num_lanes:numLanes]) + } + samples = sheet.map { create_samples_channel(it) } emit: case_info // channel: [ val(case_info) ] @@ -29,15 +37,16 @@ workflow CHECK_INPUT { // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] def create_fastq_channel(LinkedHashMap row) { // create meta map - def meta = [:] - meta.case_id = row.case_id - meta.gender = row.gender - meta.id = row.sample - meta.maternal = row.maternal_id - meta.paternal = row.paternal_id - meta.phenotype = row.phenotype - meta.single_end = row.single_end.toBoolean() - meta.read_group = "\'@RG\\tID:"+ row.fastq_1.split('/')[-1] + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" + def meta = [:] + meta.case_id = row.case_id + meta.gender = row.gender + meta.id = row.sample + meta.maternal = row.maternal_id + meta.paternal = row.paternal_id + meta.phenotype = row.phenotype + meta.single_end = row.single_end.toBoolean() + meta.num_lanes = row.num_lanes + meta.read_group = "\'@RG\\tID:"+ row.fastq_1.split('/')[-1] + "\\tPL:ILLUMINA\\tSM:"+row.sample.split('_')[0]+"\'" // add path(s) of the fastq file(s) to the meta map From 8572aa2639d22ba4bf046dcd7c728a3c8a05e4ea Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 26 Apr 2023 09:21:48 +0200 Subject: [PATCH 1134/1169] Fix review comments asp8200 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a55e0d37..e1fbf900 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,11 @@ ## Introduction -**nf-core/raredisease** is a bioinformatics best-practice analysis pipeline for calling and scoring variants from WGS/WES data of rare disease patients. This pipeline is heavily inspired by [MIP](https://github.com/Clinical-Genomics/MIP). +**nf-core/raredisease** is a best-practice bioinformatic pipeline for calling and scoring variants from WGS/WES data from rare disease patients. This pipeline is heavily inspired by [MIP](https://github.com/Clinical-Genomics/MIP). The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources.The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/raredisease/results). +On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/raredisease/results). ## Pipeline summary From acef1f9f95cb16b9a7895795ca44955cff0cd461 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Apr 2023 10:12:49 +0200 Subject: [PATCH 1135/1169] update join statements --- subworkflows/local/align.nf | 2 +- subworkflows/local/alignment/align_bwamem2.nf | 2 +- subworkflows/local/alignment/align_sentieon.nf | 8 ++++---- subworkflows/local/annotate_snvs.nf | 8 ++++++-- subworkflows/local/call_repeat_expansions.nf | 8 +++++--- .../local/mitochondria/align_and_call_MT.nf | 8 ++++---- .../local/mitochondria/merge_annotate_MT.nf | 14 ++++++++++---- .../local/variant_calling/call_snv_sentieon.nf | 2 +- workflows/raredisease.nf | 8 ++++---- 9 files changed, 36 insertions(+), 24 deletions(-) diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 354f1a4b..4d53765f 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -39,7 +39,7 @@ workflow ALIGN { ch_marked_bam = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bam, ALIGN_SENTIEON.out.marked_bam) ch_marked_bai = Channel.empty().mix(ALIGN_BWAMEM2.out.marked_bai, ALIGN_SENTIEON.out.marked_bai) - ch_bam_bai = ch_marked_bam.join(ch_marked_bai, by: [0]) + ch_bam_bai = ch_marked_bam.join(ch_marked_bai, failOnMismatch:true, failOnDuplicate:true) ch_versions = Channel.empty().mix(ALIGN_BWAMEM2.out.versions, ALIGN_SENTIEON.out.versions) emit: diff --git a/subworkflows/local/alignment/align_bwamem2.nf b/subworkflows/local/alignment/align_bwamem2.nf index 11b782bb..3857c8e0 100644 --- a/subworkflows/local/alignment/align_bwamem2.nf +++ b/subworkflows/local/alignment/align_bwamem2.nf @@ -27,7 +27,7 @@ workflow ALIGN_BWAMEM2 { SAMTOOLS_INDEX_ALIGN ( BWAMEM2_MEM.out.bam ) // Get stats for each demultiplexed read pair. - bam_sorted_indexed = BWAMEM2_MEM.out.bam.join(SAMTOOLS_INDEX_ALIGN.out.bai) + bam_sorted_indexed = BWAMEM2_MEM.out.bam.join(SAMTOOLS_INDEX_ALIGN.out.bai, failOnMismatch:true, failOnDuplicate:true) SAMTOOLS_STATS ( bam_sorted_indexed, [] ) // Merge multiple lane samples and index diff --git a/subworkflows/local/alignment/align_sentieon.nf b/subworkflows/local/alignment/align_sentieon.nf index 4f8908ba..a161cb1d 100644 --- a/subworkflows/local/alignment/align_sentieon.nf +++ b/subworkflows/local/alignment/align_sentieon.nf @@ -29,7 +29,7 @@ workflow ALIGN_SENTIEON { SENTIEON_BWAMEM.out .bam - .join(SENTIEON_BWAMEM.out.bai) + .join(SENTIEON_BWAMEM.out.bai, failOnMismatch:true, failOnDuplicate:true) .map{ meta, bam, bai -> new_id = meta.id.split('_')[0] new_meta = meta + [id:new_id, read_group:"\'@RG\\tID:" + new_id + "\\tPL:" + val_platform + "\\tSM:" + new_id + "\'"] @@ -50,15 +50,15 @@ workflow ALIGN_SENTIEON { SENTIEON_LOCUSCOLLECTOR ( ch_bam_bai ) ch_bam_bai - .join(SENTIEON_LOCUSCOLLECTOR.out.score) - .join(SENTIEON_LOCUSCOLLECTOR.out.score_idx) + .join(SENTIEON_LOCUSCOLLECTOR.out.score, failOnMismatch:true, failOnDuplicate:true) + .join(SENTIEON_LOCUSCOLLECTOR.out.score_idx, failOnMismatch:true, failOnDuplicate:true) .set { ch_bam_bai_score } SENTIEON_DEDUP ( ch_bam_bai_score, ch_fasta, ch_fai ) if (params.variant_caller == "sentieon") { SENTIEON_DEDUP.out.bam - .join(SENTIEON_DEDUP.out.bai) + .join(SENTIEON_DEDUP.out.bai, failOnMismatch:true, failOnDuplicate:true) .set { ch_dedup_bam_bai } SENTIEON_BQSR ( ch_dedup_bam_bai, ch_fasta, ch_fai, ch_known_dbsnp, ch_known_dbsnp_tbi ) ch_bqsr_bam = SENTIEON_BQSR.out.bam diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index cfbb4b04..dd927d81 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -66,7 +66,10 @@ workflow ANNOTATE_SNVS { TABIX_BCFTOOLS_VIEW (BCFTOOLS_VIEW.out.vcf) - BCFTOOLS_VIEW.out.vcf.join(TABIX_BCFTOOLS_VIEW.out.tbi).collect().set { ch_vcf_scatter_in } + BCFTOOLS_VIEW.out.vcf + .join(TABIX_BCFTOOLS_VIEW.out.tbi, failOnMismatch:true, failOnDuplicate:true) + .collect() + .set { ch_vcf_scatter_in } GATK4_SELECTVARIANTS (ch_vcf_scatter_in.combine(ch_split_intervals)).vcf.set { ch_vep_in } @@ -88,7 +91,7 @@ workflow ANNOTATE_SNVS { if (params.analysis_type == 'wgs') { ENSEMBLVEP_SNV.out.vcf_gz - .join(TABIX_VEP.out.tbi) + .join(TABIX_VEP.out.tbi, failOnMismatch:true, failOnDuplicate:true) .groupTuple() .map { meta, vcfs, tbis -> def sortedvcfs = vcfs.sort { it.baseName } @@ -104,6 +107,7 @@ workflow ANNOTATE_SNVS { ch_vep_ann = BCFTOOLS_CONCAT.out.vcf ch_vep_index = TABIX_BCFTOOLS_CONCAT.out.tbi } + ch_versions = ch_versions.mix(BCFTOOLS_ROH.out.versions) ch_versions = ch_versions.mix(RHOCALL_ANNOTATE.out.versions) ch_versions = ch_versions.mix(ZIP_TABIX_ROHCALL.out.versions) diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 4741272f..66dea07d 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -40,7 +40,7 @@ workflow CALL_REPEAT_EXPANSIONS { // Split multi allelelic SPLIT_MULTIALLELICS_EXP ( - RENAMESAMPLE_EXP.out.vcf.join(TABIX_EXP_RENAME.out.tbi), + RENAMESAMPLE_EXP.out.vcf.join(TABIX_EXP_RENAME.out.tbi, failOnMismatch:true, failOnDuplicate:true), ch_fasta ) @@ -62,6 +62,8 @@ workflow CALL_REPEAT_EXPANSIONS { ) INDEX_STRANGER ( COMPRESS_STRANGER.out.vcf ) + ch_vcf_idx = COMPRESS_STRANGER.out.vcf.join(INDEX_STRANGER.out.tbi, failOnMismatch:true, failOnDuplicate:true) + ch_versions = ch_versions.mix(EXPANSIONHUNTER.out.versions.first()) ch_versions = ch_versions.mix(BCFTOOLS_REHEADER_EXP.out.versions.first()) ch_versions = ch_versions.mix(RENAMESAMPLE_EXP.out.versions.first() ) @@ -73,6 +75,6 @@ workflow CALL_REPEAT_EXPANSIONS { ch_versions = ch_versions.mix(INDEX_STRANGER.out.versions.first()) emit: - vcf = COMPRESS_STRANGER.out.vcf.join(INDEX_STRANGER.out.tbi) // channel: [ val(meta), path(vcf), path(tbi) ] - versions = ch_versions // channel: [ path(versions.yml) ] + vcf = ch_vcf_idx // channel: [ val(meta), path(vcf), path(tbi) ] + versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/local/mitochondria/align_and_call_MT.nf b/subworkflows/local/mitochondria/align_and_call_MT.nf index 95dcca1c..7feb58bb 100644 --- a/subworkflows/local/mitochondria/align_and_call_MT.nf +++ b/subworkflows/local/mitochondria/align_and_call_MT.nf @@ -33,7 +33,7 @@ workflow ALIGN_AND_CALL_MT { SENTIEON_BWAMEM_MT ( ch_fastq, ch_fasta, ch_fai, ch_index_bwa ) ch_mt_bam = Channel.empty().mix(BWAMEM2_MEM_MT.out.bam, SENTIEON_BWAMEM_MT.out.bam) - ch_fastq_ubam = ch_mt_bam.join(ch_ubam, by: [0]) + ch_fastq_ubam = ch_mt_bam.join(ch_ubam, failOnMismatch:true, failOnDuplicate:true) GATK4_MERGEBAMALIGNMENT_MT (ch_fastq_ubam, ch_fasta, ch_dict) @@ -44,7 +44,7 @@ workflow ALIGN_AND_CALL_MT { SAMTOOLS_SORT_MT (PICARD_MARKDUPLICATES_MT.out.bam) SAMTOOLS_INDEX_MT(SAMTOOLS_SORT_MT.out.bam) - ch_sort_index_bam = SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, by: [0]) + ch_sort_index_bam = SAMTOOLS_SORT_MT.out.bam.join(SAMTOOLS_INDEX_MT.out.bai, failOnMismatch:true, failOnDuplicate:true) ch_sort_index_bam_int_mt = ch_sort_index_bam.combine(ch_intervals_mt) GATK4_MUTECT2_MT (ch_sort_index_bam_int_mt, ch_fasta, ch_fai, ch_dict, [], [], [],[]) @@ -52,8 +52,8 @@ workflow ALIGN_AND_CALL_MT { HAPLOCHECK_MT (GATK4_MUTECT2_MT.out.vcf) // Filter Mutect2 calls - ch_mutect_vcf = GATK4_MUTECT2_MT.out.vcf.join(GATK4_MUTECT2_MT.out.tbi, by: [0]) - ch_mutect_out = ch_mutect_vcf.join(GATK4_MUTECT2_MT.out.stats, by: [0]) + ch_mutect_vcf = GATK4_MUTECT2_MT.out.vcf.join(GATK4_MUTECT2_MT.out.tbi, failOnMismatch:true, failOnDuplicate:true) + ch_mutect_out = ch_mutect_vcf.join(GATK4_MUTECT2_MT.out.stats, failOnMismatch:true, failOnDuplicate:true) ch_to_filt = ch_mutect_out.map { meta, vcf, tbi, stats -> return [meta, vcf, tbi, stats, [], [], [], []] diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 33886f4e..6e3db396 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -41,16 +41,22 @@ workflow MERGE_ANNOTATE_MT { GATK4_MERGEVCFS_LIFT_UNLIFT_MT( ch_vcfs, ch_genome_dict_meta) // Filtering Variants - GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.vcf.join(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.tbi, by:[0]).set { ch_filt_vcf } + GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.vcf + .join(GATK4_MERGEVCFS_LIFT_UNLIFT_MT.out.tbi, failOnMismatch:true, failOnDuplicate:true) + .set { ch_filt_vcf } GATK4_VARIANTFILTRATION_MT (ch_filt_vcf, ch_genome_fasta, ch_genome_fai, ch_genome_dict_no_meta) // Spliting multiallelic calls - GATK4_VARIANTFILTRATION_MT.out.vcf.join(GATK4_VARIANTFILTRATION_MT.out.tbi, by:[0]).set { ch_in_split } + GATK4_VARIANTFILTRATION_MT.out.vcf + .join(GATK4_VARIANTFILTRATION_MT.out.tbi, failOnMismatch:true, failOnDuplicate:true) + .set { ch_in_split } SPLIT_MULTIALLELICS_MT (ch_in_split, ch_genome_fasta) TABIX_TABIX_MT(SPLIT_MULTIALLELICS_MT.out.vcf) // Removing duplicates and merging if there is more than one sample - SPLIT_MULTIALLELICS_MT.out.vcf.join(TABIX_TABIX_MT.out.tbi).set { ch_in_remdup } + SPLIT_MULTIALLELICS_MT.out.vcf + .join(TABIX_TABIX_MT.out.tbi, failOnMismatch:true, failOnDuplicate:true) + .set { ch_in_remdup } REMOVE_DUPLICATES_MT(ch_in_remdup, ch_genome_fasta) TABIX_TABIX_MT2(REMOVE_DUPLICATES_MT.out.vcf) @@ -98,7 +104,7 @@ workflow MERGE_ANNOTATE_MT { // Running vcfanno TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf_gz) - ch_in_vcfanno = ENSEMBLVEP_MT.out.vcf_gz.join(TABIX_TABIX_MT3.out.tbi, by: [0]) + ch_in_vcfanno = ENSEMBLVEP_MT.out.vcf_gz.join(TABIX_TABIX_MT3.out.tbi, failOnMismatch:true, failOnDuplicate:true) VCFANNO_MT(ch_in_vcfanno, ch_vcfanno_toml, [], ch_vcfanno_resources) ZIP_TABIX_VCFANNO(VCFANNO_MT.out.vcf) diff --git a/subworkflows/local/variant_calling/call_snv_sentieon.nf b/subworkflows/local/variant_calling/call_snv_sentieon.nf index 0b163740..03b6c684 100644 --- a/subworkflows/local/variant_calling/call_snv_sentieon.nf +++ b/subworkflows/local/variant_calling/call_snv_sentieon.nf @@ -36,7 +36,7 @@ workflow CALL_SNV_SENTIEON { TABIX_BCFTOOLS ( BCF_FILTER_TWO.out.vcf ) - BCF_FILTER_TWO.out.vcf.join(TABIX_BCFTOOLS.out.tbi) + BCF_FILTER_TWO.out.vcf.join(TABIX_BCFTOOLS.out.tbi, failOnMismatch:true, failOnDuplicate:true) .map { meta,vcf,tbi -> return [vcf,tbi] } .set { ch_vcf_idx } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index eb917010..64957c95 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -343,7 +343,7 @@ workflow RAREDISEASE { // ped correspondence, sex check, ancestry check PEDDY_CHECK ( - CALL_SNV.out.vcf.join(CALL_SNV.out.tabix), + CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, failOnMismatch:true, failOnDuplicate:true), MAKE_PED.out.ped ) ch_versions = ch_versions.mix(PEDDY_CHECK.out.versions) @@ -432,7 +432,7 @@ workflow RAREDISEASE { if (!params.skip_snv_annotation) { - ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, by: [0]) + ch_vcf = CALL_SNV.out.vcf.join(CALL_SNV.out.tabix, failOnMismatch:true, failOnDuplicate:true) if (!params.skip_mt_analysis) { ch_vcf @@ -441,7 +441,7 @@ workflow RAREDISEASE { GATK4_SELECTVARIANTS(ch_selvar_in) // remove mitochondrial variants - ch_vcf = GATK4_SELECTVARIANTS.out.vcf.join(GATK4_SELECTVARIANTS.out.tbi, by: [0]) + ch_vcf = GATK4_SELECTVARIANTS.out.vcf.join(GATK4_SELECTVARIANTS.out.tbi, failOnMismatch:true, failOnDuplicate:true) ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions) } @@ -475,7 +475,7 @@ workflow RAREDISEASE { .groupTuple() .set { ch_merged_tbi } - ch_merged_vcf.join(ch_merged_tbi).set {ch_concat_in} + ch_merged_vcf.join(ch_merged_tbi, failOnMismatch:true, failOnDuplicate:true).set {ch_concat_in} BCFTOOLS_CONCAT (ch_concat_in) ch_snv_annotate = BCFTOOLS_CONCAT.out.vcf From f906129844cb70f9931bdf65b6d1fff1589a8678 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Apr 2023 13:53:34 +0200 Subject: [PATCH 1136/1169] fix error --- subworkflows/local/annotate_snvs.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index dd927d81..54d09e95 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -91,7 +91,7 @@ workflow ANNOTATE_SNVS { if (params.analysis_type == 'wgs') { ENSEMBLVEP_SNV.out.vcf_gz - .join(TABIX_VEP.out.tbi, failOnMismatch:true, failOnDuplicate:true) + .join(TABIX_VEP.out.tbi, failOnMismatch:true) .groupTuple() .map { meta, vcfs, tbis -> def sortedvcfs = vcfs.sort { it.baseName } From 35aeeea2246f7d42f035a1b019331dc65e91f6aa Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Apr 2023 17:29:15 +0200 Subject: [PATCH 1137/1169] update docs and lint config --- .github/CONTRIBUTING.md | 12 ------------ .github/PULL_REQUEST_TEMPLATE.md | 7 ++++--- .nf-core.yml | 4 ---- 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 4b1a4fa3..47df952f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -94,18 +94,6 @@ Please use the following naming schemes, to make it easy to understand what is g - initial process channel: `ch_output_from_` - intermediate and terminal channels: `ch__for_` -* subworkflows: `verb_noun` or `verb_variant_noun` - - `verb_noun` : `align_bwamem2.nf` - - `verb_variant_noun` : `call_snv_deepvariant.nf` - -### Reusing modules in the workflow - -Occasionally, you might find yourself wanting to reuse a module with options that are different from what has already been defined in [conf/modules.config](../conf/modules.config). In that case, we recommend importing the module using an unique alias within the subworkflow, and then defining the options for the alias in [conf/modules.config](../conf/modules.config). - -For a working example, please have a look at how we have reused `bcftools norm` in both [subworkflows/local/call_snv_deepvariant.nf](../subworkflows/local/call_snv_deepvariant.nf) and [subworkflows/local/prepare_vcf.nf](../subworkflows/local/prepare_vcf.nf), and defined its subworkflow-specific options in [conf/modules.config](../conf/modules.config). - -You can find more information about aliases in the nextflow documentation [here](https://www.nextflow.io/docs/edge/dsl2.html#module-aliases). - ### Nextflow version bumping If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d848b01e..386c57f4 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,10 +15,11 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] 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 you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) +- [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir -stub`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test_one_sample,docker --outdir -stub`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). +- [ ] Ensure the test suite passes (`nextflow run . -profile test_one_sample,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.nf-core.yml b/.nf-core.yml index a22ef6f7..321436fe 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,11 +2,7 @@ lint: files_exist: - conf/modules.config files_unchanged: - - .github/CONTRIBUTING.md - - .github/ISSUE_TEMPLATE/bug_report.yml - .github/PULL_REQUEST_TEMPLATE.md - assets/multiqc_config.yaml - .github/workflows/linting.yml - - .github/workflows/linting_comment.yml - - .github/workflows/branch.yml repository_type: pipeline From 516e916def981b4b13fb8ae928f9e2a077940b26 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Apr 2023 17:52:09 +0200 Subject: [PATCH 1138/1169] update schema inputs --- assets/schema_input.json | 43 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 4ba2de4c..3258d7eb 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -29,8 +29,49 @@ "maxLength": 0 } ] + }, + "gender": { + "type": "string", + "pattern": "^\\S+$", + "errorMessage": "Gender must be provided and cannot contain spaces" + }, + "phenotype": { + "type": "string", + "pattern": "^\\S+$", + "errorMessage": "Phenotype must be provided and cannot contain spaces" + }, + "paternal_id": { + "errorMessage": "Paternal ID cannot contain spaces", + "anyOf": [ + { + "type": "string", + "pattern": "^\\S+$" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "maternal_id": { + "errorMessage": "Maternal ID cannot contain spaces", + "anyOf": [ + { + "type": "string", + "pattern": "^\\S+$" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "case_id": { + "type": "string", + "pattern": "^\\S+$", + "errorMessage": "Case name must be provided and cannot contain spaces" } }, - "required": ["sample", "fastq_1"] + "required": ["sample", "fastq_1", "gender", "phenotype", "case_id"] } } From 9b3059f1c74490ef25f3ed14eafdeca888519d6a Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Apr 2023 17:52:22 +0200 Subject: [PATCH 1139/1169] remove awstest2 --- .github/workflows/awstest2.yml | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 .github/workflows/awstest2.yml diff --git a/.github/workflows/awstest2.yml b/.github/workflows/awstest2.yml deleted file mode 100644 index 469bf2ba..00000000 --- a/.github/workflows/awstest2.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: nf-core AWS test single sample -# This workflow can be triggered manually with the GitHub actions workflow dispatch button. -# It runs the -profile 'test2samples' on AWS batch - -on: - workflow_dispatch: -jobs: - run-tower: - name: Run AWS tests single sample - if: github.repository == 'nf-core/raredisease' - runs-on: ubuntu-latest - steps: - # Launch workflow using Tower CLI tool action - - name: Launch workflow via tower - uses: nf-core/tower-action@v3 - with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/raredisease/work-${{ github.sha }} - parameters: | - { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/raredisease/results-test2samples-${{ github.sha }}" - } - profiles: test_one_sample,aws_tower - - uses: actions/upload-artifact@v3 - with: - name: Tower debug log file - path: tower_action_*.log From 65198d4d0cd470ab4df298f891445bef592e56fa Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Wed, 26 Apr 2023 17:55:36 +0200 Subject: [PATCH 1140/1169] remove change_name.nf --- modules/local/change_name.nf | 49 ------------------------------------ 1 file changed, 49 deletions(-) delete mode 100644 modules/local/change_name.nf diff --git a/modules/local/change_name.nf b/modules/local/change_name.nf deleted file mode 100644 index 38ee7c95..00000000 --- a/modules/local/change_name.nf +++ /dev/null @@ -1,49 +0,0 @@ -process CHANGE_NAME { - tag "$meta.id" - label 'process_low' - label 'process_single' - - conda "conda-forge::python=3.9.5" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'quay.io/biocontainers/python:3.9--1' }" - - input: - tuple val(meta), path(input_file) - - output: - tuple val(meta), path( "*.${file_type}"), emit: file - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - file_type = task.ext.file_type ?: input_file.getExtension() - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - mv \\ - $input_file \\ - ${prefix}.${file_type} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - change_name: v1.0 - END_VERSIONS - """ - - stub: - def args = task.ext.args ?: '' - file_type = task.ext.file_type ?: input_file.getExtension() - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.${file_type} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - change_name: v1.0 - END_VERSIONS - """ -} From 7ba68d7d3889f7c11bce636ad541bc4938c09ab7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 27 Apr 2023 14:41:23 +0200 Subject: [PATCH 1141/1169] comments --- workflows/raredisease.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index bf8d9cc4..6b32e808 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -188,7 +188,7 @@ workflow RAREDISEASE { : Channel.value([]) // Generate pedigree file - pedfile = CHECK_INPUT.out.samples.toList().map { make_ped(it) } + pedfile = CHECK_INPUT.out.samples.toList().map { makePed(it) } // Input QC FASTQC (CHECK_INPUT.out.reads) @@ -564,7 +564,7 @@ workflow.onComplete { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -def make_ped(samples) { +def makePed(samples) { def case_name = samples[0].case_id def outfile = workDir.resolve("$case_name" + '.ped') From 3898b6259929a199c6c7f8d5e01e4282fb2c9c41 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Fri, 28 Apr 2023 14:25:40 +0000 Subject: [PATCH 1142/1169] Template update for nf-core/tools version 2.8 --- .editorconfig | 2 +- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 3 +- .github/workflows/awsfulltest.yml | 2 +- .github/workflows/awstest.yml | 2 +- .github/workflows/branch.yml | 2 +- .github/workflows/clean-up.yml | 24 ++++ .github/workflows/linting.yml | 2 +- .pre-commit-config.yaml | 5 + CHANGELOG.md | 2 +- README.md | 74 ++++++---- bin/check_samplesheet.py | 3 - conf/base.config | 2 +- conf/igenomes.config | 8 ++ conf/test_full.config | 2 + docs/usage.md | 130 +++++------------- lib/NfcoreSchema.groovy | 4 +- lib/WorkflowMain.groovy | 13 +- lib/WorkflowRaredisease.groovy | 12 +- main.nf | 1 - modules.json | 4 +- modules/local/samplesheet_check.nf | 2 +- .../custom/dumpsoftwareversions/main.nf | 6 +- .../custom/dumpsoftwareversions/meta.yml | 2 + modules/nf-core/multiqc/main.nf | 6 +- modules/nf-core/multiqc/meta.yml | 3 +- nextflow.config | 31 ++++- tower.yml | 5 + 28 files changed, 195 insertions(+), 159 deletions(-) create mode 100644 .github/workflows/clean-up.yml create mode 100644 .pre-commit-config.yaml create mode 100644 tower.yml diff --git a/.editorconfig b/.editorconfig index b78de6e6..b6b31907 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,7 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{md,yml,yaml,html,css,scss,js,cff}] +[*.{md,yml,yaml,html,css,scss,js}] indent_size = 2 # These files are edited and tested upstream in nf-core/modules diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 46af5c36..c6865b29 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -45,6 +45,6 @@ body: * Nextflow version _(eg. 22.10.1)_ * Hardware _(eg. HPC, Desktop, Cloud)_ * Executor _(eg. slurm, local, awsbatch)_ - * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, or Apptainer)_ * OS _(eg. CentOS Linux, macOS, Linux Mint)_ * Version of nf-core/raredisease _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4548dd24..57aa63e7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,7 +15,8 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rare - [ ] 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 you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/raredisease/tree/master/.github/CONTRIBUTING.md) +- [ ] If necessary, also make a PR on the nf-core/raredisease _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index c6fab293..d777aefd 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v3 + uses: seqeralabs/action-tower-launch@v1 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 87d5182f..61ea561e 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -12,7 +12,7 @@ jobs: steps: # Launch workflow using Tower CLI tool action - name: Launch workflow via tower - uses: nf-core/tower-action@v3 + uses: seqeralabs/action-tower-launch@v1 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 26015bbe..387c04ca 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,7 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/raredisease' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/raredisease ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/raredisease ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml new file mode 100644 index 00000000..694e90ec --- /dev/null +++ b/.github/workflows/clean-up.yml @@ -0,0 +1,24 @@ +name: "Close user-tagged issues and PRs" +on: + schedule: + - cron: "0 0 * * 0" # Once a week + +jobs: + clean-up: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v7 + with: + stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." + stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." + close-issue-message: "This issue was closed because it has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor and then staled for 20 days with no activity." + days-before-stale: 30 + days-before-close: 20 + days-before-pr-close: -1 + any-of-labels: "awaiting-changes,awaiting-feedback" + exempt-issue-labels: "WIP" + exempt-pr-labels: "WIP" + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 858d622e..888cb4bc 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -78,7 +78,7 @@ jobs: - uses: actions/setup-python@v4 with: - python-version: "3.7" + python-version: "3.8" architecture: "x64" - name: Install dependencies diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..0c31cdb9 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,5 @@ +repos: + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v2.7.1" + hooks: + - id: prettier diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b18325f..59e6e976 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## v1.0dev - [date] +## v1.0.0 - [date] Initial release of nf-core/raredisease, created with the [nf-core](https://nf-co.re/) template. diff --git a/README.md b/README.md index 9f6ba61b..1d4dabc1 100644 --- a/README.md +++ b/README.md @@ -8,57 +8,71 @@ [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) [![Launch on Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/raredisease) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/raredisease)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/raredisease)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction - +**nf-core/raredisease** is a bioinformatics pipeline that ... -**nf-core/raredisease** is a bioinformatics best-practice analysis pipeline for call and score variants from WGS/WES of rare disease patients. - -The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! - - - -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources.The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/raredisease/results). - -## Pipeline summary + + 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) 2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) -## Quick Start +## Usage + +> **Note** +> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how +> to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) +> with `-profile test` before running the workflow on actual data. + + - Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. +Now, you can run the pipeline using: - > - The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. - > - Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > - If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. - > - If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. + -4. Start running your own analysis! +```bash +nextflow run nf-core/raredisease \ + -profile \ + --input samplesheet.csv \ + --outdir +``` - +> **Warning:** +> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those +> provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; +> see [docs](https://nf-co.re/usage/configuration#custom-configuration-files). - ```bash - nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile - ``` +For more details, please refer to the [usage documentation](https://nf-co.re/raredisease/usage) and the [parameter documentation](https://nf-co.re/raredisease/parameters). -## Documentation +## Pipeline output -The nf-core/raredisease pipeline comes with documentation about the pipeline [usage](https://nf-co.re/raredisease/usage), [parameters](https://nf-co.re/raredisease/parameters) and [output](https://nf-co.re/raredisease/output). +To see the the results of a test run with a full size dataset refer to the [results](https://nf-co.re/raredisease/results) tab on the nf-core website pipeline page. +For more details about the output files and reports, please refer to the +[output documentation](https://nf-co.re/raredisease/output). ## Credits diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 11b15572..4a758fe0 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -158,9 +158,6 @@ def sniff_format(handle): peek = read_head(handle) handle.seek(0) sniffer = csv.Sniffer() - if not sniffer.has_header(peek): - logger.critical("The given sample sheet does not appear to contain a header.") - sys.exit(1) dialect = sniffer.sniff(peek) return dialect diff --git a/conf/base.config b/conf/base.config index d84b67a8..9a86068f 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ process { memory = { check_max( 6.GB * task.attempt, 'memory' ) } time = { check_max( 4.h * task.attempt, 'time' ) } - errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' diff --git a/conf/igenomes.config b/conf/igenomes.config index 7a1b3ac6..3f114377 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -36,6 +36,14 @@ params { macs_gsize = "2.7e9" blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" } + 'CHM13' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAIndex/" + bwamem2 = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAmem2Index/" + gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/CHM13/Annotation/Genes/genes.gtf" + gff = "ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/009/914/755/GCF_009914755.1_T2T-CHM13v2.0/GCF_009914755.1_T2T-CHM13v2.0_genomic.gff.gz" + mito_name = "chrM" + } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" diff --git a/conf/test_full.config b/conf/test_full.config index a33b4721..9dd4f763 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -10,6 +10,8 @@ ---------------------------------------------------------------------------------------- */ +cleanup = true + params { config_profile_name = 'Full test profile' config_profile_description = 'Full test dataset to check pipeline function' diff --git a/docs/usage.md b/docs/usage.md index 8ef28997..94e500a7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -71,6 +71,29 @@ work # Directory containing the nextflow working files # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` +If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. + +Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. + +> ⚠️ Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). +> The above pipeline run specified with a params file in yaml format: + +```bash +nextflow run nf-core/raredisease -profile docker -params-file params.yaml +``` + +with `params.yaml` containing: + +```yaml +input: './samplesheet.csv' +outdir: './results/' +genome: 'GRCh37' +input: 'data' +<...> +``` + +You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). + ### Updating the pipeline When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: @@ -87,6 +110,10 @@ First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/ This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. +To further assist in reproducbility, you can use share and re-use [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. + +> 💡 If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. + ## Core Nextflow arguments > **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). @@ -95,7 +122,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Apptainer, Conda) - see below. > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -119,8 +146,10 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - `charliecloud` - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) +- `apptainer` + - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `conda` - - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. + - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter, Charliecloud, or Apptainer. ### `-resume` @@ -138,102 +167,19 @@ Specify the path to a specific config file (this is a core Nextflow command). Se Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. -For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: - -```console -[62/149eb0] NOTE: Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) -Error executing process > 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' - -Caused by: - Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) - -Command executed: - STAR \ - --genomeDir star \ - --readFilesIn WT_REP1_trimmed.fq.gz \ - --runThreadN 2 \ - --outFileNamePrefix WT_REP1. \ - - -Command exit status: - 137 - -Command output: - (empty) - -Command error: - .command.sh: line 9: 30 Killed STAR --genomeDir star --readFilesIn WT_REP1_trimmed.fq.gz --runThreadN 2 --outFileNamePrefix WT_REP1. -Work dir: - /home/pipelinetest/work/9d/172ca5881234073e8d76f2a19c88fb - -Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` -``` - -#### For beginners - -A first step to bypass this error, you could try to increase the amount of CPUs, memory, and time for the whole pipeline. Therefor you can try to increase the resource for the parameters `--max_cpus`, `--max_memory`, and `--max_time`. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of rnaseq](https://nf-co.re/rnaseq/3.9/parameters) and scroll down to the `show hidden parameter` button to get the default value for `--max_memory`. In this case 128GB, you than can try to run your pipeline again with `--max_memory 200GB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. - -#### Advanced option on process level - -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). -We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/star/align/main.nf`. -If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). -The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. -The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. -Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. -The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. - -```nextflow -process { - withName: 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN' { - memory = 100.GB - } -} -``` - -> **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. -> -> If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. - -### Updating containers (advanced users) - -The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. - -1. Check the default version used by the pipeline in the module file for [Pangolin](https://github.com/nf-core/viralrecon/blob/a85d5969f9025409e3618d6c280ef15ce417df65/modules/nf-core/software/pangolin/main.nf#L14-L19) -2. Find the latest version of the Biocontainer available on [Quay.io](https://quay.io/repository/biocontainers/pangolin?tag=latest&tab=tags) -3. Create the custom config accordingly: - - - For Docker: +To change the resource requests, please see the [max resources](https://nf-co.re/docs/usage/configuration#max-resources) and [tuning workflow resources](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources) section of the nf-core website. - ```nextflow - process { - withName: PANGOLIN { - container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` +### Custom Containers - - For Singularity: +In some cases you may wish to change which container or conda environment a step of the pipeline uses for a particular tool. By default nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However in some cases the pipeline specified version maybe out of date. - ```nextflow - process { - withName: PANGOLIN { - container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` +To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/usage/configuration#updating-tool-versions) section of the nf-core website. - - For Conda: +### Custom Tool Arguments - ```nextflow - process { - withName: PANGOLIN { - conda = 'bioconda::pangolin=3.0.5' - } - } - ``` +A pipeline might not always support every possible argument or option of a particular tool used in pipeline. Fortunately, nf-core pipelines provide some freedom to users to insert additional parameters that the pipeline does not include by default. -> **NB:** If you wish to periodically update individual tool-specific results (e.g. Pangolin) generated by the pipeline then you must ensure to keep the `work/` directory otherwise the `-resume` ability of the pipeline will be compromised and it will restart from scratch. +To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/usage/configuration#customising-tool-arguments) section of the nf-core website. ### nf-core/configs diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 33cd4f6e..9b34804d 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -2,6 +2,7 @@ // This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. // +import nextflow.Nextflow import org.everit.json.schema.Schema import org.everit.json.schema.loader.SchemaLoader import org.everit.json.schema.ValidationException @@ -83,6 +84,7 @@ class NfcoreSchema { 'stub-run', 'test', 'w', + 'with-apptainer', 'with-charliecloud', 'with-conda', 'with-dag', @@ -177,7 +179,7 @@ class NfcoreSchema { } if (has_error) { - System.exit(1) + Nextflow.error('Exiting!') } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 9f34c54a..902b3be4 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -2,6 +2,8 @@ // This file holds several functions specific to the main.nf workflow in the nf-core/raredisease pipeline // +import nextflow.Nextflow + class WorkflowMain { // @@ -21,7 +23,7 @@ class WorkflowMain { // // Generate help string // - public static String help(workflow, params, log) { + public static String help(workflow, params) { def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" def help_string = '' help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) @@ -34,7 +36,7 @@ class WorkflowMain { // // Generate parameter summary log string // - public static String paramsSummaryLog(workflow, params, log) { + public static String paramsSummaryLog(workflow, params) { def summary_log = '' summary_log += NfcoreTemplate.logo(workflow, params.monochrome_logs) summary_log += NfcoreSchema.paramsSummaryLog(workflow, params) @@ -49,7 +51,7 @@ class WorkflowMain { public static void initialise(workflow, params, log) { // Print help to screen if required if (params.help) { - log.info help(workflow, params, log) + log.info help(workflow, params) System.exit(0) } @@ -61,7 +63,7 @@ class WorkflowMain { } // Print parameter summary log to screen - log.info paramsSummaryLog(workflow, params, log) + log.info paramsSummaryLog(workflow, params) // Validate workflow parameters via the JSON schema if (params.validate_params) { @@ -81,8 +83,7 @@ class WorkflowMain { // Check input has been provided if (!params.input) { - log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" - System.exit(1) + Nextflow.error("Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'") } } // diff --git a/lib/WorkflowRaredisease.groovy b/lib/WorkflowRaredisease.groovy index 5faae8cf..b4f3b6d8 100755 --- a/lib/WorkflowRaredisease.groovy +++ b/lib/WorkflowRaredisease.groovy @@ -2,6 +2,7 @@ // This file holds several functions specific to the workflow/raredisease.nf in the nf-core/raredisease pipeline // +import nextflow.Nextflow import groovy.text.SimpleTemplateEngine class WorkflowRaredisease { @@ -14,8 +15,7 @@ class WorkflowRaredisease { if (!params.fasta) { - log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." - System.exit(1) + Nextflow.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." } } @@ -61,17 +61,19 @@ class WorkflowRaredisease { def description_html = engine.createTemplate(methods_text).make(meta) return description_html - }// + } + + // // Exit pipeline if incorrect --genome key provided // private static void genomeExistsError(params, log) { if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - log.error "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + " Currently, the available genome keys are:\n" + " ${params.genomes.keySet().join(", ")}\n" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - System.exit(1) + Nextflow.error(error_string) } } } diff --git a/main.nf b/main.nf index a195db40..25e7ee5d 100644 --- a/main.nf +++ b/main.nf @@ -4,7 +4,6 @@ nf-core/raredisease ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/raredisease - Website: https://nf-co.re/raredisease Slack : https://nfcore.slack.com/channels/raredisease ---------------------------------------------------------------------------------------- diff --git a/modules.json b/modules.json index d6c9442c..8588dadf 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", "installed_by": ["modules"] }, "fastqc": { @@ -17,7 +17,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "f2d63bd5b68925f98f572eed70993d205cc694b7", "installed_by": ["modules"] } } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 4542abb3..4dc269ea 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -5,7 +5,7 @@ process SAMPLESHEET_CHECK { conda "conda-forge::python=3.8.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - 'quay.io/biocontainers/python:3.8.3' }" + 'biocontainers/python:3.8.3' }" input: path samplesheet diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 3df21765..800a6099 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.13" + conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml index 60b546a0..c32657de 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -1,7 +1,9 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json name: custom_dumpsoftwareversions description: Custom module used to dump software versions within the nf-core pipeline template keywords: - custom + - dump - version tools: - custom: diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 68f66bea..4b604749 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_single' - conda "bioconda::multiqc=1.13" + conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ebc29b27..f93b5ee5 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json name: MultiQC description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: @@ -37,7 +38,7 @@ output: description: MultiQC report file pattern: "multiqc_report.html" - data: - type: dir + type: directory description: MultiQC data dir pattern: "multiqc_data" - plots: diff --git a/nextflow.config b/nextflow.config index bdb92381..e15d3d7e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -78,7 +78,11 @@ try { profiles { - debug { process.beforeScript = 'echo $HOSTNAME' } + debug { + dumpHashes = true + process.beforeScript = 'echo $HOSTNAME' + cleanup = false + } conda { conda.enabled = true docker.enabled = false @@ -86,6 +90,7 @@ profiles { podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } mamba { conda.enabled = true @@ -95,14 +100,18 @@ profiles { podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } docker { docker.enabled = true + docker.registry = 'quay.io' docker.userEmulation = true + conda.enabled = false singularity.enabled = false podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } arm { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' @@ -110,31 +119,49 @@ profiles { singularity { singularity.enabled = true singularity.autoMounts = true + conda.enabled = false docker.enabled = false podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } podman { podman.enabled = true + podman.registry = 'quay.io' + conda.enabled = false docker.enabled = false singularity.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } shifter { shifter.enabled = true + conda.enabled = false docker.enabled = false singularity.enabled = false podman.enabled = false charliecloud.enabled = false + apptainer.enabled = false } charliecloud { charliecloud.enabled = true + conda.enabled = false docker.enabled = false singularity.enabled = false podman.enabled = false shifter.enabled = false + apptainer.enabled = false + } + apptainer { + apptainer.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false } gitpod { executor.name = 'local' @@ -193,7 +220,7 @@ manifest { description = """call and score variants from WGS/WES of rare disease patients""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.0dev' + version = '1.0.0' doi = '' } diff --git a/tower.yml b/tower.yml new file mode 100644 index 00000000..787aedfe --- /dev/null +++ b/tower.yml @@ -0,0 +1,5 @@ +reports: + multiqc_report.html: + display: "MultiQC HTML report" + samplesheet.csv: + display: "Auto-created samplesheet with collated metadata and FASTQ paths" From 67ec2a7b8e91e82ee40815b613777f9d887ed4ab Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 2 May 2023 11:02:12 +0200 Subject: [PATCH 1143/1169] fix docs --- README.md | 109 ++++++++++---- docs/usage.md | 389 ++++++++++++++++++++++++++++++++++-------------- modules.json | 310 ++++++++++++++++++++++++++++++++++++++ nextflow.config | 7 + 4 files changed, 675 insertions(+), 140 deletions(-) diff --git a/README.md b/README.md index 1d4dabc1..670cf2ae 100644 --- a/README.md +++ b/README.md @@ -10,22 +10,85 @@ [![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23raredisease-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/raredisease)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +#### TOC + +- [Introduction](#introduction) +- [Pipeline summary](#pipeline-summary) +- [Usage](#usage) +- [Pipeline output](#pipeline-output) +- [Credits](#credits) +- [Contributions and Support](#contributions-and-support) +- [Citations](#citations) + ## Introduction -**nf-core/raredisease** is a bioinformatics pipeline that ... +**nf-core/raredisease** is a best-practice bioinformatic pipeline for calling and scoring variants from WGS/WES data from rare disease patients. This pipeline is heavily inspired by [MIP](https://github.com/Clinical-Genomics/MIP). + +The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! + +On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/raredisease/results). + +## Pipeline summary + +**1. Metrics:** + +- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) +- [Mosdepth](https://github.com/brentp/mosdepth) +- [MultiQC](http://multiqc.info/) +- [Picard's CollectMutipleMetrics, CollectHsMetrics, and CollectWgsMetrics](https://broadinstitute.github.io/picard/) +- [Qualimap](http://qualimap.conesalab.org/) +- [Sentieon's WgsMetricsAlgo](https://support.sentieon.com/manual/usages/general/) +- [TIDDIT's cov](https://github.com/J35P312/) + +**2. Alignment:** + +- [Bwa-mem2](https://github.com/bwa-mem2/bwa-mem2) +- [Sentieon DNAseq](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/) + +**3. Variant calling - SNV:** + +- [DeepVariant](https://github.com/google/deepvariant) +- [Sentieon DNAscope](https://support.sentieon.com/manual/DNAscope_usage/dnascope/) + +**4. Variant calling - SV:** + +- [Manta](https://github.com/Illumina/manta) +- [TIDDIT's sv](https://github.com/SciLifeLab/TIDDIT) + +**5. Annotation - SNV:** - +- [bcftools roh](https://samtools.github.io/bcftools/bcftools.html#roh) +- [vcfanno](https://github.com/brentp/vcfanno) +- [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) - - +**6. Annotation - SV:** -1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) +- [SVDB query](https://github.com/J35P312/SVDB#Query) +- [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) + +**7. Mitochondrial analysis:** + +- [Alignment and variant calling - GATK Mitochondrial short variant discovery pipeline ](https://gatk.broadinstitute.org/hc/en-us/articles/4403870837275-Mitochondrial-short-variant-discovery-SNVs-Indels-) +- Annotation: + - [HaploGrep2](https://github.com/seppinho/haplogrep-cmd) + - [vcfanno](https://github.com/brentp/vcfanno) + - [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html) + +**8. Variant calling - repeat expansions:** + +- [Expansion Hunter](https://github.com/Illumina/ExpansionHunter) +- [Stranger](https://github.com/Clinical-Genomics/stranger) + +**9. Rank variants - SV and SNV:** + +- [GENMOD](https://github.com/Clinical-Genomics/genmod) + + +

      + +

      + +Note that it is possible to include/exclude certain tools or steps. ## Usage @@ -34,26 +97,21 @@ > to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) > with `-profile test` before running the workflow on actual data. - +Second, ensure that you have defined the path to reference files and parameters required for the type of analysis that you want to perform. More information about this can be found [here](https://github.com/nf-core/raredisease/blob/dev/docs/usage.md). Now, you can run the pipeline using: - - ```bash nextflow run nf-core/raredisease \ -profile \ @@ -70,17 +128,16 @@ For more details, please refer to the [usage documentation](https://nf-co.re/rar ## Pipeline output -To see the the results of a test run with a full size dataset refer to the [results](https://nf-co.re/raredisease/results) tab on the nf-core website pipeline page. For more details about the output files and reports, please refer to the [output documentation](https://nf-co.re/raredisease/output). ## Credits -nf-core/raredisease was originally written by Clinical Genomics Stockholm. +nf-core/raredisease was written in a collaboration between the Clinical Genomics nodes in Sweden, with major contributions from [Ramprasad Neethiraj](https://github.com/ramprasadn), [Anders Jemt](https://github.com/jemten), [Lucia Pena Perez](https://github.com/Lucpen), and [Mei Wu](https://github.com/projectoriented) at Clinical Genomics Stockholm. -We thank the following people for their extensive assistance in the development of this pipeline: +Additional contributors were [Sima Rahimi](https://github.com/sima-r), [Gwenna Breton](https://github.com/Gwennid) and [Emma Västerviga](https://github.com/EmmaCAndersson) (Clinical Genomics Gothenburg); [Lauri Mesilaakso](https://github.com/ljmesi) (Clinical Genomics Linköping); [Subazini Thankaswamy Kosalai](https://github.com/sysbiocoder) (Clinical Genomics Örebro); [Annick Renevey](https://github.com/rannick) and [Peter Pruisscher](https://github.com/peterpru) (Clinical Genomics Stockholm); [Ryan Kennedy](https://github.com/ryanjameskennedy) (Clinical Genomics Lund); and [Lucas Taniguti](https://github.com/lmtani). - +We thank the nf-core community for their extensive assistance in the development of this pipeline. ## Contributions and Support @@ -93,8 +150,6 @@ For further information or help, don't hesitate to get in touch on the [Slack `# - - An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. You can cite the `nf-core` publication as follows: @@ -104,3 +159,7 @@ You can cite the `nf-core` publication as follows: > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > > _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). + +You can read more about MIP's use in healthcare in, + +> Stranneheim H, Lagerstedt-Robinson K, Magnusson M, et al. Integration of whole genome sequencing into a healthcare setting: high diagnostic rates across multiple clinical entities in 3219 rare disease patients. Genome Med. 2021;13(1):40. doi:10.1186/s13073-021-00855-5 diff --git a/docs/usage.md b/docs/usage.md index 94e500a7..a02b86d6 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,171 +1,314 @@ # nf-core/raredisease: Usage -## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/raredisease/usage](https://nf-co.re/raredisease/usage) - -> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ +**We recommend reading this documentation on the nf-core website: [https://nf-co.re/raredisease/usage](https://nf-co.re/raredisease/usage)** + +Table of contents: + +- [nf-core/raredisease: Usage](#nf-coreraredisease-usage) + - [Introduction](#introduction) + - [Prerequisites](#prerequisites) + - [Run nf-core/raredisease with test data](#run-nf-coreraredisease-with-test-data) + - [Updating the pipeline](#updating-the-pipeline) + - [Run nf-core/raredisease with your data](#run-nf-coreraredisease-with-your-data) + - [Samplesheet](#samplesheet) + - [Reference files and parameters](#reference-files-and-parameters) + - [1. Alignment](#1-alignment) + - [2. QC stats from the alignment files](#2-qc-stats-from-the-alignment-files) + - [3. Repeat expansions](#3-repeat-expansions) + - [4. Variant calling - SNV](#4-variant-calling---snv) + - [5. Variant calling - Structural variants](#5-variant-calling---structural-variants) + - [6. SNV annotation & Ranking](#6-snv-annotation--ranking) + - [7. SV annotation & Ranking](#7-sv-annotation--ranking) + - [8. Mitochondrial analysis](#8-mitochondrial-analysis) + - [Run the pipeline](#run-the-pipeline) + - [Direct input in CLI](#direct-input-in-cli) + - [Import from a config file (recommended)](#import-from-a-config-file-recommended) + - [Best practices](#best-practices) + - [Custom configuration](#custom-configuration) + - [Changing resources](#changing-resources) + - [Custom Containers](#custom-containers) + - [Custom Tool Arguments](#custom-tool-arguments) + - [nf-core/configs](#nf-coreconfigs) + - [Run Sentieon](#run-sentieon) + - [Azure Resource Requests](#azure-resource-requests) + - [Running in the background](#running-in-the-background) + - [Nextflow memory requirements](#nextflow-memory-requirements) ## Introduction - +nf-core/raredisease is a bioinformatics best-practice analysis pipeline to call, annotate and score variants from WGS/WES of rare disease patients. The pipeline is built using Nextflow. -## Samplesheet input +## Prerequisites -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. +1. Install Nextflow (>=22.10.1) using the instructions [here.](https://nextflow.io/docs/latest/getstarted.html#installation) +2. Install one of the following technologies for full pipeline reproducibility: Docker, Singularity, Podman, Shifter or Charliecloud. + > Almost all nf-core pipelines give you the option to use conda as well. However, some tools used in the raredisease pipeline do not have a conda package so we do not support conda at the moment. -```bash ---input '[path to samplesheet file]' +## Run nf-core/raredisease with test data + +Before running the pipeline with your data, we recommend running it with the test dataset available [here](https://github.com/nf-core/test-datasets/tree/raredisease). You do not need to download the data as the pipeline is configured to fetch that data automatically for you when you use the test profile. + +Run the following command, where YOURPROFILE is the package manager you installed on your machine. For example, `-profile test,docker` or `-profile test,singularity`: + +``` +nextflow run nf-core/raredisease \ + -revision dev -profile test, \ + --outdir ``` -### Multiple runs of the same sample +> Check [nf-core/configs](https://github.com/nf-core/configs/tree/master/conf) to see if a custom config file to run nf-core pipelines already exists for your institute. If so, you can simply use `-profile test,` in your command. This enables the appropriate package manager and sets the appropriate execution settings for your machine. +> NB: The order of profiles is important! They are loaded in sequence, so later profiles can overwrite earlier profiles. -The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: +Running the command creates the following files in your working directory: -```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz +``` +work # Directory containing the Nextflow working files + # Finished results in specified location (defined with --outdir) +.nextflow_log # Log file from Nextflow +# Other Nextflow hidden files, like history of pipeline logs. ``` -### Full samplesheet +Test profile runs the pipeline with a case containing three samples, but if you would like to test the pipeline with one sample, use `-profile test_one_sample,`. -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. +### Updating the pipeline -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. +The above command downloads the pipeline from GitHub, caches it, and tests it on the test dataset. When you run the command again, it will fetch the pipeline from cache even if a more recent version of the pipeline is available. To make sure that you're running the latest version of the pipeline, update the cached version of the pipeline by including `-latest` in the command. -```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, -``` +## Run nf-core/raredisease with your data -| Column | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +Running the pipeline involves three steps: -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. +1. Prepare a samplesheet +2. Gather all required references +3. Supply samplesheet and references, and run the command -## Running the pipeline +#### Samplesheet -The typical command for running the pipeline is as follows: +A samplesheet is used to pass the information about the sample(s), such as the path to the FASTQ files and other meta data (gender, phenotype, etc.,) to the pipeline in csv format. -```bash -nextflow run nf-core/raredisease --input samplesheet.csv --outdir --genome GRCh37 -profile docker -``` +nf-core/raredisease will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information in the samplesheet (sex/gender and phenotype) should be provided as they would be for a [ped file](https://gatk.broadinstitute.org/hc/en-us/articles/360035531972-PED-Pedigree-format) (i.e. 1 for male, 2 for female, other for unknown). -This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. +| Fields | Description | +| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `lane` | Used to generate separate channels during the alignment step. | +| `fastq_1` | Absolute path to FASTQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Absolute path to FASTQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `gender` | Sex (1=male; 2=female; other=unknown). | +| `phenotype` | Affected status of patient (0 = missing; 1=unaffected; 2=affected). | +| `paternal_id` | Sample ID of the father, can be blank if the father isn't part of the analysis or for samples other than the proband. | +| `maternal_id` | Sample ID of the mother, can be blank if the mother isn't part of the analysis or for samples other than the proband. | +| `case_id` | Case ID, for the analysis used when generating a family VCF. | -Note that the pipeline will create the following files in your working directory: +It is also possible to include multiple runs of the same sample in a samplesheet. For example, when you have re-sequenced the same sample more than once to increase sequencing depth. In that case, the `sample` identifiers in the samplesheet have to be the same. The pipeline will align the raw read/read-pairs independently before merging the alignments belonging to the same sample. Below is an example for a trio with the proband sequenced across two lanes: -```bash -work # Directory containing the nextflow working files - # Finished results in specified location (defined with --outdir) -.nextflow_log # Log file from Nextflow -# Other nextflow hidden files, eg. history of pipeline runs and old logs. -``` +| sample | lane | fastq_1 | fastq_2 | gender | phenotype | paternal_id | maternal_id | case_id | +| -------- | ---- | -------------------------------- | -------------------------------- | ------ | --------- | ----------- | ----------- | ------- | +| AEG588A1 | 2 | AEG588A1_S1_L002_R1_001.fastq.gz | AEG588A1_S1_L002_R2_001.fastq.gz | 1 | 2 | AEG588A3 | AEG588A2 | fam_1 | +| AEG588A1 | 3 | AEG588A1_S1_L003_R1_001.fastq.gz | AEG588A1_S1_L003_R2_001.fastq.gz | 1 | 2 | AEG588A3 | AEG588A2 | fam_1 | +| AEG588A2 | 4 | AEG588A2_S1_L004_R1_001.fastq.gz | AEG588A2_S1_L004_R2_001.fastq.gz | 2 | 1 | | | fam_1 | +| AEG588A3 | 4 | AEG588A3_S1_L004_R1_001.fastq.gz | AEG588A3_S1_L004_R2_001.fastq.gz | 1 | 1 | | | fam_1 | -If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. +If you would like to see more examples of what a typical samplesheet looks like for a singleton and a trio, follow these links, [singleton](https://github.com/nf-core/test-datasets/blob/raredisease/testdata/samplesheet_single.csv) and [trio](https://github.com/nf-core/test-datasets/blob/raredisease/testdata/samplesheet_trio.csv). -Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. +#### Reference files and parameters -> ⚠️ Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). -> The above pipeline run specified with a params file in yaml format: +In nf-core/raredisease, references can be supplied using parameters listed [here](https://nf-co.re/raredisease/dev/parameters). -```bash -nextflow run nf-core/raredisease -profile docker -params-file params.yaml -``` +Note that the pipeline is modular in architecture. It offers you the flexibility to choose between different tools. For example, you can align with either bwamem2 or Sentieon BWA mem and call SNVs with either DeepVariant or Sentieon DNAscope. You also have the option to turn off sections of the pipeline if you do not want to run the. For example, snv annotation can be turned off by adding `--skip_snv_annotation` flag in the command line, or by setting it to true in a parameter file. This flexibility means that in any given analysis run, a combination of tools included in the pipeline will not be executed. So the pipeline is written in a way that can account for these differences while working with reference parameters. If a tool is not going to be executed during the course of a run, parameters used only by that tool need not be provided. For example, for SNV calling if you use DeepVariant as your variant caller, you need not provide the parameter `--ml_model`, which is only used by Sentieon DNAscope. -with `params.yaml` containing: +nf-core/raredisease consists of several tools used for various purposes. For convenience, we have grouped those tools under the following categories: -```yaml -input: './samplesheet.csv' -outdir: './results/' -genome: 'GRCh37' -input: 'data' -<...> -``` +1. Alignment (bwamem2/Sentieon BWA mem) +2. QC stats from the alignment files +3. Repeat expansions (ExpansionsHunter & Stranger) +4. Variant calling - SNV (DeepVariant/Sentieon DNAscope) +5. Variant calling - Structural variants (SV) (Tiddit & Manta) +6. SNV annotation & ranking (rohcall, vcfanno, ensembl VEP, GENMOD) +7. SV annotation & ranking (SVDB query, ensembl VEP, GENMOD) +8. Mitochondrial analysis -You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). +> We have only listed the groups that require at least one input from the user. For example, the pipeline also runs SMNCopyNumberCaller, but it does not require any input other than the bam files passed by the pipeline. Hence, it is not mentioned in the list above. To know more about the tools used in the pipeline check the [README](../README.md). -### Updating the pipeline +The mandatory and optional parameters for each category are tabulated below. -When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: +> Alignment, QC stats, repeat expansions, SNV & SV variant calling are run by default. Hence, the mandatory parameters used by those features will always have to be provided to the pipeline. -```bash -nextflow pull nf-core/raredisease -``` +##### 1. Alignment -### Reproducibility +| Mandatory | Optional | +| ------------------- | --------------------------- | +| aligner1 | fasta_fai2 | +| fasta | bwamem22 | +| platform | known_dbsnp3 | +| | known_dbsnp_tbi3 | -It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. +1Default value is bwamem2, but if you have a valid license for Sentieon, you have the option to use Sentieon as well.
      +2fasta_fai and bwamem2, if not provided by the user, will be generated by the pipeline when necessary.
      +3Used only by Sentieon.
      -First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. +##### 2. QC stats from the alignment files -This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. +| Mandatory | Optional | +| ------------------------------------------------------------ | -------- | +| intervals_wgs1 | | +| intervals_y1 | | +| target_bed / (bait_intervals & target_intervals)2 | | -To further assist in reproducbility, you can use share and re-use [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. +1These files are Picard's style interval list files, comprising the entire genome or only the chromosome Y. A version of these files for GRCh37 and for GRCh38 is supplied in the pipeline assets. These files are not necessary if you are using Sentieon.
      +2 If a target_bed file is provided, bait_intervals and target_intervals can be generated by the pipeline.
      -> 💡 If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. +##### 3. Repeat expansions -## Core Nextflow arguments +| Mandatory | Optional | +| --------------- | -------- | +| variant_catalog | | -> **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). +##### 4. Variant calling - SNV -### `-profile` +| Mandatory | Optional | +| -------------------------- | --------------------------- | +| variant_caller1 | known_dbsnp2 | +| ml_model2 | known_dbsnp_tbi2 | +| analysis_type3 | call_interval2 | +| | known_dbsnp_tbi2 | -Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. +1Default variant caller is DeepVariant, but you have the option to use Sentieon as well.
      +2These parameters are only used by Sentieon.
      +3Default is WGS, but you have the option to choose WES as well.
      -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Apptainer, Conda) - see below. +##### 5. Variant calling - Structural variants -> We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. +| Mandatory | Optional | +| --------- | ---------- | +| | target_bed | +| | bwa | -The pipeline also dynamically loads configurations from [https://github.com/nf-core/configs](https://github.com/nf-core/configs) when it runs, making multiple config profiles for various institutional clusters available at run time. For more information and to see if your system is available in these configs please see the [nf-core/configs documentation](https://github.com/nf-core/configs#documentation). +##### 6. SNV annotation & Ranking -Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! -They are loaded in sequence, so later profiles can overwrite earlier profiles. +| Mandatory | Optional | +| ----------------------------- | ------------------------------ | +| genome1 | gnomad_af4 | +| vcfanno_resources2 | reduced_penetrance5 | +| vcfanno_toml3 | vcfanno_lua | +| vep_cache_version | vep_filters6 | +| vep_cache | score_config_snv7 | -If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended, since it can lead to different results on different machines dependent on the computer enviroment. +1Genome version is used by VEP. You have the option to choose between GRCh37 and GRCh38.
      +2Path to VCF files and their indices used by vcfanno. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_resources.txt).
      +3Path to a vcfanno configuration file. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_config.toml).
      +4GnomAD VCF file can be downloaded from [here] (https://gnomad.broadinstitute.org/downloads).
      +5Used by GENMOD while modeling the variants. Contains a list of loci that show [reduced penetrance](https://medlineplus.gov/genetics/understanding/inheritance/penetranceexpressivity/) in people. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv).
      +6 This file contains a list of candidate genes (with [HGNC](https://www.genenames.org/) IDs) that is used to split the variants into canditate variants and research variants. Research variants contain all the variants, while candidate variants are a subset of research variants and are associated with candidate genes. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/hgnc.txt).
      +7Used by GENMOD for ranking the variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/rank_model_snv.ini).
      -- `test` - - A profile with a complete configuration for automated testing - - Includes links to test data so needs no other parameters -- `docker` - - A generic configuration profile to be used with [Docker](https://docker.com/) -- `singularity` - - A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) -- `podman` - - A generic configuration profile to be used with [Podman](https://podman.io/) -- `shifter` - - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) -- `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) -- `apptainer` - - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) -- `conda` - - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter, Charliecloud, or Apptainer. +##### 7. SV annotation & Ranking -### `-resume` +| Mandatory | Optional | +| -------------------------- | ------------------ | +| genome | reduced_penetrance | +| svdb_query_dbs1 | score_config_sv | +| vep_cache_version | vep_filters | +| vep_cache | | -Specify this when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). +1 A CSV file that describes the databases (VCFs) used by SVDB for annotating structural variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/svdb_querydb_files.csv). Information about the column headers can be found [here](https://github.com/J35P312/SVDB#Query). -You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. +##### 8. Mitochondrial analysis -### `-c` +| Mandatory | Optional | +| ------------------------------ | -------- | +| genome | | +| mt_backchain_shift1 | | +| mito_name | | +| mt_fasta_shift | | +| mt_intervals | | +| mt_intervals_shift | | +| vcfanno_resources | | +| vcfanno_toml | | +| vep_cache_version | | +| vep_cache | | -Specify the path to a specific config file (this is a core Nextflow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. +1Can be generated by GATK's [ShiftFasta](https://gatk.broadinstitute.org/hc/en-us/articles/9570501436827-ShiftFasta-BETA-). Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/mt_shift8000.back_chain). -## Custom configuration +#### Run the pipeline + +You can directly supply the parameters in the command line (CLI) or use a config file from which the pipeline can import the parameters. + +##### Direct input in CLI + +All of the pipeline parameters listed [here](https://nf-co.re/raredisease/dev/parameters) can be passed using the CLI. For example, you can provide the samplesheet, reference FASTA, and turn off annotations for SNVs and SVs by running, + +``` +nextflow run nf-core/raredisease \ + -revision dev \ + -profile test, \ + --input samplesheet.csv \ + --fasta reference.fasta \ + --skip_snv_annotation \ + --skip_sv_annotation \ + --outdir +``` + +##### Import from a config file (recommended) + +To input or change the default parameters, we recommend using a config file instead. Create a config file that contains all the parameters and supply that file as shown below. + +``` +nextflow run nf-core/raredisease \ + -revision dev \ + -profile test, \ + -c \ + --outdir +``` + +A sample config file can be found [here](https://github.com/nf-core/raredisease/blob/dev/conf/test.config). + +## Best practices + +- **Singularity cache:** If you are using singularity, use the nf-core download command to download images first, before running the pipeline. Define [NXF_SINGULARITY_CACHEDIR](https://nextflow.io/docs/latest/config.html?highlight=nxf_singularity_cachedir#environment-variables) or singularity.cacheDir Nextflow options to store and re-use the images from a central location for future pipeline runs. + +- **Save references:** While the pipeline can generate indices for the FASTA and some VCF files when they are not provided, it can be benficial to supply them to the pipeline as it saves computing resources. You can use the `--save_reference` parameter to publish those files, and then update your config file with the paths to these files for your subsequent runs. + +- **Update pipeline:** If you would like to update the pipeline code stored in cache, in addition to running the command with `-latest` option, you can also run the command below: + +```bash +nextflow pull nf-core/raredisease +``` + +- **Reproducibility:** Specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/raredisease releases page](https://github.com/nf-core/raredisease/releases) and find the latest pipeline version - numeric only (e.g. `1.3.1`). Then specify this when running the pipeline with `-r`, for example, `-r 1.3.1`. You can switch to another version by changing the number after the `-r` flag. The version number will be logged in reports when you run the pipeline. For example, you can view the version number at the bottom of the MultiQC reports. + +To further assist in reproducbility, you can use share and re-use [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. + +> 💡 If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. + +- **Restart a previous run:** Add `-resume` to your command when restarting a pipeline. Nextflow will use cached results from any pipeline steps where inputs are the same, and resume the run from where it terminated previously. For input to be considered the same, names and the files' contents must be identical. For more info about `-resume`, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. + +- **Reusing parameters:** If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. + +Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. + +> ⚠️ Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). +> The above pipeline run specified with a params file in yaml format: + +```bash +nextflow run nf-core/raredisease -profile docker -params-file params.yaml +``` + +with `params.yaml` containing: + +```yaml +input: './samplesheet.csv' +outdir: './results/' +genome: 'GRCh37' +input: 'data' +<...> +``` + +You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). -### Resource requests +## Custom configuration -Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. +### Changing resources To change the resource requests, please see the [max resources](https://nf-co.re/docs/usage/configuration#max-resources) and [tuning workflow resources](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources) section of the nf-core website. @@ -181,15 +324,31 @@ A pipeline might not always support every possible argument or option of a parti To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/usage/configuration#customising-tool-arguments) section of the nf-core website. -### nf-core/configs +#### nf-core/configs -In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. +In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information about creating your own configuration files. If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -## Azure Resource Requests +### Run Sentieon + +To use Sentieon you have to: + +1. Ensure that Sentieon executable is in path. +2. If necessary, store license information as a secret in Nextflow's local store. +3. Set environmental variable `NXF_ENABLE_SECRETS` to an appropriate value. + +To elaborate more on item #2 in the list above, if you are running nf-core/raredisease with Sentieon on AWS or on a local machine and you do not want other users to know your license details, we recommend that you use [Nextflow's secrets feature](https://www.nextflow.io/docs/latest/secrets.html) to pass the that information. To do that run the command below after replacing LICENSE with the value corresponding to your license server (for example, 1.1.1.1:4000) + +``` +nextflow secrets set SENTIEON_LICENSE_BASE64 +``` + +If you are using Nextflow secrets, you have to set the environment variable `NXF_ENABLE_SECRETS` to true. This will see to it that the pipeline can retrieve the secret from Nextflow's secrets store during the pipeline execution. Keep in mind that versions of Nextflow Version 22.09.2-edge and onwards have NXF_ENABLE_SECRETS to true by default. If you are not using secrets set `NXF_ENABLE_SECRETS` to false, but make sure that the environment variable [`SENTIEON_LICENSE`](`NXF_ENABLE_SECRETS`) is set to reflect the value of your license server on your machine. + +### Azure Resource Requests To be used with the `azurebatch` profile by specifying the `-profile azurebatch`. We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by default but these options can be changed if required. @@ -197,16 +356,16 @@ We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by de Note that the choice of VM size depends on your quota and the overall workload during the analysis. For a thorough list, please refer the [Azure Sizes for virtual machines in Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). -## Running in the background +### Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. The Nextflow `-bg` flag launches Nextflow in the background, detached from your terminal so that the workflow does not stop if you log out of your session. The logs are saved to a file. Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. -Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). +Some HPC setups also allow you to run Nextflow within a cluster job submitted to your job scheduler (from where it submits more jobs). -## Nextflow memory requirements +### Nextflow memory requirements In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): diff --git a/modules.json b/modules.json index 8588dadf..58618dca 100644 --- a/modules.json +++ b/modules.json @@ -5,20 +5,330 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "bcftools/concat": { + "branch": "master", + "git_sha": "582ff1755bdd205c65e2ba4c31e0a008dae299ec", + "installed_by": ["modules"] + }, + "bcftools/filter": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "bcftools/merge": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "bcftools/norm": { + "branch": "master", + "git_sha": "bcad95fb35e567ad25840d3297c3e17eff211a3a", + "installed_by": ["modules"] + }, + "bcftools/reheader": { + "branch": "master", + "git_sha": "bd4b60c7f9358c7146ac198fd0c4ae6355ddd086", + "installed_by": ["modules"] + }, + "bcftools/roh": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "bcftools/view": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "bwa/index": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "bwamem2/index": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "bwamem2/mem": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "cat/cat": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", "installed_by": ["modules"] }, + "deepvariant": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "expansionhunter": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, "fastqc": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, + "gatk4/bedtointervallist": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/createsequencedictionary": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/filtermutectcalls": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/intervallisttools": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/mergebamalignment": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/mergevcfs": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/mutect2": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/printreads": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/revertsam": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/samtofastq": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/selectvariants": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/splitintervals": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "gatk4/variantfiltration": { + "branch": "master", + "git_sha": "643756685546fa61f5c8fba439af746c090b9180", + "installed_by": ["modules"] + }, + "genmod/annotate": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "genmod/compound": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "genmod/models": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "genmod/score": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "glnexus": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "haplocheck": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "haplogrep2/classify": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "manta/germline": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "mosdepth": { + "branch": "master", + "git_sha": "783cc040350dbee673fd57f6a6300aea3d085b7c", + "installed_by": ["modules"] + }, "multiqc": { "branch": "master", "git_sha": "f2d63bd5b68925f98f572eed70993d205cc694b7", "installed_by": ["modules"] + }, + "peddy": { + "branch": "master", + "git_sha": "21e6e085967902fb393b27b2e7590ac4c85fab8e", + "installed_by": ["modules"] + }, + "picard/addorreplacereadgroups": { + "branch": "master", + "git_sha": "28995552268a117551ded48dadcf42b0caf0e834", + "installed_by": ["modules"] + }, + "picard/collecthsmetrics": { + "branch": "master", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", + "installed_by": ["modules"] + }, + "picard/collectmultiplemetrics": { + "branch": "master", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", + "installed_by": ["modules"] + }, + "picard/collectwgsmetrics": { + "branch": "master", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", + "installed_by": ["modules"] + }, + "picard/liftovervcf": { + "branch": "master", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", + "installed_by": ["modules"] + }, + "picard/markduplicates": { + "branch": "master", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", + "installed_by": ["modules"] + }, + "picard/renamesampleinvcf": { + "branch": "master", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", + "installed_by": ["modules"] + }, + "picard/sortvcf": { + "branch": "master", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", + "installed_by": ["modules"] + }, + "qualimap/bamqc": { + "branch": "master", + "git_sha": "75027bf77472b1f4fd2cdd7e46f83119dfb0f2c6", + "installed_by": ["modules"] + }, + "rhocall/annotate": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "samtools/faidx": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "samtools/index": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "samtools/merge": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "samtools/sort": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "samtools/stats": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "smncopynumbercaller": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "stranger": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "svdb/merge": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "svdb/query": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "tabix/bgziptabix": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "tabix/tabix": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "tiddit/cov": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "tiddit/sv": { + "branch": "master", + "git_sha": "0367c23758d83fc6973a8cd35ecba40a0cfcf2af", + "installed_by": ["modules"] + }, + "ucsc/wigtobigwig": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] + }, + "untar": { + "branch": "master", + "git_sha": "cc1f997fab6d8fde5dc0e6e2a310814df5b53ce7", + "installed_by": ["modules"] + }, + "vcfanno": { + "branch": "master", + "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "installed_by": ["modules"] } } } diff --git a/nextflow.config b/nextflow.config index e15d3d7e..46e65afa 100644 --- a/nextflow.config +++ b/nextflow.config @@ -154,6 +154,13 @@ profiles { shifter.enabled = false apptainer.enabled = false } + apptainer { + apptainer.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false apptainer { apptainer.enabled = true conda.enabled = false From 6440a13000bd619e67b814ddd1c867dde33fecaf Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 2 May 2023 11:31:53 +0200 Subject: [PATCH 1144/1169] fix error --- nextflow.config | 7 ------- 1 file changed, 7 deletions(-) diff --git a/nextflow.config b/nextflow.config index 2fd60a73..f97aeb1d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -179,13 +179,6 @@ profiles { shifter.enabled = false apptainer.enabled = false } - apptainer { - apptainer.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false apptainer { apptainer.enabled = true conda.enabled = false From f2cee3e45c6a155e211debad754263e358219deb Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 2 May 2023 11:36:35 +0200 Subject: [PATCH 1145/1169] fix lint error --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 22ba8008..3456f5fe 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,6 @@ On release, automated continuous integration tests run the pipeline on a full-si Note that it is possible to include/exclude certain tools or steps. ## Usage -======= > **Note** > If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how From 2518da2d20e14faa1bb71038ad269da9971cf55d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 2 May 2023 13:49:44 +0200 Subject: [PATCH 1146/1169] update untar --- modules.json | 2 +- modules/nf-core/untar/main.nf | 2 +- modules/nf-core/untar/meta.yml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules.json b/modules.json index 58618dca..bd084ffe 100644 --- a/modules.json +++ b/modules.json @@ -322,7 +322,7 @@ }, "untar": { "branch": "master", - "git_sha": "cc1f997fab6d8fde5dc0e6e2a310814df5b53ce7", + "git_sha": "b9829e1064382745d8dff7f1d74d2138d2864f71", "installed_by": ["modules"] }, "vcfanno": { diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf index 3384847a..67f497ee 100644 --- a/modules/nf-core/untar/main.nf +++ b/modules/nf-core/untar/main.nf @@ -5,7 +5,7 @@ process UNTAR { conda "conda-forge::sed=4.7 bioconda::grep=3.4 conda-forge::tar=1.34" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'ubuntu:20.04' }" + 'docker.io/ubuntu:20.04' }" input: tuple val(meta), path(archive) diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml index ea7a3f38..db241a6e 100644 --- a/modules/nf-core/untar/meta.yml +++ b/modules/nf-core/untar/meta.yml @@ -3,6 +3,7 @@ description: Extract files. keywords: - untar - uncompress + - extract tools: - untar: description: | From 36bdb514e9ff1f589254aacf69ec8bed3cfcbbbc Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 2 May 2023 15:00:11 +0200 Subject: [PATCH 1147/1169] update deepvariant --- modules.json | 2 +- modules/nf-core/deepvariant/main.nf | 3 ++- modules/nf-core/deepvariant/meta.yml | 5 +++++ subworkflows/local/variant_calling/call_snv_deepvariant.nf | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/modules.json b/modules.json index bd084ffe..6ef589a1 100644 --- a/modules.json +++ b/modules.json @@ -67,7 +67,7 @@ }, "deepvariant": { "branch": "master", - "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "git_sha": "b9829e1064382745d8dff7f1d74d2138d2864f71", "installed_by": ["modules"] }, "expansionhunter": { diff --git a/modules/nf-core/deepvariant/main.nf b/modules/nf-core/deepvariant/main.nf index 7e11b766..afc5e444 100644 --- a/modules/nf-core/deepvariant/main.nf +++ b/modules/nf-core/deepvariant/main.nf @@ -2,7 +2,7 @@ process DEEPVARIANT { tag "$meta.id" label 'process_medium' - container "google/deepvariant:1.4.0" + container "docker.io/google/deepvariant:1.4.0" // Exit if running this module with -profile conda / -profile mamba if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { @@ -13,6 +13,7 @@ process DEEPVARIANT { tuple val(meta), path(input), path(index), path(intervals) path(fasta) path(fai) + path(gzi) output: tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf diff --git a/modules/nf-core/deepvariant/meta.yml b/modules/nf-core/deepvariant/meta.yml index 7ecb40f2..97f068ec 100644 --- a/modules/nf-core/deepvariant/meta.yml +++ b/modules/nf-core/deepvariant/meta.yml @@ -3,6 +3,7 @@ description: DeepVariant is an analysis pipeline that uses a deep neural network keywords: - variant calling - machine learning + - neural network tools: - deepvariant: description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data @@ -38,6 +39,10 @@ input: type: file description: Index of reference fasta file pattern: "*.fai" + - gzi: + type: file + description: GZI index of reference fasta file + pattern: "*.gzi" output: - meta: diff --git a/subworkflows/local/variant_calling/call_snv_deepvariant.nf b/subworkflows/local/variant_calling/call_snv_deepvariant.nf index a401329a..fa240b1e 100644 --- a/subworkflows/local/variant_calling/call_snv_deepvariant.nf +++ b/subworkflows/local/variant_calling/call_snv_deepvariant.nf @@ -23,7 +23,7 @@ workflow CALL_SNV_DEEPVARIANT { } .set { ch_deepvar_in } - DEEPVARIANT ( ch_deepvar_in, ch_fasta, ch_fai ) + DEEPVARIANT ( ch_deepvar_in, ch_fasta, ch_fai, [] ) DEEPVARIANT.out.gvcf .collect{it[1]} .toList() From fc2a6185e668a0273f7c911d882dec7c2f1f5b6d Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 2 May 2023 15:13:01 +0200 Subject: [PATCH 1148/1169] update uri --- modules/local/ensemblvep/main.nf | 2 +- modules/local/filter_vep.nf | 2 +- modules/local/gens/main.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index 47219c5f..7ccf9fc6 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -7,7 +7,7 @@ process ENSEMBLVEP { exit 1, "Local VEP module does not support Conda. Please use Docker / Singularity / Podman instead." } - container "ensemblorg/ensembl-vep:release_107.0" + container "docker.io/ensemblorg/ensembl-vep:release_107.0" input: tuple val(meta), path(vcf) diff --git a/modules/local/filter_vep.nf b/modules/local/filter_vep.nf index 4f3d8f59..0d067c37 100644 --- a/modules/local/filter_vep.nf +++ b/modules/local/filter_vep.nf @@ -6,7 +6,7 @@ process FILTER_VEP { if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { exit 1, "Local VEP module does not support Conda. Please use Docker / Singularity / Podman instead." } - container "ensemblorg/ensembl-vep:release_107.0" + container "docker.io/ensemblorg/ensembl-vep:release_107.0" input: tuple val(meta), path(vcf) diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index f4e113c5..2aad32b3 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -2,7 +2,7 @@ process GENS { tag "$meta.id" label 'process_medium' - container 'raysloks/gens_preproc:1.0.1' + container 'docker.io/raysloks/gens_preproc:1.0.1' input: tuple val(meta), path(read_counts) From e66e33150e9b8c4b9a8c401d58bb016257e89487 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 8 May 2023 21:11:38 +0200 Subject: [PATCH 1149/1169] change fasta_fai to fai --- conf/modules/prepare_references.config | 2 +- main.nf | 2 +- nextflow_schema.json | 2 +- workflows/raredisease.nf | 43 ++++++++++++++++++++++++-- 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/conf/modules/prepare_references.config b/conf/modules/prepare_references.config index 8ea76ec6..7f4b27cd 100644 --- a/conf/modules/prepare_references.config +++ b/conf/modules/prepare_references.config @@ -46,7 +46,7 @@ process { } withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_GENOME' { - ext.when = {!params.fasta_fai} + ext.when = {!params.fai} } withName: '.*PREPARE_REFERENCES:SAMTOOLS_FAIDX_SHIFT_MT' { diff --git a/main.nf b/main.nf index b14028c2..93def192 100644 --- a/main.nf +++ b/main.nf @@ -18,7 +18,7 @@ nextflow.enable.dsl = 2 */ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') -params.fasta_fai = WorkflowMain.getGenomeAttribute(params, 'fai') +params.fai = WorkflowMain.getGenomeAttribute(params, 'fai') params.bwa = WorkflowMain.getGenomeAttribute(params, 'bwa') params.bwamem2 = WorkflowMain.getGenomeAttribute(params, 'bwamem2') params.call_interval = WorkflowMain.getGenomeAttribute(params, 'call_interval') diff --git a/nextflow_schema.json b/nextflow_schema.json index ab50b9a5..b461fb1e 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -63,7 +63,7 @@ "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", "fa_icon": "far fa-file-code" }, - "fasta_fai": { + "fai": { "type": "string", "format": "file-path", "help_text": "If none provided, will be generated automatically from the FASTA reference", diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 8d38371b..9918d2e1 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -15,7 +15,7 @@ def checkPathParamList = [ params.bwamem2, params.call_interval, params.fasta, - params.fasta_fai, + params.fai, params.gens_gnomad_pos, params.gens_interval_list, params.gens_pon, @@ -54,6 +54,43 @@ def checkPathParamList = [ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CHECK MANDATORY PARAMETERS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +def mandatoryParams = [ + "aligner", + "analysis_type", + "fasta", + "input", + "intervals_wgs", + "intervals_y", + "platform", + "variant_catalog", + "variant_caller" +] + +if (!params.skip_snv_annotation) { + mandatoryParams += ["genome", "vcfanno_resources", "vcfanno_toml", "vep_cache", "vep_cache_version"] +} + +if (!params.skip_sv_annotation) { + mandatoryParams += ["genome", "svdb_query_dbs", "vep_cache", "vep_cache_version"] +} + +if (!params.skip_mt_analysis) { + mandatoryParams += ["genome", "mt_backchain_shift", "mito_name", "mt_fasta_shift", "mt_intervals", + "mt_intervals_shift", "vcfanno_resources", "vcfanno_toml", "vep_cache_version", "vep_cache"] +} + +if (params.analysis_type.equals("wes")) { + mandatoryParams += ["target_bed"] +} + +for (param in mandatoryParams.unique()) { if (params[param] == null) { exit 1, "params." + param + " not set." } } + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CONFIG FILES @@ -218,9 +255,9 @@ workflow RAREDISEASE { ch_bwamem2_index_mt_shift = params.mt_bwamem2_index_shift ? Channel.fromPath(params.mt_bwamem2_index_shift).collect() : ch_references.bwamem2_index_mt_shift ch_chrom_sizes = ch_references.chrom_sizes - ch_genome_fai_no_meta = params.fasta_fai ? Channel.fromPath(params.fasta_fai).collect() + ch_genome_fai_no_meta = params.fai ? Channel.fromPath(params.fai).collect() : ch_references.fasta_fai - ch_genome_fai_meta = params.fasta_fai ? Channel.fromPath(params.fasta_fai).map {it -> [[id:it[0].simpleName], it]}.collect() + ch_genome_fai_meta = params.fai ? Channel.fromPath(params.fai).map {it -> [[id:it[0].simpleName], it]}.collect() : ch_references.fasta_fai_meta ch_mt_shift_fai = params.mt_fai_shift ? Channel.fromPath(params.mt_fai_shift).collect() : ch_references.fasta_fai_mt_shift From d4fb645d066a5e79366f4ac1a51f4c0e8049bed4 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 15 May 2023 13:04:06 +0200 Subject: [PATCH 1150/1169] change gender to sex --- README.md | 2 +- assets/samplesheet.csv | 2 +- assets/schema_input.json | 6 ++-- bin/check_samplesheet.py | 2 +- conf/modules/call_repeat_expansions.config | 1 + docs/usage.md | 18 +++++------ modules.json | 2 +- modules/nf-core/expansionhunter/main.nf | 34 ++++++++++++-------- modules/nf-core/expansionhunter/meta.yml | 21 +++++++++--- subworkflows/local/call_repeat_expansions.nf | 7 ++-- subworkflows/local/check_input.nf | 4 +-- workflows/raredisease.nf | 6 ++-- 12 files changed, 65 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 3456f5fe..22a4ab00 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ First, prepare a samplesheet with your input data that looks as follows: `samplesheet.csv`: ```csv -sample,lane,fastq_1,fastq_2,gender,phenotype,paternal_id,maternal_id,case_id +sample,lane,fastq_1,fastq_2,sex,phenotype,paternal_id,maternal_id,case_id hugelymodelbat,1,reads_1.fastq.gz,reads_2.fastq.gz,1,2,,,justhusky ``` diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index d8fcccca..e4a3d013 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,4 +1,4 @@ -sample,lane,fastq_1,fastq_2,gender,phenotype,paternal_id,maternal_id,case_id +sample,lane,fastq_1,fastq_2,sex,phenotype,paternal_id,maternal_id,case_id 1234N,1,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L001_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L001_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey 1234N,4,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L004_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L004_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey 1234N,2,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L002_R1_xxx.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/tiny/normal/tiny_n_L002_R2_xxx.fastq.gz,2,1,caseyupper,caseyupperlamb,caseydonkey diff --git a/assets/schema_input.json b/assets/schema_input.json index 3258d7eb..602ec301 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -30,10 +30,10 @@ } ] }, - "gender": { + "sex": { "type": "string", "pattern": "^\\S+$", - "errorMessage": "Gender must be provided and cannot contain spaces" + "errorMessage": "Sex must be provided and cannot contain spaces" }, "phenotype": { "type": "string", @@ -72,6 +72,6 @@ "errorMessage": "Case name must be provided and cannot contain spaces" } }, - "required": ["sample", "fastq_1", "gender", "phenotype", "case_id"] + "required": ["sample", "fastq_1", "sex", "phenotype", "case_id"] } } diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 5648dd1b..ac46acd3 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -196,7 +196,7 @@ def check_samplesheet(file_in, file_out): "lane", "fastq_1", "fastq_2", - "gender", + "sex", "phenotype", "paternal_id", "maternal_id", diff --git a/conf/modules/call_repeat_expansions.config b/conf/modules/call_repeat_expansions.config index 1f71bef6..0509d1e2 100644 --- a/conf/modules/call_repeat_expansions.config +++ b/conf/modules/call_repeat_expansions.config @@ -24,6 +24,7 @@ process { } withName: '.*CALL_REPEAT_EXPANSIONS:EXPANSIONHUNTER' { + ext.args = { ("${meta.sex}" == '1') ? '--sex male' : '--sex female' } ext.prefix = { "${meta.id}_exphunter" } } diff --git a/docs/usage.md b/docs/usage.md index a02b86d6..412273c6 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -84,9 +84,9 @@ Running the pipeline involves three steps: #### Samplesheet -A samplesheet is used to pass the information about the sample(s), such as the path to the FASTQ files and other meta data (gender, phenotype, etc.,) to the pipeline in csv format. +A samplesheet is used to pass the information about the sample(s), such as the path to the FASTQ files and other meta data (sex, phenotype, etc.,) to the pipeline in csv format. -nf-core/raredisease will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information in the samplesheet (sex/gender and phenotype) should be provided as they would be for a [ped file](https://gatk.broadinstitute.org/hc/en-us/articles/360035531972-PED-Pedigree-format) (i.e. 1 for male, 2 for female, other for unknown). +nf-core/raredisease will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The pedigree information in the samplesheet (sex and phenotype) should be provided as they would be for a [ped file](https://gatk.broadinstitute.org/hc/en-us/articles/360035531972-PED-Pedigree-format) (i.e. 1 for male, 2 for female, other for unknown). | Fields | Description | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -94,7 +94,7 @@ nf-core/raredisease will auto-detect whether a sample is single- or paired-end u | `lane` | Used to generate separate channels during the alignment step. | | `fastq_1` | Absolute path to FASTQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | | `fastq_2` | Absolute path to FASTQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `gender` | Sex (1=male; 2=female; other=unknown). | +| `sex` | Sex (1=male; 2=female; other=unknown). | | `phenotype` | Affected status of patient (0 = missing; 1=unaffected; 2=affected). | | `paternal_id` | Sample ID of the father, can be blank if the father isn't part of the analysis or for samples other than the proband. | | `maternal_id` | Sample ID of the mother, can be blank if the mother isn't part of the analysis or for samples other than the proband. | @@ -102,12 +102,12 @@ nf-core/raredisease will auto-detect whether a sample is single- or paired-end u It is also possible to include multiple runs of the same sample in a samplesheet. For example, when you have re-sequenced the same sample more than once to increase sequencing depth. In that case, the `sample` identifiers in the samplesheet have to be the same. The pipeline will align the raw read/read-pairs independently before merging the alignments belonging to the same sample. Below is an example for a trio with the proband sequenced across two lanes: -| sample | lane | fastq_1 | fastq_2 | gender | phenotype | paternal_id | maternal_id | case_id | -| -------- | ---- | -------------------------------- | -------------------------------- | ------ | --------- | ----------- | ----------- | ------- | -| AEG588A1 | 2 | AEG588A1_S1_L002_R1_001.fastq.gz | AEG588A1_S1_L002_R2_001.fastq.gz | 1 | 2 | AEG588A3 | AEG588A2 | fam_1 | -| AEG588A1 | 3 | AEG588A1_S1_L003_R1_001.fastq.gz | AEG588A1_S1_L003_R2_001.fastq.gz | 1 | 2 | AEG588A3 | AEG588A2 | fam_1 | -| AEG588A2 | 4 | AEG588A2_S1_L004_R1_001.fastq.gz | AEG588A2_S1_L004_R2_001.fastq.gz | 2 | 1 | | | fam_1 | -| AEG588A3 | 4 | AEG588A3_S1_L004_R1_001.fastq.gz | AEG588A3_S1_L004_R2_001.fastq.gz | 1 | 1 | | | fam_1 | +| sample | lane | fastq_1 | fastq_2 | sex | phenotype | paternal_id | maternal_id | case_id | +| -------- | ---- | -------------------------------- | -------------------------------- | --- | --------- | ----------- | ----------- | ------- | +| AEG588A1 | 2 | AEG588A1_S1_L002_R1_001.fastq.gz | AEG588A1_S1_L002_R2_001.fastq.gz | 1 | 2 | AEG588A3 | AEG588A2 | fam_1 | +| AEG588A1 | 3 | AEG588A1_S1_L003_R1_001.fastq.gz | AEG588A1_S1_L003_R2_001.fastq.gz | 1 | 2 | AEG588A3 | AEG588A2 | fam_1 | +| AEG588A2 | 4 | AEG588A2_S1_L004_R1_001.fastq.gz | AEG588A2_S1_L004_R2_001.fastq.gz | 2 | 1 | | | fam_1 | +| AEG588A3 | 4 | AEG588A3_S1_L004_R1_001.fastq.gz | AEG588A3_S1_L004_R2_001.fastq.gz | 1 | 1 | | | fam_1 | If you would like to see more examples of what a typical samplesheet looks like for a singleton and a trio, follow these links, [singleton](https://github.com/nf-core/test-datasets/blob/raredisease/testdata/samplesheet_single.csv) and [trio](https://github.com/nf-core/test-datasets/blob/raredisease/testdata/samplesheet_trio.csv). diff --git a/modules.json b/modules.json index 6ef589a1..981605d8 100644 --- a/modules.json +++ b/modules.json @@ -72,7 +72,7 @@ }, "expansionhunter": { "branch": "master", - "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", + "git_sha": "5e4835b5798eaef33d23d9a2939f2ca9d3a07d4d", "installed_by": ["modules"] }, "fastqc": { diff --git a/modules/nf-core/expansionhunter/main.nf b/modules/nf-core/expansionhunter/main.nf index 5db8794a..b5339bf6 100644 --- a/modules/nf-core/expansionhunter/main.nf +++ b/modules/nf-core/expansionhunter/main.nf @@ -5,47 +5,55 @@ process EXPANSIONHUNTER { conda "bioconda::expansionhunter=4.0.2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/expansionhunter:4.0.2--he785bd8_0' : - 'quay.io/biocontainers/expansionhunter:4.0.2--he785bd8_0' }" + 'biocontainers/expansionhunter:4.0.2--he785bd8_0' }" input: tuple val(meta), path(bam), path(bai) - path fasta - path variant_catalog + tuple val(meta2), path(fasta) + tuple val(meta3), path(fasta_fai) + tuple val(meta4), path(variant_catalog) output: - tuple val(meta), path("*.vcf"), emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.json.gz") , emit: json + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def gender = (meta.gender == 'male' || meta.gender == 1 || meta.gender == 'XY') ? "male" : "female" + """ ExpansionHunter \\ - $args \\ - --reads $bam \\ - --output-prefix $prefix \\ - --reference $fasta \\ - --variant-catalog $variant_catalog \\ - --sex $gender + ${args} \\ + --reads ${bam} \\ + --output-prefix ${prefix} \\ + --reference ${fasta} \\ + --variant-catalog ${variant_catalog} + + bgzip --threads ${task.cpus} ${args2} ${prefix}.vcf + bgzip --threads ${task.cpus} ${args2} ${prefix}.json cat <<-END_VERSIONS > versions.yml "${task.process}": expansionhunter: \$( echo \$(ExpansionHunter --version 2>&1) | sed 's/^.*ExpansionHunter v//') + bgzip: \$(echo \$(bgzip -h 2>&1) | sed 's/^.*Version: //;s/Usage:.*//') END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.vcf + touch ${prefix}.vcf.gz + touch ${prefix}.json.gz cat <<-END_VERSIONS > versions.yml "${task.process}": expansionhunter: \$( echo \$(ExpansionHunter --version 2>&1) | sed 's/^.*ExpansionHunter v//') + bgzip: \$(echo \$(bgzip -h 2>&1) | sed 's/^.*Version: //;s/Usage:.*//') END_VERSIONS """ } diff --git a/modules/nf-core/expansionhunter/meta.yml b/modules/nf-core/expansionhunter/meta.yml index ebb3016c..645f751b 100644 --- a/modules/nf-core/expansionhunter/meta.yml +++ b/modules/nf-core/expansionhunter/meta.yml @@ -3,12 +3,15 @@ description: Estimate repeat sizes using NGS data keywords: - STR - repeat_expansions + - bam + - cram + - vcf + - json tools: - expansionhunter: description: A tool for estimating repeat sizes homepage: https://github.com/Illumina/ExpansionHunter documentation: https://github.com/Illumina/ExpansionHunter/blob/master/docs/01_Introduction.md - doi: "10.1093/bioinformatics/btz431" licence: ["Apache-2.0"] @@ -25,11 +28,15 @@ input: - fasta: type: file description: Reference genome - pattern: "*.{fa,fasta}" + pattern: "*.{fna,fa,fasta}" + - fasta: + type: file + description: Reference genome index + pattern: "*.fai" - variant_catalog: type: file - description: json file with repeat expansion sites to genotype - pattern: "*.{json}" + description: JSON file with repeat expansion sites to genotype + pattern: "*.json" output: - meta: @@ -44,7 +51,11 @@ output: - vcf: type: file description: VCF with repeat expansions - pattern: "*.{vcf}" + pattern: "*.vcf.gz" + - json: + type: file + description: JSON with repeat expansions + pattern: "*.json.gz" authors: - "@jemten" diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index 66dea07d..ceb3a8b5 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -20,14 +20,17 @@ workflow CALL_REPEAT_EXPANSIONS { ch_case_info // channel: [mandatory] [ val(case_id) ] ch_fasta // channel: [mandatory] [ path(fasta) ] ch_fai // channel: [mandatory] [ path(fai) ] + ch_fasta_meta // channel: [mandatory] [ val(meta), path(fasta) ] + ch_fai_meta // channel: [mandatory] [ val(meta), path(fai) ] main: ch_versions = Channel.empty() EXPANSIONHUNTER ( ch_bam, - ch_fasta, - ch_variant_catalog + ch_fasta_meta, + ch_fai_meta, + ch_variant_catalog.map { it -> [[id:it[0].simpleName],it]} ) // Fix header and rename sample diff --git a/subworkflows/local/check_input.nf b/subworkflows/local/check_input.nf index 4199196a..3c5ab0cf 100644 --- a/subworkflows/local/check_input.nf +++ b/subworkflows/local/check_input.nf @@ -39,7 +39,7 @@ def create_fastq_channel(LinkedHashMap row) { // create meta map def meta = [:] meta.case_id = row.case_id - meta.gender = row.gender + meta.sex = row.sex meta.id = row.sample meta.maternal = row.maternal_id meta.paternal = row.paternal_id @@ -69,7 +69,7 @@ def create_fastq_channel(LinkedHashMap row) { def create_samples_channel(LinkedHashMap row) { def sample = [:] sample.id = row.sample - sample.gender = row.gender + sample.sex = row.sex sample.phenotype = row.phenotype sample.maternal = row.maternal_id sample.paternal = row.paternal_id diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 9918d2e1..f0ca78de 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -325,7 +325,9 @@ workflow RAREDISEASE { ch_variant_catalog, CHECK_INPUT.out.case_info, ch_genome_fasta_no_meta, - ch_genome_fai_no_meta + ch_genome_fai_no_meta, + ch_genome_fasta_meta, + ch_genome_fai_meta ) ch_versions = ch_versions.mix(CALL_REPEAT_EXPANSIONS.out.versions) @@ -612,7 +614,7 @@ def makePed(samples) { sample_tokenized.removeLast() sample_name = sample_tokenized.join("_") if (!samples_list.contains(sample_name)) { - outfile.append('\n' + [samples[i].case_id, sample_name, samples[i].paternal, samples[i].maternal, samples[i].gender, samples[i].phenotype].join('\t')); + outfile.append('\n' + [samples[i].case_id, sample_name, samples[i].paternal, samples[i].maternal, samples[i].sex, samples[i].phenotype].join('\t')); samples_list.add(sample_name) } } From fa676efeaa24db761545f6c06c6b883720300a02 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 15 May 2023 13:15:51 +0200 Subject: [PATCH 1151/1169] manta conf --- conf/modules/call_sv_manta.config | 1 + subworkflows/local/annotate_snvs.nf | 4 ++-- subworkflows/local/call_repeat_expansions.nf | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/conf/modules/call_sv_manta.config b/conf/modules/call_sv_manta.config index f55581af..3fa83f3b 100644 --- a/conf/modules/call_sv_manta.config +++ b/conf/modules/call_sv_manta.config @@ -17,6 +17,7 @@ process { withName: '.*CALL_STRUCTURAL_VARIANTS:CALL_SV_MANTA:MANTA' { + ext.args = { (params.analysis_type == "wes") ? '--exome' : '' } ext.prefix = { "${meta.id}_manta" } } } diff --git a/subworkflows/local/annotate_snvs.nf b/subworkflows/local/annotate_snvs.nf index 54d09e95..5bc27d26 100644 --- a/subworkflows/local/annotate_snvs.nf +++ b/subworkflows/local/annotate_snvs.nf @@ -106,6 +106,8 @@ workflow ANNOTATE_SNVS { ch_vep_ann = BCFTOOLS_CONCAT.out.vcf ch_vep_index = TABIX_BCFTOOLS_CONCAT.out.tbi + ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) + ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) } ch_versions = ch_versions.mix(BCFTOOLS_ROH.out.versions) @@ -118,8 +120,6 @@ workflow ANNOTATE_SNVS { ch_versions = ch_versions.mix(GATK4_SELECTVARIANTS.out.versions.first()) ch_versions = ch_versions.mix(ENSEMBLVEP_SNV.out.versions.first()) ch_versions = ch_versions.mix(TABIX_VEP.out.versions.first()) - ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) - ch_versions = ch_versions.mix(TABIX_BCFTOOLS_CONCAT.out.versions) emit: vcf_ann = ch_vep_ann // channel: [ val(meta), path(vcf) ] diff --git a/subworkflows/local/call_repeat_expansions.nf b/subworkflows/local/call_repeat_expansions.nf index ceb3a8b5..52343806 100644 --- a/subworkflows/local/call_repeat_expansions.nf +++ b/subworkflows/local/call_repeat_expansions.nf @@ -51,10 +51,13 @@ workflow CALL_REPEAT_EXPANSIONS { SPLIT_MULTIALLELICS_EXP.out.vcf .collect{it[1]} .toList() + .collect() .set {ch_exp_vcfs} + ch_case_info .combine(ch_exp_vcfs) .set {ch_svdb_merge_input} + SVDB_MERGE_REPEATS ( ch_svdb_merge_input, [] ) // Annotate, compress and index From 79680707cf24923cb1f267686a5d5f3c89250196 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 15 May 2023 13:34:37 +0200 Subject: [PATCH 1152/1169] bait padding --- conf/modules/prepare_references.config | 2 +- nextflow.config | 1 + nextflow_schema.json | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/conf/modules/prepare_references.config b/conf/modules/prepare_references.config index 7f4b27cd..8504a34c 100644 --- a/conf/modules/prepare_references.config +++ b/conf/modules/prepare_references.config @@ -91,7 +91,7 @@ process { withName: '.*PREPARE_REFERENCES:GATK_ILT' { ext.when = { params.target_bed } - ext.args = '--PADDING 100 -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2' + ext.args = { "--PADDING ${params.bait_padding} -SUBDIVISION_MODE INTERVAL_SUBDIVISION --SCATTER_COUNT 2" } publishDir = [ enabled: false ] diff --git a/nextflow.config b/nextflow.config index f97aeb1d..e127d869 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,6 +22,7 @@ params { // Main options analysis_type = 'wgs' + bait_padding = 100 skip_snv_annotation = false skip_sv_annotation = false skip_mt_analysis = false diff --git a/nextflow_schema.json b/nextflow_schema.json index b461fb1e..f8e5fdea 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -48,6 +48,15 @@ "fa_icon": "fas fa-dna", "description": "Reference genome related files and options required for the workflow.", "properties": { + "bait_padding": { + "type": "number", + "default": 100, + "fa_icon": "fas fa-greater-than", + "pattern": "^\\S+\\.bed(\\.gz)?$", + "description": "The amount to pad each end of the target intervals to create bait intervals.", + "help_text": "If you would like to limit your analysis to specific regions of the genome, you can pass those regions in a bed file using this option", + "hidden": true + }, "genome": { "type": "string", "description": "Name of iGenomes reference.", From 169dd381871ecc22a6375e97906c1a8c20875410 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 15 May 2023 17:45:16 +0200 Subject: [PATCH 1153/1169] review suggestions --- assets/multiqc_config.yml | 23 +++++++++++++++++++ modules/local/add_most_severe_consequence.nf | 8 ++++--- modules/local/add_most_severe_pli.nf | 8 ++++--- modules/local/ensemblvep/main.nf | 2 +- modules/local/filter_vep.nf | 2 +- modules/local/gatk4/collectreadcounts/main.nf | 12 +++++----- modules/local/gatk4/denoisereadcounts/main.nf | 12 +++++----- modules/local/gens/main.nf | 6 ----- nextflow_schema.json | 2 +- subworkflows/local/check_input.nf | 4 ++-- workflows/raredisease.nf | 23 +++++++++++++++---- 11 files changed, 68 insertions(+), 34 deletions(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index a0ce1f4d..c2b26325 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -15,3 +15,26 @@ report_section_order: order: -1002 export_plots: true + +run_modules: + - fastqc + - qualimap + - picard + - mosdepth + +module_order: + - fastqc: + name: "FastQC" + path_filters: + - "*.zip" + - picard: + name: "Picard" + - qualimap: + name: "Qualimap" + - mosdepth: + name: "Mosdepth" + +extra_fn_clean_exts: + - "_sorted_md" + - type: regex + pattern: "_T[0-9]" diff --git a/modules/local/add_most_severe_consequence.nf b/modules/local/add_most_severe_consequence.nf index c70eedeb..0c572811 100644 --- a/modules/local/add_most_severe_consequence.nf +++ b/modules/local/add_most_severe_consequence.nf @@ -2,10 +2,10 @@ process ADD_MOST_SEVERE_CSQ { tag "$meta.id" label 'process_low' - conda "conda-forge::python=3.9.5" + conda "conda-forge::python=3.8.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'quay.io/biocontainers/python:3.9--1' }" + 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + 'biocontainers/python:3.8.3' }" input: tuple val(meta), path(vcf) @@ -27,6 +27,7 @@ process ADD_MOST_SEVERE_CSQ { cat <<-END_VERSIONS > versions.yml "${task.process}": add_most_severe_consequence: v1.0 + python: \$(python --version | sed 's/Python //g') END_VERSIONS """ @@ -38,6 +39,7 @@ process ADD_MOST_SEVERE_CSQ { cat <<-END_VERSIONS > versions.yml "${task.process}": add_most_severe_consequence: v1.0 + python: \$(python --version | sed 's/Python //g') END_VERSIONS """ } diff --git a/modules/local/add_most_severe_pli.nf b/modules/local/add_most_severe_pli.nf index 1167a1b1..f2975a22 100644 --- a/modules/local/add_most_severe_pli.nf +++ b/modules/local/add_most_severe_pli.nf @@ -2,10 +2,10 @@ process ADD_MOST_SEVERE_PLI { tag "$meta.id" label 'process_low' - conda "conda-forge::python=3.9.5" + conda "conda-forge::python=3.8.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'quay.io/biocontainers/python:3.9--1' }" + 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + 'biocontainers/python:3.8.3' }" input: tuple val(meta), path(vcf) @@ -26,6 +26,7 @@ process ADD_MOST_SEVERE_PLI { cat <<-END_VERSIONS > versions.yml "${task.process}": add_most_severe_pli: v1.0 + python: \$(python --version | sed 's/Python //g') END_VERSIONS """ @@ -37,6 +38,7 @@ process ADD_MOST_SEVERE_PLI { cat <<-END_VERSIONS > versions.yml "${task.process}": add_most_severe_pli: v1.0 + python: \$(python --version | sed 's/Python //g') END_VERSIONS """ } diff --git a/modules/local/ensemblvep/main.nf b/modules/local/ensemblvep/main.nf index 7ccf9fc6..11ef4651 100644 --- a/modules/local/ensemblvep/main.nf +++ b/modules/local/ensemblvep/main.nf @@ -4,7 +4,7 @@ process ENSEMBLVEP { // Exit if running this module with -profile conda / -profile mamba if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - exit 1, "Local VEP module does not support Conda. Please use Docker / Singularity / Podman instead." + error("Local VEP module does not support Conda. Please use Docker / Singularity / Podman instead.") } container "docker.io/ensemblorg/ensembl-vep:release_107.0" diff --git a/modules/local/filter_vep.nf b/modules/local/filter_vep.nf index 0d067c37..d2ffb904 100644 --- a/modules/local/filter_vep.nf +++ b/modules/local/filter_vep.nf @@ -4,7 +4,7 @@ process FILTER_VEP { // Exit if running this module with -profile conda / -profile mamba if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - exit 1, "Local VEP module does not support Conda. Please use Docker / Singularity / Podman instead." + error("Local VEP module does not support Conda. Please use Docker / Singularity / Podman instead.") } container "docker.io/ensemblorg/ensembl-vep:release_107.0" diff --git a/modules/local/gatk4/collectreadcounts/main.nf b/modules/local/gatk4/collectreadcounts/main.nf index b9690e0b..f424d20e 100644 --- a/modules/local/gatk4/collectreadcounts/main.nf +++ b/modules/local/gatk4/collectreadcounts/main.nf @@ -2,10 +2,10 @@ process GATK4_COLLECTREADCOUNTS { tag "$meta.id" label 'process_medium' - conda "bioconda::gatk4=4.2.4.1" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(bam), path(bai) @@ -21,14 +21,14 @@ process GATK4_COLLECTREADCOUNTS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 12 + def avail_mem = 12288 if (!task.memory) { log.info '[GATK CollectReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" CollectReadCounts \\ + gatk --java-options "-Xmx${avail_mem}M" CollectReadCounts \\ -I $bam \\ --read-index $bai \\ -R $fasta \\ diff --git a/modules/local/gatk4/denoisereadcounts/main.nf b/modules/local/gatk4/denoisereadcounts/main.nf index 48d3da82..c18a7763 100644 --- a/modules/local/gatk4/denoisereadcounts/main.nf +++ b/modules/local/gatk4/denoisereadcounts/main.nf @@ -2,10 +2,10 @@ process GATK4_DENOISEREADCOUNTS { tag "$meta.id" label 'process_high' - conda "bioconda::gatk4=4.2.4.1" + conda "bioconda::gatk4=4.4.0.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gatk4:4.2.4.1--hdfd78af_0' : - 'quay.io/biocontainers/gatk4:4.2.4.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/gatk4:4.4.0.0--py36hdfd78af_0': + 'quay.io/biocontainers/gatk4:4.4.0.0--py36hdfd78af_0' }" input: tuple val(meta), path(read_counts) @@ -19,14 +19,14 @@ process GATK4_DENOISEREADCOUNTS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 12 + def avail_mem = 12288 if (!task.memory) { log.info '[GATK DenoiseReadCounts] Available memory not known - defaulting to 12GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.giga + avail_mem = (task.memory.mega*0.8).intValue() } """ - gatk --java-options "-Xmx${avail_mem}g" DenoiseReadCounts \\ + gatk --java-options "-Xmx${avail_mem}M" DenoiseReadCounts \\ -I $read_counts \\ --count-panel-of-normals $panel_of_normals \\ --standardized-copy-ratios ${prefix}.standardizedCR.tsv \\ diff --git a/modules/local/gens/main.nf b/modules/local/gens/main.nf index 2aad32b3..34399885 100644 --- a/modules/local/gens/main.nf +++ b/modules/local/gens/main.nf @@ -16,12 +16,6 @@ process GENS { script: def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 6 - if (!task.memory) { - log.info '[Gens] Available memory not known - defaulting to 6GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } """ generate_gens_data.pl \\ $read_counts \\ diff --git a/nextflow_schema.json b/nextflow_schema.json index f8e5fdea..88cd28e5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -468,7 +468,7 @@ "pcr_amplification": { "type": "boolean", "default": false, - "description": "indicates whether the sample library is amplified using PCR or not. Set to false for PCR Free samples.", + "description": "Indicates whether the sample library is amplified using PCR or not. Set to false for PCR Free samples.", "fa_icon": "fas fa-map-signs" }, "variant_type": { diff --git a/subworkflows/local/check_input.nf b/subworkflows/local/check_input.nf index 3c5ab0cf..c7a490dc 100644 --- a/subworkflows/local/check_input.nf +++ b/subworkflows/local/check_input.nf @@ -52,13 +52,13 @@ def create_fastq_channel(LinkedHashMap row) { // add path(s) of the fastq file(s) to the meta map def fastq_meta = [] if (!file(row.fastq_1).exists()) { - exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" + error("ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}") } if (meta.single_end) { fastq_meta = [ meta, [ file(row.fastq_1) ] ] } else { if (!file(row.fastq_2).exists()) { - exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" + error("ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}") } fastq_meta = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] } diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index f0ca78de..d88d94f5 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -89,8 +89,21 @@ if (params.analysis_type.equals("wes")) { mandatoryParams += ["target_bed"] } -for (param in mandatoryParams.unique()) { if (params[param] == null) { exit 1, "params." + param + " not set." } } +if (params.variant_caller.equals("sentieon")) { + mandatoryParams += ["ml_model"] +} +def missingParamsCount = 0 +for (param in mandatoryParams.unique()) { + if (params[param] == null) { + println("params." + param + " not set.") + missingParamsCount += 1 + } +} + +if (missingParamsCount>0) { + error("\nSet the missing parameters.") +} /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CONFIG FILES @@ -168,18 +181,18 @@ workflow RAREDISEASE { CHECK_INPUT (ch_input) ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) } else { - exit 1, 'Input samplesheet not specified!' + error('Input samplesheet not specified!') } if (params.variant_caller.equals("sentieon") && !params.ml_model) { - exit 1, 'Machine learning model not specified!' + error('Machine learning model not specified!') } // Initialize all file channels including unprocessed vcf, bed and tab files ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() : Channel.value([]) ch_genome_fasta_no_meta = params.fasta ? Channel.fromPath(params.fasta).collect() - : ( exit 1, 'Genome fasta not specified!' ) + : ( error('Genome fasta not specified!') ) ch_genome_fasta_meta = ch_genome_fasta_no_meta.map { it -> [[id:it[0].simpleName], it] } ch_gnomad_af_tab = params.gnomad_af ? Channel.fromPath(params.gnomad_af).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) @@ -189,7 +202,7 @@ workflow RAREDISEASE { : Channel.empty() ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) - ch_ml_model = params.ml_model ? Channel.fromPath(params.ml_model).collect() + ch_ml_model = (params.variant_caller.equals("sentieon") && !params.ml_model) ? Channel.fromPath(params.ml_model).collect() : Channel.value([]) ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() : Channel.value([]) From 0797c0766f3a17308e03483414cd5eafc8a96a85 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 15 May 2023 18:26:15 +0200 Subject: [PATCH 1154/1169] fix typo --- workflows/raredisease.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index d88d94f5..e06b1d27 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -202,7 +202,7 @@ workflow RAREDISEASE { : Channel.empty() ch_known_dbsnp = params.known_dbsnp ? Channel.fromPath(params.known_dbsnp).map{ it -> [[id:it[0].simpleName], it] }.collect() : Channel.value([[],[]]) - ch_ml_model = (params.variant_caller.equals("sentieon") && !params.ml_model) ? Channel.fromPath(params.ml_model).collect() + ch_ml_model = (params.variant_caller.equals("sentieon") && params.ml_model) ? Channel.fromPath(params.ml_model).collect() : Channel.value([]) ch_mt_backchain_shift = params.mt_backchain_shift ? Channel.fromPath(params.mt_backchain_shift).collect() : Channel.value([]) From 48cfc0d4f8927d089fee33dacc03afe9a61c19a1 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 15 May 2023 18:58:08 +0200 Subject: [PATCH 1155/1169] update conditionals --- workflows/raredisease.nf | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index e06b1d27..9b5c9b87 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -102,7 +102,7 @@ for (param in mandatoryParams.unique()) { } if (missingParamsCount>0) { - error("\nSet the missing parameters.") + error("\nSet missing parameters and restart the run.") } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -176,17 +176,9 @@ workflow RAREDISEASE { ch_versions = Channel.empty() // Initialize input channels - if (params.input) { - ch_input = Channel.fromPath(params.input) - CHECK_INPUT (ch_input) - ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) - } else { - error('Input samplesheet not specified!') - } - - if (params.variant_caller.equals("sentieon") && !params.ml_model) { - error('Machine learning model not specified!') - } + ch_input = Channel.fromPath(params.input) + CHECK_INPUT (ch_input) + ch_versions = ch_versions.mix(CHECK_INPUT.out.versions) // Initialize all file channels including unprocessed vcf, bed and tab files ch_call_interval = params.call_interval ? Channel.fromPath(params.call_interval).collect() From baf7af84abd3ce85ab8fb5d46889dc0092623f62 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 15 May 2023 19:16:00 +0200 Subject: [PATCH 1156/1169] remove help_text for bait padding --- nextflow_schema.json | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 88cd28e5..f568a865 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -54,7 +54,6 @@ "fa_icon": "fas fa-greater-than", "pattern": "^\\S+\\.bed(\\.gz)?$", "description": "The amount to pad each end of the target intervals to create bait intervals.", - "help_text": "If you would like to limit your analysis to specific regions of the genome, you can pass those regions in a bed file using this option", "hidden": true }, "genome": { From 790f4f9b1e66d284ed73563aac84d815c42f3a8b Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Tue, 16 May 2023 14:21:53 +0200 Subject: [PATCH 1157/1169] review suggestions --- CHANGELOG.md | 13 +++++++++++++ conf/modules/check_input.config | 12 ------------ nextflow.config | 1 - tower.yml | 5 ++++- workflows/raredisease.nf | 3 +-- 5 files changed, 18 insertions(+), 16 deletions(-) delete mode 100644 conf/modules/check_input.config diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dd49a55..23a719c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,3 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## v1.0.0 - [2023-03-31] Initial release of nf-core/raredisease, created with the [nf-core](https://nf-co.re/) template. + +### `Added` + +- FastQC read quality control +- Read mapping with BWAmem2/Sentieon +- Qualimap & Picard tools quality control metrics +- Call repeat expansions with ExpansionHunter and Stranger +- SNV calling with DeepVariant/Sentieon +- SV calling with Manta and TIDDIT +- SNV annotation with bcftools roh, vcfanno, and vep +- SV annotation with SVDB query and vep +- Separate workflow for analysing and annotating mitochondrial variants +- Call copy number variants in the SMN gene using SMNCopyNumberCaller diff --git a/conf/modules/check_input.config b/conf/modules/check_input.config deleted file mode 100644 index 2812ef7f..00000000 --- a/conf/modules/check_input.config +++ /dev/null @@ -1,12 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config file for defining DSL2 per module options and publishing paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. - ext.when = Conditional clause ----------------------------------------------------------------------------------------- -*/ diff --git a/nextflow.config b/nextflow.config index e127d869..a653f2e8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -285,7 +285,6 @@ includeConfig 'conf/modules/call_snv_deepvariant.config' includeConfig 'conf/modules/call_snv_sentieon.config' includeConfig 'conf/modules/call_sv_manta.config' includeConfig 'conf/modules/call_sv_tiddit.config' -includeConfig 'conf/modules/check_input.config' includeConfig 'conf/modules/convert_mt_bam_to_fastq.config' includeConfig 'conf/modules/gens.config' includeConfig 'conf/modules/merge_annotate_MT.config' diff --git a/tower.yml b/tower.yml index 787aedfe..2d5717b0 100644 --- a/tower.yml +++ b/tower.yml @@ -1,5 +1,8 @@ reports: multiqc_report.html: display: "MultiQC HTML report" - samplesheet.csv: + samplesheet.valid.csv: display: "Auto-created samplesheet with collated metadata and FASTQ paths" + "*.ped": + display: "Auto-created pedigree file" + mimeType: "text" diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 9b5c9b87..000e973f 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -611,7 +611,7 @@ workflow.onComplete { def makePed(samples) { def case_name = samples[0].case_id - def outfile = workDir.resolve("$case_name" + '.ped') + def outfile = file("${params.outdir}/pipeline_info/${case_name}" + '.ped') outfile.text = ['#family_id', 'sample_id', 'father', 'mother', 'sex', 'phenotype'].join('\t') def samples_list = [] for(int i = 0; i Date: Tue, 23 May 2023 15:32:17 +0200 Subject: [PATCH 1158/1169] align_comments --- subworkflows/local/align.nf | 4 ++-- subworkflows/local/call_snv.nf | 4 ++-- subworkflows/local/variant_calling/call_sv_manta.nf | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/align.nf b/subworkflows/local/align.nf index 4d53765f..44d86c8b 100644 --- a/subworkflows/local/align.nf +++ b/subworkflows/local/align.nf @@ -19,7 +19,7 @@ workflow ALIGN { main: ch_versions = Channel.empty() - ALIGN_BWAMEM2 ( + ALIGN_BWAMEM2 ( // Triggered when params.aligner is set as bwamem2 ch_reads_input, ch_index_bwamem2, ch_fasta, @@ -27,7 +27,7 @@ workflow ALIGN { val_platform ) - ALIGN_SENTIEON ( + ALIGN_SENTIEON ( // Triggered when params.aligner is set as sentieon ch_reads_input, ch_fasta, ch_fai, diff --git a/subworkflows/local/call_snv.nf b/subworkflows/local/call_snv.nf index c8493a49..28eeee0b 100644 --- a/subworkflows/local/call_snv.nf +++ b/subworkflows/local/call_snv.nf @@ -23,14 +23,14 @@ workflow CALL_SNV { ch_vcf = Channel.empty() ch_tabix = Channel.empty() - CALL_SNV_DEEPVARIANT ( + CALL_SNV_DEEPVARIANT ( // triggered only when params.variant_caller is set as deepvariant ch_input, ch_fasta, ch_fai, ch_case_info ) - CALL_SNV_SENTIEON( + CALL_SNV_SENTIEON( // triggered only when params.variant_caller is set as sentieon ch_input, ch_fasta, ch_fai, diff --git a/subworkflows/local/variant_calling/call_sv_manta.nf b/subworkflows/local/variant_calling/call_sv_manta.nf index 2fbf4bec..c7e13c3d 100644 --- a/subworkflows/local/variant_calling/call_sv_manta.nf +++ b/subworkflows/local/variant_calling/call_sv_manta.nf @@ -27,7 +27,7 @@ workflow CALL_SV_MANTA { return [bed_file, index]} .set { bed_input } - if (params.analysis_type.toUpperCase() == "WGS" ) { + if (params.analysis_type == "wgs" ) { ch_case_info.combine(bam_file_list) .combine(bai_file_list) .map { it -> it + [ [], [] ] } From 12f38e18c0b48a7548f791542176c6dd694a37c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marius=20Bj=C3=B8rnstad?= Date: Thu, 25 May 2023 15:19:55 +0200 Subject: [PATCH 1159/1169] Move options to Mandatory, describe gnomAD AF format --- docs/usage.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 412273c6..3581333c 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -188,19 +188,22 @@ The mandatory and optional parameters for each category are tabulated below. | Mandatory | Optional | | ----------------------------- | ------------------------------ | -| genome1 | gnomad_af4 | -| vcfanno_resources2 | reduced_penetrance5 | -| vcfanno_toml3 | vcfanno_lua | -| vep_cache_version | vep_filters6 | -| vep_cache | score_config_snv7 | +| genome1 | reduced_penetrance6 | +| vcfanno_resources2 | vcfanno_lua | +| vcfanno_toml3 | vep_filters7 | +| vep_cache_version | | +| vep_cache | | +| gnomad_af4 | | +| score_config_snv5 | | 1Genome version is used by VEP. You have the option to choose between GRCh37 and GRCh38.
      2Path to VCF files and their indices used by vcfanno. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_resources.txt).
      3Path to a vcfanno configuration file. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_config.toml).
      -4GnomAD VCF file can be downloaded from [here] (https://gnomad.broadinstitute.org/downloads).
      -5Used by GENMOD while modeling the variants. Contains a list of loci that show [reduced penetrance](https://medlineplus.gov/genetics/understanding/inheritance/penetranceexpressivity/) in people. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv).
      -6 This file contains a list of candidate genes (with [HGNC](https://www.genenames.org/) IDs) that is used to split the variants into canditate variants and research variants. Research variants contain all the variants, while candidate variants are a subset of research variants and are associated with candidate genes. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/hgnc.txt).
      -7Used by GENMOD for ranking the variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/rank_model_snv.ini).
      +4 GnomAD VCF files can be downloaded from [here](https://gnomad.broadinstitute.org/downloads). The option `gnomad_af` expects a tab-delimited file with +no header and the following columns: `CHROM POS REF_ALLELE ALT_ALLELE AF`. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/gnomad_reformated.tab.gz).
      +5Used by GENMOD for ranking the variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/rank_model_snv.ini).
      +6Used by GENMOD while modeling the variants. Contains a list of loci that show [reduced penetrance](https://medlineplus.gov/genetics/understanding/inheritance/penetranceexpressivity/) in people. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv).
      +7 This file contains a list of candidate genes (with [HGNC](https://www.genenames.org/) IDs) that is used to split the variants into canditate variants and research variants. Research variants contain all the variants, while candidate variants are a subset of research variants and are associated with candidate genes. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/hgnc.txt).
      ##### 7. SV annotation & Ranking From 96ad150c80497e5311dc3155ca966418d1c7f0cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marius=20Bj=C3=B8rnstad?= Date: Fri, 26 May 2023 10:15:57 +0200 Subject: [PATCH 1160/1169] Add information about VEP cache --- docs/usage.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 3581333c..32bcaee8 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -188,22 +188,25 @@ The mandatory and optional parameters for each category are tabulated below. | Mandatory | Optional | | ----------------------------- | ------------------------------ | -| genome1 | reduced_penetrance6 | +| genome1 | reduced_penetrance7 | | vcfanno_resources2 | vcfanno_lua | -| vcfanno_toml3 | vep_filters7 | +| vcfanno_toml3 | vep_filters8 | | vep_cache_version | | -| vep_cache | | -| gnomad_af4 | | -| score_config_snv5 | | +| vep_cache4 | | +| gnomad_af5 | | +| score_config_snv6 | | 1Genome version is used by VEP. You have the option to choose between GRCh37 and GRCh38.
      2Path to VCF files and their indices used by vcfanno. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_resources.txt).
      3Path to a vcfanno configuration file. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/vcfanno_config.toml).
      -4 GnomAD VCF files can be downloaded from [here](https://gnomad.broadinstitute.org/downloads). The option `gnomad_af` expects a tab-delimited file with +4 VEP caches can be downloaded [here](https://www.ensembl.org/info/docs/tools/vep/script/vep_cache.html#cache). +VEP plugins and associated files may be installed in the cache directory, and the plugin pLI is mandatory to install. +See example cache [here](https://raw.githubusercontent.com/nf-core/test-datasets/raredisease/reference/vep_cache_and_plugins.tar.gz).
      +5 GnomAD VCF files can be downloaded from [here](https://gnomad.broadinstitute.org/downloads). The option `gnomad_af` expects a tab-delimited file with no header and the following columns: `CHROM POS REF_ALLELE ALT_ALLELE AF`. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/gnomad_reformated.tab.gz).
      -5Used by GENMOD for ranking the variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/rank_model_snv.ini).
      -6Used by GENMOD while modeling the variants. Contains a list of loci that show [reduced penetrance](https://medlineplus.gov/genetics/understanding/inheritance/penetranceexpressivity/) in people. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv).
      -7 This file contains a list of candidate genes (with [HGNC](https://www.genenames.org/) IDs) that is used to split the variants into canditate variants and research variants. Research variants contain all the variants, while candidate variants are a subset of research variants and are associated with candidate genes. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/hgnc.txt).
      +6Used by GENMOD for ranking the variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/rank_model_snv.ini).
      +7Used by GENMOD while modeling the variants. Contains a list of loci that show [reduced penetrance](https://medlineplus.gov/genetics/understanding/inheritance/penetranceexpressivity/) in people. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/reduced_penetrance.tsv).
      +8 This file contains a list of candidate genes (with [HGNC](https://www.genenames.org/) IDs) that is used to split the variants into canditate variants and research variants. Research variants contain all the variants, while candidate variants are a subset of research variants and are associated with candidate genes. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/hgnc.txt).
      ##### 7. SV annotation & Ranking From a5b2c447e0c822b8f0ea046f6289b722e2587f41 Mon Sep 17 00:00:00 2001 From: "lucia.pena.perez@scilifelab.se" Date: Mon, 29 May 2023 10:26:08 +0200 Subject: [PATCH 1161/1169] feat added hmtnote annotation --- CITATIONS.md | 4 ++ conf/modules/merge_annotate_MT.config | 11 +++++ modules.json | 5 +++ modules/nf-core/hmtnote/annotate/main.nf | 45 +++++++++++++++++++ modules/nf-core/hmtnote/annotate/meta.yml | 41 +++++++++++++++++ .../local/mitochondria/merge_annotate_MT.nf | 7 ++- 6 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/hmtnote/annotate/main.nf create mode 100644 modules/nf-core/hmtnote/annotate/meta.yml diff --git a/CITATIONS.md b/CITATIONS.md index b4bc88d1..80e78ee8 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -56,6 +56,10 @@ > Weissensteiner H, Pacher D, Kloss-Brandstätter A, et al. HaploGrep 2: mitochondrial haplogroup classification in the era of high-throughput sequencing. Nucleic Acids Res. 2016;44(W1):W58-W63. doi:10.1093/nar/gkw233 +- [Hmtnote](https://doi.org/10.1101/600619) + + > Preste R, Clima R, Attimonelli M. Human mitochondrial variant annotation with HmtNote. bioRxiv 600619; doi:10.1101/600619 + - [Manta](https://academic.oup.com/bioinformatics/article/32/8/1220/1743909?login=true) > Chen X, Schulz-Trieglaff O, Shaw R, et al. Manta: rapid detection of structural variants and indels for germline and cancer sequencing applications. Bioinformatics. 2016;32(8):1220-1222. doi:10.1093/bioinformatics/btv710 diff --git a/conf/modules/merge_annotate_MT.config b/conf/modules/merge_annotate_MT.config index d62cf73c..d7c7c7e7 100644 --- a/conf/modules/merge_annotate_MT.config +++ b/conf/modules/merge_annotate_MT.config @@ -70,6 +70,17 @@ process { ] } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HMTNOTE_ANNOTATE' { + ext.prefix = { "${meta.id}_vep_vcfanno_hmtnote_mt" } + ext.args = '--offline' + publishDir = [ + path: { "${params.outdir}/annotate_mt" }, + mode: params.publish_dir_mode, + pattern: "*{vcf}", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:HAPLOGREP2_CLASSIFY_MT' { ext.prefix = { "${meta.id}_haplogrep" } publishDir = [ diff --git a/modules.json b/modules.json index 981605d8..f7c5ca45 100644 --- a/modules.json +++ b/modules.json @@ -180,6 +180,11 @@ "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", "installed_by": ["modules"] }, + "hmtnote/annotate": { + "branch": "master", + "git_sha": "a746b933e61f43f8932aa2f867d5ec7f0ded352b", + "installed_by": ["modules"] + }, "manta/germline": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", diff --git a/modules/nf-core/hmtnote/annotate/main.nf b/modules/nf-core/hmtnote/annotate/main.nf new file mode 100644 index 00000000..d523d047 --- /dev/null +++ b/modules/nf-core/hmtnote/annotate/main.nf @@ -0,0 +1,45 @@ +process HMTNOTE_ANNOTATE { + tag "$meta.id" + label 'process_low' + + conda "bioconda::hmtnote=0.7.2" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/hmtnote:0.7.2--pyhdfd78af_1': + 'biocontainers/hmtnote:0.7.2--pyhdfd78af_1' }" + + input: + tuple val(meta), path(vcf) + + output: + tuple val(meta), path("*_annotated.vcf"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + hmtnote \\ + annotate \\ + $vcf \\ + ${prefix}_annotated.vcf \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + hmtnote: \$(echo \$(hmtnote --version 2>&1) | sed 's/^.*hmtnote, version //; s/Using.*\$//' )) + END_VERSIONS + """ + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_annotated.vcf + cat <<-END_VERSIONS > versions.yml + "${task.process}": + hmtnote: \$(echo \$(hmtnote --version 2>&1) | sed 's/^.*hmtnote, version //; s/Using.*\$//' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/hmtnote/annotate/meta.yml b/modules/nf-core/hmtnote/annotate/meta.yml new file mode 100644 index 00000000..44cf88ca --- /dev/null +++ b/modules/nf-core/hmtnote/annotate/meta.yml @@ -0,0 +1,41 @@ +name: hmtnote_annotate +description: Human mitochondrial variants annotation using HmtVar. Contains .plk file with annotation, so can be run offline +keywords: + - hmtnote + - mitochondria + - annotation +tools: + - hmtnote: + description: Human mitochondrial variants annotation using HmtVar. + homepage: https://github.com/robertopreste/HmtNote + documentation: https://hmtnote.readthedocs.io/en/latest/usage.html + + doi: "10.1101/600619" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + - vcf: + type: file + description: vcf file + pattern: "*.vcf" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - vcf: + type: file + description: annotated vcf + pattern: "*_annotated.vcf" + +authors: + - "@sysbiocoder" diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 6e3db396..38d5dab9 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -14,6 +14,7 @@ include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../.. include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../../modules/nf-core/haplogrep2/classify/main' include { VCFANNO as VCFANNO_MT } from '../../../modules/nf-core/vcfanno/main' include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../../modules/nf-core/tabix/bgziptabix/main' +include { HMTNOTE_ANNOTATE as HMTNOTE_ANNOTATE } from '../../../modules/nf-core/hmtnote/annotate/main' workflow MERGE_ANNOTATE_MT { take: @@ -106,7 +107,10 @@ workflow MERGE_ANNOTATE_MT { TABIX_TABIX_MT3(ENSEMBLVEP_MT.out.vcf_gz) ch_in_vcfanno = ENSEMBLVEP_MT.out.vcf_gz.join(TABIX_TABIX_MT3.out.tbi, failOnMismatch:true, failOnDuplicate:true) VCFANNO_MT(ch_in_vcfanno, ch_vcfanno_toml, [], ch_vcfanno_resources) - ZIP_TABIX_VCFANNO(VCFANNO_MT.out.vcf) + + // HMTNOTE ANNOTATE + HMTNOTE_ANNOTATE(VCFANNO_MT.out.vcf) + ZIP_TABIX_VCFANNO(HMTNOTE_ANNOTATE.out.vcf) // Prepare output ch_vcf_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, vcf] } @@ -122,6 +126,7 @@ workflow MERGE_ANNOTATE_MT { ch_versions = ch_versions.mix(BCFTOOLS_MERGE_MT.out.versions) ch_versions = ch_versions.mix(ENSEMBLVEP_MT.out.versions) ch_versions = ch_versions.mix(VCFANNO_MT.out.versions) + ch_versions = ch_versions.mix(HMTNOTE_ANNOTATE.out.versions) ch_versions = ch_versions.mix(HAPLOGREP2_CLASSIFY_MT.out.versions) emit: From 4940347018d889278ddf20466abd1bf1cb626de9 Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 29 May 2023 12:28:36 +0200 Subject: [PATCH 1162/1169] Update subworkflows/local/mitochondria/merge_annotate_MT.nf Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- subworkflows/local/mitochondria/merge_annotate_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 38d5dab9..1ca748a7 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -110,7 +110,7 @@ workflow MERGE_ANNOTATE_MT { // HMTNOTE ANNOTATE HMTNOTE_ANNOTATE(VCFANNO_MT.out.vcf) - ZIP_TABIX_VCFANNO(HMTNOTE_ANNOTATE.out.vcf) + ZIP_TABIX_HMTNOTE(HMTNOTE_ANNOTATE.out.vcf) // Prepare output ch_vcf_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, vcf] } From b1bbe480fa445b6462f8bafb53fc41e09c147aea Mon Sep 17 00:00:00 2001 From: Lucpen Date: Mon, 29 May 2023 12:28:43 +0200 Subject: [PATCH 1163/1169] Update subworkflows/local/mitochondria/merge_annotate_MT.nf Co-authored-by: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> --- subworkflows/local/mitochondria/merge_annotate_MT.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 1ca748a7..45785476 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -13,7 +13,7 @@ include { TABIX_TABIX as TABIX_TABIX_MT3 } from '../../.. include { ENSEMBLVEP as ENSEMBLVEP_MT } from '../../../modules/local/ensemblvep/main' include { HAPLOGREP2_CLASSIFY as HAPLOGREP2_CLASSIFY_MT } from '../../../modules/nf-core/haplogrep2/classify/main' include { VCFANNO as VCFANNO_MT } from '../../../modules/nf-core/vcfanno/main' -include { TABIX_BGZIPTABIX as ZIP_TABIX_VCFANNO } from '../../../modules/nf-core/tabix/bgziptabix/main' +include { TABIX_BGZIPTABIX as ZIP_TABIX_HMTNOTE } from '../../../modules/nf-core/tabix/bgziptabix/main' include { HMTNOTE_ANNOTATE as HMTNOTE_ANNOTATE } from '../../../modules/nf-core/hmtnote/annotate/main' workflow MERGE_ANNOTATE_MT { From 5a2bf6ea97d56bbd888ed1cd43aaebe6856bff58 Mon Sep 17 00:00:00 2001 From: "lucia.pena.perez@scilifelab.se" Date: Mon, 29 May 2023 12:31:12 +0200 Subject: [PATCH 1164/1169] feat fix line --- subworkflows/local/mitochondria/merge_annotate_MT.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/mitochondria/merge_annotate_MT.nf b/subworkflows/local/mitochondria/merge_annotate_MT.nf index 45785476..16eb4438 100644 --- a/subworkflows/local/mitochondria/merge_annotate_MT.nf +++ b/subworkflows/local/mitochondria/merge_annotate_MT.nf @@ -113,8 +113,8 @@ workflow MERGE_ANNOTATE_MT { ZIP_TABIX_HMTNOTE(HMTNOTE_ANNOTATE.out.vcf) // Prepare output - ch_vcf_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, vcf] } - ch_tbi_out = ZIP_TABIX_VCFANNO.out.gz_tbi.map{meta, vcf, tbi -> return [meta, tbi] } + ch_vcf_out = ZIP_TABIX_HMTNOTE.out.gz_tbi.map{meta, vcf, tbi -> return [meta, vcf] } + ch_tbi_out = ZIP_TABIX_HMTNOTE.out.gz_tbi.map{meta, vcf, tbi -> return [meta, tbi] } // Running haplogrep2 HAPLOGREP2_CLASSIFY_MT(ch_in_vep, "vcf.gz") From 5efb2e3c488073ac40641c037a3ff615eb05d4c2 Mon Sep 17 00:00:00 2001 From: "lucia.pena.perez@scilifelab.se" Date: Mon, 29 May 2023 13:57:15 +0200 Subject: [PATCH 1165/1169] fix naming --- conf/modules/merge_annotate_MT.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules/merge_annotate_MT.config b/conf/modules/merge_annotate_MT.config index d7c7c7e7..367fbe7c 100644 --- a/conf/modules/merge_annotate_MT.config +++ b/conf/modules/merge_annotate_MT.config @@ -60,8 +60,8 @@ process { ].join(' ') } - withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ZIP_TABIX_VCFANNO' { - ext.prefix = { "${meta.id}_vep_vcfanno_mt" } + withName: '.*ANALYSE_MT:MERGE_ANNOTATE_MT:ZIP_TABIX_HMTNOTE' { + ext.prefix = { "${meta.id}_vep_vcfanno_hmtnote_mt" } publishDir = [ path: { "${params.outdir}/annotate_mt" }, mode: params.publish_dir_mode, From 6f0c5133930b099f2b696c3936595c4e547f88b0 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Mon, 29 May 2023 16:07:28 +0200 Subject: [PATCH 1166/1169] update workflow --- docs/usage.md | 3 ++- workflows/raredisease.nf | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 32bcaee8..8e76910f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -213,9 +213,10 @@ no header and the following columns: `CHROM POS REF_ALLELE ALT_ALLELE AF`. Sampl | Mandatory | Optional | | -------------------------- | ------------------ | | genome | reduced_penetrance | -| svdb_query_dbs1 | score_config_sv | +| svdb_query_dbs1 | | | vep_cache_version | vep_filters | | vep_cache | | +| score_config_sv | | 1 A CSV file that describes the databases (VCFs) used by SVDB for annotating structural variants. Sample file [here](https://github.com/nf-core/test-datasets/blob/raredisease/reference/svdb_querydb_files.csv). Information about the column headers can be found [here](https://github.com/J35P312/SVDB#Query). diff --git a/workflows/raredisease.nf b/workflows/raredisease.nf index 000e973f..6ab05e3e 100644 --- a/workflows/raredisease.nf +++ b/workflows/raredisease.nf @@ -73,11 +73,12 @@ def mandatoryParams = [ ] if (!params.skip_snv_annotation) { - mandatoryParams += ["genome", "vcfanno_resources", "vcfanno_toml", "vep_cache", "vep_cache_version"] + mandatoryParams += ["genome", "vcfanno_resources", "vcfanno_toml", "vep_cache", "vep_cache_version", + "gnomad_af", "score_config_snv"] } if (!params.skip_sv_annotation) { - mandatoryParams += ["genome", "svdb_query_dbs", "vep_cache", "vep_cache_version"] + mandatoryParams += ["genome", "svdb_query_dbs", "vep_cache", "vep_cache_version", "score_config_sv"] } if (!params.skip_mt_analysis) { From 8cc189a738d99e947c71bf82eb489025be56c2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marius=20Bj=C3=B8rnstad?= Date: Tue, 30 May 2023 09:51:05 +0200 Subject: [PATCH 1167/1169] Fix documentation string for VEP cache version --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index f568a865..3da8d7be 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -495,7 +495,7 @@ "vep_cache_version": { "type": "integer", "default": "107", - "description": "Specifies which analysis type for the pipeline- either 'wgs','wes','mito'. This changes resources consumed and tools used.", + "description": "Specify the version of the VEP cache provided to the `--vep_cache` option.", "fa_icon": "fas fa-book", "enum": [107] } From 90d8956abe0960056f90e119b01e4f485657c457 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Jun 2023 14:04:56 +0200 Subject: [PATCH 1168/1169] Update CHANGELOG.md [skip ci] --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23a719c8..c7e7df70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## v1.0.0 - [2023-03-31] +## v1.0.0 - [2023-06-01] Initial release of nf-core/raredisease, created with the [nf-core](https://nf-co.re/) template. @@ -18,4 +18,4 @@ Initial release of nf-core/raredisease, created with the [nf-core](https://nf-co - SNV annotation with bcftools roh, vcfanno, and vep - SV annotation with SVDB query and vep - Separate workflow for analysing and annotating mitochondrial variants -- Call copy number variants in the SMN gene using SMNCopyNumberCaller +- Call copy number variants in the SMN gene using SMNCopyNumberCallerx From ae36d769f13c92709b3e53c9f2f80b2f11ab7fd7 Mon Sep 17 00:00:00 2001 From: Ramprasad Neethiraj <20065894+ramprasadn@users.noreply.github.com> Date: Thu, 1 Jun 2023 14:09:54 +0200 Subject: [PATCH 1169/1169] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7e7df70..eabbc201 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,4 +18,4 @@ Initial release of nf-core/raredisease, created with the [nf-core](https://nf-co - SNV annotation with bcftools roh, vcfanno, and vep - SV annotation with SVDB query and vep - Separate workflow for analysing and annotating mitochondrial variants -- Call copy number variants in the SMN gene using SMNCopyNumberCallerx +- Call copy number variants in the SMN gene using SMNCopyNumberCaller

    Yf*O7e^!FIFr{mBZVq-%^YWv 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

    Data was processed using nf-core/raredisease v${workflow.manifest.version} ${doi_text} of the nf-core collection of workflows (Ewels et al., 2020).

    - + + nf-core/raredisease Pipeline Report + + +
    -

    nf-core/raredisease v${version}

    -

    Run Name: $runName

    + - <% if (!success){ out << """ -
    -

    nf-core/raredisease execution completed unsuccessfully!

    +

    nf-core/raredisease v${version}

    +

    Run Name: $runName

    + +<% if (!success){ + out << """ +
    +

    nf-core/raredisease execution completed unsuccessfully!

    The exit status of the task that caused the workflow execution to fail was: $exitStatus.

    The full error message was:

    -
    ${errorReport}
    -
    - """ } else { out << """ -
    +
    ${errorReport}
    +
    + """ +} else { + out << """ +
    nf-core/raredisease execution completed successfully! -
    - """ } %> +
    + """ +} +%> -

    The workflow was completed at $dateComplete (duration: $duration)

    -

    The command used to launch the workflow was as follows:

    -
    -$commandLine
    +

    The workflow was completed at $dateComplete (duration: $duration)

    +

    The command used to launch the workflow was as follows:

    +
    $commandLine
    -

    Pipeline Configuration:

    - - - <% out << summary.collect{ k,v -> " - - - - - " }.join("\n") %> - -
    - $k - -
    $v
    -
    +

    Pipeline Configuration:

    + + + <% out << summary.collect{ k,v -> "" }.join("\n") %> + +
    $k
    $v
    -

    nf-core/raredisease

    -

    https://github.com/nf-core/raredisease

    -
    - +

    nf-core/raredisease

    +

    https://github.com/nf-core/raredisease

    + +

    5ZopirL))ulvG9H$w^n|v=bc4-cXFs8WXp)jeq{FFi_oY#2pc`vWrTjpg* zn~=xi=OhbTzOv@JsrsU*_;8;Mw*A&F92Dw6Xg!W=;9-1nyuo+W@wlGx`dcHOIAcP8 z29ujs9StLW<#jXGwN*^7%7!P{^ABlJK1RL^-3Ix2ajuaZr&#pEI^^1MlpdJU$(pO^oGYg6cRb_g#rAZsEoEADi@JbDy?5Wcv3}7Zc^ui|-aCG+ZXm?Dfqmw_! zD_kuLHB?TNqqa5_y*_|L^A$ zFEpC3>3gD28jz8Z4ZDnKQawP zOcZVr>rncB+iw2kSo)JsDc+$3{pUyHL29%)`Z^- z=E@R>##4l|7}Knf(_0torWZBxc+vT#B3wVu>aI8@4{nOv`y-G-qy-SbYIoAh)2)1R zdD@Hi%;m*JkIOi9?a$&5>d~Cu>6&($W&=0%MFi$wy0xe3S|^?@&9u95R9kw3KnFHv z(%dO2?MF1jin^MY5eS&+=KH(*ac+OyEf-5oly;da+f;XD{Zu#PtUtNtqG*ZQTxB(; zWOzmS{7rA&yE=v6EpCj?$u!1Yl_0%D9Ozv)6PionN?Fbz^ekdKi!E4b&^x`3%CVEv z`NAH_Ml=xh@}f)$uerIjEV)!)Sf&J)>K$I|3l<%-%IH!;xtF72hMt^Op$;C zyxD|~hF7+^i=HYk;%*Cz+y6S9e%p_QY`CT16d?PuiPSEAMlf$1D3n4UI^Mws%nCf9 z&@9AO@C;3$~l^zHLQaSj=7NCkNfLD#gvm9~3YYeKu0$q6fTF)}cQW773X9anx5RUWeV z4&NYp(K!f6jqYtx_IcA>a#3>lVl@35_$`Q1viF>1#LQx>Llo5Uf ziEIiQd{xJHS07-Z=bXKsp+~BI~Cf*9#3GMNNTLTv@G@Le6-(<3xEH- z@3NDg{#=3KU4siz7Ty|K>;a`-n94(l+WW~_+5{? ztXB&5J~?LvNf3M`L5Bkb3NqW}ituV>?x2@Zy3uhj0M4$06JVzK$`j71AbXZoH8lUZ zi0-OwYazv9x`}vH>y_Lkt&jkKfY@)FkRPSOVWqCYv9;zRz(8RVk&z22&bu|i^-jD} zQZiuRXbg$@hVqVf{?Y;g9#Y926x=nDlMHB2zdLcP@ARi!U`CT{1Wxzky%)xW3#p*>IEsX(D?V)wz-ZcyDc&-`K!e@M5!E@ zoKl2wnHR52b*jK{@r@dV!p!WFuwoRUCrkkC&lI&y;=+-4(R--x+;AH*^zv zpBw>gOuAj$Tc-rc1=!n^)hjJZ1eyiwE?iJf7|P3I3b_-Y&2T=!16Nja5Szy-h70}q znhR2w&o23;sI`x71HJ2)(&CvwKB_Y6v-KNZ`U%wn-U1MD(S>!Re}qFK*5hEPX?BqM^2ZtKngo5;fB@uVxv1{)dX1KW}Zq=+9r4qsF4EHj7!t<$@0AKOTf34kNkC6oefD@;K%#1ZRT|>!p*T^_`twL}Bk#Ioaz}%#m+ow~^ zxaNMgOPfvEQA3huZHq>}9Oh5n0`njW?1mbNkAA$eR*W6Ye zNz&8>cT9d$tmR*A$2um1NS$2^vOY~{L&z+&A`MmI6-QjMDv4$lq2{ZG*+EL~@w2u* zUv$R;wryQ>jViOiMzM4HjiLT74e~eMAi3lL=sP#2p6|7cuP_j%_8fowyHJB!yrRwE z*}Fwk7CqE|Pfd)R@0y_;7H>K?L5SKdJRZpQ_WX3`mn<)7I&hUIfvG>qWG445GGf>m z!GqHNDKL0YHL3cu;Kc=GTCcC$3s`1Kf z6e~c(J7%NY&>v-rJ5c)3Cv#59rh?QjsWL0gB{<1WW_H1TiE;NGzsa)eKilb+`^sX_ zUFDe&N^Xzl3*8p>*Q4w|+H7}&dn#<8xyEs|kLv5QrdigY$8fe)lZ`80ISY%3HkpdG zXO&p`KoDTwX5fdtQ8<20by*@(yuhQuOv-h*D^?DMp6!_@405-iQ=cryIXIsVG=T3L ztU%q|s=FT~$GQqNQr>vF=Blfx*QmR&5qmZR;q6U(zRUWC?Tt5xq?Qj%t`F&#_-a1! z9iQ_qF5T8cs7LSS=+$kv^y5e>R5V58lkSS>a4lgaMb@@C77e~O*D7{N10|rshRY@c z`q)zYtAs70g=lxwFVLa0qv{2qg#%C`H~FEM=6J7%nL0o1ibRWai01ojZYwTi#PIa- zho$mdJR7#lylcjX$A5bAQanV4B|kZAqXCQ@n$w7lWjXDQWewXpCpntB1#x{xza#(7 zy^pBBKqFD&5^zU24nZiwXL*y@R7YUnWS2H!3l;^d$qaM!FUCm9MtQX}L$UO=Um))g zBdzFunqnEav)OaK*-dfv-NLd{{2EN#AbAq*8I6|BnlSvFm-B)ZjS|R<3bUP9xR>SL zMD-4|5y_Wfn0IA=Nt-izjkKQOH)#>w5sFH*ZgJij1s0jSg=EjjE5jI2Uj6;d zEOn+k8YXau^=^v)k309^`o=wk$EhisiBv24rFT7r?(uQ*dV)*R0OwxqQ@=z3Q-_J}w>n)MaJ41Bs>Hq4RH%d#Amg4bM2;%I{jJeW9r+9R83+)<~sYz>5g#; z5nY=+%e4RIH1zn~ST>+7QnT8;O%skV{6xHTf{M7f0XSr)9L!trFIH;4qsKIP9vbVp z4feq-WC1ztrZ3F4p>kd`w!F!$VXAr0} zQQrAtrj!ZQ(&+Ch9#t9< zu}J8MBpr$4s|YwkRWFnU5%3Kt#lLd2^ULMJBL%wuLzxm9cg^xrZZw3B3Dev)RD`0D z#^lMCfjbiZLsgoV($cjZhInJCUP+jcTgIowu~4xaoK8M^#ccDM%jla4Au4k0^PivU zl!hWRHZYI8+j7#~G1Uo41&FV1Widn=L?#<-4URhnB`wMVK0KLmU0-)qSaaL)=!ll< z?jP&m#$2C+A$p|MzcNHO&7${RdT-QPJL!cazvMuAo&2iAzOW)j8JY1r&+~$pix@K* z>%1I!M8?$y)Adxzu@eQQuNbkcu1J5p?wYm~THNlxZCHXl5;@$Pe4iGLK75+s?7@Rc zZ3#iRRPlf>Or{zWNP3f&NJ|5WQ4vdcy~aC2rAo44gB|k=&QWuc>@1eA-8dc z%ch)JENp3Q{Mi>4Tc#dx1KZ}O#uq_2+w7SZF9MnH?yEshFqJ6RVj$V(cbx8~F7xQK zS}1nBo%X+hE4&t_39g_`87bZUee9y*f!a?e8K=|u#bX#Ua_9K^S^b%e4T&#$c|Hi% z+-7anH|>STgV;o*@PB|2=TYmELNw_b#Cu0sWZdI;qm7#cHn4PKS-O?gtFiTQj~j|m z+kuRC%T^}4e_<_NE|T188aDI{I#uI=)qIiz%Sl^BB6wR!*`!;9TV<|y$f8oyJzxuc>Z zZI@npZl&>Cf+`^y@EI25Q)xAbw68{9Dl8g_#=!Or+8oLt?^WN1^8J~sifiu5tZy$h zrU~qct&NaTeqJltf(NAFkyEQ9gCq}*_6FK7KQfUnv7p%PDBQE7n!3&`v-$Z%6H&*> z+{&6?axvywwS?#}~y>zZUWmC(^E%V?;^XtcAwN0YyYZZkVIf@X(Wu?nU$pJMZ@uc-dC7>Ql+7vuHnJq|pE>HD*g&XuP$~iSJpN@( zz#R0j&g`lk6GG?pjV0GbNwYz^3-}e1=V@=RaR_O)6q_-9ZHrmg)n;1=CAz*d{!S z0H%LO*lv$+Gthe(#-*;@V>?qt!*t7iX3c!(TD#CyHb3TNh%0#<=3j;be1`#R;ucfr z*|ZI^i&x;>{X=jr+!;#ktPJ5rUob_T8chbUSXYm9N>V5$xjKbLZksHiIe3_clGeMHqiab~N1qY!s6D5T$)8&1|LI=6W6 zTLYsVFMSs})~hf?qlyuCWqP|prC*%bE3tM}6T*GTi$Wq#5#p5g0x7&H1Ho^%Gpr73 zk#K8t4&UvJ)n9v;1l(q~1n|$VI;U(+<TbMrDv&xk z`QwLre(W6NF5N;tx?OC{C#je6G>^<_0!&@^U6!><2HX|q6P}o`bS=6I{7s7aN%EYK z0WG4DDJ;O`M+O8~$Aj+e=&Q*M9CgxW8naM!V#UDKl}+6hj9z{a-o$j;7@`1&`=zrd zGm&M@U0wD~(d4y|Xt3np?%{UaTmM4Cvle`;oOd9d+U3vcw_3zTuTl5U|8vo1+sVyg znTfkcp=N6v!Z+y|m>5w7)6BJ-W12jFJl8l`Gl_819BArwhY^EbkWa|AAlI9;`wMb? z0N*(Iyrps(;OO?}Z}(d31ky{XG9A@0a(ltb1R7G=5C8S9C%s1!TQ~ENh5u@(1R9Km zr9SAmn~eG2EnU@<{C4lAImTj3YvSkL*3uGEcml~3Us`B0|GC!CU1xns$G6qq zId)mn8j6WMOjH;6;k-4I`UkLpk>T!V~PC}m({XJ zw=cl)WvgxJ7UTNU`gpQ}<-tai;~HhZ#1PH6EH3#h+$K+z#n7`ZYp5A~tse92cvu06 zy|>Q`SE9Vb-pC{L1lAdZ_v(eWE@|ePGD+TU0S!`zA*(p}Rk@#1i#==k#+q{y$ZMp{ zU7C~;Uuwep{et?IcbRXczZrrHl@2dygb>|u!o6DM1e%1@Qi{rz_bBx76C!=GSJq5; zes|%l3h{+c*`vh;g4gz{5 z$9Rza)mR}P@B<(nmc<9n!bCYxH94?t!SsT3L4mTp_w;rRdX|)6=Ki!4DPv6 ze@t+XM&LN=?00v?yZB|2QfY+%Ip{8t=hP14*pEN+rD^{+nt3XI+;`)$EMt6w8Gpoh zYOc*!W_GWb`!b7myXxxVB8>I70!Mtjt=wVz zkzYz6mUM`$1YjzKA-oFb{IeB%L2&7h3&aft3bER-A*PIzOFF(QrpdDUj#vW*L!rqXS-w=4byD&(c%(DM=|>a!a-LtSY)zL@QKe!^*$dx*eQk4m00N20g3(h+dj7 zB#f}VAX&<_4DOwrCZcGsK3QtYwpTBM->)$0OwjjNIruswedWo9XAucW6i164&v#LG zM+@|R_|}6*Y0;-JI>iNZ9i(D`(t z$As#}4~0>@OKvkwkEF9^;-!btYNpwlr59S*%60sBKL$Iz+=0T2&M$G%T~T6|{l59z zy?P1q+$E7rUG9=&$dTqpbCj-9?c4t^Y& zF@Hqg5byPC*HH;RMtbLKE*l3N8XU?m>ZNz&iFL@QPyLD&(WKKs3bE@ zI2nnS?i!wp%VVJ9hBk|6Kz^FOeZJ@_&j}PO;?)+cch^aR+xDJdbpLQL3e&y%o4I6T zNDLvN!dVOnmSFU%4ofl;{`bmLfh8D)1fcGx{zZW}Zd^EynxL#-Go2I3USudtbPTb)}K-tmV!!%m%l~|R=f~W>V?R>S2-!? zdvAINA}DWM*BSWcA%3$X&6Q}Gy&=?)Sn9;8sLf)Qv0Lx^$?`?$?J2dQq{f7ryUMbz zmZ5YhRoHJ^L+z1VaO1NkT6%cZQ*paAd|b*+_S@VX+YI}9s znn&~gGkVC?JJ0GB9<@!#FcA;douNZjUo;twU2O8E1i<}1=x=)?<~&}Hm$C(yH%MHP zq=*xoNvJ2LonUp=3|Z%=yex)=da>d^jcMk1JesB%qTzpCtod}!W!+u+re;2ge=jHG zE36Y{4J8yTh>(uInb|e_M9p83SJQ+^3|w?=JCZesUz&%cWa5jiZ>EPBkuS50Axaou zS#eiqtWez5oetgBE&aqFDmcJpzI$Qiy_~afygPS)X8iPt=dR3AajV8ced{o zl+NO%0#A3583N&osMAq}r&-^(=DejzWo1`%qNk6N(=L7ec7ybW7fl^+zbf^rBpRo# zS>XY|cT)lrlHpFHRr&Z&tIWahf{4u+gA%*|hxG4s?w_fZjDV7?Xxg%b67?TwIY~(s z3YCcm2=6mWA)3<&QA4C#JSK9*5tT@gGI2XUQ{d)RblH=z0YKC7M3;pZU0$lLFY=aq zF+k1*CzaQ^V}tgiIP-O|3>%Fd_CdAQd9SS4@dGTw_TO;zuQ&2mVXX z*IdzT;H+wL!3{hTgPjYJY5d^sZ%`glECF#0(G~)2f%i8~ur{=k(dCd-Th0w78F#}t z%>5Uk&Cgr0s;PM{NIc-$N2i7ho3v?J;-!JkR$QAFwb)H7`+M{DsJeSC)r(}WG)blk zlpkeBSLu(V!#v)CBY_$DfJi3V-4SpCbEnXpu}~zslE$m^Lw>&Krfw-JxfBS*yhJ7< z8{`ptq4`rHZOxbwZ-HRNM?il^^etki$Tb1_B7WgUce5A~>flL(zK`e8YR?sYhr~(; zA}LQR#BC?f!v?9-a#?6hBmKIn-E(NR6VR9P%Cpp}jvrzWQ|46;ne{)_kKpB|>xFjK zJJo|} zzGlK|ni$K>-m()E@EKzNR`&E8#DDV!j&3$VU2fmNT&ZDct8w9mPwVI0k5fGAC3z|n z4bb?btj4bFXG0kHM@QYfwdSU52n1~N8toVs@klB;ZU=mj@PaRr1cCPQQ1fv@>x2Vh zpDI@Hz42iL(Fo+Stno`Ua@EX@l0+VxhlS(>$!^D++;b5tj7!YCyd5v6YtG7?x?-yg z9cAy~#++4g-Xz}uUSKx!WQOtQU%8uOL}q51P~*{h5qevjm@EI7ClcW3zT(2q7hQLJ zx-*f}+BA^ze@^3+)#5T5eJK%_=;ljw#?8zK$zlR|S!`*Q;>;iEIItgH2R3<7)Cy*J zdTM4MW{zlNXQfFJLCk1$Le^cH3YEG)#gvl6a3CcztqgF9SCoLV>d{#}?o_N|)GP&? zY}6+Y0FkpU@2?K(wv?jP)kL}X*-#K(bX(GtpG$#GI?Z?iQEQ&DqrhsVh_OrI2J6{n zRbJTccs5>ol{BjYvc~VkBoroXXOp{DF+i_g&^{v4hbRzs)h0{G};up(Hj#RF-U;BU)ANVq-JV`{l`9+FLPBG6Y*;g@bvOK2IDCQCruIO{W|ucl4@N0m*#C;6Z6{EJ|e4 zIFP$~NvlbV+|cPbU2<2JZ45pE>+hJrWhFhvXVOw3I07GYO26bJ?3y_O%znp|FWTkV zjC7!Bptm>dt!SABZC7-2Q_A7|o@Y5yJ zgtD6E2%vj#7gB)##Ed4fR0$-P`0MCs;4F=A^MlRmsp#x*H*`PpA^&T#jWv_;oqse> zT|2wc1lN7RQ@wVZsUBMp7}%Aac8Puu%kexfRl9u?ga98JqzEh7g`xs$-7llQRFaH( zHE0$jn!cH;k9HbM3yMCFOD*R)G$)8trB98a{G zMWa4i3{rbL&SfgKbULK(OI=FV^Rsr#YuylKd>J~hq%%j zk{AHH?QT_3ew>vnxWHo1OgC}XdI5(Yc;LF`wrE<~?JR2~w@Q^b3B3JHCC&=N4fVNQ z`xr#FMg#%%G2m7JLAcFP6Rl)LljxY{;QCPyHm`G)Rj-NeNpXi0HrO@w88LxQ3p zP~G^&Xak(-P8LmKLs_1&wmvA3Qh^a&DCP?&x|=Tb$0+%v!_a&G4M*H`UtiqzVRJ^h>2bxnNuhKz>C^H(6 z5{+Wj;pZWZ!%56_`Q)k$n(KPJi+sZQn(1^C64(~fq+oAYVH#xK4$9S76vfI7lc7H_ zC>QN?oJ_S0?a@d@Dcr3(?md2UHM#GY}!812w607hNRoE=I#)TC$q zSpYRs>JNtZyoJKOMYsoopa(mibrozP;qe%6d+8Xo5b*xS8$%yd-8V4H0mscF>6eleX2iA^lZQc_zEk<46p*P4mQoi$Zi zT%_M!2}AO!AOf06r<6;ttUXdGQSs!p^5}@$CdA|IShRCeWTs$yJw{G~p*&F&<=WF7 zw!~&fwoTci8|Im#u`BC{@ni+4IjlS;gPb3=SWYh=?&6Zgn_M#n+Ei#dLiyBge-IK> z!aiNmW;EoumY^fZ7$`7^Lb=ET9mIH-*SS^hzD%{dGHgUoWBzG?HBhP*AI##ddpRnh zHJ4e*YQ>$}up?g<80ZaYRyI^J=Gh-$8LlyEB3|u2BMHxm+(?rkasW`osske$gql}n%6JKR-T(Eye zdh{BG+-|gND;si&x)f~!*LnN@D_~GSqL`%9E)C0ReJ{!>!c@PqZ_u1T&Sg^66PqrS z8b4&ATZ7ElWCe8!%B}HpGjZu^h}Mfb7Px=VDLZ2vWb6&W<-`0k8pdnxGOAW}m#z}B z)Tb5T^bO+FpS|ARz8)aS$S9ap+2S)8jcW1QNj-BIM#cD@D;CR>Ax7_6x&@RQ3c})d zWdw|5qT~nc`F+m1GDF zJ%7q_4#J8WPzL6OCF4D0KrH9+*lc z*EI}N2nuq~4w1I#RG+A_V9iZTBbzSE($KEoIoDR^2c-Y3T4>Lcq5ENphL{v5Ai3^tdIy7x-nfsy*_nN^4@*oMQIMpT8*bXM6qojk zX$L=*;@-*kJvFJFvm&cpYFb?7HoSyK-<#-;5)@=+xI#Z*R)Eckw*D+#HKVH)TyN@0Cnkd@q6K z7V~-Y^@+;8ZE0573ZB6z7F!84Nh=Rnx2M9yyf|i7@asKE@vL@vb9C4Fn#-JOboHfU zK1nJpX?)E3(wpjbZjwl2cQ+yTGHBuz#Re{HMcz`;L}8w=yO*gT9E5n)eDokMi@HH_ zToj2DYk5Kp?nJ?4l``fkW{df+J|r;{Zm2$AbX8Yf-&D;dOM3c9t0dY;fEK65*j#&) zSlwh*-oC5gb;P zJZl;0g@)%YH~PQ{0PYE7Z&7Fzt_j2rc8#+(X)hAG&`V@+7Fx3QxXg5B-KtG=%q($Q zrSM@?7aW3+eZj1efdX8X#no`|Z!_!foXoQ4H8(X)A1u4PzUXAlcjd^xEAyVvjBeiU zQTR!4nAh%Cwb{pR9^31&Y&O{3U1?Le!Xpx~Jq7R-x0_TXEGlgqO-3{TqgJRz8n5J*H2>Hlxr3tF5hv5V_bk9YqOv=%#NHgHLW;mrzEO<*Pl?INf5@ z*J#YItH1I}uecUh)an+TqE|M$i+}3d_{CCZ<$iT``>)49GA>TKys|5ZIWsCPL=O0& zN+M;tAU%~3YM#Jor#3n#)_WcrLqo7Ztkdi9*D|{PwYa3K2;aWs-Q|K{?2j_I`C(zB zM?gL*pLX11HciJ@g%$Z629|~_4PtbL0;gK>ixXFRPZv!EtETT_0NSER=bsOd+l8E( z5@Y0;;8yHvoQ2c9L!ZQMTe<<7lk0YSSTW1>#K4fq6f=F65+XA^qf8SMjM>dyjI7(9 z2O$Sm){4g2FFf39^bM`u&C-D<;CKAmUo^AOdh>ES9oF1+q`J<^rtgTQJ{)}g_6G9M zqZ$2#+>!3n64VJ%)~TtC&<54Y2lv`87ahq<<%NoT zzH~s}rF3d<-|%WXhd?Fvx&DqK`ayeUmA`KhT~8ctuZi+0v!7X@`pW+}o(@eiVwMB< z(=}HYDn7T_g~^Yc4;&e?8s_I2G#C{}lD&UOj0zKDtzArS|2KfmJacCq6)fUuZg@Bw z^<}g%=Uj>FJwN;_ZFYXG;(5;|hhBdUwde5I^&X!49f?(3bJ-I7*<6}3g`VCX!KT7o z0P>M!ZKyv<9<{$x3)pVT@u?PYRAN03I{G290qO9t2Ps^AtVl@ zelb3;(VrP@672;p)^Yjfd%f@p;sVkT-)Bq8ji@3caw4Z{$cSY;W0dj+1DXud3{I-q zyz|}fHDrr_)6{e<+UpjJJAJz5CZnmE(S)%q%Ne@yCgN*QtJR%mlqkOL4AqZoZi*_}ZfHM#(tIg;vc1`iCdemkvkKU* z4X3>sFMfXg zIup;c?(3!k@+plo;#4&L^k3EKRV%@^4m!n(03v-_rP_!AnkfLKa7%A4FyWBcfSg%) z42&Qp9`=Z9&&P)bET4PlENj}5vZ{tV-Q_gCS61e8r7Xco#4WM@z%TIM(Qrltbu#E2 zY}#dx5y&{tahaCLzH~#3jfqP0&`_tmElsdyw#-C0_s>~g7ID#STV>kakE5vJu}8O! z7t;*LhimG(5Z+Buu0hdOyWC&q*I|09hGEAqp5^67?q$aX_W`9y#9^KXa#3%U=V66( zn)T6nK~l(SJJ1Br?RHjmRo<6f%Zk)*Sf7{C+qd7~^$lK=D(6LQ{I>#??Dx$39kU6Z zmcdV_ZlrWecz|CY+n9m;SCbK#2KNF6dcNkayj=RSsd%5IYaKSo+C&f8kzT4?wf8a; zI1$En(4?eS4)eZJ3>!Jab@_@<@MGcR8p=H*!p`kiTEYbg{2DGyBrNzQf3o zlQowy_N30(qUv&pt-qcoeT&{cK>hTKatf>IvD|5%t|>Y!lZpA)#DhfKeLF5R-`T+A zHJClff6bLB8&?tUwS%4N(=}IFQ&Vdh*q)O9aL9CAXh_>}Je49-Xvig^HyvbAbvO`2 zt8@&n<&Zr!Sb2%Jp?s-3m;gYHu=KKG247fP|1%qW|1`W~Ovve)>!KnOV6@vAQpt}H zSby2~{eAncsid|^2A$M}C6B9M29ir~E8rAXMZT<{$75}nATnv%lys`=<_wlU2Zursg)rH5chLURk+W;HdXyn z`x1tj6UCWP=@VSDT0z}Dycm%Id0+&H`TW&*-07suYe>c(^iR;}(0};KMz<|3x@fo- zdxLIrD6)S_&vMsiBJV&2FC|_FqOVjTv0bT)4k6g8Bv&otNo5WWiX4?nw^9s>5wb@g z%WH?bV@63`w94xJ61bP%u)Sct{ENzuiC6;V$D;8VRq?7s1!(B1X+n05`)#&;DqU(K!jThd~4FKd)SP@rk0RBnxVSF<$cQaAQ)@7Wt zrkq1lJk-My!ZNI;A8OOLj$p$0FuI;F@953VT=nNmu49H#me3EwxfV;y6=!gWHqh@m z%=Xr6y38(%c3$smE zf?Sk(GZz!9nKH0IDkogjJS{%Qyg3@|KIT+)bu>SJZVCi0@SfVt5|SoemG~$IthFr7 z5Y6^taf_Ydq+y|*uQ2YL1RU5xHUCV+qVaSgCeA#TrZ+JRU#>BNT`B^A&Hdn7Lz>5L z9qgiQpjmNgfrZJMHpwJzchf)LO$1g_clBPNa4hiGx~=!eUjo3uP(n1hc&dMNuHbdJ zC9b2LmoU%s)XiO;-x+iN|9n*9HgVK@3jmyh}&1uc$rE2=BY05^LL%+a-+71>!e^WfzE@=t;w@yv~YguBggccmQ zFR%jv`?W;9N>_$kB@kb|l;Bsk+#!KO(^+~^Q36>rTmVhecbcM?4R&HSKQq|-4RwZJ z&)Ym&9yLgF221z%Uw=InCQD6`+C z_JZ28V4R!4o?b3*D$#DJT|9#|(ZcXbHTM{U5)!9?bZ6x&w5@|=lPS|&6SvhP+MwMW zS8yO_D&2sC0nKtKKA$hSZdr)Bsf4`!V!|xJCra-p2{Q-gn?U+U!mLP{LJRDg`{7S3 zKEAfiP1(_yvbxog*J^#fy{*bC9Gqq$-_+Te^d&il5(~g%rdp+lJ5X!M6u=48VDl>F zSDyb8(kvW$^ZA;)j#SpWPA8`(0;?oP@0RPZ@0IJonq`KMFrRqfAYAgOaX0_qq_IP? zSzyWV+4qxXRM&)zh(r(g%rf-qbj?|LsV{w*w~dIzeL0erKi$^5(qCW^X&d@`rszmr z)4P(oNO(C5Eo+_-GGqRhv&&K;8YAFy36p*3tWo8TXq?M>F`Q3F@7~i_AMIj&-@Pnz z$xE&qYW2>dA**j|?faqXmg39}$>D9B>2Hj?L~GiYLirO|{a&v8CbvZN(%k+0vzqQ| z+y57x^+Ofyc>A~O+|zg6^z%ixm;BOqB_yS+*CbM!w0XlU&>R^h!29_X+s?W3xGde$ zEF{Lz2KQjP`~Ja9HnfXvT!iVN3)?tcJc~^0L|~6cGksEboOXZu^1LG*@FPcMXMD;58igC z94Qi5FT1{Ox<*9Sg}A3>RCQNJgejf!tYHmUKS41DVixM zj(3v#T-i=hE3`o$|LSCZJHL41N#6lr5D~-HRY3##lyvsr*yTDe^S-QPJg)ABnjfSZ zf)rTYtpgJCVyjg*Ne(l=$?9-fpGs8xc8bA_i4j&GQ^BU0hM5L-&(=rV6_2eo&Q8me znI~Hrw>;Lf;T-9m$N3!xyP^3$9f<)#sMo(d5Ypb5T~Wmsu=gh5W{iL5xgqwbJbNj{ z^M0#u=FVhBNLCB9M>@7e3@YAn)*Hr5s{ocv{9GDJ@rAK@dJKbwh?J!cv{mVW?nLjA zmfUs?^|xP`z?=@B*QR_u;pudW0<*w>2Wh}ca%R;WV$~83 zi51A1RmdoYBa21BQo8xCE5l@5fF~hp62P@Y*EsDxshKlV^=(y`PysxLdG;4zo|`P= z{Rj#9=0R&Qijdf#oi_2Se~;v8Y2kC{V~TB>d9_P9#zXiWCz~2!iLQPr*@9U?srOy2 z6k37h6hH3*-VZakeWV-dV37nR{|I$a)-CobXb-GHC;SQ)DNm!GY2FJSltogxazpj{ z3iQX_g4KnHa2T0jy)utw*^B}(T^9kzu7T;U!N!gT1eUdg5RH{~&XZzS(`RyjNdw%@*W5NV(nvdE zg}oKYTlLACcrANEoZZ05^ z5%`Ixf+Tq>cf|mE@c%qWWZ`u9Gp)I(nznDty316d3~ulWg)*C6_1=S!}eyr;=NjWqQC!A=|4MJ>#Ym{=qs zXi$JxLv6wC`Qc1V4jj>G=W5o-S? zVPL-@3~UOZrDN<5F;}f!NS8DNB!eGIsz}Y#+z$`5?LD?NMo-gV{MfrkHyYc_)z~bU z-cG$0esK)E@d%1LRQ)}MN-@xt;{ZxLm zM;JD)jh8{*tH8I-L`5r7C-!SQ*|zc1vQ({^dgcd)zv{o9Mw3f-!fbzE^m#OLp-$Ks zlN7C}&+Hsavjs~QYLmcmQ?zyyNK^Py$2=6RPVwKO9DM=P5Y1sWu5+{X!w~mqaRUZk z7j$(?XO@AdUDNJSVnu@@V#w{x(dI3B{hv&D*)ThXF`!zB>G7KLeC#8xcJ~X|N*qdg6 zkQhDzUi2!E(k+in$2om^xZ<(o`u9@-hY{@pCwL2W^AfyA71o|8zbw|)Gfx7ZGsN{F`aSgkPKEv zAFuup$3j}ep=J+AIbbX!WJi}>|;ai$Zda+m{ z?zky}@6qC|H&hnM-vomKr3|TGs3EcoE&201dwRyVlhw_rg@M@^%cMqw0_ib)tu-y^svC8W*sl!=tU<8BTloukz zKPykde^$d6+&{A0jC|5XwVvm9^9BV@BBU)W-sXj-z77K6I~wvub3mM7u+wpK618bq z0G}(TmxP_4^vQpb5j)D(a%kx+s9fRKTZgg?jnOeFO_V> zkP`)d*>;UGR)Dsy_ft%@X|@-gi@1X>^lp)cZ_Bbg^ZJ34on0%qwF?WA@>id~-v-oS7{KMm4|K7K4 zj8f;*P~@$R&RSO8&T{VM|7iVf|E2yWQFX$7nGy!nBz2*o6_%Q{-N>CpmN(frR@;G) zAz-o?jG@V935y@3nVFfAgk2jg=v=YkrEMn`%Cv0YPC*h{Ze3@6hkbqn%HI%UCBOS& zD4(AtY*-gCA(VXZgu8Ll z+A~rG&D^VE{#-SAdl6(?GvH$jH<`~QTX>T(fR7-$Gy0BA8=`>&Nh$`kd`q&2E*{i? zt@2|*DbdU$6V^c4k!z}le_9_8wTZc7%p<9Ttj`;3WofmvL4GQWw}98>46FN!+5{2$6~cg6`M6sV%^l``cKYD!>@baCM8PNTm=NlIhv z$b%-@uzoYUW(%X>7xPy=y|(5yX9?H5%|Q%Hn9ueb=3{U0ycg6}>~j-m1warJClzW7 zBepzdOBH|quK!t&{k`oTTyCrO;J)lTX^ZD9~+lv%%Z!$VCUC?Z6^{;>>f6js4biTLN+t&lWg|JepS#ZCJ o$Lu1h%`tl*DBQOSi6N%pAzVoxZZisnHkm&rr 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 Q-?^;%e=q5y%~uHm0L1YDc>n+a literal 0 HcmV?d00001 diff --git a/testdata_sarek/rd_tiny.csv b/testdata_sarek/rd_tiny.csv new file mode 100644 index 00000000..74505e48 --- /dev/null +++ b/testdata_sarek/rd_tiny.csv @@ -0,0 +1,12 @@ +sample,fastq_1,fastq_2 +1234N,testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz +1234N,testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz +1234N,testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz +1234N,testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz +1234N,testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz +9876T,testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz +9876T,testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz +9876T,testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L003_R2_xxx.fastq.gz +9877R,testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz +9877R,testdata_sarek/tumor/tiny_t_L006_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz +9877R,testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L007_R2_xxx.fastq.gz diff --git a/testdata_sarek/rd_tiny.csv.old b/testdata_sarek/rd_tiny.csv.old new file mode 100644 index 00000000..c53c0a3b --- /dev/null +++ b/testdata_sarek/rd_tiny.csv.old @@ -0,0 +1,14 @@ +sample,fastq_1,fastq_2 +1234N,//testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz +1234N,//testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz +1234N,//testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz +1234N,//testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz +1234N,//testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz,//testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz +1234N,//testdata_sarek/dummy/normal/dummy_n_R1_xxx.fastq.gz,//testdata_sarek/dummy/normal/dummy_n_R2_xxx.fastq.gz +9876T,//testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz +9876T,//testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz +9876T,//testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L003_R2_xxx.fastq.gz +9876T,//testdata_sarek/dummy/tumor/dummy_t_R1_xxx.fastq.gz,//testdata_sarek/dummy/tumor/dummy_t_R2_xxx.fastq.gz +9877R,//testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz +9877R,//testdata_sarek/tumor/tiny_t_L006_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz +9877R,//testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz,//testdata_sarek/tumor/tiny_t_L007_R2_xxx.fastq.gz diff --git a/testdata_sarek/rd_tiny.csv~ b/testdata_sarek/rd_tiny.csv~ new file mode 100644 index 00000000..4127c094 --- /dev/null +++ b/testdata_sarek/rd_tiny.csv~ @@ -0,0 +1,14 @@ +sample,fastq_1,fastq_2 +1234N,testdata_sarek/normal/tiny_n_L001_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L001_R2_xxx.fastq.gz +1234N,testdata_sarek/normal/tiny_n_L002_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L002_R2_xxx.fastq.gz +1234N,testdata_sarek/normal/tiny_n_L004_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L004_R2_xxx.fastq.gz +1234N,testdata_sarek/normal/tiny_n_L007_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L007_R2_xxx.fastq.gz +1234N,testdata_sarek/normal/tiny_n_L008_R1_xxx.fastq.gz,testdata_sarek/normal/tiny_n_L008_R2_xxx.fastq.gz +1234N,testdata_sarek/dummy/normal/dummy_n_R1_xxx.fastq.gz,testdata_sarek/dummy/normal/dummy_n_R2_xxx.fastq.gz +9876T,testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L001_R2_xxx.fastq.gz +9876T,testdata_sarek/tumor/tiny_t_L002_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L002_R2_xxx.fastq.gz +9876T,testdata_sarek/tumor/tiny_t_L003_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L003_R2_xxx.fastq.gz +9876T,testdata_sarek/dummy/tumor/dummy_t_R1_xxx.fastq.gz,testdata_sarek/dummy/tumor/dummy_t_R2_xxx.fastq.gz +9877R,testdata_sarek/tumor/tiny_t_L005_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L005_R2_xxx.fastq.gz +9877R,testdata_sarek/tumor/tiny_t_L006_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L006_R2_xxx.fastq.gz +9877R,testdata_sarek/tumor/tiny_t_L007_R1_xxx.fastq.gz,testdata_sarek/tumor/tiny_t_L007_R2_xxx.fastq.gz diff --git a/testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz b/testdata_sarek/tumor/tiny_t_L001_R1_xxx.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..305cb53553530f9d778f1d756c97bba958cfabef GIT binary patch literal 27427 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