diff --git a/CHANGELOG.md b/CHANGELOG.md index cf940efe3c..df98c792a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - [#2087](https://github.com/nf-core/sarek/pull/2087) - Add `bam` as output format for parabricks/fq2bam, add multi lane support +- Add `xengsort` as an additional contamination removal option, including index build/reuse support and workflow integration ### Changed @@ -36,8 +37,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Parameters -| Params | status | -| ------ | ------ | +| Params | status | +| ----------------------- | ------ | +| `--xengsort_host_fasta` | added | +| `--xengsort_index` | added | +| `--xengsort_nobjects` | added | +| `--xengsort_kmersize` | added | +| `--save_xengsort_reads` | added | ### Developer section diff --git a/README.md b/README.md index 151b88920a..dabe2902fe 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Depending on the options and samples provided, the pipeline can currently perfor - Form consensus reads from UMI sequences (`fgbio`) - Sequencing quality control and trimming (enabled by `--trim_fastq`) (`FastQC`, `fastp`) -- Contamination removal (`BBSplit`, enabled by `--tools bbsplit`) +- Contamination removal (`BBSplit` or `xengsort`, enabled by `--tools bbsplit` or `--tools xengsort`) - Map Reads to Reference (`BWA-mem`, `BWA-mem2`, `dragmap` or `Sentieon BWA-mem`) - Process BAM file (`GATK MarkDuplicates`, `GATK BaseRecalibrator` and `GATK ApplyBQSR` or `Sentieon LocusCollector` and `Sentieon Dedup`) - _Experimental Feature_: Use GPU-accelerated parabricks implementation as alternative to "Map Reads to Reference" + "Process BAM file" (`--aligner parabricks`) diff --git a/conf/modules/contamination.config b/conf/modules/contamination.config index 0cb9406519..65083c01cf 100644 --- a/conf/modules/contamination.config +++ b/conf/modules/contamination.config @@ -18,4 +18,25 @@ process { ] ] } + + withName: 'XENGSORT_CLASSIFY' { + // Include read basename when FASTQ is split to avoid filename collisions across chunks. + ext.prefix = { + if (params.split_fastq && reads) { + def first_read_name = reads instanceof List ? reads[0].getName() : reads.getName() + "${first_read_name.tokenize('.')[0]}.${meta.id}" + } else { + "${meta.id}" + } + } + + publishDir = [ + [ + path: { params.save_xengsort_reads ? "${params.outdir}/preprocessing/xengsort/${meta.id}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.fq.gz', + saveAs: { params.save_xengsort_reads ? it : null } + ] + ] + } } diff --git a/conf/modules/prepare_genome.config b/conf/modules/prepare_genome.config index 5a84ea0a1f..72c1d1d1e6 100644 --- a/conf/modules/prepare_genome.config +++ b/conf/modules/prepare_genome.config @@ -98,6 +98,16 @@ process { ] } + withName: 'XENGSORT_INDEX' { + ext.nobjects = { params.xengsort_nobjects } + ext.kmersize = { params.xengsort_kmersize } + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/reference" }, + saveAs: { params.save_reference || params.build_only_index ? it : null } + ] + } + withName: 'SAMTOOLS_FAIDX' { publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/test.config b/conf/test.config index beffbc64bc..6d7db4dfa3 100644 --- a/conf/test.config +++ b/conf/test.config @@ -43,8 +43,10 @@ params { sentieon_dnascope_model = "s3://ngi-igenomes/igenomes/Homo_sapiens/GATK/GRCh38/Annotation/Sentieon/SentieonDNAscopeModel1.1.model" // default params - split_fastq = 0 // no FASTQ splitting - tools = 'strelka' // Variant calling with Strelka + split_fastq = 0 // no FASTQ splitting + tools = 'strelka' // Variant calling with Strelka + xengsort_nobjects = 400000 // xengsort index n objects + xengsort_kmersize = 25 // xengsort index k-mer size } process { @@ -89,4 +91,8 @@ process { "--low-memory", ].join(' ').trim() } } + + withName: '.*:XENGSORT_CLASSIFY' { + cpus = 1 + } } diff --git a/docs/output.md b/docs/output.md index 95c71913be..385145a82e 100644 --- a/docs/output.md +++ b/docs/output.md @@ -18,6 +18,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Split FastQ files](#split-fastq-files) - [UMI consensus](#umi-consensus) - [BBSplit contamination removal](#bbsplit-contamination-removal) + - [Xengsort contamination removal](#xengsort-contamination-removal) - [Map to Reference](#map-to-reference) - [BWA](#bwa) - [BWA-mem2](#bwa-mem2) @@ -202,6 +203,29 @@ By default, the following parameters are used for BBSplit `ambiguous2=best maxin +#### Xengsort contamination removal + +[Xengsort](https://gitlab.com/genomeinformatics/xengsort) classifies xenograft reads against graft and host references and is useful for PDX-like samples where contaminating host reads should be excluded before alignment. + +To enable the tool, add `--tools xengsort`. + +- Reuse a pre-built index with `--xengsort_index`. +- Build an index during the run by providing `--xengsort_host_fasta` together with `--xengsort_nobjects` and `--xengsort_kmersize`. `--xengsort_host_fasta` accepts either a single FASTA path or a glob pattern that matches one or more host FASTA files (for example `/path/to/host.fa` or `/path/to/host/*.fa`). Please refer to the [xengsort documentation](https://gitlab.com/genomeinformatics/xengsort) to determine appropriate values for `nobjects` and `kmersize`. + +By default, classified FastQ files are intermediate and not published to `outdir`. Set `--save_xengsort_reads` to publish them. + +
+Output files + +- `preprocessing/xengsort/` + - `*-graft.*fq.gz`: Reads assigned to graft reference (used for downstream alignment; e.g. Human). + - `*-host.*fq.gz`: Reads assigned to host reference (e.g. Mouse). + - `*-both.*fq.gz`: Reads matching both references. + - `*-neither.*fq.gz`: Reads matching neither reference. + - `*-ambiguous.*fq.gz`: Ambiguous assignments. + +
+ ### Map to Reference #### BWA @@ -1449,4 +1473,6 @@ Contains reference folders generated by the pipeline. These files are only publi - [MSIsensorPro](https://github.com/xjtu-omics/msisensor-pro) scan of the reference genome to get microsatellites information - `pon/` - Tabix index generated by [Tabix](http://www.htslib.org/doc/tabix.html) from the given panel-of-normals file +- `xengsort_index/` + - Xengsort index files generated from graft/host references (for example `*.hash` and `*.info`). diff --git a/docs/usage.md b/docs/usage.md index 44d536c97f..b5fa2f3f80 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -63,6 +63,39 @@ genome: 'GATK.GRCh38' You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). +## Optional contamination removal with xengsort + +`nf-core/sarek` supports host/graft read disambiguation with [xengsort](https://gitlab.com/genomeinformatics/xengsort). +Enable it by adding `xengsort` to `--tools`. + +When building an index during the run, provide: + +- `--xengsort_host_fasta`: host FASTA (path or glob) +- `--xengsort_nobjects`: value for `xengsort index --nobjects` +- `--xengsort_kmersize`: value for `xengsort index --kmersize` + +Alternatively, reuse an existing index with `--xengsort_index`. +For details about the appropriate nobjects and kmersize to use, +see https://gitlab.com/genomeinformatics/xengsort. + +When Sarek builds a xengsort index, it is only published to `outdir/reference` if +`--save_reference` or `--build_only_index` is enabled. + +Example: + +```bash +nextflow run nf-core/sarek \ + -profile docker \ + --input samplesheet.csv \ + --outdir results \ + --tools xengsort,strelka \ + --xengsort_host_fasta /path/to/host_reference.fasta \ + --xengsort_nobjects 400000 \ + --xengsort_kmersize 25 +``` + +Set `--save_xengsort_reads` to publish xengsort-classified FASTQ files. + ## Input: Sample sheet configurations You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use the parameter `--input` to specify its location. It has to be a comma-separated file with at least 3 columns, and a header row as shown in the examples below. diff --git a/main.nf b/main.nf index 96dd0c078a..48b35ac059 100755 --- a/main.nf +++ b/main.nf @@ -125,6 +125,8 @@ workflow NFCORE_SAREK { params.step, params.tools ?: 'no_tools', params.vep_include_fasta, + params.xengsort_index, + params.xengsort_host_fasta, ) // Build intervals if needed @@ -285,6 +287,7 @@ workflow NFCORE_SAREK { PREPARE_GENOME.out.ascat_loci_gc, PREPARE_GENOME.out.ascat_loci_rt, PREPARE_GENOME.out.bbsplit_index, + PREPARE_GENOME.out.xengsort_index, PREPARE_GENOME.out.bcftools_annotations, PREPARE_GENOME.out.bcftools_annotations_tbi, params.bcftools_columns ? Channel.fromPath(params.bcftools_columns).collect() : Channel.value([]), diff --git a/modules/local/xengsort/classify/environment.yml b/modules/local/xengsort/classify/environment.yml new file mode 100644 index 0000000000..ba93b359d9 --- /dev/null +++ b/modules/local/xengsort/classify/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::xengsort=2.1.0" diff --git a/modules/local/xengsort/classify/main.nf b/modules/local/xengsort/classify/main.nf new file mode 100644 index 0000000000..e0bf80226e --- /dev/null +++ b/modules/local/xengsort/classify/main.nf @@ -0,0 +1,87 @@ +process XENGSORT_CLASSIFY { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/xengsort:2.1.0--pyhdfd78af_1': + 'community.wave.seqera.io/library/htslib_pip_xengsort:39f2d076bf655602'}" + + input: + tuple val(meta), path(reads) + path index_folder + + output: + tuple val(meta), path('*-graft.*fq.gz') , optional:true, emit: graft_fastq + tuple val(meta), path('*-host.*fq.gz') , optional:true, emit: host_fastq + tuple val(meta), path('*-both.*fq.gz') , optional:true, emit: both_fastq + tuple val(meta), path('*-neither.*fq.gz') , optional:true, emit: neither_fastq + tuple val(meta), path('*-ambiguous.*fq.gz'), optional:true, emit: ambiguous_fastq + tuple val("${task.process}"), val('xengsort'), eval("xengsort --version"), topic: versions, emit: versions_xengsort_classify + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def mode = task.ext.mode ?: 'count' + + def fastq_args = meta.single_end ? "--fastq ${reads}" : "--fastq ${reads[0]} --pairs ${reads[1]}" + + """ + # Check if the index folder contains the expected index files + HASH_COUNT=\$(ls "${index_folder}"/*.hash 2>/dev/null | wc -l || true) + INFO_COUNT=\$(ls "${index_folder}"/*.info 2>/dev/null | wc -l || true) + + if [ "\$HASH_COUNT" -ne 1 ] || [ "\$INFO_COUNT" -ne 1 ]; then + echo "ERROR: The input index directory must contain exactly one .hash and one .info file." >&2 + echo "Found \$HASH_COUNT .hash files and \$INFO_COUNT .info files in ${index_folder}." >&2 + exit 1 + fi + + # Extract the index prefix (the .hash and .info have the same basename) + HASH_FILE=\$(ls "${index_folder}"/*.hash) + INDEX_PREFIX=\$(basename "\$HASH_FILE" .hash) + + # Run xengsort classify + xengsort classify \\ + --index "${index_folder}/\$INDEX_PREFIX" \\ + $fastq_args \\ + --mode $mode \\ + --prefix $prefix \\ + --threads ${task.cpus} \\ + $args + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + if (meta.single_end) { + """ + echo $args + + echo '' | gzip > ${prefix}-graft.fq.gz + echo '' | gzip > ${prefix}-host.fq.gz + echo '' | gzip > ${prefix}-both.fq.gz + echo '' | gzip > ${prefix}-neither.fq.gz + echo '' | gzip > ${prefix}-ambiguous.fq.gz + """ + } else { + """ + echo $args + + echo '' | gzip > ${prefix}-graft.1.fq.gz + echo '' | gzip > ${prefix}-graft.2.fq.gz + echo '' | gzip > ${prefix}-host.1.fq.gz + echo '' | gzip > ${prefix}-host.2.fq.gz + echo '' | gzip > ${prefix}-both.1.fq.gz + echo '' | gzip > ${prefix}-both.2.fq.gz + echo '' | gzip > ${prefix}-neither.1.fq.gz + echo '' | gzip > ${prefix}-neither.2.fq.gz + echo '' | gzip > ${prefix}-ambiguous.1.fq.gz + echo '' | gzip > ${prefix}-ambiguous.2.fq.gz + """ + } +} diff --git a/modules/local/xengsort/classify/meta.yml b/modules/local/xengsort/classify/meta.yml new file mode 100644 index 0000000000..13ebe69952 --- /dev/null +++ b/modules/local/xengsort/classify/meta.yml @@ -0,0 +1,130 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "xengsort_classify" +description: Xenograft read sorting using Xengsort +keywords: + - classify + - xenograft + - k-mer + - reference +tools: + - "xengsort": + description: "A fast xenograft read sorter based on space-efficient k-mer hashing." + homepage: "https://gitlab.com/genomeinformatics/xengsort" + documentation: "https://gitlab.com/genomeinformatics/xengsort" + tool_dev_url: "https://gitlab.com/genomeinformatics/xengsort" + doi: "10.4230/LIPIcs.WABI.2020.4" + licence: ["MIT"] + identifier: null + +input: + ### Add a description of all of the variables used as input + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + ontologies: [] + + - index_folder: + type: directory + description: | + xengsort index directory containing the .hash and .info files + generated by the xengsort index tool. + ontologies: [] + +output: + graft_fastq: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*-graft.*fq.gz": + type: file + description: | + Output reads that map to the graft references + pattern: "*-graft.*fq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + host_fastq: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*-host.*fq.gz": + type: file + description: | + Output reads that map to the host references + pattern: "*-host.*fq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + both_fastq: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*-both.*fq.gz": + type: file + description: | + Output reads that map to both references + pattern: "*-both.*fq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + neither_fastq: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*-neither.*fq.gz": + type: file + description: | + Output reads that map to the neither of the references + pattern: "*-neither.*fq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + ambiguous_fastq: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*-ambiguous.*fq.gz": + type: file + description: | + Ambiguous reads output + pattern: "*-ambiguous.*fq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + versions_xengsort_classify: + - - "${task.process}": + type: string + description: The process the versions were collected from + - "xengsort": + type: string + description: The name of the tool + - "xengsort --version": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - xengsort: + type: string + description: The name of the tool + - xengsort --version: + type: eval + description: The expression to obtain the version of the tool +authors: + - "@xinghansun" +maintainers: + - "@xinghansun" diff --git a/modules/local/xengsort/classify/tests/main.nf.test b/modules/local/xengsort/classify/tests/main.nf.test new file mode 100644 index 0000000000..f9fc46ca30 --- /dev/null +++ b/modules/local/xengsort/classify/tests/main.nf.test @@ -0,0 +1,155 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test xengsort/classify +nextflow_process { + + name "Test Process XENGSORT_CLASSIFY" + script "../main.nf" + process "XENGSORT_CLASSIFY" + config "./nextflow.config" + + tag "modules" + tag "modules_" + tag "xengsort" + tag "xengsort/classify" + + test("human - paired_end") { + + setup { + run("XENGSORT_INDEX") { + script "../../index/main.nf" + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta') + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta') + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz'), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz') + ] + ] + input[1] = XENGSORT_INDEX.out.index + """ + } + } + + then { + assert process.success + assert process.out.graft_fastq[0][1].size() == 2 + assert process.out.host_fastq[0][1].size() == 2 + assert process.out.both_fastq[0][1].size() == 2 + assert process.out.neither_fastq[0][1].size() == 2 + assert process.out.ambiguous_fastq[0][1].size() == 2 + assert process.out.versions_xengsort_classify[0] == ["XENGSORT_CLASSIFY", "xengsort", "2.1.0"] + } + + } + + test("human - single_end") { + + setup { + run("XENGSORT_INDEX") { + script "../../index/main.nf" + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta') + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta') + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz'), + ] + ] + input[1] = XENGSORT_INDEX.out.index + """ + } + } + + then { + assert process.success + assert file(process.out.graft_fastq[0][1]).exists() + assert file(process.out.host_fastq[0][1]).exists() + assert file(process.out.both_fastq[0][1]).exists() + assert file(process.out.neither_fastq[0][1]).exists() + assert file(process.out.ambiguous_fastq[0][1]).exists() + assert process.out.versions_xengsort_classify[0] == ["XENGSORT_CLASSIFY", "xengsort", "2.1.0"] + } + } + + test("human - paired_end - stub") { + + tag "stub" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz'), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz') + ] + ] + input[1] = file('.') + """ + } + } + + then { + assert process.success + assert process.out.graft_fastq[0][1].size() == 2 + assert process.out.host_fastq[0][1].size() == 2 + assert process.out.both_fastq[0][1].size() == 2 + assert process.out.neither_fastq[0][1].size() == 2 + assert process.out.ambiguous_fastq[0][1].size() == 2 + assert process.out.versions_xengsort_classify[0] == ["XENGSORT_CLASSIFY", "xengsort", "2.1.0"] + } + } + + test("human - single_end - stub") { + + tag "stub" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz'), + ] + ] + input[1] = file('.') + """ + } + } + + then { + assert process.success + assert file(process.out.graft_fastq[0][1]).exists() + assert file(process.out.host_fastq[0][1]).exists() + assert file(process.out.both_fastq[0][1]).exists() + assert file(process.out.neither_fastq[0][1]).exists() + assert file(process.out.ambiguous_fastq[0][1]).exists() + assert process.out.versions_xengsort_classify[0] == ["XENGSORT_CLASSIFY", "xengsort", "2.1.0"] + } + } +} diff --git a/modules/local/xengsort/classify/tests/nextflow.config b/modules/local/xengsort/classify/tests/nextflow.config new file mode 100644 index 0000000000..a45bcded53 --- /dev/null +++ b/modules/local/xengsort/classify/tests/nextflow.config @@ -0,0 +1,24 @@ +// tests/nextflow.config +process { + withName: XENGSORT_INDEX { + ext.nobjects = 400000 + ext.kmersize = 25 + } +} + +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' +} + +profiles { + docker { + docker.enabled = true + } + + conda { + docker.enabled = false + singularity.enabled = false + conda.enabled = true + conda.useMamba = false + } +} diff --git a/modules/local/xengsort/index/environment.yml b/modules/local/xengsort/index/environment.yml new file mode 100644 index 0000000000..ba93b359d9 --- /dev/null +++ b/modules/local/xengsort/index/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::xengsort=2.1.0" diff --git a/modules/local/xengsort/index/main.nf b/modules/local/xengsort/index/main.nf new file mode 100644 index 0000000000..cd76640880 --- /dev/null +++ b/modules/local/xengsort/index/main.nf @@ -0,0 +1,65 @@ +process XENGSORT_INDEX { + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/xengsort:2.1.0--pyhdfd78af_1': + 'community.wave.seqera.io/library/htslib_pip_xengsort:39f2d076bf655602'}" + + input: + path(graft_ref), stageAs: 'graft_ref/*' // allows multiple ref + path(host_ref) , stageAs: 'host_ref/*' // allows multiple ref + + output: + path "xengsort_index", emit: index + tuple val("${task.process}"), val('xengsort'), eval("xengsort --version"), topic: versions, emit: versions_xengsort_index + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + // TODO: Add a separate module to automatically estimate the optimal --nobjects value + // for xengsort index based on the size of the reference FASTA files, such as ntCard or KmerEstimate, + // as suggested in the xengsort documentation: https://gitlab.com/genomeinformatics/xengsort/-/blob/1ae75047bc76e0daf91c3223245991a8ac39bcfe/README.md + def nobjects = task.ext.nobjects ?: '' + def kmersize = task.ext.kmersize ?: '' + def mask = task.ext.mask ?: '' + + if (!nobjects) { + error "ERROR: Missing required argument 'nobjects' for xengsort index. Details: https://gitlab.com/genomeinformatics/xengsort/-/blob/1ae75047bc76e0daf91c3223245991a8ac39bcfe/README.md" + } + + if (kmersize && mask) { + error "ERROR: Mutually exclusive arguments. Specify only 'kmersize' OR 'mask', not both." + } else if (!kmersize && !mask) { + error "ERROR: Missing required argument. Specify either 'kmersize' or 'mask'." + } + + def kmer_or_mask = kmersize ? "--kmersize ${kmersize}" : "--mask ${mask}" + + """ + mkdir -p xengsort_index + + xengsort index \\ + --index xengsort_index/index \\ + --graft $graft_ref \\ + --host $host_ref \\ + $kmer_or_mask \\ + --nobjects $nobjects \\ + --threads-read ${task.cpus} \\ + --threads-split ${task.cpus} \\ + $args + """ + + stub: + def args = task.ext.args ?: '' + + """ + echo $args + + mkdir -p xengsort_index + touch xengsort_index/index.info + touch xengsort_index/index.hash + """ +} diff --git a/modules/local/xengsort/index/meta.yml b/modules/local/xengsort/index/meta.yml new file mode 100644 index 0000000000..3c248a4026 --- /dev/null +++ b/modules/local/xengsort/index/meta.yml @@ -0,0 +1,71 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "xengsort_index" +description: Indexing reference genomes for xenograft read sorting using Xengsort +keywords: + - index + - xenograft + - k-mer + - reference +tools: + - "xengsort": + description: "A fast xenograft read sorter based on space-efficient k-mer hashing." + homepage: "https://gitlab.com/genomeinformatics/xengsort" + documentation: "https://gitlab.com/genomeinformatics/xengsort" + tool_dev_url: "https://gitlab.com/genomeinformatics/xengsort" + doi: "10.4230/LIPIcs.WABI.2020.4" + licence: ["MIT"] + identifier: null + +input: + ### Add a description of all of the variables used as input + - graft_ref: + type: file + description: | + Graft (e.g. human tumour) reference genome FASTA file(s). + Multiple files are accepted. + pattern: "*.{fa,fasta,fa.gz,fasta.gz}" + ontologies: + - edam: "http://edamontology.org/format_1929" # FASTA + - edam: "http://edamontology.org/format_3989" # GZIP format + - host_ref: + type: file + description: | + Host (e.g. mouse) reference genome FASTA file(s). + Multiple files are accepted. + pattern: "*.{fa,fasta,fa.gz,fasta.gz}" + ontologies: + - edam: "http://edamontology.org/format_1929" # FASTA + - edam: "http://edamontology.org/format_3989" # GZIP format + +output: + index: + - xengsort_index: + type: directory + description: Directory containing the xengsort k-mer hash index files (index.hash, index.info) + pattern: "xengsort_index" + versions_xengsort_index: + - "${task.process}": + type: string + description: The process the versions were collected from + - "xengsort": + type: string + description: The name of the tool + - "xengsort --version": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - xengsort: + type: string + description: The name of the tool + - xengsort --version: + type: eval + description: The expression to obtain the version of the tool +authors: + - "@xinghansun" +maintainers: + - "@xinghansun" diff --git a/modules/local/xengsort/index/tests/main.nf.test b/modules/local/xengsort/index/tests/main.nf.test new file mode 100644 index 0000000000..6eb7eacd6c --- /dev/null +++ b/modules/local/xengsort/index/tests/main.nf.test @@ -0,0 +1,59 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test xengsort/index +nextflow_process { + + name "Test Process XENGSORT_INDEX" + script "../main.nf" + process "XENGSORT_INDEX" + + tag "modules" + tag "modules_" + tag "xengsort" + tag "xengsort/index" + + config "./nextflow.config" + + test("human_cov2 - fasta") { + + when { + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta') + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta') + """ + } + } + + then { + assert process.success + assert new File("${process.out.index[0]}/index.hash").exists() + assert new File("${process.out.index[0]}/index.info").exists() + assert process.out.versions_xengsort_classify[0] == ["XENGSORT_CLASSIFY", "xengsort", "2.1.0"] + } + + } + + test("human_cov2 - fasta - stub") { + + tag "stub" + options "-stub" + + when { + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta') + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta') + """ + } + } + + then { + assert process.success + assert new File("${process.out.index[0]}/index.hash").exists() + assert new File("${process.out.index[0]}/index.info").exists() + assert process.out.versions_xengsort_classify[0] == ["XENGSORT_CLASSIFY", "xengsort", "2.1.0"] + } + + } + +} diff --git a/modules/local/xengsort/index/tests/nextflow.config b/modules/local/xengsort/index/tests/nextflow.config new file mode 100644 index 0000000000..27d870434b --- /dev/null +++ b/modules/local/xengsort/index/tests/nextflow.config @@ -0,0 +1,24 @@ +// tests/nextflow.config +process { + withName: XENGSORT_INDEX { + ext.nobjects = 400000 + ext.kmersize = 25 + } +} + +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' +} + +profiles { + docker { + docker.enabled = true + } + + conda { + docker.enabled = false + singularity.enabled = false + conda.enabled = true + conda.useMamba = true + } +} diff --git a/nextflow.config b/nextflow.config index fd0425b364..eab98c7fa2 100644 --- a/nextflow.config +++ b/nextflow.config @@ -58,6 +58,13 @@ params { save_bbsplit_reads = false bbsplit_index = null + // Xengsort genome filtering + save_xengsort_reads = false + xengsort_index = null + xengsort_host_fasta = null + xengsort_nobjects = null + xengsort_kmersize = null + // Preprocessing aligner = 'bwa-mem' // Default is bwa-mem, bwa-mem2 and dragmap can be used too use_gatk_spark = null // GATK Spark implementation of their tools in local mode not used by default diff --git a/nextflow_schema.json b/nextflow_schema.json index 929a9d98d0..6a58ed9fdd 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -111,7 +111,7 @@ "fa_icon": "fas fa-toolbox", "description": "Tools to use for contamination removal, duplicate marking, variant calling and/or for annotation.", "help_text": "Multiple tools separated with commas.\n\n**Variant Calling:**\n\nGermline variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: DeepVariant, FreeBayes, GATK HaplotypeCaller, mpileup, Sentieon Haplotyper \n- Structural Variants: indexcov, Manta, TIDDIT\n- Copy-number: CNVKit\n\nTumor-only somatic variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, Lofreq, mpileup, Mutect2, Sentieon TNScope, Strelka\n- Structural Variants: Manta, Sentieon TNScope, TIDDIT\n- Copy-number: CNVKit, ControlFREEC\n\nSomatic variant calling can currently only be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, Mutect2, Sentieon TNScope, Strelka2 \n- Structural variants: Manta, TIDDIT\n- Copy-Number: ASCAT, CNVKit, Control-FREEC, Sentieon TNScope \n- Microsatellite Instability: MSIsensor2, MSIsensorpro\n\n> **NB** Mutect2 for somatic variant calling cannot be combined with `--no_intervals`\n\n**Annotation:**\n \n- snpEff, VEP, merge (both consecutively), and bcftools annotate (needs `--bcftools_annotation`).\n\n> **NB** As Sarek will use bgzip and tabix to compress and index VCF files annotated, it expects VCF files to be sorted when starting from `--step annotate`.", - "pattern": "^((ascat|bbsplit|bcfann|cnvkit|controlfreec|deepvariant|freebayes|haplotypecaller|indexcov|lofreq|manta|merge|mpileup|msisensor2|msisensorpro|muse|mutect2|ngscheckmate|sentieon_dedup|sentieon_dnascope|sentieon_haplotyper|sentieon_tnscope|snpeff|snpsift|strelka|tiddit|vep|varlociraptor)?,?)*(?\n \n \n \"nf-core/sarek\"\n \n\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/sarek)\n[![GitHub Actions CI Status](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/sarek/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/linting.yml)\n[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/sarek/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3476425-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3476425)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/sarek)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23sarek-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/sarek)\n[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)\n[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)\n[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/sarek** is a workflow designed to detect variants on whole genome or targeted sequencing data. Initially designed for Human, and Mouse, it can work on any species with a reference genome. Sarek can also handle tumour / normal pairs and could include additional relapses.\n\nThe pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/sarek/results).\n\nIt's listed on [Elixir - Tools and Data Services Registry](https://bio.tools/nf-core-sarek) and [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek).\n\n

\n \n

\n\n## Pipeline summary\n\nDepending on the options and samples provided, the pipeline can currently perform the following:\n\n- Form consensus reads from UMI sequences (`fgbio`)\n- Sequencing quality control and trimming (enabled by `--trim_fastq`) (`FastQC`, `fastp`)\n- Contamination removal (`BBSplit`, enabled by `--tools bbsplit`)\n- Map Reads to Reference (`BWA-mem`, `BWA-mem2`, `dragmap` or `Sentieon BWA-mem`)\n- Process BAM file (`GATK MarkDuplicates`, `GATK BaseRecalibrator` and `GATK ApplyBQSR` or `Sentieon LocusCollector` and `Sentieon Dedup`)\n- _Experimental Feature_: Use GPU-accelerated parabricks implementation as alternative to \"Map Reads to Reference\" + \"Process BAM file\" (`--aligner parabricks`)\n- Summarise alignment statistics (`samtools stats`, `mosdepth`)\n- Variant calling (enabled by `--tools`, see [compatibility](https://nf-co.re/sarek/latest/docs/usage#which-variant-calling-tool-is-implemented-for-which-data-type)):\n - `ASCAT`\n - `CNVkit`\n - `Control-FREEC`\n - `DeepVariant`\n - `freebayes`\n - `GATK HaplotypeCaller`\n - `GATK Mutect2`\n - `indexcov`\n - `Lofreq`\n - `Manta`\n - `mpileup`\n - `MSIsensor2`\n - `MSIsensor-pro`\n - `MuSE`\n - `Sentieon Haplotyper`\n - `Strelka`\n - `TIDDIT`\n- Post-variant calling options, one of:\n - Filtering (`bcftools view` (default: filter by `PASS,.`)), normalisation (`bcftools norm`) and consensus calling (`bcftools isec`, default: called by at least 2 tools `-n+2`) on all vcfs and/or `bcftools concat` for germline vcfs\n - `Varlociraptor` for all vcfs\n- Variant filtering and annotation (`SnpEff`, `Ensembl VEP`, `BCFtools annotate`, `SnpSift`)\n- Summarise and represent QC (`MultiQC`)\n\n

\n \n

\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst, prepare a samplesheet with your input data that looks as follows:\n\n`samplesheet.csv`:\n\n```csv\npatient,sample,lane,fastq_1,fastq_2\nID1,S1,L002,ID1_S1_L002_R1_001.fastq.gz,ID1_S1_L002_R2_001.fastq.gz\n```\n\nEach row represents a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/sarek \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/sarek/usage) and the [parameter documentation](https://nf-co.re/sarek/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/sarek/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/sarek/output).\n\n## Benchmarking\n\nOn each release, the pipeline is run on 3 full size tests:\n\n- `test_full` runs tumor-normal data for one patient from the SEQ2C consortium\n- `test_full_germline` runs a WGS 30X Genome-in-a-Bottle(NA12878) dataset\n- `test_full_germline_ncbench_agilent` runs two WES samples with 75M and 200M reads (data available [here](https://github.com/ncbench/ncbench-workflow#contributing-callsets)). The results are uploaded to Zenodo, evaluated against a truth dataset, and results are made available via the [NCBench dashboard](https://ncbench.github.io/report/report.html#).\n\n## Credits\n\nSarek was originally written by Maxime U Garcia and Szilveszter Juhos at the [National Genomics Infastructure](https://ngisweden.scilifelab.se) and [National Bioinformatics Infastructure Sweden](https://nbis.se) which are both platforms at [SciLifeLab](https://scilifelab.se), with the support of [The Swedish Childhood Tumor Biobank (Barntum\u00f6rbanken)](https://ki.se/forskning/barntumorbanken).\nFriederike Hanssen and Gisela Gabernet at [QBiC](https://www.qbic.uni-tuebingen.de/) later joined and helped with further development.\n\nThe Nextflow DSL2 conversion of the pipeline was lead by Friederike Hanssen and Maxime U Garcia.\n\nMaintenance is now lead by Friederike Hanssen and Maxime U Garcia (now at [Seqera](https://seqera.io))\n\nMain developers:\n\n- [Maxime U Garcia](https://github.com/maxulysse)\n- [Friederike Hanssen](https://github.com/FriederikeHanssen)\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n- [Abhinav Sharma](https://github.com/abhi18av)\n- [Adam Talbot](https://github.com/adamrtalbot)\n- [Adrian L\u00e4rkeryd](https://github.com/adrlar)\n- [\u00c0itor Olivares](https://github.com/AitorPeseta)\n- [Alexander Peltzer](https://github.com/apeltzer)\n- [Alison Meynert](https://github.com/ameynert)\n- [Anders Sune Pedersen](https://github.com/asp8200)\n- [arontommi](https://github.com/arontommi)\n- [BarryDigby](https://github.com/BarryDigby)\n- [Bekir Erg\u00fcner](https://github.com/berguner)\n- [bjornnystedt](https://github.com/bjornnystedt)\n- [cgpu](https://github.com/cgpu)\n- [Chela James](https://github.com/chelauk)\n- [David Mas-Ponte](https://github.com/davidmasp)\n- [Edmund Miller](https://github.com/edmundmiller)\n- [Famke B\u00e4uerle](https://github.com/famosab)\n- [Francesco Lescai](https://github.com/lescai)\n- [Francisco Mart\u00ednez](https://github.com/nevinwu)\n- [Gavin Mackenzie](https://github.com/GCJMackenzie)\n- [Gisela Gabernet](https://github.com/ggabernet)\n- [Grant Neilson](https://github.com/grantn5)\n- [gulfshores](https://github.com/gulfshores)\n- [Harshil Patel](https://github.com/drpatelh)\n- [Hongwei Ye](https://github.com/YeHW)\n- [James A. Fellows Yates](https://github.com/jfy133)\n- [Jesper Eisfeldt](https://github.com/J35P312)\n- [Johannes Alneberg](https://github.com/alneberg)\n- [Jonas Kjellin](https://github.com/kjellinjonas)\n- [Jos\u00e9 Fern\u00e1ndez Navarro](https://github.com/jfnavarro)\n- [J\u00falia Mir Pedrol](https://github.com/mirpedrol)\n- [Ken Brewer](https://github.com/kenibrewer)\n- [Lasse Westergaard Folkersen](https://github.com/lassefolkersen)\n- [Lucia Conde](https://github.com/lconde-ucl)\n- [Louis Le N\u00e9zet](https://github.com/LouisLeNezet)\n- [Malin Larsson](https://github.com/malinlarsson)\n- [Marcel Martin](https://github.com/marcelm)\n- [Nick Smith](https://github.com/nickhsmith)\n- [Nicolas Schcolnicov](https://github.com/nschcolnicov)\n- [Nilesh Tawari](https://github.com/nilesh-tawari)\n- [Nils Homer](https://github.com/nh13)\n- [Olga Botvinnik](https://github.com/olgabot)\n- [Oskar Wacker](https://github.com/WackerO)\n- [pallolason](https://github.com/pallolason)\n- [Paul Cantalupo](https://github.com/pcantalupo)\n- [Phil Ewels](https://github.com/ewels)\n- [Pierre Lindenbaum](https://github.com/lindenb)\n- [Sabrina Krakau](https://github.com/skrakau)\n- [Sam Minot](https://github.com/sminot)\n- [Sebastian-D](https://github.com/Sebastian-D)\n- [Silvia Morini](https://github.com/silviamorins)\n- [Simon Pearce](https://github.com/SPPearce)\n- [Solenne Correard](https://github.com/scorreard)\n- [Susanne Jodoin](https://github.com/SusiJo)\n- [Szilveszter Juhos](https://github.com/szilvajuhos)\n- [Tobias Koch](https://github.com/KochTobi)\n- [Winni Kretzschmar](https://github.com/winni2k)\n- [Patricie Skal\u00e1kov\u00e1](https://github.com/Patricie34)\n\n## Acknowledgements\n\n| [![Barntum\u00f6rbanken](docs/images/BTB_logo.png)](https://ki.se/forskning/barntumorbanken) | [![SciLifeLab](docs/images/SciLifeLab_logo.png)](https://scilifelab.se) |\n| :-----------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------: |\n| [![National Genomics Infrastructure](docs/images/NGI_logo.png)](https://ngisweden.scilifelab.se/) | [![National Bioinformatics Infrastructure Sweden](docs/images/NBIS_logo.png)](https://nbis.se) |\n| [![QBiC](docs/images/QBiC_logo.png)](https://www.qbic.uni-tuebingen.de) | [![GHGA](docs/images/GHGA_logo.png)](https://www.ghga.de/) |\n| [![DNGC](docs/images/DNGC_logo.png)](https://eng.ngc.dk/) | |\n\n## Contributions & Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#sarek` channel](https://nfcore.slack.com/channels/sarek) (you can join with [this invite](https://nf-co.re/join/slack)), or contact us: [Maxime U Garcia](mailto:maxime.garcia@seqera.io?subject=[GitHub]%20nf-core/sarek), [Friederike Hanssen](mailto:friederike.hanssen@qbic.uni-tuebingen.de?subject=[GitHub]%20nf-core/sarek)\n\n## Citations\n\nIf you use `nf-core/sarek` for your analysis, please cite the `Sarek` article as follows:\n\n> Friederike Hanssen, Maxime U Garcia, Lasse Folkersen, Anders Sune Pedersen, Francesco Lescai, Susanne Jodoin, Edmund Miller, Oskar Wacker, Nicholas Smith, nf-core community, Gisela Gabernet, Sven Nahnsen **Scalable and efficient DNA sequencing analysis on different compute infrastructures aiding variant discovery** _NAR Genomics and Bioinformatics_ Volume 6, Issue 2, June 2024, lqae031, [doi: 10.1093/nargab/lqae031](https://doi.org/10.1093/nargab/lqae031).\n\n> Garcia M, Juhos S, Larsson M et al. **Sarek: A portable workflow for whole-genome sequencing analysis of germline and somatic variants [version 2; peer review: 2 approved]** _F1000Research_ 2020, 9:63 [doi: 10.12688/f1000research.16665.2](http://dx.doi.org/10.12688/f1000research.16665.2).\n\nYou can cite the sarek zenodo record for a specific version using the following [doi: 10.5281/zenodo.3476425](https://doi.org/10.5281/zenodo.3476425)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n\n## CHANGELOG\n\n- [CHANGELOG](CHANGELOG.md)\n", + "description": "

\n \n \n \"nf-core/sarek\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/sarek)\n[![GitHub Actions CI Status](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/sarek/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/linting.yml)\n[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/sarek/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3476425-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3476425)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/sarek)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23sarek-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/sarek)\n[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)\n[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)\n[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/sarek** is a workflow designed to detect variants on whole genome or targeted sequencing data. Initially designed for Human, and Mouse, it can work on any species with a reference genome. Sarek can also handle tumour / normal pairs and could include additional relapses.\n\nThe pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/sarek/results).\n\nIt's listed on [Elixir - Tools and Data Services Registry](https://bio.tools/nf-core-sarek) and [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek).\n\n

\n \n

\n\n## Pipeline summary\n\nDepending on the options and samples provided, the pipeline can currently perform the following:\n\n- Form consensus reads from UMI sequences (`fgbio`)\n- Sequencing quality control and trimming (enabled by `--trim_fastq`) (`FastQC`, `fastp`)\n- Contamination removal (`BBSplit` or `xengsort`, enabled by `--tools bbsplit` or `--tools xengsort`)\n- Map Reads to Reference (`BWA-mem`, `BWA-mem2`, `dragmap` or `Sentieon BWA-mem`)\n- Process BAM file (`GATK MarkDuplicates`, `GATK BaseRecalibrator` and `GATK ApplyBQSR` or `Sentieon LocusCollector` and `Sentieon Dedup`)\n- _Experimental Feature_: Use GPU-accelerated parabricks implementation as alternative to \"Map Reads to Reference\" + \"Process BAM file\" (`--aligner parabricks`)\n- Summarise alignment statistics (`samtools stats`, `mosdepth`)\n- Variant calling (enabled by `--tools`, see [compatibility](https://nf-co.re/sarek/latest/docs/usage#which-variant-calling-tool-is-implemented-for-which-data-type)):\n - `ASCAT`\n - `CNVkit`\n - `Control-FREEC`\n - `DeepVariant`\n - `freebayes`\n - `GATK HaplotypeCaller`\n - `GATK Mutect2`\n - `indexcov`\n - `Lofreq`\n - `Manta`\n - `mpileup`\n - `MSIsensor2`\n - `MSIsensor-pro`\n - `MuSE`\n - `Sentieon Haplotyper`\n - `Strelka`\n - `TIDDIT`\n- Post-variant calling options, one of:\n - Filtering (`bcftools view` (default: filter by `PASS,.`)), normalisation (`bcftools norm`) and consensus calling (`bcftools isec`, default: called by at least 2 tools `-n+2`) on all vcfs and/or `bcftools concat` for germline vcfs\n - `Varlociraptor` for all vcfs\n- Variant filtering and annotation (`SnpEff`, `Ensembl VEP`, `BCFtools annotate`, `SnpSift`)\n- Summarise and represent QC (`MultiQC`)\n\n

\n \n

\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst, prepare a samplesheet with your input data that looks as follows:\n\n`samplesheet.csv`:\n\n```csv\npatient,sample,lane,fastq_1,fastq_2\nID1,S1,L002,ID1_S1_L002_R1_001.fastq.gz,ID1_S1_L002_R2_001.fastq.gz\n```\n\nEach row represents a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/sarek \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/sarek/usage) and the [parameter documentation](https://nf-co.re/sarek/parameters).\n\nExample: enable xengsort contamination removal and build a Xengsort index from a host FASTA:\n\n```bash\nnextflow run nf-core/sarek \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \\\n --tools xengsort,strelka \\\n --xengsort_host_fasta /path/to/host_reference.fasta \\\n --xengsort_nobjects 400000 \\\n --xengsort_kmersize 25\n```\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/sarek/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/sarek/output).\n\n## Benchmarking\n\nOn each release, the pipeline is run on 3 full size tests:\n\n- `test_full` runs tumor-normal data for one patient from the SEQ2C consortium\n- `test_full_germline` runs a WGS 30X Genome-in-a-Bottle(NA12878) dataset\n- `test_full_germline_ncbench_agilent` runs two WES samples with 75M and 200M reads (data available [here](https://github.com/ncbench/ncbench-workflow#contributing-callsets)). The results are uploaded to Zenodo, evaluated against a truth dataset, and results are made available via the [NCBench dashboard](https://ncbench.github.io/report/report.html#).\n\n## Credits\n\nSarek was originally written by Maxime U Garcia and Szilveszter Juhos at the [National Genomics Infastructure](https://ngisweden.scilifelab.se) and [National Bioinformatics Infastructure Sweden](https://nbis.se) which are both platforms at [SciLifeLab](https://scilifelab.se), with the support of [The Swedish Childhood Tumor Biobank (Barntum\u00f6rbanken)](https://ki.se/forskning/barntumorbanken).\nFriederike Hanssen and Gisela Gabernet at [QBiC](https://www.qbic.uni-tuebingen.de/) later joined and helped with further development.\n\nThe Nextflow DSL2 conversion of the pipeline was lead by Friederike Hanssen and Maxime U Garcia.\n\nMaintenance is now lead by Friederike Hanssen and Maxime U Garcia (now at [Seqera](https://seqera.io))\n\nMain developers:\n\n- [Maxime U Garcia](https://github.com/maxulysse)\n- [Friederike Hanssen](https://github.com/FriederikeHanssen)\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n- [Abhinav Sharma](https://github.com/abhi18av)\n- [Adam Talbot](https://github.com/adamrtalbot)\n- [Adrian L\u00e4rkeryd](https://github.com/adrlar)\n- [\u00c0itor Olivares](https://github.com/AitorPeseta)\n- [Alexander Peltzer](https://github.com/apeltzer)\n- [Alison Meynert](https://github.com/ameynert)\n- [Anders Sune Pedersen](https://github.com/asp8200)\n- [arontommi](https://github.com/arontommi)\n- [BarryDigby](https://github.com/BarryDigby)\n- [Bekir Erg\u00fcner](https://github.com/berguner)\n- [bjornnystedt](https://github.com/bjornnystedt)\n- [cgpu](https://github.com/cgpu)\n- [Chela James](https://github.com/chelauk)\n- [David Mas-Ponte](https://github.com/davidmasp)\n- [Edmund Miller](https://github.com/edmundmiller)\n- [Famke B\u00e4uerle](https://github.com/famosab)\n- [Francesco Lescai](https://github.com/lescai)\n- [Francisco Mart\u00ednez](https://github.com/nevinwu)\n- [Gavin Mackenzie](https://github.com/GCJMackenzie)\n- [Gisela Gabernet](https://github.com/ggabernet)\n- [Grant Neilson](https://github.com/grantn5)\n- [gulfshores](https://github.com/gulfshores)\n- [Harshil Patel](https://github.com/drpatelh)\n- [Hongwei Ye](https://github.com/YeHW)\n- [James A. Fellows Yates](https://github.com/jfy133)\n- [Jesper Eisfeldt](https://github.com/J35P312)\n- [Johannes Alneberg](https://github.com/alneberg)\n- [Jonas Kjellin](https://github.com/kjellinjonas)\n- [Jos\u00e9 Fern\u00e1ndez Navarro](https://github.com/jfnavarro)\n- [J\u00falia Mir Pedrol](https://github.com/mirpedrol)\n- [Ken Brewer](https://github.com/kenibrewer)\n- [Lasse Westergaard Folkersen](https://github.com/lassefolkersen)\n- [Lucia Conde](https://github.com/lconde-ucl)\n- [Louis Le N\u00e9zet](https://github.com/LouisLeNezet)\n- [Malin Larsson](https://github.com/malinlarsson)\n- [Marcel Martin](https://github.com/marcelm)\n- [Nick Smith](https://github.com/nickhsmith)\n- [Nicolas Schcolnicov](https://github.com/nschcolnicov)\n- [Nilesh Tawari](https://github.com/nilesh-tawari)\n- [Nils Homer](https://github.com/nh13)\n- [Olga Botvinnik](https://github.com/olgabot)\n- [Oskar Wacker](https://github.com/WackerO)\n- [pallolason](https://github.com/pallolason)\n- [Paul Cantalupo](https://github.com/pcantalupo)\n- [Phil Ewels](https://github.com/ewels)\n- [Pierre Lindenbaum](https://github.com/lindenb)\n- [Sabrina Krakau](https://github.com/skrakau)\n- [Sam Minot](https://github.com/sminot)\n- [Sebastian-D](https://github.com/Sebastian-D)\n- [Silvia Morini](https://github.com/silviamorins)\n- [Simon Pearce](https://github.com/SPPearce)\n- [Solenne Correard](https://github.com/scorreard)\n- [Susanne Jodoin](https://github.com/SusiJo)\n- [Szilveszter Juhos](https://github.com/szilvajuhos)\n- [Tobias Koch](https://github.com/KochTobi)\n- [Winni Kretzschmar](https://github.com/winni2k)\n- [Patricie Skal\u00e1kov\u00e1](https://github.com/Patricie34)\n\n## Acknowledgements\n\n| [![Barntum\u00f6rbanken](docs/images/BTB_logo.png)](https://ki.se/forskning/barntumorbanken) | [![SciLifeLab](docs/images/SciLifeLab_logo.png)](https://scilifelab.se) |\n| :-----------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------: |\n| [![National Genomics Infrastructure](docs/images/NGI_logo.png)](https://ngisweden.scilifelab.se/) | [![National Bioinformatics Infrastructure Sweden](docs/images/NBIS_logo.png)](https://nbis.se) |\n| [![QBiC](docs/images/QBiC_logo.png)](https://www.qbic.uni-tuebingen.de) | [![GHGA](docs/images/GHGA_logo.png)](https://www.ghga.de/) |\n| [![DNGC](docs/images/DNGC_logo.png)](https://eng.ngc.dk/) | |\n\n## Contributions & Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#sarek` channel](https://nfcore.slack.com/channels/sarek) (you can join with [this invite](https://nf-co.re/join/slack)), or contact us: [Maxime U Garcia](mailto:maxime.garcia@seqera.io?subject=[GitHub]%20nf-core/sarek), [Friederike Hanssen](mailto:friederike.hanssen@qbic.uni-tuebingen.de?subject=[GitHub]%20nf-core/sarek)\n\n## Citations\n\nIf you use `nf-core/sarek` for your analysis, please cite the `Sarek` article as follows:\n\n> Friederike Hanssen, Maxime U Garcia, Lasse Folkersen, Anders Sune Pedersen, Francesco Lescai, Susanne Jodoin, Edmund Miller, Oskar Wacker, Nicholas Smith, nf-core community, Gisela Gabernet, Sven Nahnsen **Scalable and efficient DNA sequencing analysis on different compute infrastructures aiding variant discovery** _NAR Genomics and Bioinformatics_ Volume 6, Issue 2, June 2024, lqae031, [doi: 10.1093/nargab/lqae031](https://doi.org/10.1093/nargab/lqae031).\n\n> Garcia M, Juhos S, Larsson M et al. **Sarek: A portable workflow for whole-genome sequencing analysis of germline and somatic variants [version 2; peer review: 2 approved]** _F1000Research_ 2020, 9:63 [doi: 10.12688/f1000research.16665.2](http://dx.doi.org/10.12688/f1000research.16665.2).\n\nYou can cite the sarek zenodo record for a specific version using the following [doi: 10.5281/zenodo.3476425](https://doi.org/10.5281/zenodo.3476425)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n\n## CHANGELOG\n\n- [CHANGELOG](CHANGELOG.md)\n", "hasPart": [ { "@id": "main.nf" diff --git a/subworkflows/local/fastq_preprocess_gatk/main.nf b/subworkflows/local/fastq_preprocess_gatk/main.nf index cabdb53091..1e36f3a640 100644 --- a/subworkflows/local/fastq_preprocess_gatk/main.nf +++ b/subworkflows/local/fastq_preprocess_gatk/main.nf @@ -14,6 +14,9 @@ include { FASTP } from '../../../mod include { BBMAP_BBSPLIT } from '../../../modules/nf-core/bbmap/bbsplit' //TODO: WHAT ABOUT BBSPLIT RUNS WITH PARABRICKS? +// Remove genome contaminant reads with xengsort +include { XENGSORT_CLASSIFY } from '../../../modules/local/xengsort/classify/main' + // Create umi consensus bams from fastq include { FASTQ_CREATE_UMI_CONSENSUS_FGBIO } from '../../../subworkflows/local/fastq_create_umi_consensus_fgbio/main' @@ -62,6 +65,7 @@ workflow FASTQ_PREPROCESS_GATK { known_sites_indels known_sites_indels_tbi bbsplit_index + xengsort_index main: @@ -152,6 +156,11 @@ workflow FASTQ_PREPROCESS_GATK { reports = reports.mix(BBMAP_BBSPLIT.out.stats.collect{ _meta, stats -> stats }) + } else if (params.tools && params.tools.split(',').contains('xengsort')) { + reads_for_alignment = XENGSORT_CLASSIFY( + reads_for_bbsplit, + xengsort_index + ).graft_fastq } else { reads_for_alignment = reads_for_bbsplit } diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 3b8de518e7..8c2ba04f21 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -18,6 +18,7 @@ include { UNZIP as UNZIP_ALLELES } from '../../../modules/nf- include { UNZIP as UNZIP_GC } from '../../../modules/nf-core/unzip' include { UNZIP as UNZIP_LOCI } from '../../../modules/nf-core/unzip' include { UNZIP as UNZIP_RT } from '../../../modules/nf-core/unzip' +include { XENGSORT_INDEX } from '../../../modules/local/xengsort/index/main.nf' workflow PREPARE_GENOME { take: @@ -52,6 +53,8 @@ workflow PREPARE_GENOME { step // params.step tools // params.tools vep_include_fasta // params.vep_include_fasta + xengsort_index_in // params.xengsort_index + xengsort_host_fasta_in // params.xengsort_host_fasta main: versions = Channel.empty() @@ -147,6 +150,25 @@ workflow PREPARE_GENOME { } } + // Prepare genome for Xengsort contamination filtering + xengsort_index = Channel.empty() + if (tools && tools.split(',').contains('xengsort')) { + if (xengsort_index_in) { + // Use user-provided xengsort index + xengsort_index = Channel.value(file(xengsort_index_in, checkIfExists: true)) + } + else { + if (!xengsort_host_fasta_in) { + error("Pipeline error: '--xengsort_host_fasta' is missing. Cannot build index.") + } + // Build index from scratch using main fasta as graft and xengsort_host_fasta as host + xengsort_index = XENGSORT_INDEX( + fasta.map { _meta, fasta_ -> fasta_ }, + Channel.fromPath(xengsort_host_fasta_in, checkIfExists: true).collect() + ).index + } + } + bcftools_annotations = bcftools_annotations_in ? Channel.fromPath(bcftools_annotations_in).collect() : Channel.value([]) bcftools_annotations_tbi = bcftools_annotations_tbi_in ? Channel.fromPath(bcftools_annotations_tbi_in).collect() : Channel.value([]) @@ -325,4 +347,5 @@ workflow PREPARE_GENOME { pon_tbi // Channel: [pon_tbi] vep_fasta // Channel: [meta, vep_fasta] versions // Channel: [versions.yml] + xengsort_index // Channel: [xengsort_index/] } diff --git a/subworkflows/local/prepare_genome/tests/bbsplit.nf.test b/subworkflows/local/prepare_genome/tests/bbsplit.nf.test index ca96469853..e7ef97517b 100644 --- a/subworkflows/local/prepare_genome/tests/bbsplit.nf.test +++ b/subworkflows/local/prepare_genome/tests/bbsplit.nf.test @@ -25,31 +25,33 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = "${projectDir}/tests/csv/bbsplit_fasta_list.csv" // bbsplit_fasta_list input[5] = null // bbsplit_index - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = null // bcftools_annotations + input[7] = null // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = null // dbsnp + input[12] = null // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta' // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = null // germline_resource + input[18] = null // germline_resource_tbi + input[19] = null // known_indels + input[20] = null // known_indels_tbi + input[21] = null // known_snps + input[22] = null // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = null // pon + input[26] = null // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "bbsplit" // tools - enable bbsplit input[30] = false // vep_include_fasta + input[31] = null // xengsort_index + input[32] = null // xengsort_host_fasta """ } } @@ -81,31 +83,33 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = null // bbsplit_fasta_list input[5] = null // bbsplit_index - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = null // bcftools_annotations + input[7] = null // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = null // dbsnp + input[12] = null // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta' // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = null // germline_resource + input[18] = null // germline_resource_tbi + input[19] = null // known_indels + input[20] = null // known_indels_tbi + input[21] = null // known_snps + input[22] = null // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = null // pon + input[26] = null // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "no_tools" // tools - bbsplit not enabled input[30] = false // vep_include_fasta + input[31] = null // xengsort_index + input[32] = null // xengsort_host_fasta """ } } @@ -138,31 +142,33 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = null // bbsplit_fasta_list input[5] = mock_index_dir.toString() // bbsplit_index (directory) - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = null // bcftools_annotations + input[7] = null // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = null // dbsnp + input[12] = null // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta' // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = null // germline_resource + input[18] = null // germline_resource_tbi + input[19] = null // known_indels + input[20] = null // known_indels_tbi + input[21] = null // known_snps + input[22] = null // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = null // pon + input[26] = null // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "bbsplit" // tools - enable bbsplit input[30] = false // vep_include_fasta + input[31] = null // xengsort_index + input[32] = null // xengsort_host_fasta """ } } @@ -197,31 +203,33 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = "${projectDir}/tests/csv/bbsplit_fasta_list.csv" // bbsplit_fasta_list input[5] = null // bbsplit_index - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = null // bcftools_annotations + input[7] = null // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = null // dbsnp + input[12] = null // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta' // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = null // germline_resource + input[18] = null // germline_resource_tbi + input[19] = null // known_indels + input[20] = null // known_indels_tbi + input[21] = null // known_snps + input[22] = null // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = null // pon + input[26] = null // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "bbsplit" // tools - enable bbsplit input[30] = false // vep_include_fasta + input[31] = null // xengsort_index + input[32] = null // xengsort_host_fasta """ } } @@ -259,31 +267,33 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = null // bbsplit_fasta_list input[5] = dummy_tar.toString() // bbsplit_index (tar.gz file) - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = null // bcftools_annotations + input[7] = null // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = null // dbsnp + input[12] = null // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta' // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = null // germline_resource + input[18] = null // germline_resource_tbi + input[19] = null // known_indels + input[20] = null // known_indels_tbi + input[21] = null // known_snps + input[22] = null // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = null // pon + input[26] = null // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "bbsplit" // tools - enable bbsplit input[30] = false // vep_include_fasta + input[31] = null // xengsort_index + input[32] = null // xengsort_host_fasta """ } } diff --git a/subworkflows/local/prepare_genome/tests/nextflow.config b/subworkflows/local/prepare_genome/tests/nextflow.config index 16d29f4fde..34d7943b38 100644 --- a/subworkflows/local/prepare_genome/tests/nextflow.config +++ b/subworkflows/local/prepare_genome/tests/nextflow.config @@ -2,4 +2,10 @@ process { withName: 'PREPARE_GENOME:BBMAP_BBSPLIT' { memory = '1.GB' } + + withName: 'PREPARE_GENOME:XENGSORT_INDEX' { + memory = '8.GB' + ext.nobjects = 400000 + ext.kmersize = 25 + } } diff --git a/subworkflows/local/prepare_genome/tests/xengsort.nf.test b/subworkflows/local/prepare_genome/tests/xengsort.nf.test new file mode 100644 index 0000000000..f438c3c52d --- /dev/null +++ b/subworkflows/local/prepare_genome/tests/xengsort.nf.test @@ -0,0 +1,168 @@ +nextflow_workflow { + + name "Test Subworkflow PREPARE_GENOME - Xengsort functionality" + script "../main.nf" + workflow "PREPARE_GENOME" + config "./nextflow.config" + + tag "subworkflows" + tag "subworkflows_local" + tag "prepare_genome" + tag "xengsort" + + test("Xengsort - build index from host fasta") { + + options "-stub" + + when { + workflow { + """ + input[0] = null // ascat_alleles + input[1] = null // ascat_loci + input[2] = null // ascat_loci_gc + input[3] = null // ascat_loci_rt + input[4] = null // bbsplit_fasta_list + input[5] = null // bbsplit_index + input[6] = null // bcftools_annotations + input[7] = null // bcftools_annotations_tbi + input[8] = null // bwa + input[9] = null // bwamem2 + input[10] = null // chr_dir + input[11] = null // dbsnp + input[12] = null // dbsnp_tbi + input[13] = null // dict + input[14] = null // dragmap + input[15] = params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta' // fasta + input[16] = null // fasta_fai + input[17] = null // germline_resource + input[18] = null // germline_resource_tbi + input[19] = null // known_indels + input[20] = null // known_indels_tbi + input[21] = null // known_snps + input[22] = null // known_snps_tbi + input[23] = null // msisensor2_models + input[24] = null // msisensorpro_scan + input[25] = null // pon + input[26] = null // pon_tbi + input[27] = 'bwa-mem' // aligner + input[28] = 'annotate' // step + input[29] = 'xengsort' // tools + input[30] = false // vep_include_fasta + input[31] = null // xengsort_index + input[32] = params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta' // xengsort_host_fasta + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.xengsort_index.size() == 1 } + ) + } + } + + test("Xengsort - use provided index") { + + when { + workflow { + """ + def mock_index_dir = file("${workDir}/mock_xengsort_index") + mock_index_dir.mkdirs() + file("${workDir}/mock_xengsort_index/index.info").text = 'dummy' + + input[0] = null // ascat_alleles + input[1] = null // ascat_loci + input[2] = null // ascat_loci_gc + input[3] = null // ascat_loci_rt + input[4] = null // bbsplit_fasta_list + input[5] = null // bbsplit_index + input[6] = null // bcftools_annotations + input[7] = null // bcftools_annotations_tbi + input[8] = null // bwa + input[9] = null // bwamem2 + input[10] = null // chr_dir + input[11] = null // dbsnp + input[12] = null // dbsnp_tbi + input[13] = null // dict + input[14] = null // dragmap + input[15] = params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta' // fasta + input[16] = null // fasta_fai + input[17] = null // germline_resource + input[18] = null // germline_resource_tbi + input[19] = null // known_indels + input[20] = null // known_indels_tbi + input[21] = null // known_snps + input[22] = null // known_snps_tbi + input[23] = null // msisensor2_models + input[24] = null // msisensorpro_scan + input[25] = null // pon + input[26] = null // pon_tbi + input[27] = 'bwa-mem' // aligner + input[28] = 'annotate' // step + input[29] = 'xengsort' // tools + input[30] = false // vep_include_fasta + input[31] = mock_index_dir.toString() // xengsort_index + input[32] = null // xengsort_host_fasta + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.xengsort_index.size() == 1 } + ) + } + } + + test("Don't run Xengsort - tools without xengsort") { + + when { + workflow { + """ + input[0] = null // ascat_alleles + input[1] = null // ascat_loci + input[2] = null // ascat_loci_gc + input[3] = null // ascat_loci_rt + input[4] = null // bbsplit_fasta_list + input[5] = null // bbsplit_index + input[6] = null // bcftools_annotations + input[7] = null // bcftools_annotations_tbi + input[8] = null // bwa + input[9] = null // bwamem2 + input[10] = null // chr_dir + input[11] = null // dbsnp + input[12] = null // dbsnp_tbi + input[13] = null // dict + input[14] = null // dragmap + input[15] = params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta' // fasta + input[16] = null // fasta_fai + input[17] = null // germline_resource + input[18] = null // germline_resource_tbi + input[19] = null // known_indels + input[20] = null // known_indels_tbi + input[21] = null // known_snps + input[22] = null // known_snps_tbi + input[23] = null // msisensor2_models + input[24] = null // msisensorpro_scan + input[25] = null // pon + input[26] = null // pon_tbi + input[27] = 'bwa-mem' // aligner + input[28] = 'annotate' // step + input[29] = 'no_tools' // tools + input[30] = false // vep_include_fasta + input[31] = null // xengsort_index + input[32] = null // xengsort_host_fasta + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.xengsort_index.size() == 0 } + ) + } + } +} diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index da3eeb6d16..46110678f0 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -314,6 +314,9 @@ " split_fastq : 0", " intervals : https://raw.githubusercontent.com/nf-core/test-datasets/modules/data//genomics/homo_sapiens/genome/genome.interval_list", " tools : strelka", + "Unique Molecular Identifiers", + " xengsort_nobjects : 400000", + " xengsort_kmersize : 25", "Annotation", " bcftools_annotations : https://raw.githubusercontent.com/nf-core/test-datasets/modules/data//genomics/sarscov2/illumina/vcf/test2.vcf.gz", " bcftools_annotations_tbi : https://raw.githubusercontent.com/nf-core/test-datasets/modules/data//genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi", @@ -391,7 +394,7 @@ "[NXF_HASH] Submitted process > NFCORE_SAREK:SAREK:VCF_QC_BCFTOOLS_VCFTOOLS:VCFTOOLS_TSTV_QUAL (test)" ] ], - "timestamp": "2025-12-15T19:44:11.568889909", + "timestamp": "2026-03-27T09:42:05.764331126", "meta": { "nf-test": "0.9.3", "nextflow": "25.10.2" diff --git a/tests/xengsort.nf.test b/tests/xengsort.nf.test new file mode 100644 index 0000000000..f2a5c70ddb --- /dev/null +++ b/tests/xengsort.nf.test @@ -0,0 +1,60 @@ +def projectDir = new File('.').absolutePath + +def modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + +nextflow_pipeline { + + name "Test pipeline - Xengsort contamination removal" + script "../main.nf" + + def test_scenario = [ + [ + name: "-profile test --tools xengsort,strelka --xengsort_host_fasta (single)", + params: [ + tools: 'xengsort,strelka', + xengsort_host_fasta: modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', + input: "${projectDir}/tests/csv/3.0/fastq_single.csv", + modules_testdata_base_path: modules_testdata_base_path, + igenomes_base: modules_testdata_base_path, + genome: 'testdata.nf-core.sarek', + save_reference: true, + validate_params: false + ], + ignoreFiles: '{multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt,multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt,multiqc/multiqc_data/mosdepth_perchrom.txt,multiqc/multiqc_data/samtools*.txt,preprocessing/**/*.cram,reports/mosdepth/*/*,**/xengsort_index/*.hash,**/xengsort_index/*.info}' + ], + [ + name: "-profile test --tools xengsort,strelka --xengsort_host_fasta (pair)", + params: [ + tools: 'xengsort,strelka', + xengsort_host_fasta: modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', + input: "${projectDir}/tests/csv/3.0/fastq_pair.csv", + modules_testdata_base_path: modules_testdata_base_path, + igenomes_base: modules_testdata_base_path, + genome: 'testdata.nf-core.sarek', + save_reference: true, + validate_params: false + ], + ignoreFiles: '{multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt,multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt,multiqc/multiqc_data/mosdepth_perchrom.txt,multiqc/multiqc_data/samtools*.txt,preprocessing/**/*.cram,reports/mosdepth/*/*,**/xengsort_index/*.hash,**/xengsort_index/*.info}' + ], + [ + name: "-profile test --tools xengsort,strelka --xengsort_host_fasta -stub", + params: [ + tools: 'xengsort,strelka', + xengsort_host_fasta: modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', + input: "${projectDir}/tests/csv/3.0/fastq_single.csv", + modules_testdata_base_path: modules_testdata_base_path, + igenomes_base: modules_testdata_base_path, + genome: 'testdata.nf-core.sarek', + save_reference: true, + validate_params: false + ], + stub: true, + ignoreFiles: '{multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt,multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt,multiqc/multiqc_data/mosdepth_perchrom.txt,multiqc/multiqc_data/samtools*.txt,preprocessing/**/*.cram,reports/mosdepth/*/*}' + ] + ] + + // Generate tests for each scenario + test_scenario.each { scenario -> + test(scenario.name, UTILS.getTest(scenario)) + } +} diff --git a/tests/xengsort.nf.test.snap b/tests/xengsort.nf.test.snap new file mode 100644 index 0000000000..6a2492a9d1 --- /dev/null +++ b/tests/xengsort.nf.test.snap @@ -0,0 +1,944 @@ +{ + "-profile test --tools xengsort,strelka --xengsort_host_fasta (pair)": { + "content": [ + 43, + { + "BCFTOOLS_STATS": { + "bcftools": 1.21 + }, + "BWAMEM1_INDEX": { + "bwa": "0.7.18-r1243-dirty" + }, + "BWAMEM1_MEM": { + "bwa": "0.7.18-r1243-dirty", + "samtools": 1.21 + }, + "CREATE_INTERVALS_BED": { + "gawk": "5.3.0" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "GATK4_APPLYBQSR": { + "gatk4": "4.6.1.0" + }, + "GATK4_BASERECALIBRATOR": { + "gatk4": "4.6.1.0" + }, + "GATK4_INTERVALLISTTOBED": { + "gatk4": "4.6.1.0" + }, + "GATK4_MARKDUPLICATES": { + "gatk4": "4.6.1.0", + "samtools": 1.21 + }, + "INDEX_CRAM": { + "samtools": 1.21 + }, + "MOSDEPTH": { + "mosdepth": "0.3.10" + }, + "SAMTOOLS_STATS": { + "samtools": 1.21 + }, + "STRELKA_SINGLE": { + "strelka": "2.9.10" + }, + "STRELKA_SOMATIC": { + "strelka": "2.9.10" + }, + "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { + "bgzip": "1.21", + "tabix": "1.21" + }, + "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { + "bgzip": "1.21", + "tabix": "1.21" + }, + "VCFTOOLS_TSTV_COUNT": { + "vcftools": "0.1.16" + }, + "XENGSORT_CLASSIFY": { + "xengsort": "2.1.0" + }, + "XENGSORT_INDEX": { + "xengsort": "2.1.0" + } + }, + [ + "csv", + "csv/markduplicates.csv", + "csv/markduplicates_no_table.csv", + "csv/recalibrated.csv", + "csv/variantcalled.csv", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", + "multiqc/multiqc_data/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.txt", + "multiqc/multiqc_data/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.txt", + "multiqc/multiqc_data/gatk-base-recalibrator-reported-empirical-plot.txt", + "multiqc/multiqc_data/gatk_base_recalibrator.txt", + "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_bcftools_stats.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_picard_dups.txt", + "multiqc/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/picard_MarkIlluminaAdapters_histogram.txt", + "multiqc/multiqc_data/picard_MeanQualityByCycle_histogram.txt", + "multiqc/multiqc_data/picard_MeanQualityByCycle_histogram_1.txt", + "multiqc/multiqc_data/picard_QualityScoreDistribution_histogram.txt", + "multiqc/multiqc_data/picard_deduplication.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_data/vcftools_tstv_by_count.txt", + "multiqc/multiqc_data/vcftools_tstv_by_qual.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_length_distribution_plot.pdf", + "multiqc/multiqc_plots/pdf/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.pdf", + "multiqc/multiqc_plots/pdf/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.pdf", + "multiqc/multiqc_plots/pdf/gatk-base-recalibrator-reported-empirical-plot.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/picard_deduplication-cnt.pdf", + "multiqc/multiqc_plots/pdf/picard_deduplication-pct.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/vcftools_tstv_by_count.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_length_distribution_plot.png", + "multiqc/multiqc_plots/png/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.png", + "multiqc/multiqc_plots/png/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.png", + "multiqc/multiqc_plots/png/gatk-base-recalibrator-reported-empirical-plot.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/picard_deduplication-cnt.png", + "multiqc/multiqc_plots/png/picard_deduplication-pct.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/vcftools_tstv_by_count.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_length_distribution_plot.svg", + "multiqc/multiqc_plots/svg/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.svg", + "multiqc/multiqc_plots/svg/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.svg", + "multiqc/multiqc_plots/svg/gatk-base-recalibrator-reported-empirical-plot.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/picard_deduplication-cnt.svg", + "multiqc/multiqc_plots/svg/picard_deduplication-pct.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/vcftools_tstv_by_count.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_sarek_software_mqc_versions.yml", + "preprocessing", + "preprocessing/markduplicates", + "preprocessing/markduplicates/test", + "preprocessing/markduplicates/test/test.md.cram", + "preprocessing/markduplicates/test/test.md.cram.crai", + "preprocessing/markduplicates/test2", + "preprocessing/markduplicates/test2/test2.md.cram", + "preprocessing/markduplicates/test2/test2.md.cram.crai", + "preprocessing/recal_table", + "preprocessing/recal_table/test", + "preprocessing/recal_table/test/test.recal.table", + "preprocessing/recal_table/test2", + "preprocessing/recal_table/test2/test2.recal.table", + "preprocessing/recalibrated", + "preprocessing/recalibrated/test", + "preprocessing/recalibrated/test/test.recal.cram", + "preprocessing/recalibrated/test/test.recal.cram.crai", + "preprocessing/recalibrated/test2", + "preprocessing/recalibrated/test2/test2.recal.cram", + "preprocessing/recalibrated/test2/test2.recal.cram.crai", + "reference", + "reference/bwa", + "reference/bwa/genome.amb", + "reference/bwa/genome.ann", + "reference/bwa/genome.bwt", + "reference/bwa/genome.pac", + "reference/bwa/genome.sa", + "reference/intervals", + "reference/intervals/chr22_1-40001.bed", + "reference/intervals/chr22_1-40001.bed.gz", + "reference/intervals/genome.bed", + "reference/intervals/genome.bed.gz", + "reference/xengsort_index", + "reference/xengsort_index/index.hash", + "reference/xengsort_index/index.info", + "reports", + "reports/bcftools", + "reports/bcftools/strelka", + "reports/bcftools/strelka/test", + "reports/bcftools/strelka/test/test.strelka.variants.bcftools_stats.txt", + "reports/bcftools/strelka/test2_vs_test", + "reports/bcftools/strelka/test2_vs_test/test2_vs_test.strelka.somatic_indels.bcftools_stats.txt", + "reports/bcftools/strelka/test2_vs_test/test2_vs_test.strelka.somatic_snvs.bcftools_stats.txt", + "reports/fastqc", + "reports/fastqc/test-test_L1", + "reports/fastqc/test-test_L1/test-test_L1_1_fastqc.html", + "reports/fastqc/test-test_L1/test-test_L1_1_fastqc.zip", + "reports/fastqc/test-test_L1/test-test_L1_2_fastqc.html", + "reports/fastqc/test-test_L1/test-test_L1_2_fastqc.zip", + "reports/fastqc/test2-test_L1", + "reports/fastqc/test2-test_L1/test2-test_L1_1_fastqc.html", + "reports/fastqc/test2-test_L1/test2-test_L1_1_fastqc.zip", + "reports/fastqc/test2-test_L1/test2-test_L1_2_fastqc.html", + "reports/fastqc/test2-test_L1/test2-test_L1_2_fastqc.zip", + "reports/markduplicates", + "reports/markduplicates/test", + "reports/markduplicates/test/test.md.cram.metrics", + "reports/markduplicates/test2", + "reports/markduplicates/test2/test2.md.cram.metrics", + "reports/mosdepth", + "reports/mosdepth/test", + "reports/mosdepth/test/test.md.mosdepth.global.dist.txt", + "reports/mosdepth/test/test.md.mosdepth.region.dist.txt", + "reports/mosdepth/test/test.md.mosdepth.summary.txt", + "reports/mosdepth/test/test.md.regions.bed.gz", + "reports/mosdepth/test/test.md.regions.bed.gz.csi", + "reports/mosdepth/test/test.recal.mosdepth.global.dist.txt", + "reports/mosdepth/test/test.recal.mosdepth.region.dist.txt", + "reports/mosdepth/test/test.recal.mosdepth.summary.txt", + "reports/mosdepth/test/test.recal.regions.bed.gz", + "reports/mosdepth/test/test.recal.regions.bed.gz.csi", + "reports/mosdepth/test2", + "reports/mosdepth/test2/test2.md.mosdepth.global.dist.txt", + "reports/mosdepth/test2/test2.md.mosdepth.region.dist.txt", + "reports/mosdepth/test2/test2.md.mosdepth.summary.txt", + "reports/mosdepth/test2/test2.md.regions.bed.gz", + "reports/mosdepth/test2/test2.md.regions.bed.gz.csi", + "reports/mosdepth/test2/test2.recal.mosdepth.global.dist.txt", + "reports/mosdepth/test2/test2.recal.mosdepth.region.dist.txt", + "reports/mosdepth/test2/test2.recal.mosdepth.summary.txt", + "reports/mosdepth/test2/test2.recal.regions.bed.gz", + "reports/mosdepth/test2/test2.recal.regions.bed.gz.csi", + "reports/samtools", + "reports/samtools/test", + "reports/samtools/test/test.md.cram.stats", + "reports/samtools/test/test.recal.cram.stats", + "reports/samtools/test2", + "reports/samtools/test2/test2.md.cram.stats", + "reports/samtools/test2/test2.recal.cram.stats", + "reports/vcftools", + "reports/vcftools/strelka", + "reports/vcftools/strelka/test", + "reports/vcftools/strelka/test/test.strelka.variants.FILTER.summary", + "reports/vcftools/strelka/test/test.strelka.variants.TsTv.count", + "reports/vcftools/strelka/test/test.strelka.variants.TsTv.qual", + "reports/vcftools/strelka/test2_vs_test", + "reports/vcftools/strelka/test2_vs_test/test2_vs_test.strelka.somatic_indels.FILTER.summary", + "reports/vcftools/strelka/test2_vs_test/test2_vs_test.strelka.somatic_indels.TsTv.count", + "reports/vcftools/strelka/test2_vs_test/test2_vs_test.strelka.somatic_indels.TsTv.qual", + "reports/vcftools/strelka/test2_vs_test/test2_vs_test.strelka.somatic_snvs.FILTER.summary", + "reports/vcftools/strelka/test2_vs_test/test2_vs_test.strelka.somatic_snvs.TsTv.count", + "reports/vcftools/strelka/test2_vs_test/test2_vs_test.strelka.somatic_snvs.TsTv.qual", + "variant_calling", + "variant_calling/strelka", + "variant_calling/strelka/test", + "variant_calling/strelka/test/test.strelka.genome.vcf.gz", + "variant_calling/strelka/test/test.strelka.genome.vcf.gz.tbi", + "variant_calling/strelka/test/test.strelka.variants.vcf.gz", + "variant_calling/strelka/test/test.strelka.variants.vcf.gz.tbi", + "variant_calling/strelka/test2_vs_test", + "variant_calling/strelka/test2_vs_test/test2_vs_test.strelka.somatic_indels.vcf.gz", + "variant_calling/strelka/test2_vs_test/test2_vs_test.strelka.somatic_indels.vcf.gz.tbi", + "variant_calling/strelka/test2_vs_test/test2_vs_test.strelka.somatic_snvs.vcf.gz", + "variant_calling/strelka/test2_vs_test/test2_vs_test.strelka.somatic_snvs.vcf.gz.tbi" + ], + [ + "fastqc-status-check-heatmap.txt:md5,eeb4e7e7a45f4223c86bfe3aea81f90b", + "fastqc_adapter_content_plot.txt:md5,cc7a809f9f001c10646ee4199ccdb40f", + "fastqc_per_base_n_content_plot.txt:md5,1eba855ae0fa5b5ed4a1f90d1c97f759", + "fastqc_per_base_sequence_quality_plot.txt:md5,cbb2743dfb2ec74e72b578c83ec28ee8", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,73c884822eba0bafcdf34b90fe81aec5", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,24eeb00e5e2b11c7ab90a3223d429d15", + "fastqc_per_sequence_quality_scores_plot.txt:md5,6f048594f02effb93608665be29bd35a", + "fastqc_sequence_counts_plot.txt:md5,fca7ee9ef3382e2837a302d8c5d33769", + "fastqc_sequence_duplication_levels_plot.txt:md5,2aa0c6f33e4cffbb29cdabe2c28bb097", + "fastqc_sequence_length_distribution_plot.txt:md5,61b1fe978a2c73b86c30c27ee4bc60ae", + "multiqc_citations.txt:md5,790a7694da30294b51fa1d6c3eb8ba2b", + "multiqc_fastqc.txt:md5,2fd25e8c81f962594b801d5a9df3cd87", + "picard_MarkIlluminaAdapters_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.amb:md5,1891c1de381b3a96d4e72f590fde20c1", + "genome.ann:md5,2df4aa2d7580639fa0fcdbcad5e2e969", + "genome.bwt:md5,815eded87e4cb6b0f1daab5c4d6e30af", + "genome.pac:md5,8569fbdb2c98c6fb16dfa73d8eacb070", + "genome.sa:md5,e7cff62b919448a3a3d0fe4aaf427594", + "chr22_1-40001.bed:md5,87a15eb9c2ff20ccd5cd8735a28708f7", + "chr22_1-40001.bed.gz:md5,87a15eb9c2ff20ccd5cd8735a28708f7", + "genome.bed:md5,a87dc7d20ebca626f65cc16ff6c97a3e", + "genome.bed.gz:md5,a87dc7d20ebca626f65cc16ff6c97a3e", + "test.strelka.variants.bcftools_stats.txt:md5,d09761afc32b904a3a18a1623789c65c", + "test2_vs_test.strelka.somatic_indels.bcftools_stats.txt:md5,5e8f9a8fdbc765ced736d0c8c7dd3a52", + "test2_vs_test.strelka.somatic_snvs.bcftools_stats.txt:md5,edb7763fad7b6f825e47e01ffa70adbc", + "test.strelka.variants.FILTER.summary:md5,5996690f9ad61a2e37084a92c7f99bbe", + "test.strelka.variants.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", + "test2_vs_test.strelka.somatic_indels.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", + "test2_vs_test.strelka.somatic_indels.TsTv.count:md5,8dcfdbcaac118df1d5ad407dd2af699f", + "test2_vs_test.strelka.somatic_snvs.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", + "test2_vs_test.strelka.somatic_snvs.TsTv.count:md5,8dcfdbcaac118df1d5ad407dd2af699f" + ], + "No BAM files", + "No CRAM files", + [ + "test.strelka.genome.vcf.gz:md5,e3571b004f31f46ba56b558c75a876f8", + "test.strelka.variants.vcf.gz:md5,5f015f39b788e767830761fadb6231b", + "test2_vs_test.strelka.somatic_indels.vcf.gz:md5,d41d8cd98f00b204e9800998ecf8427e", + "test2_vs_test.strelka.somatic_snvs.vcf.gz:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test2_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998513#1/1", + "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" + ] + ], + "timestamp": "2026-03-21T15:03:50.866969", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "-profile test --tools xengsort,strelka --xengsort_host_fasta -stub": { + "content": [ + 26, + { + "BCFTOOLS_STATS": { + "bcftools": 1.21 + }, + "BWAMEM1_INDEX": { + "bwa": "0.7.18-r1243-dirty" + }, + "BWAMEM1_MEM": { + "bwa": "0.7.18-r1243-dirty", + "samtools": 1.21 + }, + "CREATE_INTERVALS_BED": { + "gawk": "5.3.0" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "GATK4_APPLYBQSR": { + "gatk4": "4.6.1.0" + }, + "GATK4_BASERECALIBRATOR": { + "gatk4": "4.6.1.0" + }, + "GATK4_INTERVALLISTTOBED": { + "gatk4": "4.6.1.0" + }, + "GATK4_MARKDUPLICATES": { + "gatk4": "4.6.1.0", + "samtools": 1.21 + }, + "INDEX_CRAM": { + "samtools": 1.21 + }, + "MOSDEPTH": { + "mosdepth": "0.3.10" + }, + "SAMTOOLS_STATS": { + "samtools": 1.21 + }, + "STRELKA_SINGLE": { + "strelka": "2.9.10" + }, + "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { + "bgzip": "1.21", + "tabix": "1.21" + }, + "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { + "bgzip": "1.21", + "tabix": "1.21" + }, + "VCFTOOLS_TSTV_COUNT": { + "vcftools": "0.1.16" + }, + "XENGSORT_CLASSIFY": { + "xengsort": "2.1.0" + }, + "XENGSORT_INDEX": { + "xengsort": "2.1.0" + } + }, + [ + "csv", + "csv/markduplicates.csv", + "csv/markduplicates_no_table.csv", + "csv/recalibrated.csv", + "csv/variantcalled.csv", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", + "multiqc/multiqc_data/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.txt", + "multiqc/multiqc_data/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.txt", + "multiqc/multiqc_data/gatk-base-recalibrator-reported-empirical-plot.txt", + "multiqc/multiqc_data/gatk_base_recalibrator.txt", + "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_bcftools_stats.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_picard_dups.txt", + "multiqc/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/picard_MarkIlluminaAdapters_histogram.txt", + "multiqc/multiqc_data/picard_MeanQualityByCycle_histogram.txt", + "multiqc/multiqc_data/picard_MeanQualityByCycle_histogram_1.txt", + "multiqc/multiqc_data/picard_QualityScoreDistribution_histogram.txt", + "multiqc/multiqc_data/picard_deduplication.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_data/vcftools_tstv_by_count.txt", + "multiqc/multiqc_data/vcftools_tstv_by_qual.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_length_distribution_plot.pdf", + "multiqc/multiqc_plots/pdf/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.pdf", + "multiqc/multiqc_plots/pdf/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.pdf", + "multiqc/multiqc_plots/pdf/gatk-base-recalibrator-reported-empirical-plot.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/picard_deduplication-cnt.pdf", + "multiqc/multiqc_plots/pdf/picard_deduplication-pct.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/vcftools_tstv_by_count.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_length_distribution_plot.png", + "multiqc/multiqc_plots/png/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.png", + "multiqc/multiqc_plots/png/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.png", + "multiqc/multiqc_plots/png/gatk-base-recalibrator-reported-empirical-plot.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/picard_deduplication-cnt.png", + "multiqc/multiqc_plots/png/picard_deduplication-pct.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/vcftools_tstv_by_count.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_length_distribution_plot.svg", + "multiqc/multiqc_plots/svg/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.svg", + "multiqc/multiqc_plots/svg/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.svg", + "multiqc/multiqc_plots/svg/gatk-base-recalibrator-reported-empirical-plot.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/picard_deduplication-cnt.svg", + "multiqc/multiqc_plots/svg/picard_deduplication-pct.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/vcftools_tstv_by_count.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_sarek_software_mqc_versions.yml", + "preprocessing", + "preprocessing/markduplicates", + "preprocessing/markduplicates/test", + "preprocessing/markduplicates/test/test.md.cram", + "preprocessing/markduplicates/test/test.md.cram.crai", + "preprocessing/recal_table", + "preprocessing/recal_table/test", + "preprocessing/recal_table/test/test.recal.table", + "preprocessing/recalibrated", + "preprocessing/recalibrated/test", + "preprocessing/recalibrated/test/test.recal.cram", + "preprocessing/recalibrated/test/test.recal.cram.crai", + "reference", + "reference/bwa", + "reference/bwa/genome.amb", + "reference/bwa/genome.ann", + "reference/bwa/genome.bwt", + "reference/bwa/genome.pac", + "reference/bwa/genome.sa", + "reference/intervals", + "reference/intervals/chr22_1-40001.bed", + "reference/intervals/chr22_1-40001.bed.gz", + "reference/intervals/genome.bed", + "reference/intervals/genome.bed.gz", + "reference/xengsort_index", + "reference/xengsort_index/index.hash", + "reference/xengsort_index/index.info", + "reports", + "reports/bcftools", + "reports/bcftools/strelka", + "reports/bcftools/strelka/test", + "reports/bcftools/strelka/test/test.strelka.variants.bcftools_stats.txt", + "reports/fastqc", + "reports/fastqc/test-test_L1", + "reports/fastqc/test-test_L1/test-test_L1_1_fastqc.html", + "reports/fastqc/test-test_L1/test-test_L1_1_fastqc.zip", + "reports/fastqc/test-test_L1/test-test_L1_2_fastqc.html", + "reports/fastqc/test-test_L1/test-test_L1_2_fastqc.zip", + "reports/fastqc/test-test_L2", + "reports/fastqc/test-test_L2/test-test_L2_1_fastqc.html", + "reports/fastqc/test-test_L2/test-test_L2_1_fastqc.zip", + "reports/fastqc/test-test_L2/test-test_L2_2_fastqc.html", + "reports/fastqc/test-test_L2/test-test_L2_2_fastqc.zip", + "reports/markduplicates", + "reports/markduplicates/test", + "reports/markduplicates/test/test.md.cram.metrics", + "reports/mosdepth", + "reports/mosdepth/test", + "reports/mosdepth/test/test.md.mosdepth.global.dist.txt", + "reports/mosdepth/test/test.md.mosdepth.region.dist.txt", + "reports/mosdepth/test/test.md.mosdepth.summary.txt", + "reports/mosdepth/test/test.md.regions.bed.gz", + "reports/mosdepth/test/test.md.regions.bed.gz.csi", + "reports/mosdepth/test/test.recal.mosdepth.global.dist.txt", + "reports/mosdepth/test/test.recal.mosdepth.region.dist.txt", + "reports/mosdepth/test/test.recal.mosdepth.summary.txt", + "reports/mosdepth/test/test.recal.regions.bed.gz", + "reports/mosdepth/test/test.recal.regions.bed.gz.csi", + "reports/samtools", + "reports/samtools/test", + "reports/samtools/test/test.md.cram.stats", + "reports/samtools/test/test.recal.cram.stats", + "reports/vcftools", + "reports/vcftools/strelka", + "reports/vcftools/strelka/test", + "reports/vcftools/strelka/test/test.strelka.variants.FILTER.summary", + "reports/vcftools/strelka/test/test.strelka.variants.TsTv.count", + "reports/vcftools/strelka/test/test.strelka.variants.TsTv.qual", + "variant_calling", + "variant_calling/strelka", + "variant_calling/strelka/test", + "variant_calling/strelka/test/test.strelka.genome.vcf.gz", + "variant_calling/strelka/test/test.strelka.genome.vcf.gz.tbi", + "variant_calling/strelka/test/test.strelka.variants.vcf.gz", + "variant_calling/strelka/test/test.strelka.variants.vcf.gz.tbi" + ], + [ + "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" + ] + ], + "timestamp": "2026-03-21T15:09:50.075786", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "-profile test --tools xengsort,strelka --xengsort_host_fasta (single)": { + "content": [ + 26, + { + "BCFTOOLS_STATS": { + "bcftools": 1.21 + }, + "BWAMEM1_INDEX": { + "bwa": "0.7.18-r1243-dirty" + }, + "BWAMEM1_MEM": { + "bwa": "0.7.18-r1243-dirty", + "samtools": 1.21 + }, + "CREATE_INTERVALS_BED": { + "gawk": "5.3.0" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "GATK4_APPLYBQSR": { + "gatk4": "4.6.1.0" + }, + "GATK4_BASERECALIBRATOR": { + "gatk4": "4.6.1.0" + }, + "GATK4_INTERVALLISTTOBED": { + "gatk4": "4.6.1.0" + }, + "GATK4_MARKDUPLICATES": { + "gatk4": "4.6.1.0", + "samtools": 1.21 + }, + "INDEX_CRAM": { + "samtools": 1.21 + }, + "MOSDEPTH": { + "mosdepth": "0.3.10" + }, + "SAMTOOLS_STATS": { + "samtools": 1.21 + }, + "STRELKA_SINGLE": { + "strelka": "2.9.10" + }, + "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { + "bgzip": "1.21", + "tabix": "1.21" + }, + "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { + "bgzip": "1.21", + "tabix": "1.21" + }, + "VCFTOOLS_TSTV_COUNT": { + "vcftools": "0.1.16" + }, + "XENGSORT_CLASSIFY": { + "xengsort": "2.1.0" + }, + "XENGSORT_INDEX": { + "xengsort": "2.1.0" + } + }, + [ + "csv", + "csv/markduplicates.csv", + "csv/markduplicates_no_table.csv", + "csv/recalibrated.csv", + "csv/variantcalled.csv", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", + "multiqc/multiqc_data/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.txt", + "multiqc/multiqc_data/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.txt", + "multiqc/multiqc_data/gatk-base-recalibrator-reported-empirical-plot.txt", + "multiqc/multiqc_data/gatk_base_recalibrator.txt", + "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_bcftools_stats.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_picard_dups.txt", + "multiqc/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/picard_MarkIlluminaAdapters_histogram.txt", + "multiqc/multiqc_data/picard_MeanQualityByCycle_histogram.txt", + "multiqc/multiqc_data/picard_MeanQualityByCycle_histogram_1.txt", + "multiqc/multiqc_data/picard_QualityScoreDistribution_histogram.txt", + "multiqc/multiqc_data/picard_deduplication.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_data/vcftools_tstv_by_count.txt", + "multiqc/multiqc_data/vcftools_tstv_by_qual.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_length_distribution_plot.pdf", + "multiqc/multiqc_plots/pdf/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.pdf", + "multiqc/multiqc_plots/pdf/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.pdf", + "multiqc/multiqc_plots/pdf/gatk-base-recalibrator-reported-empirical-plot.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/picard_deduplication-cnt.pdf", + "multiqc/multiqc_plots/pdf/picard_deduplication-pct.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/vcftools_tstv_by_count.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_length_distribution_plot.png", + "multiqc/multiqc_plots/png/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.png", + "multiqc/multiqc_plots/png/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.png", + "multiqc/multiqc_plots/png/gatk-base-recalibrator-reported-empirical-plot.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/picard_deduplication-cnt.png", + "multiqc/multiqc_plots/png/picard_deduplication-pct.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/vcftools_tstv_by_count.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_length_distribution_plot.svg", + "multiqc/multiqc_plots/svg/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Count.svg", + "multiqc/multiqc_plots/svg/gatk-base-recalibrator-quality-scores-plot_Pre-recalibration_Percent.svg", + "multiqc/multiqc_plots/svg/gatk-base-recalibrator-reported-empirical-plot.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/picard_deduplication-cnt.svg", + "multiqc/multiqc_plots/svg/picard_deduplication-pct.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/vcftools_tstv_by_count.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_sarek_software_mqc_versions.yml", + "preprocessing", + "preprocessing/markduplicates", + "preprocessing/markduplicates/test", + "preprocessing/markduplicates/test/test.md.cram", + "preprocessing/markduplicates/test/test.md.cram.crai", + "preprocessing/recal_table", + "preprocessing/recal_table/test", + "preprocessing/recal_table/test/test.recal.table", + "preprocessing/recalibrated", + "preprocessing/recalibrated/test", + "preprocessing/recalibrated/test/test.recal.cram", + "preprocessing/recalibrated/test/test.recal.cram.crai", + "reference", + "reference/bwa", + "reference/bwa/genome.amb", + "reference/bwa/genome.ann", + "reference/bwa/genome.bwt", + "reference/bwa/genome.pac", + "reference/bwa/genome.sa", + "reference/intervals", + "reference/intervals/chr22_1-40001.bed", + "reference/intervals/chr22_1-40001.bed.gz", + "reference/intervals/genome.bed", + "reference/intervals/genome.bed.gz", + "reference/xengsort_index", + "reference/xengsort_index/index.hash", + "reference/xengsort_index/index.info", + "reports", + "reports/bcftools", + "reports/bcftools/strelka", + "reports/bcftools/strelka/test", + "reports/bcftools/strelka/test/test.strelka.variants.bcftools_stats.txt", + "reports/fastqc", + "reports/fastqc/test-test_L1", + "reports/fastqc/test-test_L1/test-test_L1_1_fastqc.html", + "reports/fastqc/test-test_L1/test-test_L1_1_fastqc.zip", + "reports/fastqc/test-test_L1/test-test_L1_2_fastqc.html", + "reports/fastqc/test-test_L1/test-test_L1_2_fastqc.zip", + "reports/fastqc/test-test_L2", + "reports/fastqc/test-test_L2/test-test_L2_1_fastqc.html", + "reports/fastqc/test-test_L2/test-test_L2_1_fastqc.zip", + "reports/fastqc/test-test_L2/test-test_L2_2_fastqc.html", + "reports/fastqc/test-test_L2/test-test_L2_2_fastqc.zip", + "reports/markduplicates", + "reports/markduplicates/test", + "reports/markduplicates/test/test.md.cram.metrics", + "reports/mosdepth", + "reports/mosdepth/test", + "reports/mosdepth/test/test.md.mosdepth.global.dist.txt", + "reports/mosdepth/test/test.md.mosdepth.region.dist.txt", + "reports/mosdepth/test/test.md.mosdepth.summary.txt", + "reports/mosdepth/test/test.md.regions.bed.gz", + "reports/mosdepth/test/test.md.regions.bed.gz.csi", + "reports/mosdepth/test/test.recal.mosdepth.global.dist.txt", + "reports/mosdepth/test/test.recal.mosdepth.region.dist.txt", + "reports/mosdepth/test/test.recal.mosdepth.summary.txt", + "reports/mosdepth/test/test.recal.regions.bed.gz", + "reports/mosdepth/test/test.recal.regions.bed.gz.csi", + "reports/samtools", + "reports/samtools/test", + "reports/samtools/test/test.md.cram.stats", + "reports/samtools/test/test.recal.cram.stats", + "reports/vcftools", + "reports/vcftools/strelka", + "reports/vcftools/strelka/test", + "reports/vcftools/strelka/test/test.strelka.variants.FILTER.summary", + "reports/vcftools/strelka/test/test.strelka.variants.TsTv.count", + "reports/vcftools/strelka/test/test.strelka.variants.TsTv.qual", + "variant_calling", + "variant_calling/strelka", + "variant_calling/strelka/test", + "variant_calling/strelka/test/test.strelka.genome.vcf.gz", + "variant_calling/strelka/test/test.strelka.genome.vcf.gz.tbi", + "variant_calling/strelka/test/test.strelka.variants.vcf.gz", + "variant_calling/strelka/test/test.strelka.variants.vcf.gz.tbi" + ], + [ + "fastqc-status-check-heatmap.txt:md5,a020b9689ddeb4abec16b4854fe452f1", + "fastqc_adapter_content_plot.txt:md5,2e1b72be741319e7fadbbb39d7e5b37d", + "fastqc_per_base_n_content_plot.txt:md5,ad3b971a6bb4e8ba6c844c8a03584eb8", + "fastqc_per_base_sequence_quality_plot.txt:md5,1bc03889d243a944253ac637d81ae10c", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,2c42d140ce06c08dad2b58f397c23239", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,59e22821d350bfb97c37ffd9088f5ad9", + "fastqc_per_sequence_quality_scores_plot.txt:md5,f33615cc98bb6225f39545a415fa7c0f", + "fastqc_sequence_counts_plot.txt:md5,7f0f19a58e8e54e792a751fd04a9ae13", + "fastqc_sequence_duplication_levels_plot.txt:md5,92b02e250ff78725deb9a10d510fcecc", + "fastqc_sequence_length_distribution_plot.txt:md5,fb04dce68ec566314125bc9438211b28", + "multiqc_citations.txt:md5,790a7694da30294b51fa1d6c3eb8ba2b", + "multiqc_fastqc.txt:md5,bde0d0bffa62228b33fb68b7e25b6ff8", + "picard_MarkIlluminaAdapters_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.amb:md5,1891c1de381b3a96d4e72f590fde20c1", + "genome.ann:md5,2df4aa2d7580639fa0fcdbcad5e2e969", + "genome.bwt:md5,815eded87e4cb6b0f1daab5c4d6e30af", + "genome.pac:md5,8569fbdb2c98c6fb16dfa73d8eacb070", + "genome.sa:md5,e7cff62b919448a3a3d0fe4aaf427594", + "chr22_1-40001.bed:md5,87a15eb9c2ff20ccd5cd8735a28708f7", + "chr22_1-40001.bed.gz:md5,87a15eb9c2ff20ccd5cd8735a28708f7", + "genome.bed:md5,a87dc7d20ebca626f65cc16ff6c97a3e", + "genome.bed.gz:md5,a87dc7d20ebca626f65cc16ff6c97a3e", + "test.strelka.variants.bcftools_stats.txt:md5,d09761afc32b904a3a18a1623789c65c", + "test.strelka.variants.FILTER.summary:md5,5996690f9ad61a2e37084a92c7f99bbe", + "test.strelka.variants.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a" + ], + "No BAM files", + "No CRAM files", + [ + "test.strelka.genome.vcf.gz:md5,e3571b004f31f46ba56b558c75a876f8", + "test.strelka.variants.vcf.gz:md5,5f015f39b788e767830761fadb6231b" + ], + [ + "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" + ] + ], + "timestamp": "2026-03-21T14:53:23.916056", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index f1248e0459..f91ad93743 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -72,6 +72,7 @@ workflow SAREK { ascat_loci_gc ascat_loci_rt bbsplit_index + xengsort_index bcftools_annotations bcftools_annotations_tbi bcftools_columns @@ -246,6 +247,7 @@ workflow SAREK { known_sites_indels, known_sites_indels_tbi, bbsplit_index, + xengsort_index, ) // Gather preprocessing output