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