diff --git a/CHANGELOG.md b/CHANGELOG.md index f4f2c3da89..864837e3ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [1744](https://github.com/nf-core/sarek/pull/1744) - Add MuSE as new somatic variant caller + ### Changed - [1810](https://github.com/nf-core/sarek/pull/1810) - Move non-informative information in the CHANGELOG for the end user to its own Developer section @@ -23,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | Dependency | Old version | New version | | ---------- | ----------- | ----------- | +| `MuSE` | | 2.1.2 | ### Parameters diff --git a/CITATIONS.md b/CITATIONS.md index 1c4a22cade..4396e8c9e2 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -150,6 +150,10 @@ > Wilm et al. LoFreq: A sequence-quality aware, ultra-sensitive variant caller for uncovering cell-population heterogeneity from high-throughput sequencing datasets. Nucleic Acids Res. 2012; 40(22):11189-201. +- [MuSE](https://pubmed.ncbi.nlm.nih.gov/38589250/) + + > Ji S, Zhu T, Sethia A, Wang W. Accelerated somatic mutation calling for whole-genome and whole-exome sequencing data from heterogenous tumor samples. Genome Res. 2024 May 15;34(4):633-641. doi: 10.1101/gr.278456.123. PMID: 38589250; PMCID: PMC11146589. + ## R packages - [R](https://www.R-project.org/) diff --git a/README.md b/README.md index c4f7b5443b..fbbe1e5cdd 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ Depending on the options and samples provided, the pipeline can currently perfor - `Strelka2` - `TIDDIT` - `Lofreq` + - `MuSE` - Variant filtering and annotation (`SnpEff`, `Ensembl VEP`, `BCFtools annotate`) - Summarise and represent QC (`MultiQC`) diff --git a/conf/modules/muse.config b/conf/modules/muse.config new file mode 100644 index 0000000000..7b76cf3205 --- /dev/null +++ b/conf/modules/muse.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 = When to run the module. +---------------------------------------------------------------------------------------- +*/ + +// MUSE + +process { + + withName: 'MUSE_CALL' { + ext.args = { params.wes ? '-E' : '-G' } + ext.when = { params.tools && params.tools.contains('muse') } + ext.prefix = { "${meta.id}" } // .MuSE. is added by the tool by default + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/variant_calling/muse/${meta.id}/" }, + pattern: "*.txt", + ] + } + + withName: 'MUSE_SUMP' { + ext.args = { params.wes ? '-E' : '-G' } + ext.when = { params.tools && params.tools.contains('muse') } + ext.prefix = { "${meta.id}.muse" } + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/variant_calling/muse/${meta.id}/" }, + pattern: "*{vcf.gz,vcf.gz.tbi}", + ] + } + + withName: 'CRAM_TO_BAM_TUMOR' { + ext.prefix = {"${meta.tumor_id}"} + } + + withName: 'CRAM_TO_BAM_NORMAL' { + ext.prefix = {"${meta.normal_id}"} + } + +} diff --git a/conf/test_full.config b/conf/test_full.config index 0d00a965fc..d5bf5d3234 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -18,7 +18,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/csv/HCC1395_WXS_somatic_full_test.csv' // Other params - tools = 'ngscheckmate,lofreq,strelka,mutect2,freebayes,ascat,manta,cnvkit,tiddit,controlfreec,vep,snpeff' + tools = 'ngscheckmate,lofreq,strelka,mutect2,muse,freebayes,ascat,manta,cnvkit,tiddit,controlfreec,vep,snpeff' split_fastq = 20000000 intervals = 's3://ngi-igenomes/test-data/sarek/S07604624_Padded_Agilent_SureSelectXT_allexons_V6_UTR.bed' wes = true diff --git a/docs/output.md b/docs/output.md index 6d723ba03b..a589752626 100644 --- a/docs/output.md +++ b/docs/output.md @@ -44,6 +44,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Sentieon Haplotyper joint germline variant calling](#sentieon-haplotyper-joint-germline-variant-calling) - [Strelka](#strelka) - [Lofreq](#lofreq) + - [MuSE](#muse) - [Structural Variants](#structural-variants) - [Indexcov](#indexcov) - [Manta](#manta) @@ -453,6 +454,37 @@ Files created: +#### Lofreq + +[Lofreq](https://github.com/CSB5/lofreq) is a fast and sensitive variant-caller for inferring SNVs and indels from next-generation sequencing data. It makes full use of base-call qualities and other sources of errors inherent in sequencing, which are usually ignored by other methods or only used for filtering. For further reading and documentation see the [Lofreq user guide](https://csb5.github.io/lofreq/). + +
+Output files for tumor-only samples + +**Output directory: `{outdir}/variant_calling/lofreq//`** + +- `.vcf.gz` + + - VCF which provides a detailed description of the detected genetic variants. + +
+ +#### MuSE + +[MuSE](https://github.com/wwylab/MuSE) is an accurate and ultra-fast somatic mutation calling tool for whole-genome sequencing (WGS) and whole-exome sequencing (WES) data from heterogeneous tumor samples. This tool is unique in accounting for tumor heterogeneity using a sample-specific error model that improves sensitivity and specificity in mutation calling from sequencing data. For further reading see the [recently published paper](https://genome.cshlp.org/content/early/2024/05/03/gr.278456.123.long). + +
+Output files for tumor-normal samples + +**Output directory: `{outdir}/variant_calling/muse//`** + +- `.MuSE.txt` + - TXT containing position-specific summary statistics. +- `.muse.vcf.gz` + - VCF with called variants. Fields are named TUMOR and NORMAL. + +
+ #### Sentieon DNAscope [Sentieon DNAscope](https://support.sentieon.com/appnotes/dnascope_ml/#dnascope-germline-variant-calling-with-a-machine-learning-model) is a variant-caller which aims at outperforming GATK's Haplotypecaller in terms of both speed and accuracy. DNAscope allows you to use a machine learning model to perform variant calling with higher accuracy by improving the candidate detection and filtering. @@ -577,20 +609,6 @@ For further downstream analysis, take a look [here](https://github.com/Illumina/ -#### Lofreq - -[Lofreq](https://github.com/CSB5/lofreq) is a fast and sensitive variant-caller for inferring SNVs and indels from next-generation sequencing data. It makes full use of base-call qualities and other sources of errors inherent in sequencing, which are usually ignored by other methods or only used for filtering. For further reading and documentation see the [Lofreq user guide](https://csb5.github.io/lofreq/). - -
-Output files for tumor-only samples - -**Output directory: `{outdir}/variant_calling/lofreq//`** - --`.vcf.gz` --VCF which provides a detailed description of the detected genetic variants. - -
- ### Structural Variants #### indexcov diff --git a/docs/usage.md b/docs/usage.md index 8231d40be8..2a5de760ab 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -583,7 +583,8 @@ This list is by no means exhaustive and it will depend on the specific analysis | [GATK Mutect2](https://gatk.broadinstitute.org/hc/en-us/articles/5358911630107-Mutect2) | x | x | x | - | x | x | | [lofreq](https://github.com/CSB5/lofreq) | x | x | x | - | x | - | | [mpileup](https://www.htslib.org/doc/samtools-mpileup.html) | x | x | x | x | x | - | -| [Strelka](https://github.com/Illumina/strelka) | x | x | x | x | - | x | +| [MuSE](https://github.com/wwylab/MuSE) | x | x | x | - | - | x | +| [Strelka](https://github.com/Illumina/strelka) | x | x | - | - | - | x | | [Manta](https://github.com/Illumina/manta) | x | x | x | x | x | x | | [indexcov](https://github.com/brentp/goleft/tree/master/indexcov) | x | - | - | x | - | x | | [TIDDIT](https://github.com/SciLifeLab/TIDDIT) | x | x | x | x | x | x | diff --git a/modules.json b/modules.json index ad4fd57616..9287a66480 100644 --- a/modules.json +++ b/modules.json @@ -355,6 +355,16 @@ "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", "installed_by": ["modules"] }, + "muse/call": { + "branch": "master", + "git_sha": "a14b4f333e54f58ac3125db6959c8a43957fd5c8", + "installed_by": ["modules"] + }, + "muse/sump": { + "branch": "master", + "git_sha": "a14b4f333e54f58ac3125db6959c8a43957fd5c8", + "installed_by": ["modules"] + }, "ngscheckmate/ncm": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", diff --git a/modules/nf-core/muse/call/environment.yml b/modules/nf-core/muse/call/environment.yml new file mode 100644 index 0000000000..f81029a392 --- /dev/null +++ b/modules/nf-core/muse/call/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::muse=2.1.2 diff --git a/modules/nf-core/muse/call/main.nf b/modules/nf-core/muse/call/main.nf new file mode 100644 index 0000000000..97740c08e5 --- /dev/null +++ b/modules/nf-core/muse/call/main.nf @@ -0,0 +1,50 @@ +process MUSE_CALL { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9f/9f0ebb574ef5eed2a6e034f1b2feea6c252d1ab0c8bc5135a669059aa1f4d2ca/data': + 'community.wave.seqera.io/library/muse:6637291dcbb0bdb8' }" + + input: + tuple val(meta), path(tumor_bam), path(tumor_bai), path(normal_bam), path(normal_bai) + tuple val(meta2), path(reference) + + output: + tuple val(meta), path("*.MuSE.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}" + """ + MuSE \\ + call \\ + $args \\ + -f $reference \\ + -O ${prefix} \\ + -n $task.cpus \\ + $tumor_bam \\ + $normal_bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + MuSE: \$( MuSE --version | sed -e "s/MuSE, version //g" | sed -e "s/MuSE //g" ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.MuSE.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + MuSE: \$( MuSE --version | sed -e "s/MuSE, version //g" | sed -e "s/MuSE //g" ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/muse/call/meta.yml b/modules/nf-core/muse/call/meta.yml new file mode 100644 index 0000000000..6733677dbd --- /dev/null +++ b/modules/nf-core/muse/call/meta.yml @@ -0,0 +1,72 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "muse_call" +description: pre-filtering and calculating position-specific summary statistics using + the Markov substitution model +keywords: + - variant calling + - somatic + - wgs + - wxs + - vcf +tools: + - "MuSE": + description: "Somatic point mutation caller based on Markov substitution model + for molecular evolution" + homepage: "https://bioinformatics.mdanderson.org/public-software/muse/" + documentation: "https://github.com/wwylab/MuSE" + tool_dev_url: "https://github.com/wwylab/MuSE" + doi: "10.1101/gr.278456.123" + licence: ["https://github.com/danielfan/MuSE/blob/master/LICENSE"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - tumor_bam: + type: file + description: Sorted tumor BAM file + pattern: "*.bam" + - tumor_bai: + type: file + description: Index file for the tumor BAM file + pattern: "*.bai" + - normal_bam: + type: file + description: Sorted matched normal BAM file + pattern: "*.bam" + - normal_bai: + type: file + description: Index file for the normal BAM file + pattern: "*.bai" + - - meta2: + type: map + description: | + Groovy Map containing reference information. + e.g. `[ id:'test' ]` + - reference: + type: file + description: reference genome file + pattern: ".fasta" +output: + - txt: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*.MuSE.txt": + type: file + description: position-specific summary statistics + pattern: "*.MuSE.txt" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@famosab" +maintainers: + - "@famosab" diff --git a/modules/nf-core/muse/call/tests/main.nf.test b/modules/nf-core/muse/call/tests/main.nf.test new file mode 100644 index 0000000000..a0550d5434 --- /dev/null +++ b/modules/nf-core/muse/call/tests/main.nf.test @@ -0,0 +1,81 @@ +nextflow_process { + + name "Test Process MUSE_CALL" + script "../main.nf" + process "MUSE_CALL" + + tag "modules" + tag "modules_nfcore" + tag "muse" + tag "muse/call" + + test("human - bam") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id:'reference' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + path(process.out.txt.get(0).get(1)).readLines()[1..-1] + // first line holds build version which differs between conda and docker/singularity + ).match() + } + ) + } + + } + + test("human - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id:'reference' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out, + path(process.out.versions[0]).yaml + ).match() + } + ) + } + + } + +} diff --git a/modules/nf-core/muse/call/tests/main.nf.test.snap b/modules/nf-core/muse/call/tests/main.nf.test.snap new file mode 100644 index 0000000000..e9a0c0d9a6 --- /dev/null +++ b/modules/nf-core/muse/call/tests/main.nf.test.snap @@ -0,0 +1,83 @@ +{ + "human - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.MuSE.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,67bc768725ca9e5b73241808eda48eff" + ], + "txt": [ + [ + { + "id": "test" + }, + "test.MuSE.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,67bc768725ca9e5b73241808eda48eff" + ] + }, + { + "MUSE_CALL": { + "MuSE": "v2.1.2" + } + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-02-18T10:38:10.225172" + }, + "human - bam": { + "content": [ + [ + "versions.yml:md5,67bc768725ca9e5b73241808eda48eff" + ], + [ + "##MuSE_call=\"MuSE -f genome.fasta -O test -n 2 call test2.paired_end.recalibrated.sorted.bam test.paired_end.recalibrated.sorted.bam\"", + "##TUMOR=\"Sample=tumour,File=test2.paired_end.recalibrated.sorted.bam\"", + "##NORMAL=\"Sample=normal,File=test.paired_end.recalibrated.sorted.bam\"", + "##contig=", + "##reference=file://genome.fasta", + "chr21\t15730462\tG\tT\t78\t73\t5.06329e-02\t9.99999e-07\t9.99999e-07\t9.98758e-01\t1.24019e-03\t1.00000e+00\t6.56197e-04\t1.36986e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t71\t1\tN\t74\t4\t71\t1\tT\t0/1:88:84,4:12,24:2\t0/0:87:85,1:11,22:.", + "chr21\t26089994\tG\tT\t52\t41\t9.61538e-02\t9.99999e-07\t9.99999e-07\t9.96265e-01\t3.73266e-03\t1.00000e+00\t1.61194e-03\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t40\t1\tN\t47\t5\t40\t0\tT\t0/1:58:53,5:12,24:2\t0/0:45:44,0:11,0:.", + "chr21\t29327119\tG\tT\t64\t69\t4.61538e-02\t9.99999e-07\t9.99999e-07\t9.98757e-01\t1.24119e-03\t1.00000e+00\t5.96791e-04\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t69\t1\tN\t60\t3\t69\t0\tT\t0/1:67:62,3:13,26:2\t0/0:69:69,0:12,0:.", + "chr21\t30289397\tG\tT\t61\t68\t4.91803e-02\t9.99999e-07\t9.99999e-07\t9.99068e-01\t9.30193e-04\t1.00000e+00\t4.36842e-04\t1.47059e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t67\t1\tN\t57\t3\t67\t1\tT\t0/1:65:60,3:14,25:2\t0/0:72:71,1:13,23:.", + "chr21\t31127136\tG\tT\t52\t56\t1.15385e-01\t9.99999e-07\t9.99999e-07\t9.95375e-01\t4.62342e-03\t1.00000e+00\t1.99006e-03\t1.78571e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t55\t1\tN\t46\t6\t55\t1\tT\t0/1:58:52,6:12,24:2\t0/0:60:59,1:12,24:.", + "chr21\t31154294\tG\tT\t51\t54\t5.88235e-02\t9.99999e-07\t9.99999e-07\t9.98171e-01\t1.82684e-03\t1.00000e+00\t7.86016e-04\t1.85185e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t53\t1\tN\t48\t3\t53\t1\tT\t0/1:58:54,3:12,26:2\t0/0:56:55,1:11,23:.", + "chr21\t32368464\tG\tT\t52\t51\t9.61538e-02\t9.99999e-07\t9.99999e-07\t9.97921e-01\t2.07710e-03\t1.00000e+00\t9.01715e-04\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t51\t1\tN\t47\t5\t51\t0\tT\t0/1:58:53,5:11,23:2\t0/0:57:57,0:11,0:.", + "chr21\t32751144\tG\tT\t84\t73\t5.88235e-02\t9.99999e-07\t9.99999e-07\t9.97552e-01\t2.44588e-03\t1.00000e+00\t1.33898e-03\t1.36986e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t72\t1\tN\t79\t5\t72\t1\tT\t0/1:94:89,5:13,24:2\t0/0:79:78,1:12,24:.", + "chr21\t33524890\tG\tT\t65\t58\t7.24638e-02\t9.99999e-07\t9.99999e-07\t9.98752e-01\t1.24643e-03\t1.00000e+00\t6.03800e-04\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t58\t1\tN\t61\t4\t58\t0\tT\t0/1:74:69,5:12,24:2\t0/0:63:63,0:11,0:.", + "chr21\t37124722\tG\tT\t42\t50\t9.30233e-02\t9.99999e-07\t9.99999e-07\t9.97842e-01\t2.15588e-03\t1.00000e+00\t8.42815e-04\t2.00000e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t48\t1\tN\t38\t4\t48\t1\tT\t0/1:49:44,4:12,24:2\t0/0:55:53,1:11,23:.", + "chr21\t39411760\tG\tT\t74\t69\t5.40541e-02\t9.99999e-07\t9.99999e-07\t9.98929e-01\t1.06922e-03\t1.00000e+00\t5.51430e-04\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t68\t1\tN\t70\t4\t68\t0\tT\t0/1:79:75,4:12,24:2\t0/0:74:73,0:11,0:.", + "chr21\t39661403\tG\tT\t120\t128\t4.06504e-02\t9.99999e-07\t9.99999e-07\t9.99639e-01\t3.58902e-04\t1.00000e+00\t2.32249e-04\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t126\t1\tN\t115\t4\t126\t0\tT\t0/1:133:126,5:13,24:2\t0/0:133:131,0:13,0:.", + "chr21\t40338362\tG\tT\t62\t84\t4.76190e-02\t9.99999e-07\t9.99999e-07\t9.99460e-01\t5.38124e-04\t1.00000e+00\t2.53917e-04\t1.19048e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t83\t1\tN\t58\t3\t83\t1\tT\t0/1:67:63,3:13,25:2\t0/0:89:88,1:13,23:.", + "chr21\t41494394\tG\tT\t55\t63\t7.27273e-02\t9.99999e-07\t9.99999e-07\t9.98213e-01\t1.78518e-03\t1.00000e+00\t7.96975e-04\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t63\t1\tN\t51\t4\t63\t0\tT\t0/1:59:55,4:11,24:2\t0/0:69:69,0:11,0:.", + "chr21\t42076112\tG\tT\t53\t50\t7.40741e-02\t9.99999e-07\t9.99999e-07\t9.98446e-01\t1.55196e-03\t1.00000e+00\t6.80690e-04\t2.00000e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t49\t1\tN\t49\t4\t49\t1\tT\t0/1:55:51,4:12,24:2\t0/0:53:52,1:11,23:.", + "chr21\t42099216\tG\tT\t110\t87\t3.53982e-02\t9.99999e-07\t9.99999e-07\t9.99735e-01\t2.62657e-04\t1.00000e+00\t1.62359e-04\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t85\t1\tN\t104\t4\t85\t0\tT\t0/1:122:116,4:14,24:2\t0/0:93:91,0:14,0:.", + "chr21\t42127034\tG\tT\t34\t44\t1.17647e-01\t9.99999e-07\t9.99999e-07\t9.97401e-01\t2.59663e-03\t1.00000e+00\t9.13452e-04\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t43\t1\tN\t30\t4\t43\t0\tT\t0/1:35:31,4:12,24:2\t0/0:47:46,0:11,0:.", + "chr21\t42288054\tG\tT\t64\t64\t6.15385e-02\t9.99999e-07\t9.99999e-07\t9.98679e-01\t1.31946e-03\t1.00000e+00\t6.34399e-04\t1.56250e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t63\t1\tN\t60\t4\t63\t1\tT\t0/1:71:66,5:13,24:2\t0/0:67:66,1:12,26:.", + "chr21\t42447147\tG\tT\t76\t74\t5.26316e-02\t9.99999e-07\t9.99999e-07\t9.98843e-01\t1.15527e-03\t1.00000e+00\t6.03609e-04\t1.35135e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t72\t1\tN\t72\t4\t72\t1\tT\t0/1:82:77,4:12,24:2\t0/0:84:82,1:12,24:.", + "chr21\t43719369\tG\tT\t77\t82\t6.41026e-02\t9.99999e-07\t9.99999e-07\t9.97895e-01\t2.10296e-03\t1.00000e+00\t1.10470e-03\t1.21951e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t81\t1\tN\t72\t5\t81\t1\tT\t0/1:87:81,5:11,24:2\t0/0:94:93,1:11,23:.", + "chr21\t44527385\tG\tT\t63\t67\t9.52381e-02\t9.99999e-07\t9.99999e-07\t9.96723e-01\t3.27471e-03\t1.00000e+00\t1.55576e-03\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t65\t1\tN\t57\t6\t65\t0\tT\t0/1:68:62,6:12,23:2\t0/0:70:68,0:11,0:.", + "chr21\t44539599\tG\tT\t88\t83\t5.68182e-02\t9.99999e-07\t9.99999e-07\t9.97878e-01\t2.11981e-03\t1.00000e+00\t1.18775e-03\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t82\t1\tN\t82\t5\t82\t0\tT\t0/1:95:88,6:13,24:2\t0/0:90:89,0:12,0:.", + "chr21\t44903401\tG\tT\t40\t38\t1.25000e-01\t9.99999e-07\t9.99999e-07\t9.96171e-01\t3.82668e-03\t1.00000e+00\t1.45159e-03\t2.63158e-02\t9.99999e-07\t9.99999e-07\t9.99997e-01\t9.99999e-07\t1.00000e+00\t1.00053e-08\t37\t1\tN\t35\t5\t37\t1\tT\t0/1:45:40,5:12,24:2\t0/0:40:39,1:11,23:.", + "chr21\t46002393\tG\tT\t85\t92\t5.88235e-02\t9.99999e-07\t9.99999e-07\t9.98018e-01\t1.97994e-03\t1.00000e+00\t1.09115e-03\t0.00000e+00\tNA\tNA\tNA\tNA\tNA\t1.00000e-08\t91\t1\tN\t80\t5\t91\t0\tT\t0/1:89:84,5:14,24:2\t0/0:99:98,0:14,0:." + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-02-18T11:35:05.915076" + } +} \ No newline at end of file diff --git a/modules/nf-core/muse/sump/environment.yml b/modules/nf-core/muse/sump/environment.yml new file mode 100644 index 0000000000..c8e0bd4a5b --- /dev/null +++ b/modules/nf-core/muse/sump/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::muse=2.1.2 + - bioconda::tabix=1.11 diff --git a/modules/nf-core/muse/sump/main.nf b/modules/nf-core/muse/sump/main.nf new file mode 100644 index 0000000000..70b3352847 --- /dev/null +++ b/modules/nf-core/muse/sump/main.nf @@ -0,0 +1,54 @@ +process MUSE_SUMP { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/35/3567f6162ff718c648175c5e7b5f848eaa27811d0cb3ad53def8f0a1c8893efa/data': + 'community.wave.seqera.io/library/muse_tabix:df58ca78bd9447b7' }" + + input: + tuple val(meta), path(muse_call_txt) + tuple val(meta2), path(ref_vcf), path(ref_vcf_tbi) + + 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 ?: '' // -G for WGS data and -E for WES data + def args2 = task.ext.args2 ?: '' // args for bgzip + def prefix = task.ext.prefix ?: "${meta.id}" + """ + MuSE \\ + sump \\ + $args \\ + -I $muse_call_txt \\ + -n $task.cpus \\ + -D $ref_vcf \\ + -O ${prefix}.vcf + + bgzip $args2 --threads $task.cpus ${prefix}.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + MuSE: \$( MuSE --version | sed -e "s/MuSE, version //g" | sed -e "s/MuSE //g" ) + bgzip: \$( bgzip --version | sed -n 's/bgzip (htslib) \\([0-9.]*\\)/\\1/p' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + MuSE: \$( MuSE --version | sed -e "s/MuSE, version //g" | sed -e "s/MuSE //g" ) + bgzip: \$( bgzip --version | sed -n 's/bgzip (htslib) \\([0-9.]*\\)/\\1/p' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/muse/sump/meta.yml b/modules/nf-core/muse/sump/meta.yml new file mode 100644 index 0000000000..9e938e1114 --- /dev/null +++ b/modules/nf-core/muse/sump/meta.yml @@ -0,0 +1,67 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "muse_sump" +description: Computes tier-based cutoffs from a sample-specific error model which + is generated by muse/call and reports the finalized variants +keywords: + - variant calling + - somatic + - wgs + - wxs + - vcf +tools: + - "MuSE": + description: "Somatic point mutation caller based on Markov substitution model + for molecular evolution" + homepage: "https://bioinformatics.mdanderson.org/public-software/muse/" + documentation: "https://github.com/wwylab/MuSE" + tool_dev_url: "https://github.com/wwylab/MuSE" + doi: "10.1101/gr.278456.123" + licence: ["https://github.com/danielfan/MuSE/blob/master/LICENSE"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - muse_call_txt: + type: file + description: single input file generated by 'MuSE call' + pattern: "*.MuSE.txt" + - - meta2: + type: map + description: | + Groovy Map containing reference information. + e.g. `[ id:'test' ]` + - ref_vcf: + type: file + description: | + dbSNP vcf file that should be bgzip compressed, tabix indexed and + based on the same reference genome used in 'MuSE call' + pattern: ".vcf.gz" + - ref_vcf_tbi: + type: file + description: Tabix index for the dbSNP vcf file + pattern: ".vcf.gz.tbi" +output: + - vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + pattern: "*.vcf" + - "*.vcf.gz": + type: map + description: bgzipped vcf file with called variants + pattern: "*.vcf" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@famosab" +maintainers: + - "@famosab" diff --git a/modules/nf-core/muse/sump/tests/main.nf.test b/modules/nf-core/muse/sump/tests/main.nf.test new file mode 100644 index 0000000000..113fe8dd17 --- /dev/null +++ b/modules/nf-core/muse/sump/tests/main.nf.test @@ -0,0 +1,82 @@ +nextflow_process { + + name "Test Process MUSE_SUMP" + script "../main.nf" + process "MUSE_SUMP" + + tag "modules" + tag "modules_nfcore" + tag "muse" + tag "muse/sump" + + test("human - txt") { + + config "./nextflow.config" + + when { + params { + module_args = '-E' + } + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/muse/MuSE-call.chr21.hg38.paired_end.recal.MuSE.txt', checkIfExists: true) + ] + input[1] = [ + [ id:'reference' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz.tbi', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + path(process.out.vcf.get(0).get(1)).vcf.header.getColumnCount(), + path(process.out.vcf.get(0).get(1)).vcf.summary + ).match() + } + ) + } + + } + + test("human - txt - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/muse/MuSE-call.chr21.hg38.paired_end.recal.MuSE.txt', checkIfExists: true) + ] + input[1] = [ + [ id:'reference' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz.tbi', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out, + path(process.out.versions[0]).yaml + ).match() + } + ) + } + + } + +} diff --git a/modules/nf-core/muse/sump/tests/main.nf.test.snap b/modules/nf-core/muse/sump/tests/main.nf.test.snap new file mode 100644 index 0000000000..796bd3dc85 --- /dev/null +++ b/modules/nf-core/muse/sump/tests/main.nf.test.snap @@ -0,0 +1,55 @@ +{ + "human - txt - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + "versions.yml:md5,b464e1a4b351fa27cea9141b8ab79bb7" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,b464e1a4b351fa27cea9141b8ab79bb7" + ] + }, + { + "MUSE_SUMP": { + "MuSE": "v2.1.2", + "bgzip": 1.21 + } + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-02-18T10:48:48.403588" + }, + "human - txt": { + "content": [ + [ + "versions.yml:md5,b464e1a4b351fa27cea9141b8ab79bb7" + ], + 11, + "VcfFile [chromosomes=[], sampleCount=2, variantCount=0, phased=true, phasedAutodetect=true]" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-02-18T10:48:40.369312" + } +} \ No newline at end of file diff --git a/modules/nf-core/muse/sump/tests/nextflow.config b/modules/nf-core/muse/sump/tests/nextflow.config new file mode 100644 index 0000000000..6d29ad9187 --- /dev/null +++ b/modules/nf-core/muse/sump/tests/nextflow.config @@ -0,0 +1,12 @@ +process { + + withName: 'MUSE_SUMP' { + ext.args = params.module_args + stageInMode = 'copy' + } + + withName: 'MUSE_SUMP_WGS' { + ext.args = '-G' + } + +} diff --git a/nextflow.config b/nextflow.config index c8dcabb915..c187336a87 100644 --- a/nextflow.config +++ b/nextflow.config @@ -459,6 +459,7 @@ includeConfig 'conf/modules/joint_germline.config' includeConfig 'conf/modules/manta.config' includeConfig 'conf/modules/mpileup.config' includeConfig 'conf/modules/msisensorpro.config' +includeConfig 'conf/modules/muse.config' includeConfig 'conf/modules/mutect2.config' includeConfig 'conf/modules/sentieon_dnascope.config' includeConfig 'conf/modules/sentieon_dnascope_joint_germline.config' diff --git a/nextflow_schema.json b/nextflow_schema.json index e5dc346c24..7fc78dd037 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -112,7 +112,7 @@ "fa_icon": "fas fa-toolbox", "description": "Tools to use for duplicate marking, variant calling and/or for annotation.", "help_text": "Multiple tools separated with commas.\n\n**Variant Calling:**\n\nGermline variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: DeepVariant, FreeBayes, GATK HaplotypeCaller, mpileup, Sentieon Haplotyper, Strelka\n- Structural Variants: indexcov, Manta, TIDDIT\n- Copy-number: CNVKit\n\nTumor-only somatic variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, mpileup, Mutect2, Lofreq, Strelka\n- Structural Variants: Manta, TIDDIT\n- Copy-number: CNVKit, ControlFREEC\n\nSomatic variant calling can currently only be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, Mutect2, Strelka2\n- Structural variants: Manta, TIDDIT\n- Copy-Number: ASCAT, CNVKit, Control-FREEC\n- Microsatellite Instability: MSIsensorpro\n\n> **NB** Mutect2 for somatic variant calling cannot be combined with `--no_intervals`\n\n**Annotation:**\n \n- snpEff, VEP, merge (both consecutively), and bcftools annotate (needs `--bcftools_annotation`).\n\n> **NB** As Sarek will use bgzip and tabix to compress and index VCF files annotated, it expects VCF files to be sorted when starting from `--step annotate`.", - "pattern": "^((ascat|bcfann|cnvkit|controlfreec|deepvariant|freebayes|haplotypecaller|lofreq|sentieon_dnascope|sentieon_haplotyper|manta|indexcov|merge|mpileup|msisensorpro|mutect2|ngscheckmate|sentieon_dedup|snpeff|strelka|tiddit|vep)?,?)*(? [ meta, normal_cram, normal_crai ] } + cram_tumor = cram.map{ meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, tumor_cram, tumor_crai ] } + BAM_VARIANT_CALLING_SOMATIC_MUSE( + cram_normal, + cram_tumor, + fasta, + fasta_fai, + dbsnp, + dbsnp_tbi + ) + + vcf_muse = BAM_VARIANT_CALLING_SOMATIC_MUSE.out.vcf + versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_MUSE.out.versions) + } + // MUTECT2 if (tools.split(',').contains('mutect2')) { BAM_VARIANT_CALLING_SOMATIC_MUTECT2( @@ -242,6 +261,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { vcf_all = Channel.empty().mix( vcf_freebayes, vcf_manta, + vcf_muse, vcf_mutect2, vcf_strelka, vcf_tiddit @@ -253,6 +273,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { vcf_all vcf_freebayes vcf_manta + vcf_muse vcf_mutect2 vcf_strelka vcf_tiddit diff --git a/subworkflows/local/bam_variant_calling_somatic_muse/main.nf b/subworkflows/local/bam_variant_calling_somatic_muse/main.nf new file mode 100644 index 0000000000..466295c4d0 --- /dev/null +++ b/subworkflows/local/bam_variant_calling_somatic_muse/main.nf @@ -0,0 +1,72 @@ +// +// MuSE tumor-normal variant calling +// +// For all modules here: +// A when clause condition is defined in the conf/modules.config to determine if the module should be run + +include { MUSE_CALL } from '../../../modules/nf-core/muse/call/main' +include { MUSE_SUMP } from '../../../modules/nf-core/muse/sump/main' +include { SAMTOOLS_CONVERT as CRAM_TO_BAM_TUMOR } from '../../../modules/nf-core/samtools/convert/main' +include { SAMTOOLS_CONVERT as CRAM_TO_BAM_NORMAL } from '../../../modules/nf-core/samtools/convert/main' + +workflow BAM_VARIANT_CALLING_SOMATIC_MUSE { + take: + cram_normal // channel: [mandatory] [ meta, normal_cram, normal_crai] + cram_tumor // channel: [mandatory] [ meta, tumor_cram, tumor_crai] + fasta // channel: [mandatory] [ meta, fasta ] + fai // channel: [mandatory] [ meta, fai ] + dbsnp // channel: [optional] [ dbsnp ] + dbsnp_tbi // channel: [optional] [ dbsnp_tbi ] + + main: + versions = Channel.empty() + ch_dbsnp = dbsnp.combine(dbsnp_tbi) + + CRAM_TO_BAM_TUMOR( + cram_tumor, + fasta, + fai + ) + + CRAM_TO_BAM_NORMAL( + cram_normal, + fasta, + fai + ) + + ch_normal_bam = CRAM_TO_BAM_NORMAL.out.bam + ch_normal_bai = CRAM_TO_BAM_NORMAL.out.bai + ch_tumor_bam = CRAM_TO_BAM_TUMOR.out.bam + ch_tumor_bai = CRAM_TO_BAM_TUMOR.out.bai + + // Combine normal BAM and BAI + ch_normal = ch_normal_bam.join(ch_normal_bai, by: [0]) // Join by meta + + // Combine tumor BAM and BAI + ch_tumor = ch_tumor_bam.join(ch_tumor_bai, by: [0]) // Join by meta + + // Combine normal and tumor data + ch_bam = ch_tumor.join(ch_normal, by: [0]) // Join by meta + + MUSE_CALL( + ch_bam, + fasta + ) + + MUSE_SUMP( + MUSE_CALL.out.txt, + ch_dbsnp.map{ it -> [ [ id:it.baseName ], it[0], it[1] ] } + ) + + // add variantcaller to meta map + vcf = MUSE_SUMP.out.vcf.map{ meta, vcf -> [ meta + [ variantcaller:'muse' ], vcf ] } + + versions = versions.mix(CRAM_TO_BAM_NORMAL.out.versions) + versions = versions.mix(CRAM_TO_BAM_TUMOR.out.versions) + versions = versions.mix(MUSE_CALL.out.versions) + versions = versions.mix(MUSE_SUMP.out.versions) + + emit: + vcf + versions +} diff --git a/tests/variant_calling_muse.nf.test b/tests/variant_calling_muse.nf.test new file mode 100644 index 0000000000..c007b6e74a --- /dev/null +++ b/tests/variant_calling_muse.nf.test @@ -0,0 +1,114 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + tag "pipeline_sarek" + + test("Run with profile test | --tools muse | somatic") { + + when { + params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + input = "${projectDir}/tests/csv/3.0/recalibrated_somatic.csv" + genome = null + igenomes_ignore = true + chr_dir = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/sequence/chromosomes.tar.gz" + dbsnp = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz" + dbsnp_tbi = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz.tbi" + fasta = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta" + fasta_fai = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai" + germline_resource = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz" + germline_resource_tbi = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz.tbi" + intervals = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.bed" + pon = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/mills_and_1000G.indels.hg38.vcf.gz" + pon_tbi = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/mills_and_1000G.indels.hg38.vcf.gz.tbi" + ngscheckmate_bed = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/SNP_GRCh38_hg38_wChr.bed" + nucleotides_per_second = 20 + step = 'variant_calling' + tools = 'muse' + wes = true + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + // bam_files: All bam files + def bam_files = getAllFilesFromDir(params.outdir, include: ['**/*.bam']) + def fasta = params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta' + assertAll( + { assert workflow.success}, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we tests pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_sarek_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path, + // All bam files + bam_files.collect{ file -> [ file.getName(), bam(file.toString(), fasta).getReadsMD5() ] } + ).match() } + ) + } + } + + test("Run with profile test | --tools muse | somatic | stub") { + options "-stub" + when { + params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + input = "${projectDir}/tests/csv/3.0/recalibrated_somatic.csv" + genome = null + igenomes_ignore = true + chr_dir = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/sequence/chromosomes.tar.gz" + dbsnp = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz" + dbsnp_tbi = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz.tbi" + fasta = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta" + fasta_fai = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai" + germline_resource = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz" + germline_resource_tbi = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz.tbi" + intervals = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.bed" + pon = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/mills_and_1000G.indels.hg38.vcf.gz" + pon_tbi = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/mills_and_1000G.indels.hg38.vcf.gz.tbi" + ngscheckmate_bed = "${params.modules_testdata_base_path}/genomics/homo_sapiens/genome/chr21/germlineresources/SNP_GRCh38_hg38_wChr.bed" + nucleotides_per_second = 20 + step = 'variant_calling' + tools = 'muse' + wes = true + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + // bam_files: All bam files + def bam_files = getAllFilesFromDir(params.outdir, include: ['**/*.bam']) + def fasta = params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta' + assertAll( + { assert workflow.success}, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we tests pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_sarek_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path, + // All bam files + bam_files.collect{ file -> [ file.getName(), bam(file.toString(), fasta).getReadsMD5() ] } + ).match() } + ) + } + } + +} diff --git a/tests/variant_calling_muse.nf.test.snap b/tests/variant_calling_muse.nf.test.snap new file mode 100644 index 0000000000..95caaf3b5f --- /dev/null +++ b/tests/variant_calling_muse.nf.test.snap @@ -0,0 +1,419 @@ +{ + "Run with profile test | --tools muse | somatic": { + "content": [ + 18, + { + "BCFTOOLS_STATS": { + "bcftools": 1.2 + }, + "CRAM_TO_BAM_NORMAL": { + "samtools": 1.21 + }, + "CRAM_TO_BAM_TUMOR": { + "samtools": 1.21 + }, + "MUSE_CALL": { + "MuSE": "v2.1.2" + }, + "MUSE_SUMP": { + "MuSE": "v2.1.2", + "bgzip": 1.21 + }, + "VCFTOOLS_TSTV_COUNT": { + "vcftools": "0.1.16" + }, + "Workflow": { + "nf-core/sarek": "v3.6.0dev" + } + }, + [ + "cram", + "cram/sample3.bam", + "cram/sample3.bam.bai", + "cram/sample4.bam", + "cram/sample4.bam.bai", + "csv", + "csv/variantcalled.csv", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/bcftools_stats_indel-lengths.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_bcftools_stats.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/vcftools_tstv_by_count.txt", + "multiqc/multiqc_data/vcftools_tstv_by_qual.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/bcftools_stats_indel-lengths.pdf", + "multiqc/multiqc_plots/pdf/general_stats_table.pdf", + "multiqc/multiqc_plots/pdf/vcftools_tstv_by_count.pdf", + "multiqc/multiqc_plots/pdf/vcftools_tstv_by_qual.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/bcftools_stats_indel-lengths.png", + "multiqc/multiqc_plots/png/general_stats_table.png", + "multiqc/multiqc_plots/png/vcftools_tstv_by_count.png", + "multiqc/multiqc_plots/png/vcftools_tstv_by_qual.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/bcftools_stats_indel-lengths.svg", + "multiqc/multiqc_plots/svg/general_stats_table.svg", + "multiqc/multiqc_plots/svg/vcftools_tstv_by_count.svg", + "multiqc/multiqc_plots/svg/vcftools_tstv_by_qual.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_sarek_software_mqc_versions.yml", + "reference", + "reference/dict", + "reports", + "reports/bcftools", + "reports/bcftools/muse", + "reports/bcftools/muse/sample4_vs_sample3", + "reports/bcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.bcftools_stats.txt", + "reports/mosdepth", + "reports/mosdepth/sample3", + "reports/mosdepth/sample3/sample3.recal.mosdepth.global.dist.txt", + "reports/mosdepth/sample3/sample3.recal.mosdepth.region.dist.txt", + "reports/mosdepth/sample3/sample3.recal.mosdepth.summary.txt", + "reports/mosdepth/sample3/sample3.recal.per-base.bed.gz", + "reports/mosdepth/sample3/sample3.recal.per-base.bed.gz.csi", + "reports/mosdepth/sample3/sample3.recal.regions.bed.gz", + "reports/mosdepth/sample3/sample3.recal.regions.bed.gz.csi", + "reports/mosdepth/sample4", + "reports/mosdepth/sample4/sample4.recal.mosdepth.global.dist.txt", + "reports/mosdepth/sample4/sample4.recal.mosdepth.region.dist.txt", + "reports/mosdepth/sample4/sample4.recal.mosdepth.summary.txt", + "reports/mosdepth/sample4/sample4.recal.per-base.bed.gz", + "reports/mosdepth/sample4/sample4.recal.per-base.bed.gz.csi", + "reports/mosdepth/sample4/sample4.recal.regions.bed.gz", + "reports/mosdepth/sample4/sample4.recal.regions.bed.gz.csi", + "reports/samtools", + "reports/samtools/sample3", + "reports/samtools/sample3/sample3.recal.cram.stats", + "reports/samtools/sample4", + "reports/samtools/sample4/sample4.recal.cram.stats", + "reports/vcftools", + "reports/vcftools/muse", + "reports/vcftools/muse/sample4_vs_sample3", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.FILTER.summary", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.TsTv.count", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.TsTv.qual", + "variant_calling", + "variant_calling/muse", + "variant_calling/muse/sample4_vs_sample3", + "variant_calling/muse/sample4_vs_sample3/sample4_vs_sample3.MuSE.txt", + "variant_calling/muse/sample4_vs_sample3/sample4_vs_sample3.muse.vcf.gz" + ], + [ + "sample3.bam:md5,8cfa7f35990240ab663a0776ae67ecdc", + "sample3.bam.bai:md5,c55142e20838c3b56d93ff853a7b7189", + "sample4.bam:md5,fe8ceee2ede1f9b0b4f2aaa3f1a97241", + "sample4.bam.bai:md5,c6d0e6be2e5d8a6bd312517d9ba0f4af", + "bcftools_stats_indel-lengths.txt:md5,a61271bd3cf0a87521bd00049e260cef", + "multiqc_bcftools_stats.txt:md5,a268831d16d1d8e2c800c3c5b045fb2e", + "multiqc_citations.txt:md5,ac2b3cf2dfb12c40837b9bbad8112d86", + "vcftools_tstv_by_count.txt:md5,0f4e35a5c711129a5df1f6c8cf2a6678", + "sample4_vs_sample3.muse.bcftools_stats.txt:md5,0a4c6d5841a55b492a50917b0610a0b3", + "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", + "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", + "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", + "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", + "sample3.recal.per-base.bed.gz.csi:md5,519cc5bf84da0d71b87a88c76f83194e", + "sample3.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", + "sample3.recal.regions.bed.gz.csi:md5,538cb5d244411a670a4b041691f8825b", + "sample4.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", + "sample4.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", + "sample4.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", + "sample4.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", + "sample4.recal.per-base.bed.gz.csi:md5,aaa7bed9e7ef873b23bca249b8b58eb9", + "sample4.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", + "sample4.recal.regions.bed.gz.csi:md5,538cb5d244411a670a4b041691f8825b", + "sample3.recal.cram.stats:md5,bcc229318527e414e69aaa5cd092ad9b", + "sample4.recal.cram.stats:md5,0d1784cb4c3f14b9858247ac6128dd03", + "sample4_vs_sample3.muse.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", + "sample4_vs_sample3.muse.TsTv.count:md5,8dcfdbcaac118df1d5ad407dd2af699f", + "sample4_vs_sample3.MuSE.txt:md5,06f2eb941e03ea238ca8d864985aa6f1" + ], + [ + [ + "sample3.bam", + "891da60dc1cc5c6455bfc1442aea0982" + ], + [ + "sample4.bam", + "36856b3e6dd1bc0f10688b9d8c02faa8" + ] + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-02-24T10:09:35.350085828" + }, + "Run with profile test | --tools muse | somatic | stub": { + "content": [ + 17, + { + "BCFTOOLS_STATS": { + "bcftools": 1.2 + }, + "CRAM_TO_BAM_NORMAL": { + "samtools": 1.21 + }, + "CRAM_TO_BAM_TUMOR": { + "samtools": 1.21 + }, + "MUSE_CALL": { + "MuSE": "v2.1.2" + }, + "MUSE_SUMP": { + "MuSE": "v2.1.2", + "bgzip": 1.21 + }, + "VCFTOOLS_TSTV_COUNT": { + "vcftools": "0.1.16" + }, + "Workflow": { + "nf-core/sarek": "v3.6.0dev" + } + }, + [ + "cram", + "cram/sample3.bai", + "cram/sample3.bam", + "cram/sample4.bai", + "cram/sample4.bam", + "csv", + "csv/variantcalled.csv", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_plots", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_sarek_software_mqc_versions.yml", + "reference", + "reference/dict", + "reports", + "reports/bcftools", + "reports/bcftools/muse", + "reports/bcftools/muse/sample4_vs_sample3", + "reports/bcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.bcftools_stats.txt", + "reports/mosdepth", + "reports/mosdepth/sample3", + "reports/mosdepth/sample3/sample3.recal.global.dist.txt", + "reports/mosdepth/sample3/sample3.recal.per-base.bed.gz", + "reports/mosdepth/sample3/sample3.recal.per-base.bed.gz.csi", + "reports/mosdepth/sample3/sample3.recal.per-base.d4", + "reports/mosdepth/sample3/sample3.recal.quantized.bed.gz", + "reports/mosdepth/sample3/sample3.recal.quantized.bed.gz.csi", + "reports/mosdepth/sample3/sample3.recal.region.dist.txt", + "reports/mosdepth/sample3/sample3.recal.regions.bed.gz", + "reports/mosdepth/sample3/sample3.recal.regions.bed.gz.csi", + "reports/mosdepth/sample3/sample3.recal.summary.txt", + "reports/mosdepth/sample3/sample3.recal.thresholds.bed.gz", + "reports/mosdepth/sample3/sample3.recal.thresholds.bed.gz.csi", + "reports/mosdepth/sample4", + "reports/mosdepth/sample4/sample4.recal.global.dist.txt", + "reports/mosdepth/sample4/sample4.recal.per-base.bed.gz", + "reports/mosdepth/sample4/sample4.recal.per-base.bed.gz.csi", + "reports/mosdepth/sample4/sample4.recal.per-base.d4", + "reports/mosdepth/sample4/sample4.recal.quantized.bed.gz", + "reports/mosdepth/sample4/sample4.recal.quantized.bed.gz.csi", + "reports/mosdepth/sample4/sample4.recal.region.dist.txt", + "reports/mosdepth/sample4/sample4.recal.regions.bed.gz", + "reports/mosdepth/sample4/sample4.recal.regions.bed.gz.csi", + "reports/mosdepth/sample4/sample4.recal.summary.txt", + "reports/mosdepth/sample4/sample4.recal.thresholds.bed.gz", + "reports/mosdepth/sample4/sample4.recal.thresholds.bed.gz.csi", + "reports/samtools", + "reports/samtools/sample3", + "reports/samtools/sample3/sample3.recal.cram.stats", + "reports/samtools/sample4", + "reports/samtools/sample4/sample4.recal.cram.stats", + "reports/vcftools", + "reports/vcftools/muse", + "reports/vcftools/muse/sample4_vs_sample3", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.012", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.012.indv", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.012.pos", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.BEAGLE.GL", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.BEAGLE.PL", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.FILTER.summary", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.FORMAT", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.INFO", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.LROH", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.Tajima.D", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.TsTv", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.TsTv.count", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.TsTv.qual", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.TsTv.summary", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.bcf", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.diff.discordance.matrix", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.diff.indv", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.diff.indv_in_files", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.diff.sites", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.diff.sites_in_files", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.diff.switch", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.frq", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.frq.count", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.gdepth", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.geno.chisq", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.geno.ld", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.hap.ld", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.hapcount", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.het", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.hwe", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.idepth", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.ifreqburden", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.imiss", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.impute.hap", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.impute.hap.indv", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.impute.hap.legend", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.indel.hist", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.interchrom.geno.ld", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.interchrom.hap.ld", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.kept.sites", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.ldepth", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.ldepth.mean", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.ldhat.locs", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.ldhat.sites", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.list.geno.ld", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.list.hap.ld", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.lmiss", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.lqual", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.map", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.mendel", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.ped", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.relatedness", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.relatedness2", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.removed.sites", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.singletons", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.sites.pi", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.snpden", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.tfam", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.tped", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.vcf", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.weir.fst", + "reports/vcftools/muse/sample4_vs_sample3/sample4_vs_sample3.muse.windowed.pi", + "variant_calling", + "variant_calling/muse", + "variant_calling/muse/sample4_vs_sample3", + "variant_calling/muse/sample4_vs_sample3/sample4_vs_sample3.MuSE.txt", + "variant_calling/muse/sample4_vs_sample3/sample4_vs_sample3.muse.vcf.gz" + ], + [ + "sample3.bai:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.bai:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.bcftools_stats.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.recal.global.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.recal.per-base.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "sample3.recal.per-base.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.recal.per-base.d4:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.recal.quantized.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "sample3.recal.quantized.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.recal.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.recal.regions.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "sample3.recal.regions.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.recal.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.recal.thresholds.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "sample3.recal.thresholds.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.recal.global.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.recal.per-base.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "sample4.recal.per-base.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.recal.per-base.d4:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.recal.quantized.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "sample4.recal.quantized.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.recal.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.recal.regions.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "sample4.recal.regions.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.recal.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.recal.thresholds.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "sample4.recal.thresholds.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3.recal.cram.stats:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4.recal.cram.stats:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.012:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.012.indv:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.012.pos:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.BEAGLE.GL:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.BEAGLE.PL:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.FILTER.summary:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.FORMAT:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.INFO:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.LROH:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.Tajima.D:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.TsTv:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.TsTv.count:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.TsTv.summary:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.bcf:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.diff.discordance.matrix:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.diff.indv:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.diff.indv_in_files:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.diff.sites:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.diff.sites_in_files:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.diff.switch:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.frq:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.frq.count:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.gdepth:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.geno.chisq:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.geno.ld:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.hap.ld:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.hapcount:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.het:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.hwe:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.idepth:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.ifreqburden:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.imiss:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.impute.hap:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.impute.hap.indv:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.impute.hap.legend:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.indel.hist:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.interchrom.geno.ld:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.interchrom.hap.ld:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.kept.sites:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.ldepth:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.ldepth.mean:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.ldhat.locs:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.ldhat.sites:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.list.geno.ld:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.list.hap.ld:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.lmiss:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.lqual:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.map:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.mendel:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.ped:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.relatedness:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.relatedness2:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.removed.sites:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.singletons:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.sites.pi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.snpden:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.tfam:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.tped:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.vcf:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.weir.fst:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.muse.windowed.pi:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample4_vs_sample3.MuSE.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + [ + "sample3.bam", + "d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "sample4.bam", + "d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-02-24T10:10:10.73871183" + } +} \ No newline at end of file