diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index a22a97fc..44211e06 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -50,6 +50,7 @@ jobs: NFT_VER: ${{ env.NFT_VER }} with: max_shards: 7 + tags: ${{ github.event_name == 'pull_request' && 'small' || '' }} - name: debug run: | @@ -100,6 +101,7 @@ jobs: profile: ${{ matrix.profile }} shard: ${{ matrix.shard }} total_shards: ${{ env.TOTAL_SHARDS }} + tags: ${{ github.event_name == 'pull_request' && 'small' || '' }} - name: Report test status if: ${{ always() }} diff --git a/conf/modules.config b/conf/modules.config index 25de8b9b..a97c1e4d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -287,14 +287,20 @@ process { // withName: '.*:MINIMAP2_ALIGN' { - ext.prefix = { "${meta.id}_${meta.type}_mapped" } + ext.prefix = { "${meta.id}_${meta.type}_rep${meta.replicate}_mapped" } ext.args = { + def platform_arg = meta.platform == 'pb' ? + ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq" ) + def secondary_arg = params.save_secondary_alignment ? "--secondary=yes" : "--secondary=no" + def pl = meta.platform == 'pb' ? 'PACBIO' : 'ONT' + def rg = "@RG\\tID:${meta.id}_${meta.type}_rep${meta.replicate}\\tSM:${meta.id}\\tLB:${meta.id}_${meta.type}\\tPL:${pl}" [ - meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : - ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), - params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no ", + platform_arg, + secondary_arg, "-y", - "-Y" + "-Y", + "-R '${rg}'" ].join(' ').trim() } ext.args4 = "-T '*'" @@ -303,6 +309,19 @@ process { ] } + withName: '.*:SAMTOOLS_MERGE' { + ext.prefix = { "${meta.id}_${meta.type}_mapped" } + publishDir = [ + enabled: false + ] + } + + withName: '.*:SAMTOOLS_INDEX_MERGE' { + publishDir = [ + enabled: false + ] + } + // // Methylation related processes // @@ -359,13 +378,20 @@ process { ] } withName: '.*:LONGPHASE_PHASE_SOMATIC' { - ext.prefix = { "somatic_smallvariants" } + ext.prefix = { "somatic_smallvariants_combined" } ext.args = { [ meta.platform == 'pb' ? '--pb' : '--ont', "--indels", ].join(' ').trim() } + // Intermediate output (somatic+germline combined); filtered version published below + publishDir = [ + enabled: false + ] + } + withName: '.*:PHASING_HAPLOTYPING:BCFTOOLS_VIEW' { + ext.prefix = { "somatic_smallvariants" } publishDir = [ path: { "${params.outdir}/${meta.id}/variants/phased" }, mode: params.publish_dir_mode, @@ -430,6 +456,16 @@ process { enabled: false ] } + withName: '.*:GERMLINE_CONSENSUS:BCFTOOLS_SORT_CONSENSUS' { + ext.prefix = { "${meta.id}_germline_sorted" } + ext.args = { '-Oz -W=tbi' } + publishDir = [ enabled: false ] + } + withName: '.*:SOMATIC_CONSENSUS:BCFTOOLS_SORT_CONSENSUS' { + ext.prefix = { "${meta.id}_somatic_sorted" } + ext.args = { '-Oz -W=tbi' } + publishDir = [ enabled: false ] + } withName: '.*:GERMLINE_CONSENSUS:SORT_POST_NORM' { ext.prefix = { "${meta.id}.${meta.caller}_norm_sorted" } ext.args = { '-Oz -W=tbi' } diff --git a/conf/test.config b/conf/test.config index 8494fbf9..6f38e104 100644 --- a/conf/test.config +++ b/conf/test.config @@ -52,7 +52,7 @@ params { fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/GRCh38_chr19.fasta.gz" // Additional params - genome = "CHM13" + genome = "GRCh38" vep_genome = "WBcel235" vep_species = "caenorhabditis_elegans" skip_wakhan = true diff --git a/modules.json b/modules.json index e7597448..3c22bf99 100644 --- a/modules.json +++ b/modules.json @@ -152,6 +152,11 @@ "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", "installed_by": ["modules"] }, + "samtools/merge": { + "branch": "master", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] + }, "samtools/stats": { "branch": "master", "git_sha": "fe93fde0845f907fc91ad7cc7d797930408824df", diff --git a/modules/local/bcftools/view/environment.yml b/modules/local/bcftools/view/environment.yml new file mode 100644 index 00000000..cb55500b --- /dev/null +++ b/modules/local/bcftools/view/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::bcftools=1.22 + - bioconda::htslib=1.22.1 diff --git a/modules/local/bcftools/view/main.nf b/modules/local/bcftools/view/main.nf new file mode 100644 index 00000000..652da9ac --- /dev/null +++ b/modules/local/bcftools/view/main.nf @@ -0,0 +1,40 @@ +process BCFTOOLS_VIEW { + 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/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" + + input: + tuple val(meta), path(vcf), path(tbi), path(targets), path(targets_tbi) + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*.tbi"), emit: tbi + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + bcftools view \\ + -T ${targets} \\ + -Oz \\ + -W=tbi \\ + ${args} \\ + -o ${prefix}.vcf.gz \\ + ${vcf} + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo '' | gzip > ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + """ +} diff --git a/modules/local/bcftools/view/meta.yml b/modules/local/bcftools/view/meta.yml new file mode 100644 index 00000000..28c0fc48 --- /dev/null +++ b/modules/local/bcftools/view/meta.yml @@ -0,0 +1,56 @@ +name: bcftools_view +description: Filter VCF to positions defined by a targets file using bcftools view -T +keywords: + - filtering + - VCF + - variant calling +tools: + - view: + description: VCF/BCF conversion, view, subset and filter VCF/BCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + tool_dev_url: https://github.com/samtools/bcftools + doi: "10.1093/bioinformatics/btp352" + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: Groovy Map containing sample information e.g. [ id:'test' ] + - vcf: + type: file + description: Input VCF/BCF file to filter + pattern: "*.{vcf.gz,vcf,bcf}" + - tbi: + type: file + description: Tabix index of the input VCF + pattern: "*.tbi" + - targets: + type: file + description: VCF file used as position filter (-T) + pattern: "*.{vcf.gz,vcf,bcf}" + - targets_tbi: + type: file + description: Tabix index of the targets VCF + pattern: "*.tbi" +output: + vcf: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.vcf.gz": + type: file + description: Filtered VCF file + pattern: "*.vcf.gz" + tbi: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.tbi": + type: file + description: Tabix index of filtered VCF + pattern: "*.tbi" +authors: + - "@rforsyth" +maintainers: + - "@rforsyth" diff --git a/modules/local/deepsomatic/postprocessvariants/main.nf b/modules/local/deepsomatic/postprocessvariants/main.nf index b2b0c4ba..8fd94208 100644 --- a/modules/local/deepsomatic/postprocessvariants/main.nf +++ b/modules/local/deepsomatic/postprocessvariants/main.nf @@ -28,7 +28,7 @@ process DEEPSOMATIC_POSTPROCESSVARIANTS { error "DEEPSOMATIC module does not support Conda. Please use Docker / Singularity / Podman instead." } def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}_somatic" def regions = intervals ? "--regions ${intervals}" : "" def variant_calls_tfrecord_name = variant_calls_tfrecord_files[0].name.replaceFirst(/-\d{5}-of-\d{5}/, "") @@ -121,7 +121,7 @@ process DEEPSOMATIC_POSTPROCESSVARIANTS { if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." } - prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}_somatic" """ echo "" | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi diff --git a/modules/nf-core/deepvariant/postprocessvariants/main.nf b/modules/nf-core/deepvariant/postprocessvariants/main.nf index b1fa93ac..ee7f703e 100644 --- a/modules/nf-core/deepvariant/postprocessvariants/main.nf +++ b/modules/nf-core/deepvariant/postprocessvariants/main.nf @@ -28,7 +28,7 @@ process DEEPVARIANT_POSTPROCESSVARIANTS { error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." } def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}_germline" def regions = intervals ? "--regions ${intervals}" : "" def variant_calls_tfrecord_name = variant_calls_tfrecord_files[0].name.replaceFirst(/-\d{5}-of-\d{5}/, "") @@ -79,7 +79,7 @@ process DEEPVARIANT_POSTPROCESSVARIANTS { if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." } - prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}_germline" """ echo "" | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi diff --git a/modules/nf-core/samtools/merge/environment.yml b/modules/nf-core/samtools/merge/environment.yml new file mode 100644 index 00000000..946bb362 --- /dev/null +++ b/modules/nf-core/samtools/merge/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.23.1 diff --git a/modules/nf-core/samtools/merge/main.nf b/modules/nf-core/samtools/merge/main.nf new file mode 100644 index 00000000..abb56f9f --- /dev/null +++ b/modules/nf-core/samtools/merge/main.nf @@ -0,0 +1,49 @@ +process SAMTOOLS_MERGE { + tag "${meta.id}" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c5d2818c8b9f58e1fba77ce219fdaf32087ae53e857c4a496402978af26e78c/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.23.1--5b6bb4ede7e612e5'}" + + input: + tuple val(meta), path(input_files, stageAs: "?/*"), path(index_files, stageAs: "?/*") + tuple val(meta2), path(fasta), path(fai), path(gzi) + + output: + tuple val(meta), path("${prefix}.bam"), optional: true, emit: bam + tuple val(meta), path("${prefix}.cram"), optional: true, emit: cram + tuple val(meta), path("*.{bai,crai,csi}"), optional: true, emit: index + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() + def reference = fasta ? "--reference ${fasta}" : "" + """ + # Note: --threads value represents *additional* CPUs to allocate (total CPUs = 1 + --threads). + samtools \\ + merge \\ + --threads ${task.cpus - 1} \\ + ${args} \\ + ${reference} \\ + ${prefix}.${file_type} \\ + ${input_files} + """ + + stub: + def args = task.ext.args ?: '' + prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" + def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() + def index_type = file_type == "bam" ? "csi" : "crai" + def index = args.contains("--write-index") ? "touch ${prefix}.${index_type}" : "" + """ + touch ${prefix}.${file_type} + ${index} + """ +} diff --git a/modules/nf-core/samtools/merge/meta.yml b/modules/nf-core/samtools/merge/meta.yml new file mode 100644 index 00000000..66e582e8 --- /dev/null +++ b/modules/nf-core/samtools/merge/meta.yml @@ -0,0 +1,122 @@ +name: samtools_merge +description: Merge BAM or CRAM file +keywords: + - merge + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_files: + type: file + description: BAM/CRAM file + pattern: "*.{bam,cram,sam}" + ontologies: [] + - index_files: + type: file + description: BAI/CRAI/CSI index file + pattern: "*.{bai,crai,csi}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference file the CRAM was created with (optional) + pattern: "*.{fasta,fa}" + ontologies: [] + - fai: + type: file + description: Index of the reference file the CRAM was created with (optional) + pattern: "*.fai" + ontologies: [] + - gzi: + type: file + description: Index of the compressed reference file the CRAM was created with + (optional) + pattern: "*.gzi" + ontologies: [] +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.bam: + type: file + description: BAM file + pattern: "*.{bam}" + ontologies: [] + cram: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.cram: + type: file + description: CRAM file + pattern: "*.{cram}" + ontologies: [] + index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{bai,crai,csi}": + type: file + description: BAM index file (optional) + pattern: "*.{bai,crai,csi}" + ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool +authors: + - "@yuukiiwa" + - "@maxulysse" + - "@FriederikeHanssen" + - "@ramprasadn" +maintainers: + - "@yuukiiwa" + - "@maxulysse" + - "@FriederikeHanssen" + - "@ramprasadn" + - "@matthdsm" diff --git a/modules/nf-core/samtools/merge/tests/main.nf.test b/modules/nf-core/samtools/merge/tests/main.nf.test new file mode 100644 index 00000000..b3caf864 --- /dev/null +++ b/modules/nf-core/samtools/merge/tests/main.nf.test @@ -0,0 +1,219 @@ +nextflow_process { + + name "Test Process SAMTOOLS_MERGE" + script "../main.nf" + process "SAMTOOLS_MERGE" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/merge" + config "./nextflow.config" + + test("bams") { + + when { + params { + module_args = '--write-index' + } + process { + """ + input[0] = [ + [ id:'test'], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.methylated.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true) ], + [] + ] + input[1] = [[],[],[],[]] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + bam(process.out.bam[0][1]).getReadsMD5(), + file(process.out.index[0][1]).name, + process.out.cram, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() + } + ) + } + } + + test("crams_fastq") { + + when { + params { + module_args = '--write-index --output-fmt cram,version=3.0' + } + process { + """ + input[0] = [ + [ id:'test' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.sorted.cram', checkIfExists: true) ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.sorted.cram.crai', checkIfExists: true) ] + ] + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true), + [] + ] + """ + } + } + + then { + def fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/modules/data/genomics/homo_sapiens/genome/genome.fasta' + assert process.success + assertAll( + { assert snapshot( + cram(process.out.cram[0][1], fasta).getReadsMD5(), + process.out.bam, + file(process.out.index[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() + } + ) + } + } + + test("crams_fastq_gz") { + + when { + params { + module_args = '--write-index' + } + process { + """ + input[0] = [ + [ id:'test' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.sorted.cram', checkIfExists: true) ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.sorted.cram.crai', checkIfExists: true) ] + ] + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.gz.fai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.gz.gzi', checkIfExists: true) + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + //nft-bam doesn't like the fasta.gz + file(process.out.cram[0][1]).name, + process.out.bam, + file(process.out.index[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() + } + ) + } + } + + test("bam") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.methylated.sorted.bam', checkIfExists: true) ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.methylated.sorted.bam.bai', checkIfExists: true) ] + ] + input[1] = [[],[],[],[]] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.index, + process.out.cram, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() + } + ) + } + } + + test("bams - stub") { + + options "-stub" + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.methylated.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true) ], + [] + ] + input[1] = [[],[],[],[]] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match()} + ) + } + } + + test("bams_no_index - stub") { + + options "-stub" + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test'], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.methylated.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true) ], + [] + ] + input[1] = [[],[],[],[]] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match()} + ) + } + } + +} diff --git a/modules/nf-core/samtools/merge/tests/main.nf.test.snap b/modules/nf-core/samtools/merge/tests/main.nf.test.snap new file mode 100644 index 00000000..77ed449d --- /dev/null +++ b/modules/nf-core/samtools/merge/tests/main.nf.test.snap @@ -0,0 +1,202 @@ +{ + "bams_no_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "SAMTOOLS_MERGE", + "samtools", + "1.23.1" + ] + ], + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "index": [ + + ], + "versions_samtools": [ + [ + "SAMTOOLS_MERGE", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T09:01:31.816184" + }, + "crams_fastq": { + "content": [ + "c4525b95f05075208347295e6a1fb232", + [ + + ], + "test.cram.crai", + { + "versions_samtools": [ + [ + "SAMTOOLS_MERGE", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T09:01:05.719443" + }, + "bams - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "SAMTOOLS_MERGE", + "samtools", + "1.23.1" + ] + ], + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "index": [ + + ], + "versions_samtools": [ + [ + "SAMTOOLS_MERGE", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T09:01:24.795562" + }, + "bams": { + "content": [ + "47c9f174d8c8afc1a13c75ee4b5e5d43", + "test.bam.csi", + [ + + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_MERGE", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T09:00:59.536803" + }, + "crams_fastq_gz": { + "content": [ + "test.cram", + [ + + ], + "test.cram.crai", + { + "versions_samtools": [ + [ + "SAMTOOLS_MERGE", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T09:01:11.614088" + }, + "bam": { + "content": [ + "8da8fc1099a955e3ceb198665350e766", + [ + + ], + [ + + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_MERGE", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T09:01:17.736424" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/merge/tests/nextflow.config b/modules/nf-core/samtools/merge/tests/nextflow.config new file mode 100644 index 00000000..5e29c673 --- /dev/null +++ b/modules/nf-core/samtools/merge/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: SAMTOOLS_MERGE { + ext.args = params.module_args + } +} diff --git a/nextflow.config b/nextflow.config index 84c9f487..6ea7d8f6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,12 +14,12 @@ params { input = null // Small variant calling options - germline_var_keep = ['deepvariant', 'clair'] - somatic_var_keep = ['deepsomatic', 'clair'] + germline_var_keep = ['clair'] + somatic_var_keep = ['clair'] germline_var_combine = 'all' somatic_var_combine = 'all' - prioritize_caller_germline = 'deepvariant' - prioritize_caller_somatic = 'deepsomatic' + prioritize_caller_germline = 'clair' + prioritize_caller_somatic = 'clair' generate_gvcf = false // PON Options diff --git a/nextflow_schema.json b/nextflow_schema.json index a7cc1495..75ae8c11 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -72,6 +72,7 @@ "description": "List of germline variant callers to use. Must include at least one of [deepvariant, clair].", "items": { "type": "string", + "default": "['clair']", "enum": ["deepvariant", "clair"] }, "minItems": 1 @@ -81,6 +82,7 @@ "description": "List of somatic variant callers to use. Must include at least one of [deepsomatic, clair].", "items": { "type": "string", + "default": "['clair']", "enum": ["deepsomatic", "clair"] }, "minItems": 1 @@ -100,13 +102,13 @@ "prioritize_caller_germline": { "type": "string", "description": "When both germline callers are used, specifies which caller's format to use for variants called by both. Must be [deepvariant, clair].", - "default": "deepvariant", + "default": "clair", "enum": ["deepvariant", "clair"] }, "prioritize_caller_somatic": { "type": "string", "description": "When both somatic callers are used, specifies which caller's format to use for variants called by both. Must be [deepsomatic, clair].", - "default": "deepsomatic", + "default": "clair", "enum": ["deepsomatic", "clair"] } } diff --git a/subworkflows/local/paired/paired_smallvar_germline.nf b/subworkflows/local/paired/paired_smallvar_germline.nf index bc641a7b..5a6ed936 100644 --- a/subworkflows/local/paired/paired_smallvar_germline.nf +++ b/subworkflows/local/paired/paired_smallvar_germline.nf @@ -15,10 +15,13 @@ workflow PAIRED_SMALLVAR_GERMLINE { main: germline_vcf = channel.empty() + def germline_var_keep = params.germline_var_keep instanceof List ? params.germline_var_keep : [params.germline_var_keep] + clair3_ch = channel.empty() + deepvariant_ch = channel.empty() // COMBINE NORMAL BAMS WITH DOWNLOADED CLAIR3 MODELS // Clair3 requires the model directory path; models are keyed by model name (meta.id) - if(params.germline_var_keep.contains('clair')) { + if(germline_var_keep.contains('clair')) { // Extract model name from meta.id for combine-by key clair3_models @@ -81,7 +84,7 @@ workflow PAIRED_SMALLVAR_GERMLINE { } // DEEPVARIANT - if(params.germline_var_keep.contains('deepvariant')) { + if(germline_var_keep.contains('deepvariant')) { // // SUBWORKFLOW: DEEPVARIANT (nf-core) @@ -128,7 +131,7 @@ workflow PAIRED_SMALLVAR_GERMLINE { // COMBINE GERMLINE VARIATION // If both callers requested: run consensus subworkflow; otherwise pass through single-caller output - if (params.germline_var_keep.size() > 1) { + if (germline_var_keep.size() > 1) { // Mix both caller VCFs into a single channel for GERMLINE_CONSENSUS clair3_ch .mix(deepvariant_ch) @@ -149,11 +152,11 @@ workflow PAIRED_SMALLVAR_GERMLINE { .set{ germline_vcf } // germline_vcf: [meta(+caller from consensus), vcf, tbi] } - else if (params.germline_var_keep == ['clair']) { + else if (germline_var_keep == ['clair']) { clair3_ch .set{germline_vcf} } - else if (params.germline_var_keep == ['deepvariant']) { + else if (germline_var_keep == ['deepvariant']) { deepvariant_ch .set{germline_vcf} } diff --git a/subworkflows/local/paired/paired_smallvar_somatic.nf b/subworkflows/local/paired/paired_smallvar_somatic.nf index 7c2cf944..4d9515bf 100644 --- a/subworkflows/local/paired/paired_smallvar_somatic.nf +++ b/subworkflows/local/paired/paired_smallvar_somatic.nf @@ -18,9 +18,12 @@ workflow PAIRED_SMALLVAR_SOMATIC { main: somatic_vcf = channel.empty() + def somatic_var_keep = params.somatic_var_keep instanceof List ? params.somatic_var_keep : [params.somatic_var_keep] + clairs_ch = channel.empty() + deepsomatic_ch = channel.empty() // CLAIRS: somatic SNV/indel calling from T/N paired BAMs - if(params.somatic_var_keep.contains('clair')) { + if(somatic_var_keep.contains('clair')) { // Append ClairS model name (from meta) as the last element for CLAIRS module tumor_normal_bams .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai -> @@ -79,7 +82,7 @@ workflow PAIRED_SMALLVAR_SOMATIC { } // DEEPSOMATIC: somatic variant calling using deep learning T/N model - if(params.somatic_var_keep.contains('deepsomatic')) { + if(somatic_var_keep.contains('deepsomatic')) { // DeepSomatic expects [normal, tumor] order (opposite of input tuple) tumor_normal_bams @@ -118,7 +121,7 @@ workflow PAIRED_SMALLVAR_SOMATIC { // COMBINE SOMATIC VARIATION // If both callers requested: run consensus subworkflow; otherwise pass through single-caller output - if (params.somatic_var_keep.size() > 1) { + if (somatic_var_keep.size() > 1) { clairs_ch .mix(deepsomatic_ch) .set{combine_somatic_ch} @@ -138,11 +141,11 @@ workflow PAIRED_SMALLVAR_SOMATIC { .set{ somatic_vcf } // somatic_vcf: [meta(+caller from consensus), vcf, tbi] } - else if (params.somatic_var_keep == ['clair']) { + else if (somatic_var_keep == ['clair']) { clairs_ch .set{somatic_vcf} } - else if (params.somatic_var_keep == ['deepsomatic']) { + else if (somatic_var_keep == ['deepsomatic']) { deepsomatic_ch .set{somatic_vcf} } diff --git a/subworkflows/local/phasing_haplotyping.nf b/subworkflows/local/phasing_haplotyping.nf index 32af3d42..84bde7d0 100644 --- a/subworkflows/local/phasing_haplotyping.nf +++ b/subworkflows/local/phasing_haplotyping.nf @@ -7,6 +7,7 @@ include { LONGPHASE_MODCALL as LONGPHASE_MODCALL_SOMATIC } from '../../module include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort/main' +include { BCFTOOLS_VIEW } from '../../modules/local/bcftools/view/main.nf' workflow PHASING_HAPLOTYPING { @@ -252,8 +253,33 @@ workflow PHASING_HAPLOTYPING { LONGPHASE_PHASE_SOMATIC.out.snv_vcf .join(LONGPHASE_PHASE_SOMATIC.out.snv_vcf_index) + .set{ phased_somatic_germline_vcf } + // phased_somatic_germline_vcf: [meta, vcf, tbi] -- Longphase-phased somatic+germline VCF (unfiltered) + + // + // MODULE: BCFTOOLS_VIEW (label: process_medium) + // Filter the phased somatic+germline VCF to somatic-only positions. + // Uses the original somatic VCF as a targets (-T) file so only positions + // called as somatic are retained. Phase tags (PS/HP) on somatic variants + // are preserved; germline records are dropped. + // Input: [meta, phased_combined_vcf, phased_combined_tbi, somatic_vcf, somatic_tbi] + // Output: .vcf -- [meta, vcf.gz] -- phased somatic-only VCF + // .tbi -- [meta, tbi] + // + phased_somatic_germline_vcf + .join(somatic_vcf) + .map { meta, phased_vcf, phased_tbi, som_vcf, som_tbi -> + return [ meta, phased_vcf, phased_tbi, som_vcf, som_tbi ] + } + .set { bcftools_view_input_ch } + // bcftools_view_input_ch: [meta, phased_combined_vcf, tbi, somatic_vcf, somatic_tbi] + + BCFTOOLS_VIEW ( bcftools_view_input_ch ) + + BCFTOOLS_VIEW.out.vcf + .join(BCFTOOLS_VIEW.out.tbi) .set{ phased_somatic_vcf } - // phased_somatic_vcf: [meta, vcf, tbi] -- Longphase-phased somatic (+ germline) VCF + // phased_somatic_vcf: [meta, vcf.gz, tbi] -- phased somatic-only VCF (germline removed) // HAPLOTAGGING: tag each read in the BAM with its haplotype (HP tag) using the phased germline VCF // All sample types (tumor, normal, tumor-only) are haplotagged using the germline phase blocks diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index 57acddfa..d3499cf8 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -6,6 +6,7 @@ include { BCFTOOLS_ANNOTATE as STANDARDIZE_AF } from '../../modul include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort/main' include { BCFTOOLS_SORT as SORT_POST_NORM } from '../../modules/nf-core/bcftools/sort/main' +include { BCFTOOLS_SORT as BCFTOOLS_SORT_CONSENSUS } from '../../modules/nf-core/bcftools/sort/main' @@ -198,17 +199,20 @@ workflow SMALL_VARIANT_CONSENSUS { // Use the record from the prioritized caller if (prioritize_caller in ['deepvariant', 'deepsomatic']) { BCFTOOLS_ISEC.out.deepvar_consensus_vcf - .set{vcf} - BCFTOOLS_ISEC.out.deepvar_consensus_tbi - .set{tbi} + .set{isec_consensus_vcf} } else if (prioritize_caller == 'clair') { BCFTOOLS_ISEC.out.clair_consensus_vcf - .set{vcf} - BCFTOOLS_ISEC.out.clair_consensus_tbi - .set{tbi} + .set{isec_consensus_vcf} } - // vcf/tbi: [meta, vcf/tbi] -- consensus-only calls from the priority caller + // BCFTOOLS_ISEC outputs hardcoded names (0002.vcf.gz) inside a prefix directory. + // Nextflow stages files using basename only, so both germline and somatic consensus + // VCFs would collide as "0002.vcf.gz" in downstream PHASING_HAPLOTYPING:BCFTOOLS_CONCAT. + // BCFTOOLS_SORT_CONSENSUS renames the file to a unique sample-specific name via modules.config. + BCFTOOLS_SORT_CONSENSUS(isec_consensus_vcf) + BCFTOOLS_SORT_CONSENSUS.out.vcf.set{vcf} + BCFTOOLS_SORT_CONSENSUS.out.tbi.set{tbi} + // vcf/tbi: [meta, vcf/tbi] -- consensus-only calls from the priority caller, renamed } else if (combine_method == 'all') { diff --git a/subworkflows/local/tumor_only/tumoronly_smallvar.nf b/subworkflows/local/tumor_only/tumoronly_smallvar.nf index 0476122e..02ce8b50 100644 --- a/subworkflows/local/tumor_only/tumoronly_smallvar.nf +++ b/subworkflows/local/tumor_only/tumoronly_smallvar.nf @@ -24,12 +24,18 @@ workflow TUMORONLY_SMALLVAR { somatic_vcf = channel.empty() germline_vcf = channel.empty() + def germline_var_keep = params.germline_var_keep instanceof List ? params.germline_var_keep : [params.germline_var_keep] + def somatic_var_keep = params.somatic_var_keep instanceof List ? params.somatic_var_keep : [params.somatic_var_keep] + clairsto_germline_ch = channel.empty() + clairsto_somatic_ch = channel.empty() + deepvariant_ch = channel.empty() + deepsomatic_ch = channel.empty() // CLAIRS-TO: somatic AND germline variant calling from tumor-only BAM // ClairS-TO uses a panel-of-normals / population allele database to separate somatic from germline // Runs if either somatic or germline clair calling is requested (produces both jointly) - if(params.somatic_var_keep.contains('clair') || params.germline_var_keep.contains('clair')) { + if(somatic_var_keep.contains('clair') || germline_var_keep.contains('clair')) { // Append model name and PoN info to build the full CLAIRSTO input tumor_bams .map { meta, bam, bai -> @@ -93,7 +99,7 @@ workflow TUMORONLY_SMALLVAR { } // DEEPVARIANT: germline-only variant calling (no somatic mode for tumor-only) - if(params.germline_var_keep.contains('deepvariant')) { + if(germline_var_keep.contains('deepvariant')) { // // SUBWORKFLOW: DEEPVARIANT (nf-core) @@ -130,7 +136,7 @@ workflow TUMORONLY_SMALLVAR { // COMBINE GERMLINE VARIANTS // If both callers requested: run consensus; otherwise pass through single-caller output - if (params.germline_var_keep.size() > 1) { + if (germline_var_keep.size() > 1) { clairsto_germline_ch .mix(deepvariant_ch) .set{combined_germline_ch} @@ -149,18 +155,18 @@ workflow TUMORONLY_SMALLVAR { .set{germline_vcf} // germline_vcf: [meta(+caller from consensus), vcf, tbi] } - else if (params.germline_var_keep == ['clair']) { + else if (germline_var_keep == ['clair']) { clairsto_germline_ch .set{germline_vcf} } - else if (params.germline_var_keep == ['deepvariant']) { + else if (germline_var_keep == ['deepvariant']) { deepvariant_ch .set{germline_vcf} } // DEEPSOMATIC: somatic variant calling in tumor-only mode (no matched normal) // Normal BAM/BAI are passed as empty lists; DeepSomatic uses the model's internal normal baseline - if(params.somatic_var_keep.contains('deepsomatic')) { + if(somatic_var_keep.contains('deepsomatic')) { tumor_bams .map { meta, tumor_bam, tumor_bai -> def normal_bam = [] @@ -197,7 +203,7 @@ workflow TUMORONLY_SMALLVAR { } // COMBINE SOMATIC VARIATION - if (params.somatic_var_keep.size() > 1) { + if (somatic_var_keep.size() > 1) { clairsto_somatic_ch .mix(deepsomatic_ch) .set{combined_somatic_ch} @@ -216,11 +222,11 @@ workflow TUMORONLY_SMALLVAR { .set{somatic_vcf} // somatic_vcf: [meta(+caller from consensus), vcf, tbi] } - else if (params.somatic_var_keep == ['clair']) { + else if (somatic_var_keep == ['clair']) { clairsto_somatic_ch .set{somatic_vcf} } - else if (params.somatic_var_keep == ['deepsomatic']) { + else if (somatic_var_keep == ['deepsomatic']) { deepsomatic_ch .set{somatic_vcf} } diff --git a/tests/clair_only.nf.test b/tests/clair_only.nf.test new file mode 100644 index 00000000..6030edd4 --- /dev/null +++ b/tests/clair_only.nf.test @@ -0,0 +1,151 @@ +nextflow_pipeline { + + name "Test pipeline - clair callers only (extended samplesheet)" + script "../main.nf" + tag "pipeline" + tag "extended" + + test("-profile test, clair only, extended samplesheet") { + + when { + params { + outdir = "$outputDir" + input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/refs/heads/main/samplesheets/test_sheet_2.csv" + germline_var_keep = ['clair'] + somatic_var_keep = ['clair'] + } + } + + then { + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success }, + + // ── Clair caller outputs MUST exist ────────────────────────── + { // Paired samples: Clair3 (germline) + ClairS (somatic) + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/variants/clair3/merge_output.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clair3/merge_output.vcf.gz.tbi").exists() + assert file("$launchDir/output/${s}/variants/clairs/indel.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clairs/indel.vcf.gz.tbi").exists() + assert file("$launchDir/output/${s}/variants/clairs/snvs.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clairs/snvs.vcf.gz.tbi").exists() + } + }, + { // Tumor-only samples: ClairSTO outputs + ['sample3', 'sample4', 'sample5'].each { s -> + assert file("$launchDir/output/${s}/variants/clairsto/indel.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clairsto/snv.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clairsto/somatic.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clairsto/germline.vcf.gz").exists() + } + }, + + // ── Deep caller outputs must NOT exist ─────────────────────── + { + ['sample1', 'sample2', 'sample3', 'sample4', 'sample5'].each { s -> + assert !file("$launchDir/output/${s}/variants/deepvariant").exists() + assert !file("$launchDir/output/${s}/variants/deepsomatic").exists() + } + }, + + // ── Phased VCFs exist and have data ────────────────────────── + { + ['sample1', 'sample2', 'sample3', 'sample4', 'sample5'].each { s -> + def germline = file("$launchDir/output/${s}/variants/phased/germline_smallvariants.vcf.gz") + def somatic = file("$launchDir/output/${s}/variants/phased/somatic_smallvariants.vcf.gz") + assert germline.exists() + assert somatic.exists() + assert germline.size() > 0 + assert somatic.size() > 0 + } + }, + + // ── BAM files exist ────────────────────────────────────────── + { + // Paired samples have both tumor + normal BAMs + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam.bai").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_normal.bam").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_normal.bam.bai").exists() + } + // Tumor-only samples have only tumor BAM + ['sample3', 'sample4', 'sample5'].each { s -> + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam.bai").exists() + } + }, + + // ── Severus SV outputs for paired samples ──────────────────── + { + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/variants/severus/somatic_SVs/severus_somatic.vcf.gz").exists() + } + }, + + // ── QC outputs exist for all samples ───────────────────────── + { + // Post-alignment QC (runs after replicate merge) + ['sample1', 'sample2', 'sample3', 'sample4', 'sample5'].each { s -> + def types = (s in ['sample1', 'sample2']) ? ['tumor', 'normal'] : ['tumor'] + types.each { t -> + assert file("$launchDir/output/${s}/qc/${t}/cramino_aln").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/nanoplot_aln").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/mosdepth").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/samtools").isDirectory() + } + } + }, + + // ── sample4: replicate-specific pre-alignment QC ───────────── + { + // Pre-merge QC should have separate rep1 and rep2 directories + assert file("$launchDir/output/sample4/qc/tumor/cramino_ubam_rep1").isDirectory() + assert file("$launchDir/output/sample4/qc/tumor/cramino_ubam_rep2").isDirectory() + assert file("$launchDir/output/sample4/qc/tumor/nanoplot_ubam_rep1").isDirectory() + assert file("$launchDir/output/sample4/qc/tumor/nanoplot_ubam_rep2").isDirectory() + // Post-merge QC should be a single directory (no rep suffix) + assert file("$launchDir/output/sample4/qc/tumor/cramino_aln").isDirectory() + assert file("$launchDir/output/sample4/qc/tumor/nanoplot_aln").isDirectory() + // Variant outputs should be single (merged), not duplicated + assert file("$launchDir/output/sample4/variants/clairsto/somatic.vcf.gz").exists() + assert file("$launchDir/output/sample4/variants/clairsto/germline.vcf.gz").exists() + }, + + // ── sample5: custom model override verification ────────────── + { + // ClairSTO for sample5 should use the samplesheet-specified model + // 'ont_r10_dorado_sup_4khz' instead of the auto-detected model from BAM header. + // The ClairSTO VCF header contains a ##cmdline line with --platform . + def snvVcf = file("$launchDir/output/sample5/variants/clairsto/snv.vcf.gz") + assert snvVcf.exists() + // Read VCF header and check for the expected model string + def header = ["zgrep", "##", snvVcf.toString()].execute().text + assert header.contains('ont_r10_dorado_sup_4khz') : \ + "Expected ClairSTO to use samplesheet model 'ont_r10_dorado_sup_4khz' but VCF header was:\n${header}" + }, + + // ── VEP annotation outputs ─────────────────────────────────── + { + ['sample1', 'sample2', 'sample3', 'sample4', 'sample5'].each { s -> + assert file("$launchDir/output/${s}/vep/germline").isDirectory() + assert file("$launchDir/output/${s}/vep/somatic").isDirectory() + } + // SV VEP only for paired samples (severus only runs on paired) + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/vep/SVs").isDirectory() + } + }, + + // ── Snapshot ───────────────────────────────────────────────── + { assert snapshot( + removeNextflowVersion("$outputDir/pipeline_info/lrsomatic_software_mqc_versions.yml"), + stable_name, + stable_path + ).match() } + ) + } + } +} diff --git a/tests/clair_only.nf.test.snap b/tests/clair_only.nf.test.snap new file mode 100644 index 00000000..fe0c4406 --- /dev/null +++ b/tests/clair_only.nf.test.snap @@ -0,0 +1,780 @@ +{ + "-profile test, clair only, extended samplesheet": { + "content": [ + { + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, + "BCFTOOLS_VIEW": { + "bcftools": 1.22 + }, + "CLAIR3": { + "clair3": "1.2.0" + }, + "CLAIRS": { + "clairs": "0.4.4" + }, + "CLAIRSTO": { + "clairsto": "0.4.2" + }, + "CRAMINO_POST": { + "cramino": "1.3.0" + }, + "CRAMINO_PRE": { + "cramino": "1.3.0" + }, + "GERMLINE_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "LONGPHASE_HAPLOTAG": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_SOMATIC": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_SOMATIC": { + "longphase": "2.0.1" + }, + "METAEXTRACT": { + "samtools": 1.21 + }, + "MINIMAP2_ALIGN": { + "minimap2": "2.29-r1283" + }, + "MOSDEPTH": { + "mosdepth": "0.3.11" + }, + "NANOPLOT_POST": { + "nanoplot": "1.46.1" + }, + "NANOPLOT_PRE": { + "nanoplot": "1.46.1" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": "1.22.1" + }, + "SAMTOOLS_IDXSTATS": { + "samtools": "1.22.1" + }, + "SAMTOOLS_INDEX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_INDEX_MERGE": { + "samtools": "1.22.1" + }, + "SAMTOOLS_MERGE": { + "samtools": "1.23.1" + }, + "SAMTOOLS_STATS": { + "samtools": "1.22.1" + }, + "SEVERUS": { + "severus": 1.6 + }, + "SOMATIC_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "SV_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "UNTAR": { + "untar": 1.34 + }, + "UNZIP_FASTA": { + "pigz": 2.8 + }, + "VCFSPLIT": { + "bcftools": 1.2 + }, + "WGET": { + "wget": "1.21.4" + }, + "WHATSHAP_STATS": { + "whatshap": 2.8 + }, + "Workflow": { + "IntGenomicsLab/lrsomatic": "v1.1.0dev" + } + }, + [ + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", + "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", + "multiqc/multiqc_data/mosdepth_cov_dist.txt", + "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", + "multiqc/multiqc_data/mosdepth_perchrom.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/multiqc_whatshap_phased_bp_plot.txt", + "multiqc/multiqc_data/multiqc_whatshap_stats.txt", + "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", + "multiqc/multiqc_data/samtools-flagstat-table.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_data/whatshap-stats-table.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/pdf/multiqc_whatshap_phased_bp_plot.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/whatshap-stats-table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", + "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/png/multiqc_whatshap_phased_bp_plot.png", + "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", + "multiqc/multiqc_plots/png/samtools-flagstat-table.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-stats-dp.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", + "multiqc/multiqc_plots/png/whatshap-stats-table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", + "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_plots/svg/multiqc_whatshap_phased_bp_plot.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", + "multiqc/multiqc_plots/svg/whatshap-stats-table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/lrsomatic_software_mqc_versions.yml", + "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", + "sample1/qc", + "sample1/qc/normal", + "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1_normal_cramino.txt", + "sample1/qc/normal/cramino_ubam_rep1", + "sample1/qc/normal/cramino_ubam_rep1/sample1_normal_cramino.txt", + "sample1/qc/normal/mosdepth", + "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/nanoplot_aln", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoStats.txt", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Yield_By_Length.html", + "sample1/qc/normal/nanoplot_ubam_rep1", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_NanoStats.txt", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Yield_By_Length.html", + "sample1/qc/normal/samtools", + "sample1/qc/normal/samtools/sample1.flagstat", + "sample1/qc/normal/samtools/sample1.idxstats", + "sample1/qc/normal/samtools/sample1.stats", + "sample1/qc/tumor", + "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1_tumor_cramino.txt", + "sample1/qc/tumor/cramino_ubam_rep1", + "sample1/qc/tumor/cramino_ubam_rep1/sample1_tumor_cramino.txt", + "sample1/qc/tumor/mosdepth", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/tumor/nanoplot_aln", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoStats.txt", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Yield_By_Length.html", + "sample1/qc/tumor/nanoplot_ubam_rep1", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_NanoStats.txt", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Yield_By_Length.html", + "sample1/qc/tumor/samtools", + "sample1/qc/tumor/samtools/sample1.flagstat", + "sample1/qc/tumor/samtools/sample1.idxstats", + "sample1/qc/tumor/samtools/sample1.stats", + "sample1/qc/whatshap_stats", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.gtf", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.log", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.tsv", + "sample1/variants", + "sample1/variants/clair3", + "sample1/variants/clair3/merge_output.vcf.gz", + "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", + "sample1/variants/clairs/snvs.vcf.gz", + "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/phased", + "sample1/variants/phased/germline_smallvariants.vcf.gz", + "sample1/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample1/variants/phased/somatic_smallvariants.vcf.gz", + "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/vep/germline", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", + "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", + "sample2/qc", + "sample2/qc/normal", + "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2_normal_cramino.txt", + "sample2/qc/normal/cramino_ubam_rep1", + "sample2/qc/normal/cramino_ubam_rep1/sample2_normal_cramino.txt", + "sample2/qc/normal/mosdepth", + "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/nanoplot_aln", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoStats.txt", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Yield_By_Length.html", + "sample2/qc/normal/nanoplot_ubam_rep1", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_NanoStats.txt", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Yield_By_Length.html", + "sample2/qc/normal/samtools", + "sample2/qc/normal/samtools/sample2.flagstat", + "sample2/qc/normal/samtools/sample2.idxstats", + "sample2/qc/normal/samtools/sample2.stats", + "sample2/qc/tumor", + "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2_tumor_cramino.txt", + "sample2/qc/tumor/cramino_ubam_rep1", + "sample2/qc/tumor/cramino_ubam_rep1/sample2_tumor_cramino.txt", + "sample2/qc/tumor/mosdepth", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/nanoplot_aln", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoStats.txt", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Yield_By_Length.html", + "sample2/qc/tumor/nanoplot_ubam_rep1", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_NanoStats.txt", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Yield_By_Length.html", + "sample2/qc/tumor/samtools", + "sample2/qc/tumor/samtools/sample2.flagstat", + "sample2/qc/tumor/samtools/sample2.idxstats", + "sample2/qc/tumor/samtools/sample2.stats", + "sample2/qc/whatshap_stats", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.gtf", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.log", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.tsv", + "sample2/variants", + "sample2/variants/clair3", + "sample2/variants/clair3/merge_output.vcf.gz", + "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", + "sample2/variants/clairs/snvs.vcf.gz", + "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/phased", + "sample2/variants/phased/germline_smallvariants.vcf.gz", + "sample2/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample2/variants/phased/somatic_smallvariants.vcf.gz", + "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/vep/germline", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", + "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", + "sample3/qc", + "sample3/qc/tumor", + "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3_tumor_cramino.txt", + "sample3/qc/tumor/cramino_ubam_rep1", + "sample3/qc/tumor/cramino_ubam_rep1/sample3_tumor_cramino.txt", + "sample3/qc/tumor/mosdepth", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/nanoplot_aln", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoStats.txt", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Yield_By_Length.html", + "sample3/qc/tumor/nanoplot_ubam_rep1", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_NanoStats.txt", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Yield_By_Length.html", + "sample3/qc/tumor/samtools", + "sample3/qc/tumor/samtools/sample3.flagstat", + "sample3/qc/tumor/samtools/sample3.idxstats", + "sample3/qc/tumor/samtools/sample3.stats", + "sample3/qc/whatshap_stats", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.gtf", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.log", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.tsv", + "sample3/variants", + "sample3/variants/clairsto", + "sample3/variants/clairsto/germline.vcf.gz", + "sample3/variants/clairsto/germline.vcf.gz.tbi", + "sample3/variants/clairsto/indel.vcf.gz", + "sample3/variants/clairsto/indel.vcf.gz.tbi", + "sample3/variants/clairsto/snv.vcf.gz", + "sample3/variants/clairsto/snv.vcf.gz.tbi", + "sample3/variants/clairsto/somatic.vcf.gz", + "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/phased", + "sample3/variants/phased/germline_smallvariants.vcf.gz", + "sample3/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample3/variants/phased/somatic_smallvariants.vcf.gz", + "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/vep/germline", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/vep/somatic", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html", + "sample4", + "sample4/bamfiles", + "sample4/bamfiles/sample4_tumor.bam", + "sample4/bamfiles/sample4_tumor.bam.bai", + "sample4/qc", + "sample4/qc/tumor", + "sample4/qc/tumor/cramino_aln", + "sample4/qc/tumor/cramino_aln/sample4_tumor_cramino.txt", + "sample4/qc/tumor/cramino_ubam_rep1", + "sample4/qc/tumor/cramino_ubam_rep1/sample4_tumor_cramino.txt", + "sample4/qc/tumor/cramino_ubam_rep2", + "sample4/qc/tumor/cramino_ubam_rep2/sample4_tumor_cramino.txt", + "sample4/qc/tumor/mosdepth", + "sample4/qc/tumor/mosdepth/sample4.mosdepth.global.dist.txt", + "sample4/qc/tumor/mosdepth/sample4.mosdepth.summary.txt", + "sample4/qc/tumor/nanoplot_aln", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_NanoPlot-report.html", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_NanoStats.txt", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_Non_weightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_WeightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_aln/sample4_tumor_aln_Yield_By_Length.html", + "sample4/qc/tumor/nanoplot_ubam_rep1", + "sample4/qc/tumor/nanoplot_ubam_rep1/sample4_tumor_ubam_NanoPlot-report.html", + "sample4/qc/tumor/nanoplot_ubam_rep1/sample4_tumor_ubam_NanoStats.txt", + "sample4/qc/tumor/nanoplot_ubam_rep1/sample4_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_rep1/sample4_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_rep1/sample4_tumor_ubam_WeightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_rep1/sample4_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_rep1/sample4_tumor_ubam_Yield_By_Length.html", + "sample4/qc/tumor/nanoplot_ubam_rep2", + "sample4/qc/tumor/nanoplot_ubam_rep2/sample4_tumor_ubam_NanoPlot-report.html", + "sample4/qc/tumor/nanoplot_ubam_rep2/sample4_tumor_ubam_NanoStats.txt", + "sample4/qc/tumor/nanoplot_ubam_rep2/sample4_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_rep2/sample4_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_rep2/sample4_tumor_ubam_WeightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_rep2/sample4_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_rep2/sample4_tumor_ubam_Yield_By_Length.html", + "sample4/qc/tumor/samtools", + "sample4/qc/tumor/samtools/sample4.flagstat", + "sample4/qc/tumor/samtools/sample4.idxstats", + "sample4/qc/tumor/samtools/sample4.stats", + "sample4/qc/whatshap_stats", + "sample4/qc/whatshap_stats/sample4_whatshap_stats.gtf", + "sample4/qc/whatshap_stats/sample4_whatshap_stats.log", + "sample4/qc/whatshap_stats/sample4_whatshap_stats.tsv", + "sample4/variants", + "sample4/variants/clairsto", + "sample4/variants/clairsto/germline.vcf.gz", + "sample4/variants/clairsto/germline.vcf.gz.tbi", + "sample4/variants/clairsto/indel.vcf.gz", + "sample4/variants/clairsto/indel.vcf.gz.tbi", + "sample4/variants/clairsto/snv.vcf.gz", + "sample4/variants/clairsto/snv.vcf.gz.tbi", + "sample4/variants/clairsto/somatic.vcf.gz", + "sample4/variants/clairsto/somatic.vcf.gz.tbi", + "sample4/variants/phased", + "sample4/variants/phased/germline_smallvariants.vcf.gz", + "sample4/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample4/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample4/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample4/variants/phased/somatic_smallvariants.vcf.gz", + "sample4/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample4/variants/severus", + "sample4/variants/severus/all_SVs", + "sample4/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample4/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample4/variants/severus/all_SVs/severus_all.vcf.gz", + "sample4/variants/severus/breakpoints_double.csv", + "sample4/variants/severus/read_ids.csv", + "sample4/variants/severus/read_qual.txt", + "sample4/variants/severus/severus.log", + "sample4/variants/severus/somatic_SVs", + "sample4/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample4/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample4/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample4/vep", + "sample4/vep/SVs", + "sample4/vep/SVs/sample4_SV_VEP.vcf.gz", + "sample4/vep/SVs/sample4_SV_VEP.vcf.gz.tbi", + "sample4/vep/SVs/sample4_SV_VEP.vcf.gz_summary.html", + "sample4/vep/germline", + "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz", + "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz.tbi", + "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz_summary.html", + "sample4/vep/somatic", + "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz", + "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz.tbi", + "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz_summary.html", + "sample5", + "sample5/bamfiles", + "sample5/bamfiles/sample5_tumor.bam", + "sample5/bamfiles/sample5_tumor.bam.bai", + "sample5/qc", + "sample5/qc/tumor", + "sample5/qc/tumor/cramino_aln", + "sample5/qc/tumor/cramino_aln/sample5_tumor_cramino.txt", + "sample5/qc/tumor/cramino_ubam_rep1", + "sample5/qc/tumor/cramino_ubam_rep1/sample5_tumor_cramino.txt", + "sample5/qc/tumor/mosdepth", + "sample5/qc/tumor/mosdepth/sample5.mosdepth.global.dist.txt", + "sample5/qc/tumor/mosdepth/sample5.mosdepth.summary.txt", + "sample5/qc/tumor/nanoplot_aln", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_NanoPlot-report.html", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_NanoStats.txt", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_Non_weightedHistogramReadlength.html", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_WeightedHistogramReadlength.html", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample5/qc/tumor/nanoplot_aln/sample5_tumor_aln_Yield_By_Length.html", + "sample5/qc/tumor/nanoplot_ubam_rep1", + "sample5/qc/tumor/nanoplot_ubam_rep1/sample5_tumor_ubam_NanoPlot-report.html", + "sample5/qc/tumor/nanoplot_ubam_rep1/sample5_tumor_ubam_NanoStats.txt", + "sample5/qc/tumor/nanoplot_ubam_rep1/sample5_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample5/qc/tumor/nanoplot_ubam_rep1/sample5_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample5/qc/tumor/nanoplot_ubam_rep1/sample5_tumor_ubam_WeightedHistogramReadlength.html", + "sample5/qc/tumor/nanoplot_ubam_rep1/sample5_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample5/qc/tumor/nanoplot_ubam_rep1/sample5_tumor_ubam_Yield_By_Length.html", + "sample5/qc/tumor/samtools", + "sample5/qc/tumor/samtools/sample5.flagstat", + "sample5/qc/tumor/samtools/sample5.idxstats", + "sample5/qc/tumor/samtools/sample5.stats", + "sample5/qc/whatshap_stats", + "sample5/qc/whatshap_stats/sample5_whatshap_stats.gtf", + "sample5/qc/whatshap_stats/sample5_whatshap_stats.log", + "sample5/qc/whatshap_stats/sample5_whatshap_stats.tsv", + "sample5/variants", + "sample5/variants/clairsto", + "sample5/variants/clairsto/germline.vcf.gz", + "sample5/variants/clairsto/germline.vcf.gz.tbi", + "sample5/variants/clairsto/indel.vcf.gz", + "sample5/variants/clairsto/indel.vcf.gz.tbi", + "sample5/variants/clairsto/snv.vcf.gz", + "sample5/variants/clairsto/snv.vcf.gz.tbi", + "sample5/variants/clairsto/somatic.vcf.gz", + "sample5/variants/clairsto/somatic.vcf.gz.tbi", + "sample5/variants/phased", + "sample5/variants/phased/germline_smallvariants.vcf.gz", + "sample5/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample5/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample5/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample5/variants/phased/somatic_smallvariants.vcf.gz", + "sample5/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample5/variants/severus", + "sample5/variants/severus/all_SVs", + "sample5/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample5/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample5/variants/severus/all_SVs/severus_all.vcf.gz", + "sample5/variants/severus/breakpoints_double.csv", + "sample5/variants/severus/read_ids.csv", + "sample5/variants/severus/read_qual.txt", + "sample5/variants/severus/severus.log", + "sample5/variants/severus/somatic_SVs", + "sample5/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample5/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample5/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample5/vep", + "sample5/vep/SVs", + "sample5/vep/SVs/sample5_SV_VEP.vcf.gz", + "sample5/vep/SVs/sample5_SV_VEP.vcf.gz.tbi", + "sample5/vep/SVs/sample5_SV_VEP.vcf.gz_summary.html", + "sample5/vep/germline", + "sample5/vep/germline/sample5_GERMLINE_VEP.vcf.gz", + "sample5/vep/germline/sample5_GERMLINE_VEP.vcf.gz.tbi", + "sample5/vep/germline/sample5_GERMLINE_VEP.vcf.gz_summary.html", + "sample5/vep/somatic", + "sample5/vep/somatic/sample5_SOMATIC_VEP.vcf.gz", + "sample5/vep/somatic/sample5_SOMATIC_VEP.vcf.gz.tbi", + "sample5/vep/somatic/sample5_SOMATIC_VEP.vcf.gz_summary.html" + ], + [ + "sample1_normal.bam:md5,772e41f7cd86c03a22afbe5ec0592a6b", + "sample1_normal.bam.bai:md5,1b501f6a11efe5d2e6f47b7f1523220b", + "sample1_tumor.bam:md5,c8315c80dc92dfb5d874aef3f5dd46fb", + "sample1_tumor.bam.bai:md5,bc35f807be4b93fc795a14d701469367", + "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", + "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", + "sample1.stats:md5,a8b3fba9c54efbc0934d6eacc1807140", + "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample1.stats:md5,1c60a1d249d2e503b0678c72e851ea93", + "sample1_whatshap_stats.gtf:md5,eff050a68e36e778b06e0ec19435c569", + "sample1_whatshap_stats.log:md5,76b73731f74fe32ef2d11f6bb0a0f71a", + "sample1_whatshap_stats.tsv:md5,f566ae25b3c5a8f7e94b3d6c1b0417f8", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,47cb0e0bbe71abdbf4f40217dfda43f9", + "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample2_normal.bam:md5,3157bd11ba095a884c7951aafcfcfb1c", + "sample2_normal.bam.bai:md5,edebda44c4383173caea728acde4ac43", + "sample2_tumor.bam:md5,47b2c5f86e0493ba94ff72cea77eeae3", + "sample2_tumor.bam.bai:md5,abf2c290c815f54c2b3f8179f717d9bd", + "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", + "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", + "sample2.stats:md5,20c47cb94f9ac739d69c57be6daf82c5", + "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", + "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", + "sample2.stats:md5,8635df10132c85a13f2d9878b7cf90a2", + "sample2_whatshap_stats.gtf:md5,4d8f4393e3aebe4e945c0b8236cf3b3e", + "sample2_whatshap_stats.log:md5,10bba7bae6dd99b989ece5e5dac7a8f9", + "sample2_whatshap_stats.tsv:md5,bb46226e486af9026ab76e014624e903", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,48baac86492026a4a7947bc708c47e6e", + "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample3_tumor.bam:md5,3c995151bdd974df5bf61d08606d54d3", + "sample3_tumor.bam.bai:md5,9d5964ef8f44127a7d9162d628e2407d", + "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample3.stats:md5,ecd5ea4fee37379dd5c5ae3e89dfddda", + "sample3_whatshap_stats.gtf:md5,46a97067376b06b476d180709bc9e3d8", + "sample3_whatshap_stats.log:md5,376254ec9c98f9ba204895e7085516ed", + "sample3_whatshap_stats.tsv:md5,f7cc79156f23e884ead18e50b8434dbf", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,56e899f85876cee082788927d0f89c5f", + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample4_tumor.bam:md5,d610518738c80e30d4d4c2301b9e56d9", + "sample4_tumor.bam.bai:md5,39d022831f9927574898140340a75111", + "sample4.flagstat:md5,5710382ba31b23172ca19f9407f689b4", + "sample4.idxstats:md5,3bf4793a1667f41f0b31d578f99e3955", + "sample4.stats:md5,b998982ea897721c529959e39b693ec6", + "sample4_whatshap_stats.gtf:md5,9ca85642243042d3580d14a1d54b3d6a", + "sample4_whatshap_stats.log:md5,b453653f5d83c4aa408862e7141f0965", + "sample4_whatshap_stats.tsv:md5,8830262298440c4bd8675d1ff3f601e8", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,e3beaa65b40a5093a7e74cecb0b2cfd2", + "read_qual.txt:md5,42eb25878cc6b823a562406db56b29d7", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample5_tumor.bam:md5,e3b7a4c9d391e9ddda187d7d6bcd1403", + "sample5_tumor.bam.bai:md5,d3ba11453e0eefda8d602e7b4883e82c", + "sample5.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample5.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample5.stats:md5,3f1429e9b2379bf282299d71a8c5d22c", + "sample5_whatshap_stats.gtf:md5,d02a3be9b50b953b32b42e2fedabc0e5", + "sample5_whatshap_stats.log:md5,a2e4ed9edca8609fc947041a9fead794", + "sample5_whatshap_stats.tsv:md5,860ad30057b783e24dcb41ec581c8b68", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,cc06f0726375cc45f29875b5053831e9", + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-05-12T14:39:44.13708736" + } +} \ No newline at end of file diff --git a/tests/consensus.nf.test b/tests/consensus.nf.test new file mode 100644 index 00000000..58614feb --- /dev/null +++ b/tests/consensus.nf.test @@ -0,0 +1,118 @@ +nextflow_pipeline { + + name "Test pipeline - both callers, consensus combine mode" + script "../main.nf" + tag "pipeline" + tag "extended" + + test("-profile test, consensus combine mode") { + + when { + params { + outdir = "$outputDir" + germline_var_combine = 'consensus' + somatic_var_combine = 'consensus' + germline_var_keep = ['clair', 'deepvariant'] + somatic_var_keep = ['clair', 'deepsomatic'] + } + } + + then { + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success }, + + // ── Both caller raw outputs MUST exist ─────────────────────── + { // DeepVariant germline outputs + ['sample1', 'sample2', 'sample3'].each { s -> + assert file("$launchDir/output/${s}/variants/deepvariant/${s}_germline.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/deepvariant/${s}_germline.vcf.gz.tbi").exists() + } + }, + { // DeepSomatic somatic outputs + ['sample1', 'sample2', 'sample3'].each { s -> + assert file("$launchDir/output/${s}/variants/deepsomatic/${s}_somatic.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/deepsomatic/${s}_somatic.vcf.gz.tbi").exists() + } + }, + { // Clair germline outputs (paired: clair3, tumor-only: clairsto) + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/variants/clair3/merge_output.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clair3/merge_output.vcf.gz.tbi").exists() + } + assert file("$launchDir/output/sample3/variants/clairsto/germline.vcf.gz").exists() + }, + { // Clair somatic outputs (paired: clairs, tumor-only: clairsto) + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/variants/clairs/indel.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clairs/snvs.vcf.gz").exists() + } + assert file("$launchDir/output/sample3/variants/clairsto/somatic.vcf.gz").exists() + }, + + // ── Phased consensus VCFs exist and have data ──────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + def germline = file("$launchDir/output/${s}/variants/phased/germline_smallvariants.vcf.gz") + def somatic = file("$launchDir/output/${s}/variants/phased/somatic_smallvariants.vcf.gz") + assert germline.exists() + assert somatic.exists() + assert germline.size() > 0 + assert somatic.size() > 0 + } + }, + + // ── BAM files ──────────────────────────────────────────────── + { + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam.bai").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_normal.bam").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_normal.bam.bai").exists() + } + assert file("$launchDir/output/sample3/bamfiles/sample3_tumor.bam").exists() + assert file("$launchDir/output/sample3/bamfiles/sample3_tumor.bam.bai").exists() + }, + + // ── Severus ────────────────────────────────────────────────── + { + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/variants/severus/somatic_SVs/severus_somatic.vcf.gz").exists() + } + }, + + // ── QC outputs ─────────────────────────────────────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + def types = (s in ['sample1', 'sample2']) ? ['tumor', 'normal'] : ['tumor'] + types.each { t -> + assert file("$launchDir/output/${s}/qc/${t}/cramino_aln").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/nanoplot_aln").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/mosdepth").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/samtools").isDirectory() + } + } + }, + + // ── VEP annotation outputs ─────────────────────────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + assert file("$launchDir/output/${s}/vep/germline").isDirectory() + assert file("$launchDir/output/${s}/vep/somatic").isDirectory() + } + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/vep/SVs").isDirectory() + } + }, + + // ── Snapshot ───────────────────────────────────────────────── + { assert snapshot( + removeNextflowVersion("$outputDir/pipeline_info/lrsomatic_software_mqc_versions.yml"), + stable_name, + stable_path + ).match() } + ) + } + } +} diff --git a/tests/consensus.nf.test.snap b/tests/consensus.nf.test.snap new file mode 100644 index 00000000..21552b3b --- /dev/null +++ b/tests/consensus.nf.test.snap @@ -0,0 +1,624 @@ +{ + "-profile test, consensus combine mode": { + "content": [ + { + "BCFTOOLS_ANNOTATE": { + "bcftools": 1.22 + }, + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_ISEC": { + "bcftools": 1.22 + }, + "BCFTOOLS_NORM": { + "bcftools": 1.22 + }, + "BCFTOOLS_QUERY": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT_CONSENSUS": { + "bcftools": 1.22 + }, + "BCFTOOLS_VIEW": { + "bcftools": 1.22 + }, + "CLAIR3": { + "clair3": "1.2.0" + }, + "CLAIRS": { + "clairs": "0.4.4" + }, + "CLAIRSTO": { + "clairsto": "0.4.2" + }, + "CRAMINO_POST": { + "cramino": "1.3.0" + }, + "CRAMINO_PRE": { + "cramino": "1.3.0" + }, + "DEEPSOMATIC_CALLVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_MAKEEXAMPLES": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_POSTPROCESSVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPVARIANT_CALLVARIANTS": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_MAKEEXAMPLES": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_POSTPROCESSVARIANTS": { + "deepvariant": "1.9.0" + }, + "GERMLINE_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "LONGPHASE_HAPLOTAG": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_SOMATIC": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_SOMATIC": { + "longphase": "2.0.1" + }, + "METAEXTRACT": { + "samtools": 1.21 + }, + "MINIMAP2_ALIGN": { + "minimap2": "2.29-r1283" + }, + "MOSDEPTH": { + "mosdepth": "0.3.11" + }, + "NANOPLOT_POST": { + "nanoplot": "1.46.1" + }, + "NANOPLOT_PRE": { + "nanoplot": "1.46.1" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": "1.22.1" + }, + "SAMTOOLS_IDXSTATS": { + "samtools": "1.22.1" + }, + "SAMTOOLS_INDEX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_STATS": { + "samtools": "1.22.1" + }, + "SEVERUS": { + "severus": 1.6 + }, + "SOMATIC_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "SORT_POST_NORM": { + "bcftools": 1.22 + }, + "SV_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "UNTAR": { + "untar": 1.34 + }, + "UNZIP_FASTA": { + "pigz": 2.8 + }, + "VCFSPLIT": { + "bcftools": 1.2 + }, + "WGET": { + "wget": "1.21.4" + }, + "WHATSHAP_STATS": { + "whatshap": 2.8 + }, + "Workflow": { + "IntGenomicsLab/lrsomatic": "v1.1.0dev" + } + }, + [ + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", + "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", + "multiqc/multiqc_data/mosdepth_cov_dist.txt", + "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", + "multiqc/multiqc_data/mosdepth_perchrom.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/multiqc_whatshap_phased_bp_plot.txt", + "multiqc/multiqc_data/multiqc_whatshap_stats.txt", + "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", + "multiqc/multiqc_data/samtools-flagstat-table.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_data/whatshap-stats-table.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/pdf/multiqc_whatshap_phased_bp_plot.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/whatshap-stats-table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", + "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/png/multiqc_whatshap_phased_bp_plot.png", + "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", + "multiqc/multiqc_plots/png/samtools-flagstat-table.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-stats-dp.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", + "multiqc/multiqc_plots/png/whatshap-stats-table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", + "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_plots/svg/multiqc_whatshap_phased_bp_plot.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", + "multiqc/multiqc_plots/svg/whatshap-stats-table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/lrsomatic_software_mqc_versions.yml", + "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", + "sample1/qc", + "sample1/qc/normal", + "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1_normal_cramino.txt", + "sample1/qc/normal/cramino_ubam_rep1", + "sample1/qc/normal/cramino_ubam_rep1/sample1_normal_cramino.txt", + "sample1/qc/normal/mosdepth", + "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/nanoplot_aln", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoStats.txt", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Yield_By_Length.html", + "sample1/qc/normal/nanoplot_ubam_rep1", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_NanoStats.txt", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Yield_By_Length.html", + "sample1/qc/normal/samtools", + "sample1/qc/normal/samtools/sample1.flagstat", + "sample1/qc/normal/samtools/sample1.idxstats", + "sample1/qc/normal/samtools/sample1.stats", + "sample1/qc/tumor", + "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1_tumor_cramino.txt", + "sample1/qc/tumor/cramino_ubam_rep1", + "sample1/qc/tumor/cramino_ubam_rep1/sample1_tumor_cramino.txt", + "sample1/qc/tumor/mosdepth", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/tumor/nanoplot_aln", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoStats.txt", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Yield_By_Length.html", + "sample1/qc/tumor/nanoplot_ubam_rep1", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_NanoStats.txt", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Yield_By_Length.html", + "sample1/qc/tumor/samtools", + "sample1/qc/tumor/samtools/sample1.flagstat", + "sample1/qc/tumor/samtools/sample1.idxstats", + "sample1/qc/tumor/samtools/sample1.stats", + "sample1/qc/whatshap_stats", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.gtf", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.log", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.tsv", + "sample1/variants", + "sample1/variants/clair3", + "sample1/variants/clair3/merge_output.vcf.gz", + "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", + "sample1/variants/clairs/snvs.vcf.gz", + "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/deepsomatic", + "sample1/variants/deepsomatic/sample1_somatic.vcf.gz", + "sample1/variants/deepsomatic/sample1_somatic.vcf.gz.tbi", + "sample1/variants/deepvariant", + "sample1/variants/deepvariant/sample1_germline.vcf.gz", + "sample1/variants/deepvariant/sample1_germline.vcf.gz.tbi", + "sample1/variants/phased", + "sample1/variants/phased/germline_smallvariants.vcf.gz", + "sample1/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample1/variants/phased/somatic_smallvariants.vcf.gz", + "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/vep/germline", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", + "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", + "sample2/qc", + "sample2/qc/normal", + "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2_normal_cramino.txt", + "sample2/qc/normal/cramino_ubam_rep1", + "sample2/qc/normal/cramino_ubam_rep1/sample2_normal_cramino.txt", + "sample2/qc/normal/mosdepth", + "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/nanoplot_aln", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoStats.txt", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Yield_By_Length.html", + "sample2/qc/normal/nanoplot_ubam_rep1", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_NanoStats.txt", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Yield_By_Length.html", + "sample2/qc/normal/samtools", + "sample2/qc/normal/samtools/sample2.flagstat", + "sample2/qc/normal/samtools/sample2.idxstats", + "sample2/qc/normal/samtools/sample2.stats", + "sample2/qc/tumor", + "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2_tumor_cramino.txt", + "sample2/qc/tumor/cramino_ubam_rep1", + "sample2/qc/tumor/cramino_ubam_rep1/sample2_tumor_cramino.txt", + "sample2/qc/tumor/mosdepth", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/nanoplot_aln", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoStats.txt", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Yield_By_Length.html", + "sample2/qc/tumor/nanoplot_ubam_rep1", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_NanoStats.txt", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Yield_By_Length.html", + "sample2/qc/tumor/samtools", + "sample2/qc/tumor/samtools/sample2.flagstat", + "sample2/qc/tumor/samtools/sample2.idxstats", + "sample2/qc/tumor/samtools/sample2.stats", + "sample2/qc/whatshap_stats", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.gtf", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.log", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.tsv", + "sample2/variants", + "sample2/variants/clair3", + "sample2/variants/clair3/merge_output.vcf.gz", + "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", + "sample2/variants/clairs/snvs.vcf.gz", + "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/deepsomatic", + "sample2/variants/deepsomatic/sample2_somatic.vcf.gz", + "sample2/variants/deepsomatic/sample2_somatic.vcf.gz.tbi", + "sample2/variants/deepvariant", + "sample2/variants/deepvariant/sample2_germline.vcf.gz", + "sample2/variants/deepvariant/sample2_germline.vcf.gz.tbi", + "sample2/variants/phased", + "sample2/variants/phased/germline_smallvariants.vcf.gz", + "sample2/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample2/variants/phased/somatic_smallvariants.vcf.gz", + "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/vep/germline", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", + "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", + "sample3/qc", + "sample3/qc/tumor", + "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3_tumor_cramino.txt", + "sample3/qc/tumor/cramino_ubam_rep1", + "sample3/qc/tumor/cramino_ubam_rep1/sample3_tumor_cramino.txt", + "sample3/qc/tumor/mosdepth", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/nanoplot_aln", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoStats.txt", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Yield_By_Length.html", + "sample3/qc/tumor/nanoplot_ubam_rep1", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_NanoStats.txt", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Yield_By_Length.html", + "sample3/qc/tumor/samtools", + "sample3/qc/tumor/samtools/sample3.flagstat", + "sample3/qc/tumor/samtools/sample3.idxstats", + "sample3/qc/tumor/samtools/sample3.stats", + "sample3/qc/whatshap_stats", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.gtf", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.log", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.tsv", + "sample3/variants", + "sample3/variants/clairsto", + "sample3/variants/clairsto/germline.vcf.gz", + "sample3/variants/clairsto/germline.vcf.gz.tbi", + "sample3/variants/clairsto/indel.vcf.gz", + "sample3/variants/clairsto/indel.vcf.gz.tbi", + "sample3/variants/clairsto/snv.vcf.gz", + "sample3/variants/clairsto/snv.vcf.gz.tbi", + "sample3/variants/clairsto/somatic.vcf.gz", + "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/deepsomatic", + "sample3/variants/deepsomatic/sample3_somatic.vcf.gz", + "sample3/variants/deepsomatic/sample3_somatic.vcf.gz.tbi", + "sample3/variants/deepvariant", + "sample3/variants/deepvariant/sample3_germline.vcf.gz", + "sample3/variants/deepvariant/sample3_germline.vcf.gz.tbi", + "sample3/variants/phased", + "sample3/variants/phased/germline_smallvariants.vcf.gz", + "sample3/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample3/variants/phased/somatic_smallvariants.vcf.gz", + "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/vep/germline", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/vep/somatic", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" + ], + [ + "sample1_normal.bam:md5,93dd8ac8b67eb4eb4bf27e09c8f5f99b", + "sample1_normal.bam.bai:md5,75402ef1cc35229cc131155d9ec973e0", + "sample1_tumor.bam:md5,69cba03cad51bcc1d1ee8c48da042527", + "sample1_tumor.bam.bai:md5,5d633ed05021ad81ce24b1f18cbf38b4", + "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", + "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", + "sample1.stats:md5,a8b3fba9c54efbc0934d6eacc1807140", + "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample1.stats:md5,1c60a1d249d2e503b0678c72e851ea93", + "sample1_whatshap_stats.gtf:md5,9f09f9ad1a788384cb8e46a933f77b3b", + "sample1_whatshap_stats.log:md5,20135b4e9965a31d3f9bb0df7d2cec90", + "sample1_whatshap_stats.tsv:md5,264d2d76a9b8d34ea4933aee325ce36e", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,47cb0e0bbe71abdbf4f40217dfda43f9", + "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample2_normal.bam:md5,f2ba30d007c521d479c6158e1e22367a", + "sample2_normal.bam.bai:md5,c3096f52115ec1e24c46fedc41f1f3d3", + "sample2_tumor.bam:md5,1c0287d24fa5b25b86e48024f2f55031", + "sample2_tumor.bam.bai:md5,62849cea5a005e3d8dbe8f9edcefaf60", + "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", + "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", + "sample2.stats:md5,20c47cb94f9ac739d69c57be6daf82c5", + "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", + "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", + "sample2.stats:md5,8635df10132c85a13f2d9878b7cf90a2", + "sample2_whatshap_stats.gtf:md5,f15fb43f0af73d02fc73b66fdc12d5d8", + "sample2_whatshap_stats.log:md5,ca87088fc2f11665eca3fb9c80489085", + "sample2_whatshap_stats.tsv:md5,ca53f81e39bf5d46aa4f604216add1f6", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,48baac86492026a4a7947bc708c47e6e", + "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample3_tumor.bam:md5,3c995151bdd974df5bf61d08606d54d3", + "sample3_tumor.bam.bai:md5,9d5964ef8f44127a7d9162d628e2407d", + "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample3.stats:md5,ecd5ea4fee37379dd5c5ae3e89dfddda", + "sample3_whatshap_stats.gtf:md5,46a97067376b06b476d180709bc9e3d8", + "sample3_whatshap_stats.log:md5,376254ec9c98f9ba204895e7085516ed", + "sample3_whatshap_stats.tsv:md5,f7cc79156f23e884ead18e50b8434dbf", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,56e899f85876cee082788927d0f89c5f", + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-05-12T14:52:58.254768587" + } +} \ No newline at end of file diff --git a/tests/deep_only.nf.test b/tests/deep_only.nf.test new file mode 100644 index 00000000..7e41e58f --- /dev/null +++ b/tests/deep_only.nf.test @@ -0,0 +1,108 @@ +nextflow_pipeline { + + name "Test pipeline - deep callers only" + script "../main.nf" + tag "pipeline" + tag "extended" + + test("-profile test, germline_var_keep=['deepvariant'], somatic_var_keep=['deepsomatic']") { + + when { + params { + outdir = "$outputDir" + germline_var_keep = ['deepvariant'] + somatic_var_keep = ['deepsomatic'] + } + } + + then { + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success }, + + // ── Deep caller outputs MUST exist ─────────────────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + assert file("$launchDir/output/${s}/variants/deepvariant/${s}_germline.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/deepvariant/${s}_germline.vcf.gz.tbi").exists() + assert file("$launchDir/output/${s}/variants/deepsomatic/${s}_somatic.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/deepsomatic/${s}_somatic.vcf.gz.tbi").exists() + } + }, + + // ── Clair caller outputs must NOT exist ────────────────────── + { + ['sample1', 'sample2'].each { s -> + assert !file("$launchDir/output/${s}/variants/clair3/merge_output.vcf.gz").exists() + assert !file("$launchDir/output/${s}/variants/clairs/indel.vcf.gz").exists() + } + assert !file("$launchDir/output/sample3/variants/clairsto/indel.vcf.gz").exists() + assert !file("$launchDir/output/sample3/variants/clairsto/somatic.vcf.gz").exists() + }, + + // ── Phased VCFs exist and have data ────────────────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + def germline = file("$launchDir/output/${s}/variants/phased/germline_smallvariants.vcf.gz") + def somatic = file("$launchDir/output/${s}/variants/phased/somatic_smallvariants.vcf.gz") + assert germline.exists() + assert somatic.exists() + assert germline.size() > 0 + assert somatic.size() > 0 + } + }, + + // ── BAM files ──────────────────────────────────────────────── + { + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam.bai").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_normal.bam").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_normal.bam.bai").exists() + } + assert file("$launchDir/output/sample3/bamfiles/sample3_tumor.bam").exists() + assert file("$launchDir/output/sample3/bamfiles/sample3_tumor.bam.bai").exists() + }, + + // ── Severus SV outputs for paired samples ──────────────────── + { + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/variants/severus/somatic_SVs/severus_somatic.vcf.gz").exists() + } + }, + + // ── QC outputs ─────────────────────────────────────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + def types = (s in ['sample1', 'sample2']) ? ['tumor', 'normal'] : ['tumor'] + types.each { t -> + assert file("$launchDir/output/${s}/qc/${t}/cramino_aln").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/nanoplot_aln").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/mosdepth").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/samtools").isDirectory() + } + } + }, + + // ── VEP annotation outputs ─────────────────────────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + assert file("$launchDir/output/${s}/vep/germline").isDirectory() + assert file("$launchDir/output/${s}/vep/somatic").isDirectory() + } + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/vep/SVs").isDirectory() + } + }, + + // ── Snapshot ───────────────────────────────────────────────── + { assert snapshot( + removeNextflowVersion("$outputDir/pipeline_info/lrsomatic_software_mqc_versions.yml"), + stable_name, + stable_path + ).match() } + ) + } + } +} diff --git a/tests/deep_only.nf.test.snap b/tests/deep_only.nf.test.snap new file mode 100644 index 00000000..b769d383 --- /dev/null +++ b/tests/deep_only.nf.test.snap @@ -0,0 +1,569 @@ +{ + "-profile test, germline_var_keep=['deepvariant'], somatic_var_keep=['deepsomatic']": { + "content": [ + { + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, + "BCFTOOLS_VIEW": { + "bcftools": 1.22 + }, + "CRAMINO_POST": { + "cramino": "1.3.0" + }, + "CRAMINO_PRE": { + "cramino": "1.3.0" + }, + "DEEPSOMATIC_CALLVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_MAKEEXAMPLES": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_POSTPROCESSVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPVARIANT_CALLVARIANTS": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_MAKEEXAMPLES": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_POSTPROCESSVARIANTS": { + "deepvariant": "1.9.0" + }, + "GERMLINE_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "LONGPHASE_HAPLOTAG": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_SOMATIC": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_SOMATIC": { + "longphase": "2.0.1" + }, + "METAEXTRACT": { + "samtools": 1.21 + }, + "MINIMAP2_ALIGN": { + "minimap2": "2.29-r1283" + }, + "MOSDEPTH": { + "mosdepth": "0.3.11" + }, + "NANOPLOT_POST": { + "nanoplot": "1.46.1" + }, + "NANOPLOT_PRE": { + "nanoplot": "1.46.1" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": "1.22.1" + }, + "SAMTOOLS_IDXSTATS": { + "samtools": "1.22.1" + }, + "SAMTOOLS_INDEX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_STATS": { + "samtools": "1.22.1" + }, + "SEVERUS": { + "severus": 1.6 + }, + "SOMATIC_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "SV_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "UNTAR": { + "untar": 1.34 + }, + "UNZIP_FASTA": { + "pigz": 2.8 + }, + "WGET": { + "wget": "1.21.4" + }, + "WHATSHAP_STATS": { + "whatshap": 2.8 + }, + "Workflow": { + "IntGenomicsLab/lrsomatic": "v1.1.0dev" + } + }, + [ + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", + "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", + "multiqc/multiqc_data/mosdepth_cov_dist.txt", + "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", + "multiqc/multiqc_data/mosdepth_perchrom.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/multiqc_whatshap_phased_bp_plot.txt", + "multiqc/multiqc_data/multiqc_whatshap_stats.txt", + "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", + "multiqc/multiqc_data/samtools-flagstat-table.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_data/whatshap-stats-table.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/pdf/multiqc_whatshap_phased_bp_plot.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/whatshap-stats-table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", + "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/png/multiqc_whatshap_phased_bp_plot.png", + "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", + "multiqc/multiqc_plots/png/samtools-flagstat-table.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-stats-dp.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", + "multiqc/multiqc_plots/png/whatshap-stats-table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", + "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_plots/svg/multiqc_whatshap_phased_bp_plot.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", + "multiqc/multiqc_plots/svg/whatshap-stats-table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/lrsomatic_software_mqc_versions.yml", + "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", + "sample1/qc", + "sample1/qc/normal", + "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1_normal_cramino.txt", + "sample1/qc/normal/cramino_ubam_rep1", + "sample1/qc/normal/cramino_ubam_rep1/sample1_normal_cramino.txt", + "sample1/qc/normal/mosdepth", + "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/nanoplot_aln", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoStats.txt", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Yield_By_Length.html", + "sample1/qc/normal/nanoplot_ubam_rep1", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_NanoStats.txt", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Yield_By_Length.html", + "sample1/qc/normal/samtools", + "sample1/qc/normal/samtools/sample1.flagstat", + "sample1/qc/normal/samtools/sample1.idxstats", + "sample1/qc/normal/samtools/sample1.stats", + "sample1/qc/tumor", + "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1_tumor_cramino.txt", + "sample1/qc/tumor/cramino_ubam_rep1", + "sample1/qc/tumor/cramino_ubam_rep1/sample1_tumor_cramino.txt", + "sample1/qc/tumor/mosdepth", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/tumor/nanoplot_aln", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoStats.txt", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Yield_By_Length.html", + "sample1/qc/tumor/nanoplot_ubam_rep1", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_NanoStats.txt", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Yield_By_Length.html", + "sample1/qc/tumor/samtools", + "sample1/qc/tumor/samtools/sample1.flagstat", + "sample1/qc/tumor/samtools/sample1.idxstats", + "sample1/qc/tumor/samtools/sample1.stats", + "sample1/qc/whatshap_stats", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.gtf", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.log", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.tsv", + "sample1/variants", + "sample1/variants/deepsomatic", + "sample1/variants/deepsomatic/sample1_somatic.vcf.gz", + "sample1/variants/deepsomatic/sample1_somatic.vcf.gz.tbi", + "sample1/variants/deepvariant", + "sample1/variants/deepvariant/sample1_germline.vcf.gz", + "sample1/variants/deepvariant/sample1_germline.vcf.gz.tbi", + "sample1/variants/phased", + "sample1/variants/phased/germline_smallvariants.vcf.gz", + "sample1/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample1/variants/phased/somatic_smallvariants.vcf.gz", + "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/vep/germline", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", + "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", + "sample2/qc", + "sample2/qc/normal", + "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2_normal_cramino.txt", + "sample2/qc/normal/cramino_ubam_rep1", + "sample2/qc/normal/cramino_ubam_rep1/sample2_normal_cramino.txt", + "sample2/qc/normal/mosdepth", + "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/nanoplot_aln", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoStats.txt", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Yield_By_Length.html", + "sample2/qc/normal/nanoplot_ubam_rep1", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_NanoStats.txt", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Yield_By_Length.html", + "sample2/qc/normal/samtools", + "sample2/qc/normal/samtools/sample2.flagstat", + "sample2/qc/normal/samtools/sample2.idxstats", + "sample2/qc/normal/samtools/sample2.stats", + "sample2/qc/tumor", + "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2_tumor_cramino.txt", + "sample2/qc/tumor/cramino_ubam_rep1", + "sample2/qc/tumor/cramino_ubam_rep1/sample2_tumor_cramino.txt", + "sample2/qc/tumor/mosdepth", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/nanoplot_aln", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoStats.txt", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Yield_By_Length.html", + "sample2/qc/tumor/nanoplot_ubam_rep1", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_NanoStats.txt", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Yield_By_Length.html", + "sample2/qc/tumor/samtools", + "sample2/qc/tumor/samtools/sample2.flagstat", + "sample2/qc/tumor/samtools/sample2.idxstats", + "sample2/qc/tumor/samtools/sample2.stats", + "sample2/qc/whatshap_stats", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.gtf", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.log", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.tsv", + "sample2/variants", + "sample2/variants/deepsomatic", + "sample2/variants/deepsomatic/sample2_somatic.vcf.gz", + "sample2/variants/deepsomatic/sample2_somatic.vcf.gz.tbi", + "sample2/variants/deepvariant", + "sample2/variants/deepvariant/sample2_germline.vcf.gz", + "sample2/variants/deepvariant/sample2_germline.vcf.gz.tbi", + "sample2/variants/phased", + "sample2/variants/phased/germline_smallvariants.vcf.gz", + "sample2/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample2/variants/phased/somatic_smallvariants.vcf.gz", + "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/vep/germline", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", + "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", + "sample3/qc", + "sample3/qc/tumor", + "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3_tumor_cramino.txt", + "sample3/qc/tumor/cramino_ubam_rep1", + "sample3/qc/tumor/cramino_ubam_rep1/sample3_tumor_cramino.txt", + "sample3/qc/tumor/mosdepth", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/nanoplot_aln", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoStats.txt", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Yield_By_Length.html", + "sample3/qc/tumor/nanoplot_ubam_rep1", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_NanoStats.txt", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Yield_By_Length.html", + "sample3/qc/tumor/samtools", + "sample3/qc/tumor/samtools/sample3.flagstat", + "sample3/qc/tumor/samtools/sample3.idxstats", + "sample3/qc/tumor/samtools/sample3.stats", + "sample3/qc/whatshap_stats", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.gtf", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.log", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.tsv", + "sample3/variants", + "sample3/variants/deepsomatic", + "sample3/variants/deepsomatic/sample3_somatic.vcf.gz", + "sample3/variants/deepsomatic/sample3_somatic.vcf.gz.tbi", + "sample3/variants/deepvariant", + "sample3/variants/deepvariant/sample3_germline.vcf.gz", + "sample3/variants/deepvariant/sample3_germline.vcf.gz.tbi", + "sample3/variants/phased", + "sample3/variants/phased/germline_smallvariants.vcf.gz", + "sample3/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample3/variants/phased/somatic_smallvariants.vcf.gz", + "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/vep/germline", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/vep/somatic", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" + ], + [ + "sample1_normal.bam:md5,c3eec48a64763f8a5cc7307c5fe00773", + "sample1_normal.bam.bai:md5,ddb44b5bfb0f798950d8872e9d60d784", + "sample1_tumor.bam:md5,8173a435625724d6192ff6a0e9e737bb", + "sample1_tumor.bam.bai:md5,1de9940795d293f650a22c6983b2a072", + "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", + "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", + "sample1.stats:md5,a8b3fba9c54efbc0934d6eacc1807140", + "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample1.stats:md5,1c60a1d249d2e503b0678c72e851ea93", + "sample1_whatshap_stats.gtf:md5,e1d0e87353a5f9aed8a9ac4bf7973427", + "sample1_whatshap_stats.log:md5,bd6b83a062e22cd3201523dc4c2c13e7", + "sample1_whatshap_stats.tsv:md5,7a1508751cb1daa841a577ae25f55586", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,47cb0e0bbe71abdbf4f40217dfda43f9", + "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample2_normal.bam:md5,cfe03e8510475f54eceea0c0c80db501", + "sample2_normal.bam.bai:md5,02a12e347af31e04ffa589935f89e5ed", + "sample2_tumor.bam:md5,7380c09f2ee3ebe328f1a50671408209", + "sample2_tumor.bam.bai:md5,644083528fd153b24d97ef687417e089", + "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", + "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", + "sample2.stats:md5,20c47cb94f9ac739d69c57be6daf82c5", + "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", + "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", + "sample2.stats:md5,8635df10132c85a13f2d9878b7cf90a2", + "sample2_whatshap_stats.gtf:md5,af33281699a1d0da83fbe7eaff198d03", + "sample2_whatshap_stats.log:md5,bbd9ab2ce07a009d9348a1d78bc6fc70", + "sample2_whatshap_stats.tsv:md5,c65436f930c23ddbfd568532d07dce70", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,48baac86492026a4a7947bc708c47e6e", + "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample3_tumor.bam:md5,965264ef8436cb887ad02c92d40fb50e", + "sample3_tumor.bam.bai:md5,cfc6329667a3c6c66e3c0ca0ace4c6e9", + "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample3.stats:md5,ecd5ea4fee37379dd5c5ae3e89dfddda", + "sample3_whatshap_stats.gtf:md5,f47156e18c490ff9a4e6efd04d43acc5", + "sample3_whatshap_stats.log:md5,4f7648e763004ab764143cb4f8b6499e", + "sample3_whatshap_stats.tsv:md5,4cb58bb3b663aaba23da004d69adab3e", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,56e899f85876cee082788927d0f89c5f", + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-05-12T15:08:08.302153341" + } +} \ No newline at end of file diff --git a/tests/default.nf.test b/tests/default.nf.test index a7a4281c..98934f64 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -3,6 +3,7 @@ nextflow_pipeline { name "Test pipeline" script "../main.nf" tag "pipeline" + tag "small" test("-profile test") { @@ -42,19 +43,6 @@ nextflow_pipeline { assert file("$launchDir/output/sample3/variants/clairsto/snv.vcf.gz").exists() assert file("$launchDir/output/sample3/variants/clairsto/somatic.vcf.gz").exists() assert file("$launchDir/output/sample3/variants/clairsto/germline.vcf.gz").exists() - assert file("$launchDir/output/sample1/variants/deepvariant/sample1.vcf.gz").exists() - assert file("$launchDir/output/sample1/variants/deepvariant/sample1.vcf.gz.tbi").exists() - assert file("$launchDir/output/sample2/variants/deepvariant/sample2.vcf.gz").exists() - assert file("$launchDir/output/sample2/variants/deepvariant/sample2.vcf.gz.tbi").exists() - assert file("$launchDir/output/sample3/variants/deepvariant/sample3.vcf.gz").exists() - assert file("$launchDir/output/sample3/variants/deepvariant/sample3.vcf.gz.tbi").exists() - assert file("$launchDir/output/sample1/variants/deepsomatic/sample1.vcf.gz").exists() - assert file("$launchDir/output/sample1/variants/deepsomatic/sample1.vcf.gz.tbi").exists() - assert file("$launchDir/output/sample2/variants/deepsomatic/sample2.vcf.gz").exists() - assert file("$launchDir/output/sample2/variants/deepsomatic/sample2.vcf.gz.tbi").exists() - assert file("$launchDir/output/sample3/variants/deepsomatic/sample3.vcf.gz").exists() - assert file("$launchDir/output/sample3/variants/deepsomatic/sample3.vcf.gz.tbi").exists() - }, { assert snapshot( // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index fe5bf271..be6ecba2 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -2,22 +2,13 @@ "-profile test": { "content": [ { - "BCFTOOLS_ANNOTATE": { - "bcftools": 1.22 - }, "BCFTOOLS_CONCAT": { "bcftools": 1.22 }, - "BCFTOOLS_ISEC": { - "bcftools": 1.22 - }, - "BCFTOOLS_NORM": { - "bcftools": 1.22 - }, - "BCFTOOLS_QUERY": { + "BCFTOOLS_SORT": { "bcftools": 1.22 }, - "BCFTOOLS_SORT": { + "BCFTOOLS_VIEW": { "bcftools": 1.22 }, "CLAIR3": { @@ -35,24 +26,6 @@ "CRAMINO_PRE": { "cramino": "1.3.0" }, - "DEEPSOMATIC_CALLVARIANTS": { - "deepsomatic": "1.7.0" - }, - "DEEPSOMATIC_MAKEEXAMPLES": { - "deepsomatic": "1.7.0" - }, - "DEEPSOMATIC_POSTPROCESSVARIANTS": { - "deepsomatic": "1.7.0" - }, - "DEEPVARIANT_CALLVARIANTS": { - "deepvariant": "1.9.0" - }, - "DEEPVARIANT_MAKEEXAMPLES": { - "deepvariant": "1.9.0" - }, - "DEEPVARIANT_POSTPROCESSVARIANTS": { - "deepvariant": "1.9.0" - }, "GERMLINE_VEP": { "ensemblvep": 115.2, "perl-math-cdf": 0.1, @@ -111,12 +84,6 @@ "perl-math-cdf": 0.1, "tabix": 1.21 }, - "SORT_POST_NORM": { - "bcftools": 1.22 - }, - "STANDARDIZE_AF": { - "bcftools": 1.22 - }, "SV_VEP": { "ensemblvep": 115.2, "perl-math-cdf": 0.1, @@ -307,12 +274,6 @@ "sample1/variants/clairs/indel.vcf.gz.tbi", "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", - "sample1/variants/deepsomatic", - "sample1/variants/deepsomatic/sample1.vcf.gz", - "sample1/variants/deepsomatic/sample1.vcf.gz.tbi", - "sample1/variants/deepvariant", - "sample1/variants/deepvariant/sample1.vcf.gz", - "sample1/variants/deepvariant/sample1.vcf.gz.tbi", "sample1/variants/phased", "sample1/variants/phased/germline_smallvariants.vcf.gz", "sample1/variants/phased/germline_smallvariants.vcf.gz.tbi", @@ -320,8 +281,6 @@ "sample1/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", "sample1/variants/phased/somatic_smallvariants.vcf.gz", "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", - "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz", - "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", "sample1/variants/severus", "sample1/variants/severus/all_SVs", "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", @@ -430,12 +389,6 @@ "sample2/variants/clairs/indel.vcf.gz.tbi", "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", - "sample2/variants/deepsomatic", - "sample2/variants/deepsomatic/sample2.vcf.gz", - "sample2/variants/deepsomatic/sample2.vcf.gz.tbi", - "sample2/variants/deepvariant", - "sample2/variants/deepvariant/sample2.vcf.gz", - "sample2/variants/deepvariant/sample2.vcf.gz.tbi", "sample2/variants/phased", "sample2/variants/phased/germline_smallvariants.vcf.gz", "sample2/variants/phased/germline_smallvariants.vcf.gz.tbi", @@ -443,8 +396,6 @@ "sample2/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", "sample2/variants/phased/somatic_smallvariants.vcf.gz", "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", - "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz", - "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", "sample2/variants/severus", "sample2/variants/severus/all_SVs", "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", @@ -521,12 +472,6 @@ "sample3/variants/clairsto/snv.vcf.gz.tbi", "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", - "sample3/variants/deepsomatic", - "sample3/variants/deepsomatic/sample3.vcf.gz", - "sample3/variants/deepsomatic/sample3.vcf.gz.tbi", - "sample3/variants/deepvariant", - "sample3/variants/deepvariant/sample3.vcf.gz", - "sample3/variants/deepvariant/sample3.vcf.gz.tbi", "sample3/variants/phased", "sample3/variants/phased/germline_smallvariants.vcf.gz", "sample3/variants/phased/germline_smallvariants.vcf.gz.tbi", @@ -534,8 +479,6 @@ "sample3/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", "sample3/variants/phased/somatic_smallvariants.vcf.gz", "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", - "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz", - "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", "sample3/variants/severus", "sample3/variants/severus/all_SVs", "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", @@ -564,56 +507,56 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,3ce847c38eb619781e32a10c28e0c35c", - "sample1_normal.bam.bai:md5,8dd8c7fa037badc7097067d5a88672cd", - "sample1_tumor.bam:md5,ed5eb35b63d5e92fa8e461b9a1732b21", - "sample1_tumor.bam.bai:md5,21018d3f1f85be74fd7dc66873219b05", + "sample1_normal.bam:md5,772e41f7cd86c03a22afbe5ec0592a6b", + "sample1_normal.bam.bai:md5,1b501f6a11efe5d2e6f47b7f1523220b", + "sample1_tumor.bam:md5,c8315c80dc92dfb5d874aef3f5dd46fb", + "sample1_tumor.bam.bai:md5,bc35f807be4b93fc795a14d701469367", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", - "sample1.stats:md5,70fabbdc07dec0479b3fc7dcec344054", + "sample1.stats:md5,a8b3fba9c54efbc0934d6eacc1807140", "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", - "sample1.stats:md5,5012c82d3d3ca60ffdd2fb970f772566", - "sample1_whatshap_stats.gtf:md5,428ca0e0f48dc2e3e1b978fa7cf720f3", - "sample1_whatshap_stats.log:md5,5c1f0f79a60a6879b75271fa94b620e8", - "sample1_whatshap_stats.tsv:md5,98582c7e0ff74a2a1978bf70ac9926ee", + "sample1.stats:md5,1c60a1d249d2e503b0678c72e851ea93", + "sample1_whatshap_stats.gtf:md5,eff050a68e36e778b06e0ec19435c569", + "sample1_whatshap_stats.log:md5,76b73731f74fe32ef2d11f6bb0a0f71a", + "sample1_whatshap_stats.tsv:md5,f566ae25b3c5a8f7e94b3d6c1b0417f8", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,27b409c73dd0d8bde316545f86ac7f15", - "read_qual.txt:md5,fbe6cd0b65cbfc1ca699e252e531ab72", + "breakpoints_double.csv:md5,47cb0e0bbe71abdbf4f40217dfda43f9", + "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample2_normal.bam:md5,2ecddb6279310240f2dc29b0cf7f8c84", - "sample2_normal.bam.bai:md5,9caebccee8882bcf95e65631c0ac6730", - "sample2_tumor.bam:md5,c8db7cc4b189dec3fadd2cce07d9fcae", - "sample2_tumor.bam.bai:md5,28827d78aa318e26f71b68581ed5c607", + "sample2_normal.bam:md5,3157bd11ba095a884c7951aafcfcfb1c", + "sample2_normal.bam.bai:md5,edebda44c4383173caea728acde4ac43", + "sample2_tumor.bam:md5,47b2c5f86e0493ba94ff72cea77eeae3", + "sample2_tumor.bam.bai:md5,abf2c290c815f54c2b3f8179f717d9bd", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", - "sample2.stats:md5,87cb6e9adf8a133244e8b331be43bb14", + "sample2.stats:md5,20c47cb94f9ac739d69c57be6daf82c5", "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", - "sample2.stats:md5,1e044857eeefb284fda88ee58ff7a04a", - "sample2_whatshap_stats.gtf:md5,a13f0ac1edd7abde4ad013bf2619fe0f", - "sample2_whatshap_stats.log:md5,1d5ed1faca328d3014e9b14a44d18a23", - "sample2_whatshap_stats.tsv:md5,a275209ef9e7885ee5ea3a4aa1c970fd", + "sample2.stats:md5,8635df10132c85a13f2d9878b7cf90a2", + "sample2_whatshap_stats.gtf:md5,4d8f4393e3aebe4e945c0b8236cf3b3e", + "sample2_whatshap_stats.log:md5,10bba7bae6dd99b989ece5e5dac7a8f9", + "sample2_whatshap_stats.tsv:md5,bb46226e486af9026ab76e014624e903", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,7d2fe02046bd2ff7138b46d8f67fc755", - "read_qual.txt:md5,fe3f87458d7c0c6591c37e1fd70cecf2", + "breakpoints_double.csv:md5,48baac86492026a4a7947bc708c47e6e", + "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,f5dfadf92345cd529de4c1919f82b632", - "sample3_tumor.bam.bai:md5,f8ca34c0584329c62cb70ce8fb942cb6", + "sample3_tumor.bam:md5,3c995151bdd974df5bf61d08606d54d3", + "sample3_tumor.bam.bai:md5,9d5964ef8f44127a7d9162d628e2407d", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", - "sample3.stats:md5,d7a8552a8a41a217954a0c825d468a60", - "sample3_whatshap_stats.gtf:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample3_whatshap_stats.log:md5,ca067293878d1760638626a8c5a31432", - "sample3_whatshap_stats.tsv:md5,62beceb9731cafc620ce5c6eb07a9cc9", + "sample3.stats:md5,ecd5ea4fee37379dd5c5ae3e89dfddda", + "sample3_whatshap_stats.gtf:md5,46a97067376b06b476d180709bc9e3d8", + "sample3_whatshap_stats.log:md5,376254ec9c98f9ba204895e7085516ed", + "sample3_whatshap_stats.tsv:md5,f7cc79156f23e884ead18e50b8434dbf", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,a9a0e0a75975904952788c2a0bd3fa85", - "read_qual.txt:md5,25efaa43bb81a4592bfb8f5f08f84b34", + "breakpoints_double.csv:md5,56e899f85876cee082788927d0f89c5f", + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] @@ -622,6 +565,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-04-27T21:19:25.811843046" + "timestamp": "2026-05-12T15:23:24.718538649" } } \ No newline at end of file diff --git a/tests/union.nf.test b/tests/union.nf.test new file mode 100644 index 00000000..e48ea589 --- /dev/null +++ b/tests/union.nf.test @@ -0,0 +1,118 @@ +nextflow_pipeline { + + name "Test pipeline - both callers, union combine mode" + script "../main.nf" + tag "pipeline" + tag "extended" + + test("-profile test, union combine mode") { + + when { + params { + outdir = "$outputDir" + germline_var_combine = 'all' + somatic_var_combine = 'all' + germline_var_keep = ['clair', 'deepvariant'] + somatic_var_keep = ['clair', 'deepsomatic'] + } + } + + then { + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success }, + + // ── Both caller raw outputs MUST exist ─────────────────────── + { // DeepVariant germline outputs + ['sample1', 'sample2', 'sample3'].each { s -> + assert file("$launchDir/output/${s}/variants/deepvariant/${s}_germline.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/deepvariant/${s}_germline.vcf.gz.tbi").exists() + } + }, + { // DeepSomatic somatic outputs + ['sample1', 'sample2', 'sample3'].each { s -> + assert file("$launchDir/output/${s}/variants/deepsomatic/${s}_somatic.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/deepsomatic/${s}_somatic.vcf.gz.tbi").exists() + } + }, + { // Clair germline outputs (paired: clair3, tumor-only: clairsto) + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/variants/clair3/merge_output.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clair3/merge_output.vcf.gz.tbi").exists() + } + assert file("$launchDir/output/sample3/variants/clairsto/germline.vcf.gz").exists() + }, + { // Clair somatic outputs (paired: clairs, tumor-only: clairsto) + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/variants/clairs/indel.vcf.gz").exists() + assert file("$launchDir/output/${s}/variants/clairs/snvs.vcf.gz").exists() + } + assert file("$launchDir/output/sample3/variants/clairsto/somatic.vcf.gz").exists() + }, + + // ── Phased union VCFs exist and have data ──────────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + def germline = file("$launchDir/output/${s}/variants/phased/germline_smallvariants.vcf.gz") + def somatic = file("$launchDir/output/${s}/variants/phased/somatic_smallvariants.vcf.gz") + assert germline.exists() + assert somatic.exists() + assert germline.size() > 0 + assert somatic.size() > 0 + } + }, + + // ── BAM files ──────────────────────────────────────────────── + { + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_tumor.bam.bai").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_normal.bam").exists() + assert file("$launchDir/output/${s}/bamfiles/${s}_normal.bam.bai").exists() + } + assert file("$launchDir/output/sample3/bamfiles/sample3_tumor.bam").exists() + assert file("$launchDir/output/sample3/bamfiles/sample3_tumor.bam.bai").exists() + }, + + // ── Severus ────────────────────────────────────────────────── + { + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/variants/severus/somatic_SVs/severus_somatic.vcf.gz").exists() + } + }, + + // ── QC outputs ─────────────────────────────────────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + def types = (s in ['sample1', 'sample2']) ? ['tumor', 'normal'] : ['tumor'] + types.each { t -> + assert file("$launchDir/output/${s}/qc/${t}/cramino_aln").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/nanoplot_aln").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/mosdepth").isDirectory() + assert file("$launchDir/output/${s}/qc/${t}/samtools").isDirectory() + } + } + }, + + // ── VEP annotation outputs ─────────────────────────────────── + { + ['sample1', 'sample2', 'sample3'].each { s -> + assert file("$launchDir/output/${s}/vep/germline").isDirectory() + assert file("$launchDir/output/${s}/vep/somatic").isDirectory() + } + ['sample1', 'sample2'].each { s -> + assert file("$launchDir/output/${s}/vep/SVs").isDirectory() + } + }, + + // ── Snapshot ───────────────────────────────────────────────── + { assert snapshot( + removeNextflowVersion("$outputDir/pipeline_info/lrsomatic_software_mqc_versions.yml"), + stable_name, + stable_path + ).match() } + ) + } + } +} diff --git a/tests/union.nf.test.snap b/tests/union.nf.test.snap new file mode 100644 index 00000000..8ab47fb9 --- /dev/null +++ b/tests/union.nf.test.snap @@ -0,0 +1,624 @@ +{ + "-profile test, union combine mode": { + "content": [ + { + "BCFTOOLS_ANNOTATE": { + "bcftools": 1.22 + }, + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_ISEC": { + "bcftools": 1.22 + }, + "BCFTOOLS_NORM": { + "bcftools": 1.22 + }, + "BCFTOOLS_QUERY": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, + "BCFTOOLS_VIEW": { + "bcftools": 1.22 + }, + "CLAIR3": { + "clair3": "1.2.0" + }, + "CLAIRS": { + "clairs": "0.4.4" + }, + "CLAIRSTO": { + "clairsto": "0.4.2" + }, + "CRAMINO_POST": { + "cramino": "1.3.0" + }, + "CRAMINO_PRE": { + "cramino": "1.3.0" + }, + "DEEPSOMATIC_CALLVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_MAKEEXAMPLES": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_POSTPROCESSVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPVARIANT_CALLVARIANTS": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_MAKEEXAMPLES": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_POSTPROCESSVARIANTS": { + "deepvariant": "1.9.0" + }, + "GERMLINE_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "LONGPHASE_HAPLOTAG": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_SOMATIC": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_SOMATIC": { + "longphase": "2.0.1" + }, + "METAEXTRACT": { + "samtools": 1.21 + }, + "MINIMAP2_ALIGN": { + "minimap2": "2.29-r1283" + }, + "MOSDEPTH": { + "mosdepth": "0.3.11" + }, + "NANOPLOT_POST": { + "nanoplot": "1.46.1" + }, + "NANOPLOT_PRE": { + "nanoplot": "1.46.1" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": "1.22.1" + }, + "SAMTOOLS_IDXSTATS": { + "samtools": "1.22.1" + }, + "SAMTOOLS_INDEX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_STATS": { + "samtools": "1.22.1" + }, + "SEVERUS": { + "severus": 1.6 + }, + "SOMATIC_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "SORT_POST_NORM": { + "bcftools": 1.22 + }, + "STANDARDIZE_AF": { + "bcftools": 1.22 + }, + "SV_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "UNTAR": { + "untar": 1.34 + }, + "UNZIP_FASTA": { + "pigz": 2.8 + }, + "VCFSPLIT": { + "bcftools": 1.2 + }, + "WGET": { + "wget": "1.21.4" + }, + "WHATSHAP_STATS": { + "whatshap": 2.8 + }, + "Workflow": { + "IntGenomicsLab/lrsomatic": "v1.1.0dev" + } + }, + [ + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", + "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", + "multiqc/multiqc_data/mosdepth_cov_dist.txt", + "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", + "multiqc/multiqc_data/mosdepth_perchrom.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/multiqc_whatshap_phased_bp_plot.txt", + "multiqc/multiqc_data/multiqc_whatshap_stats.txt", + "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", + "multiqc/multiqc_data/samtools-flagstat-table.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_data/whatshap-stats-table.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/pdf/multiqc_whatshap_phased_bp_plot.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/whatshap-stats-table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", + "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/png/multiqc_whatshap_phased_bp_plot.png", + "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", + "multiqc/multiqc_plots/png/samtools-flagstat-table.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-stats-dp.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", + "multiqc/multiqc_plots/png/whatshap-stats-table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", + "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_plots/svg/multiqc_whatshap_phased_bp_plot.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", + "multiqc/multiqc_plots/svg/whatshap-stats-table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/lrsomatic_software_mqc_versions.yml", + "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", + "sample1/qc", + "sample1/qc/normal", + "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1_normal_cramino.txt", + "sample1/qc/normal/cramino_ubam_rep1", + "sample1/qc/normal/cramino_ubam_rep1/sample1_normal_cramino.txt", + "sample1/qc/normal/mosdepth", + "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/nanoplot_aln", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoStats.txt", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Yield_By_Length.html", + "sample1/qc/normal/nanoplot_ubam_rep1", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_NanoStats.txt", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_rep1/sample1_normal_ubam_Yield_By_Length.html", + "sample1/qc/normal/samtools", + "sample1/qc/normal/samtools/sample1.flagstat", + "sample1/qc/normal/samtools/sample1.idxstats", + "sample1/qc/normal/samtools/sample1.stats", + "sample1/qc/tumor", + "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1_tumor_cramino.txt", + "sample1/qc/tumor/cramino_ubam_rep1", + "sample1/qc/tumor/cramino_ubam_rep1/sample1_tumor_cramino.txt", + "sample1/qc/tumor/mosdepth", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/tumor/nanoplot_aln", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoStats.txt", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Yield_By_Length.html", + "sample1/qc/tumor/nanoplot_ubam_rep1", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_NanoStats.txt", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_rep1/sample1_tumor_ubam_Yield_By_Length.html", + "sample1/qc/tumor/samtools", + "sample1/qc/tumor/samtools/sample1.flagstat", + "sample1/qc/tumor/samtools/sample1.idxstats", + "sample1/qc/tumor/samtools/sample1.stats", + "sample1/qc/whatshap_stats", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.gtf", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.log", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.tsv", + "sample1/variants", + "sample1/variants/clair3", + "sample1/variants/clair3/merge_output.vcf.gz", + "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", + "sample1/variants/clairs/snvs.vcf.gz", + "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/deepsomatic", + "sample1/variants/deepsomatic/sample1_somatic.vcf.gz", + "sample1/variants/deepsomatic/sample1_somatic.vcf.gz.tbi", + "sample1/variants/deepvariant", + "sample1/variants/deepvariant/sample1_germline.vcf.gz", + "sample1/variants/deepvariant/sample1_germline.vcf.gz.tbi", + "sample1/variants/phased", + "sample1/variants/phased/germline_smallvariants.vcf.gz", + "sample1/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample1/variants/phased/somatic_smallvariants.vcf.gz", + "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/vep/germline", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", + "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", + "sample2/qc", + "sample2/qc/normal", + "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2_normal_cramino.txt", + "sample2/qc/normal/cramino_ubam_rep1", + "sample2/qc/normal/cramino_ubam_rep1/sample2_normal_cramino.txt", + "sample2/qc/normal/mosdepth", + "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/nanoplot_aln", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoStats.txt", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Yield_By_Length.html", + "sample2/qc/normal/nanoplot_ubam_rep1", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_NanoStats.txt", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_rep1/sample2_normal_ubam_Yield_By_Length.html", + "sample2/qc/normal/samtools", + "sample2/qc/normal/samtools/sample2.flagstat", + "sample2/qc/normal/samtools/sample2.idxstats", + "sample2/qc/normal/samtools/sample2.stats", + "sample2/qc/tumor", + "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2_tumor_cramino.txt", + "sample2/qc/tumor/cramino_ubam_rep1", + "sample2/qc/tumor/cramino_ubam_rep1/sample2_tumor_cramino.txt", + "sample2/qc/tumor/mosdepth", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/nanoplot_aln", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoStats.txt", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Yield_By_Length.html", + "sample2/qc/tumor/nanoplot_ubam_rep1", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_NanoStats.txt", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_rep1/sample2_tumor_ubam_Yield_By_Length.html", + "sample2/qc/tumor/samtools", + "sample2/qc/tumor/samtools/sample2.flagstat", + "sample2/qc/tumor/samtools/sample2.idxstats", + "sample2/qc/tumor/samtools/sample2.stats", + "sample2/qc/whatshap_stats", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.gtf", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.log", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.tsv", + "sample2/variants", + "sample2/variants/clair3", + "sample2/variants/clair3/merge_output.vcf.gz", + "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", + "sample2/variants/clairs/snvs.vcf.gz", + "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/deepsomatic", + "sample2/variants/deepsomatic/sample2_somatic.vcf.gz", + "sample2/variants/deepsomatic/sample2_somatic.vcf.gz.tbi", + "sample2/variants/deepvariant", + "sample2/variants/deepvariant/sample2_germline.vcf.gz", + "sample2/variants/deepvariant/sample2_germline.vcf.gz.tbi", + "sample2/variants/phased", + "sample2/variants/phased/germline_smallvariants.vcf.gz", + "sample2/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample2/variants/phased/somatic_smallvariants.vcf.gz", + "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/vep/germline", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", + "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", + "sample3/qc", + "sample3/qc/tumor", + "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3_tumor_cramino.txt", + "sample3/qc/tumor/cramino_ubam_rep1", + "sample3/qc/tumor/cramino_ubam_rep1/sample3_tumor_cramino.txt", + "sample3/qc/tumor/mosdepth", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/nanoplot_aln", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoStats.txt", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Yield_By_Length.html", + "sample3/qc/tumor/nanoplot_ubam_rep1", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_NanoStats.txt", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_rep1/sample3_tumor_ubam_Yield_By_Length.html", + "sample3/qc/tumor/samtools", + "sample3/qc/tumor/samtools/sample3.flagstat", + "sample3/qc/tumor/samtools/sample3.idxstats", + "sample3/qc/tumor/samtools/sample3.stats", + "sample3/qc/whatshap_stats", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.gtf", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.log", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.tsv", + "sample3/variants", + "sample3/variants/clairsto", + "sample3/variants/clairsto/germline.vcf.gz", + "sample3/variants/clairsto/germline.vcf.gz.tbi", + "sample3/variants/clairsto/indel.vcf.gz", + "sample3/variants/clairsto/indel.vcf.gz.tbi", + "sample3/variants/clairsto/snv.vcf.gz", + "sample3/variants/clairsto/snv.vcf.gz.tbi", + "sample3/variants/clairsto/somatic.vcf.gz", + "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/deepsomatic", + "sample3/variants/deepsomatic/sample3_somatic.vcf.gz", + "sample3/variants/deepsomatic/sample3_somatic.vcf.gz.tbi", + "sample3/variants/deepvariant", + "sample3/variants/deepvariant/sample3_germline.vcf.gz", + "sample3/variants/deepvariant/sample3_germline.vcf.gz.tbi", + "sample3/variants/phased", + "sample3/variants/phased/germline_smallvariants.vcf.gz", + "sample3/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample3/variants/phased/somatic_smallvariants.vcf.gz", + "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/vep/germline", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/vep/somatic", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" + ], + [ + "sample1_normal.bam:md5,cbfc940a38c74cbe8435c18b9da5dd32", + "sample1_normal.bam.bai:md5,c1498328929d45b2898fa2265b0d617c", + "sample1_tumor.bam:md5,b78866edf991393806d37505d16f7e3d", + "sample1_tumor.bam.bai:md5,f613de14ab19fc3a85403661a4f6188c", + "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", + "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", + "sample1.stats:md5,a8b3fba9c54efbc0934d6eacc1807140", + "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample1.stats:md5,1c60a1d249d2e503b0678c72e851ea93", + "sample1_whatshap_stats.gtf:md5,9ae556e13516dd47d4108acf2104bddb", + "sample1_whatshap_stats.log:md5,eaddcf6a1666d4a3c1ad3316dac24139", + "sample1_whatshap_stats.tsv:md5,c2773e011c2781160fd9a7741b10546b", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,47cb0e0bbe71abdbf4f40217dfda43f9", + "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample2_normal.bam:md5,f2ba30d007c521d479c6158e1e22367a", + "sample2_normal.bam.bai:md5,c3096f52115ec1e24c46fedc41f1f3d3", + "sample2_tumor.bam:md5,1c0287d24fa5b25b86e48024f2f55031", + "sample2_tumor.bam.bai:md5,62849cea5a005e3d8dbe8f9edcefaf60", + "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", + "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", + "sample2.stats:md5,20c47cb94f9ac739d69c57be6daf82c5", + "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", + "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", + "sample2.stats:md5,8635df10132c85a13f2d9878b7cf90a2", + "sample2_whatshap_stats.gtf:md5,f15fb43f0af73d02fc73b66fdc12d5d8", + "sample2_whatshap_stats.log:md5,a6767b3490cafdcbaf3b7114644028de", + "sample2_whatshap_stats.tsv:md5,570796e5e291229e8872733425e0b133", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,48baac86492026a4a7947bc708c47e6e", + "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample3_tumor.bam:md5,116b6944da4aa833a8d21c46b5f5ecfe", + "sample3_tumor.bam.bai:md5,ea9eca53bbaba26d40b791a2ea1aadf6", + "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample3.stats:md5,ecd5ea4fee37379dd5c5ae3e89dfddda", + "sample3_whatshap_stats.gtf:md5,f47156e18c490ff9a4e6efd04d43acc5", + "sample3_whatshap_stats.log:md5,679dcfa209888a9e69a07e4c4e4b049e", + "sample3_whatshap_stats.tsv:md5,035d5aa0425ba3fc32d65268b793b424", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,56e899f85876cee082788927d0f89c5f", + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-05-12T15:44:24.705646309" + } +} \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 72cb930a..0cb20be4 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -13,7 +13,8 @@ include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lrso // // IMPORT MODULES // -include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { SAMTOOLS_MERGE } from '../modules/nf-core/samtools/merge/main' +include { SAMTOOLS_INDEX as SAMTOOLS_INDEX_MERGE } from '../modules/nf-core/samtools/index/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' @@ -262,54 +263,11 @@ workflow LRSOMATIC { } - // Drop 'replicate' from meta before concatenation -- replicate info not needed downstream - // groupTuple merges per-replicate entries that share the same sample ID into one item - // (e.g. two B2194541 rows with replicate=1 and replicate=2 become one entry with [bam1, bam2]) - ch_samplesheet - .map{ meta, bam -> - def new_meta = meta.subMap('id', - 'paired_data', - 'type', - 'platform', - 'sex', - 'fiber', - 'clair3_model', - 'clairS_model', - 'clairSTO_model', - 'kinetics') - return[new_meta, bam] - } - .groupTuple() - .map { meta, bam -> - [ meta, bam.flatten() ] - } - .set{ch_samplesheet_no_rep} - // ch_samplesheet_no_rep: [meta, [bam...]] - // meta fields: id, paired_data, type, platform, sex, fiber, - // clair3_model, clairS_model, clairSTO_model, kinetics - // (replicate field removed; replicates for same sample merged into single BAM list) - - // Branch on number of input BAMs: samples with a single BAM skip concatenation - - ch_split = ch_samplesheet_no_rep - .branch { _meta, bam -> - single: bam.size() == 1 - multiple: bam.size() > 1 - } - // ch_split.single: [meta, [bam]] -- pass-through, no concatenation needed - // ch_split.multiple: [meta, [bam...]] -- need SAMTOOLS_CAT to merge - - // - // MODULE: SAMTOOLS_CAT (label: process_single) - // Input: [meta, [bam...]] -- multiple unaligned BAMs for same sample - // Output: .bam -- [meta, bam] -- single merged unaligned BAM - // - - SAMTOOLS_CAT ( ch_split.multiple ) - .bam - .mix ( ch_split.single ) - .set { ch_cat_ubams } - // ch_cat_ubams: [meta, bam] -- single (possibly concatenated) unaligned BAM per sample + // Each replicate is aligned separately so that minimap2 can tag its reads with a + // unique @RG (sample + type + replicate). Replicates are merged after alignment. + // ch_samplesheet is [meta_with_replicate, [bam]] -- one item per replicate per sample. + // ch_ubams defaults to ch_samplesheet; the fiber-seq block below may override it. + ch_ubams = ch_samplesheet vep_cache = channel.empty() @@ -349,25 +307,25 @@ workflow LRSOMATIC { // predict m6a in unaligned bam if (!params.skip_fiber) { - // Fiber-seq processing: predict m6A methylation, call nucleosomes and FIRE elements - // Only applicable to PacBio samples with fiber-seq data (meta.fiber == "y") + // Fiber-seq processing runs per-replicate on the unaligned BAMs. + // Each replicate is processed independently; replicates are merged after alignment. if (!params.skip_normalfiber){ // Process all samples (including normals) for fiber-seq - ubams = ch_cat_ubams + ubams = ch_samplesheet } else { // Skip fiber-seq processing for normal samples; set aside normals to re-join later - ch_cat_ubams + ch_samplesheet .branch { meta, _bams -> normal: meta.type == "normal" tumor: meta.type == "tumor" } - .set { ch_cat_ubams_normal_branching } - // ch_cat_ubams_normal_branching.normal: [meta, bam] -- normal samples (held out) - // ch_cat_ubams_normal_branching.tumor: [meta, bam] -- tumor samples only + .set { ch_ubams_normal_branching } + // ch_ubams_normal_branching.normal: [meta, bam] -- normal samples (held out) + // ch_ubams_normal_branching.tumor: [meta, bam] -- tumor samples only - normal_bams = ch_cat_ubams_normal_branching.normal - ubams = ch_cat_ubams_normal_branching.tumor + normal_bams = ch_ubams_normal_branching.normal + ubams = ch_ubams_normal_branching.tumor } // Branch by sequencing platform: PacBio needs m6A prediction, ONT does not ubams @@ -375,11 +333,11 @@ workflow LRSOMATIC { pacBio: meta.platform == "pb" ont: meta.platform == "ont" } - .set{ch_cat_ubams_pacbio_ont_branching} - // ch_cat_ubams_pacbio_ont_branching.pacBio: [meta, bam] -- PacBio samples - // ch_cat_ubams_pacbio_ont_branching.ont: [meta, bam] -- ONT samples (skip m6A) + .set{ch_ubams_pacbio_ont_branching} + // ch_ubams_pacbio_ont_branching.pacBio: [meta, bam] -- PacBio samples + // ch_ubams_pacbio_ont_branching.ont: [meta, bam] -- ONT samples (skip m6A) - pacbio_bams = ch_cat_ubams_pacbio_ont_branching.pacBio + pacbio_bams = ch_ubams_pacbio_ont_branching.pacBio // Branch PacBio samples: only those with kinetics tags can have m6A predicted pacbio_bams .branch{meta, _bams -> @@ -412,7 +370,7 @@ workflow LRSOMATIC { // predicted_bams: [meta, bam] -- all PacBio samples (m6A tags present where applicable) // Re-merge ONT and PacBio before fiber-seq branching - ch_cat_ubams_pacbio_ont_branching.ont + ch_ubams_pacbio_ont_branching.ont .mix(predicted_bams) .set{fiber_branch} // fiber_branch (pre-split): [meta, bam] -- all samples (ONT + PacBio, with m6A if applicable) @@ -451,17 +409,17 @@ workflow LRSOMATIC { // Re-merge fiber and non-fiber samples after FIRE annotation fiber_branch.nonFiber .mix(FIBERTOOLSRS_FIRE.out.bam) - .set{ch_cat_ubams} + .set{ch_ubams} } else { // Re-merge fiber, non-fiber, and held-out normal samples fiber_branch.nonFiber .mix(normal_bams) .mix(FIBERTOOLSRS_FIRE.out.bam) - .set{ch_cat_ubams} + .set{ch_ubams} } - // ch_cat_ubams (updated): [meta, bam] -- all samples; fiber-seq samples now carry - // nucleosome + FIRE tags in BAM; m6A tags present for PacBio fiber-seq + // ch_ubams (updated): [meta_with_replicate, bam] -- all samples per-replicate; + // fiber-seq samples now carry nucleosome + FIRE tags; m6A tags for PacBio fiber-seq if(!params.skip_qc) { // @@ -477,30 +435,87 @@ workflow LRSOMATIC { } // // MODULE: MINIMAP2_ALIGN (label: process_high) - // Input: [meta, bam] -- unaligned BAM (may carry m6A/nucleosome/FIRE tags for fiber-seq) + // Runs once per replicate. The @RG header line encodes sample, type, and replicate so + // that reads remain distinguishable after the per-replicate BAMs are merged below. + // Input: [meta_with_replicate, bam] -- unaligned BAM per replicate // ch_fasta -- [[:], fasta] // sort_bam=true, cigar_paf_format='bai', cigar_bam='', split_prefix='' - // Output: .bam -- [meta, bam] -- coordinate-sorted aligned BAM - // .index -- [meta, bai] -- BAM index + // Output: .bam -- [meta_with_replicate, bam] -- coordinate-sorted aligned BAM + // .index -- [meta_with_replicate, bai] -- BAM index // MINIMAP2_ALIGN ( - ch_cat_ubams, + ch_ubams, ch_fasta, true, 'bai', "", "" ) - MINIMAP2_ALIGN.out.bam - .set { ch_minimap_bam } - // ch_minimap_bam: [meta, bam] -- coordinate-sorted aligned BAM - // Join BAM with its index, then branch into paired-sample vs. tumor-only paths - ch_minimap_bam + // Join per-replicate BAM with its index, drop the replicate field, then group replicates + // belonging to the same sample. Single-replicate samples skip SAMTOOLS_MERGE. + MINIMAP2_ALIGN.out.bam .join(MINIMAP2_ALIGN.out.index) - .set {ch_index_minimap} - // ch_index_minimap: [meta, bam, bai] -- aligned BAM + index, all samples + .map { meta, bam, bai -> + def new_meta = meta.subMap('id', + 'paired_data', + 'type', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return [new_meta, bam, bai] + } + .groupTuple() + .map { meta, bams, bais -> + [meta, bams.flatten(), bais.flatten()] + } + .branch { _meta, bams, _bais -> + single: bams.size() == 1 + multiple: bams.size() > 1 + } + .set { ch_aligned_split } + // ch_aligned_split.single: [meta, [bam], [bai]] -- one replicate; pass through + // ch_aligned_split.multiple: [meta, [bam...], [bai...]] -- merge needed + + // Single-replicate: unwrap lists to scalar paths + ch_aligned_split.single + .map { meta, bams, bais -> [meta, bams[0], bais[0]] } + .set { ch_single_indexed } + + // + // MODULE: SAMTOOLS_MERGE (label: process_low) + // Merges per-replicate coordinate-sorted BAMs. Because each was aligned with a unique + // @RG line (ID = {sample}_{type}_rep{N}), the merged BAM retains full replicate identity. + // Input: [meta, [bam...], [bai...]] -- grouped replicate BAMs + indices + // Output: .bam -- [meta, bam] -- merged BAM + // + SAMTOOLS_MERGE( + ch_aligned_split.multiple, + [[],[],[],[]] + ) + + // Index the merged BAM to produce a BAI (SAMTOOLS_MERGE does not create BAI inline) + SAMTOOLS_INDEX_MERGE(SAMTOOLS_MERGE.out.bam) + + // Combine single-replicate and merged paths into a unified [meta, bam, bai] channel + ch_single_indexed + .mix( + SAMTOOLS_MERGE.out.bam + .join(SAMTOOLS_INDEX_MERGE.out.bai) + ) + .set { ch_index_minimap } + // ch_index_minimap: [meta, bam, bai] -- one aligned BAM + index per sample (all replicates merged) + + // Convenience channel used by CRAMINO_POST and other modules that only need the BAM + ch_index_minimap + .map { meta, bam, _bai -> [meta, bam] } + .set { ch_minimap_bam } + // ch_minimap_bam: [meta, bam] -- post-alignment BAM (replicates merged) // // MODULE: MODKIT_PILEUP @@ -838,7 +853,7 @@ workflow LRSOMATIC { if (!params.skip_qc && !params.skip_mosdepth) { // MOSDEPTH requires a BED file argument; pass [] to compute genome-wide depth - ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) + ch_index_minimap .map { meta, bam, bai -> [meta, bam, bai, []] } .set { ch_mosdepth_in } // ch_mosdepth_in: [meta, bam, bai, []] -- [] is the optional BED (empty = genome-wide) @@ -874,7 +889,7 @@ workflow LRSOMATIC { if (!params.skip_qc && !params.skip_bamstats ) { BAM_STATS_SAMTOOLS ( - ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // [meta, bam, bai] + ch_index_minimap, // [meta, bam, bai] ch_fasta )