diff --git a/.nf-core.yml b/.nf-core.yml
new file mode 100644
index 0000000..3805dc8
--- /dev/null
+++ b/.nf-core.yml
@@ -0,0 +1 @@
+repository_type: pipeline
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fa8d993..b4620ea 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,9 +9,13 @@ Initial release of nf-core/dragen, created with the [nf-core](https://nf-co.re/)
### `Added`
+- Publish csv outputs from `DRAGEN` for `multiQC` module
+- Stub runs for `DRAGEN`, including creation of a file recognised by the `multiQC` module
+
### `Fixed`
- Fixed error `Access to 'FASTQC.out' is undefined since the workflow 'FASTQC' has not been invoked before accessing the output attribute` when `-skip_fastqc` enabled by adjusting channel generation
+- Added `arm` profile for docker runs on Mac OS
### `Dependencies`
diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml
new file mode 100644
index 0000000..1c7c313
--- /dev/null
+++ b/assets/methods_description_template.yml
@@ -0,0 +1,25 @@
+id: "seqeralabs-dragen-methods-description"
+description: "Suggested text and references to use when describing pipeline usage within the methods section of a publication."
+section_name: "seqeralabs/nf-dragen Methods Description"
+section_href: "https://github.com/seqeralabs/nf-dragen"
+plot_type: "html"
+## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline
+## You inject any metadata in the Nextflow '${workflow}' object
+data: |
+
Methods
+ Data was processed using seqeralabs/nf-dragen v${workflow.manifest.version}.
+ The pipeline was executed with Nextflow v${workflow.nextflow.version} (Di Tommaso et al., 2017) with the following command:
+ ${workflow.commandLine}
+ References
+
+ - Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. https://doi.org/10.1038/nbt.3820
+ - Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. https://doi.org/10.1038/s41587-020-0439-x
+
+
+
Notes:
+
+ ${nodoi_text}
+ - The command above does not include parameters contained in any configs or profiles that may have been used. Ensure the config file is also uploaded with your publication!
+ - You should also cite all software used within this run. Check the "Software Versions" of this report to get version information.
+
+
diff --git a/conf/modules.config b/conf/modules.config
index f84d881..0a0ddfe 100644
--- a/conf/modules.config
+++ b/conf/modules.config
@@ -65,7 +65,7 @@ if (!params.skip_dragen) {
withName: 'DRAGEN_FASTQ_TO_BAM_DNA' {
publishDir = [
- path: { "${params.outdir}/dragen/dna_fastq_to_bam" },
+ path: { "${params.outdir}/dragen/dna_fastq_to_bam/${meta.id}/" },
mode: 'copy',
saveAs: { filename -> filename.equals('versions.yml') ? null : filename }
]
@@ -74,7 +74,7 @@ if (!params.skip_dragen) {
withName: 'DRAGEN_FASTQ_TO_VCF_DNA' {
ext.args = '--enable-variant-caller true'
publishDir = [
- path: { "${params.outdir}/dragen/dna_fastq_to_vcf" },
+ path: { "${params.outdir}/dragen/dna_fastq_to_vcf/${meta.id}/" },
mode: 'copy',
saveAs: { filename -> filename.equals('versions.yml') ? null : filename }
]
@@ -83,7 +83,7 @@ if (!params.skip_dragen) {
withName: 'DRAGEN_FASTQ_TO_BAM_RNA' {
ext.args = '--enable-rna true'
publishDir = [
- path: { "${params.outdir}/dragen/rna_fastq_to_bam" },
+ path: { "${params.outdir}/dragen/rna_fastq_to_bam/${meta.id}/" },
mode: 'copy',
saveAs: { filename -> filename.equals('versions.yml') ? null : filename }
]
diff --git a/lib/WorkflowDragen.groovy b/lib/WorkflowDragen.groovy
index 9dce044..e8a6dcc 100755
--- a/lib/WorkflowDragen.groovy
+++ b/lib/WorkflowDragen.groovy
@@ -2,6 +2,8 @@
// This file holds several functions specific to the workflow/dragen.nf in the nf-core/dragen pipeline
//
+import groovy.text.SimpleTemplateEngine
+
class WorkflowDragen {
//
@@ -43,6 +45,23 @@ class WorkflowDragen {
return yaml_file_text
}
+ public static String methodsDescriptionText(run_workflow, mqc_methods_yaml) {
+ // Convert to a named map so can be used as with familar NXF ${workflow} variable syntax in the MultiQC YML file
+ def meta = [:]
+ meta.workflow = run_workflow.toMap()
+ meta["manifest_map"] = run_workflow.manifest.toMap()
+
+ meta["doi_text"] = meta.manifest_map.doi ? "(doi: ${meta.manifest_map.doi})" : ""
+ meta["nodoi_text"] = meta.manifest_map.doi ? "": "If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used. "
+
+ def methods_text = mqc_methods_yaml.text
+
+ def engine = new SimpleTemplateEngine()
+ def description_html = engine.createTemplate(methods_text).make(meta)
+
+ return description_html
+ }
+
//
// Exit pipeline if incorrect --genome key provided
//
diff --git a/modules.json b/modules.json
index 3d97359..1a4abe6 100644
--- a/modules.json
+++ b/modules.json
@@ -1,17 +1,31 @@
{
- "name": "nf-core/dragen",
- "homePage": "https://github.com/nf-core/dragen",
+ "name": "nf-dragen",
+ "homePage": "https://github.com/drpatelh/nf-dragen",
"repos": {
- "nf-core/modules": {
- "custom/dumpsoftwareversions": {
- "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41"
+ "https://github.com/nf-core/modules.git": {
+ "modules": {
+ "nf-core": {
+ "custom/dumpsoftwareversions": {
+ "branch": "master",
+ "git_sha": "7101db4432d3268b7fcb5b8f75fa0a022dc5561b",
+ "installed_by": ["modules"]
+ },
+ "fastqc": {
+ "branch": "master",
+ "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+ "installed_by": ["modules"]
+ },
+ "multiqc": {
+ "branch": "master",
+ "git_sha": "ee80d14721e76e2e079103b8dcd5d57129e584ba",
+ "installed_by": ["modules"],
+ "patch": "modules/nf-core/multiqc/multiqc.diff"
+ }
+ }
},
- "fastqc": {
- "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961"
- },
- "multiqc": {
- "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41"
+ "subworkflows": {
+ "nf-core": {}
}
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/local/dragen.nf b/modules/local/dragen.nf
index 6363fdd..7f65ffb 100644
--- a/modules/local/dragen.nf
+++ b/modules/local/dragen.nf
@@ -16,6 +16,7 @@ process DRAGEN {
tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: tbi , optional:true
tuple val(meta), path("${prefix}.hard-filtered.vcf.gz") , emit: vcf_filtered, optional:true
tuple val(meta), path("${prefix}.hard-filtered.vcf.gz.tbi"), emit: tbi_filtered, optional:true
+ tuple val(meta), path("${prefix}.*.csv") , emit: csv , optional:true
path "versions.yml" , emit: versions
script:
@@ -52,4 +53,33 @@ process DRAGEN {
dragen: \$(echo \$(/opt/edico/bin/dragen --version 2>&1) | sed -e "s/dragen Version //g")
END_VERSIONS
"""
+
+ stub:
+ prefix = task.ext.prefix ?: "${meta.id}"
+ // Generate stub files
+ // Include one possible csv file, and faked data to prompt multiqc
+ """
+ touch ${prefix}.bam
+ touch ${prefix}.vcf.gz
+ touch ${prefix}.vcf.gz.tbi
+ touch ${prefix}.hard-filtered.vcf.gz
+ touch ${prefix}.hard-filtered.vcf.gz.tbi
+
+ # Define the header row of the CSV file
+ echo "RUN TIME,,Time loading reference,00:00.1,0.09" > ${prefix}.time_metrics.csv
+ echo "RUN TIME,,Time aligning reads,00:00.5,0.53" >> ${prefix}.time_metrics.csv
+ echo "RUN TIME,,Time sorting,00:00.4,0.38" >> ${prefix}.time_metrics.csv
+ echo "RUN TIME,,Time DRAGStr calibration,00:00.0,0" >> ${prefix}.time_metrics.csv
+ echo "RUN TIME,,Time saving map/align output,00:05.6,5.57" >> ${prefix}.time_metrics.csv
+ echo "RUN TIME,,Time variant calling,00:05.5,5.45" >> ${prefix}.time_metrics.csv
+ echo "RUN TIME,,Time partitioning,00:00.1,0.12" >> ${prefix}.time_metrics.csv
+ echo "RUN TIME,,Time structural variant calling,00:02.8,2.83" >> ${prefix}.time_metrics.csv
+ echo "RUN TIME,,Time accessing license server,00:13.2,13.21" >> ${prefix}.time_metrics.csv
+ echo "RUN TIME,,Total runtime,00:27.2,27.17" >> ${prefix}.time_metrics.csv
+
+ cat <<-END_VERSIONS > versions.yml
+ "${task.process}":
+ dragen: \$(echo "vSTUB")
+ END_VERSIONS
+ """
}
diff --git a/modules/local/dragen_buildhashtable.nf b/modules/local/dragen_buildhashtable.nf
index 7f6d27f..9b1ac9d 100644
--- a/modules/local/dragen_buildhashtable.nf
+++ b/modules/local/dragen_buildhashtable.nf
@@ -30,4 +30,15 @@ process DRAGEN_BUILDHASHTABLE {
dragen: \$(echo \$(/opt/edico/bin/dragen --version 2>&1) | sed -e "s/dragen Version //g")
END_VERSIONS
"""
+
+ stub:
+ prefix = task.ext.prefix ?: 'dragen'
+ """
+ mkdir -p $prefix
+ touch $prefix/dragen.ht
+ cat <<-END_VERSIONS > versions.yml
+ "${task.process}":
+ dragen: \$(echo "v3.4.12")
+ END_VERSIONS
+ """
}
diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf
similarity index 75%
rename from modules/nf-core/modules/custom/dumpsoftwareversions/main.nf
rename to modules/nf-core/custom/dumpsoftwareversions/main.nf
index 934bb46..800a609 100644
--- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf
+++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf
@@ -1,11 +1,11 @@
process CUSTOM_DUMPSOFTWAREVERSIONS {
- label 'process_low'
+ label 'process_single'
// Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container
- conda (params.enable_conda ? "bioconda::multiqc=1.11" : null)
+ conda "bioconda::multiqc=1.14"
container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
- 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' :
- 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }"
+ 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' :
+ 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }"
input:
path versions
@@ -15,6 +15,9 @@ process CUSTOM_DUMPSOFTWAREVERSIONS {
path "software_versions_mqc.yml", emit: mqc_yml
path "versions.yml" , emit: versions
+ when:
+ task.ext.when == null || task.ext.when
+
script:
def args = task.ext.args ?: ''
template 'dumpsoftwareversions.py'
diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml
similarity index 97%
rename from modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml
rename to modules/nf-core/custom/dumpsoftwareversions/meta.yml
index 5b5b8a6..60b546a 100644
--- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml
+++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml
@@ -8,7 +8,7 @@ tools:
description: Custom module used to dump software versions within the nf-core pipeline template
homepage: https://github.com/nf-core/tools
documentation: https://github.com/nf-core/tools
- licence: ['MIT']
+ licence: ["MIT"]
input:
- versions:
type: file
diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py
new file mode 100644
index 0000000..da03340
--- /dev/null
+++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+
+
+"""Provide functions to merge multiple versions.yml files."""
+
+
+import yaml
+import platform
+from textwrap import dedent
+
+
+def _make_versions_html(versions):
+ """Generate a tabular HTML output of all versions for MultiQC."""
+ html = [
+ dedent(
+ """\\
+
+
+
+
+ Process Name |
+ Software |
+ Version |
+
+
+ """
+ )
+ ]
+ for process, tmp_versions in sorted(versions.items()):
+ html.append("")
+ for i, (tool, version) in enumerate(sorted(tmp_versions.items())):
+ html.append(
+ dedent(
+ f"""\\
+
+ {process if (i == 0) else ''} |
+ {tool} |
+ {version} |
+
+ """
+ )
+ )
+ html.append("")
+ html.append("
")
+ return "\\n".join(html)
+
+
+def main():
+ """Load all version files and generate merged output."""
+ versions_this_module = {}
+ versions_this_module["${task.process}"] = {
+ "python": platform.python_version(),
+ "yaml": yaml.__version__,
+ }
+
+ with open("$versions") as f:
+ versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module
+
+ # aggregate versions by the module name (derived from fully-qualified process name)
+ versions_by_module = {}
+ for process, process_versions in versions_by_process.items():
+ module = process.split(":")[-1]
+ try:
+ if versions_by_module[module] != process_versions:
+ raise AssertionError(
+ "We assume that software versions are the same between all modules. "
+ "If you see this error-message it means you discovered an edge-case "
+ "and should open an issue in nf-core/tools. "
+ )
+ except KeyError:
+ versions_by_module[module] = process_versions
+
+ versions_by_module["Workflow"] = {
+ "Nextflow": "$workflow.nextflow.version",
+ "$workflow.manifest.name": "$workflow.manifest.version",
+ }
+
+ versions_mqc = {
+ "id": "software_versions",
+ "section_name": "${workflow.manifest.name} Software Versions",
+ "section_href": "https://github.com/${workflow.manifest.name}",
+ "plot_type": "html",
+ "description": "are collected at run time from the software output.",
+ "data": _make_versions_html(versions_by_module),
+ }
+
+ with open("software_versions.yml", "w") as f:
+ yaml.dump(versions_by_module, f, default_flow_style=False)
+ with open("software_versions_mqc.yml", "w") as f:
+ yaml.dump(versions_mqc, f, default_flow_style=False)
+
+ with open("versions.yml", "w") as f:
+ yaml.dump(versions_this_module, f, default_flow_style=False)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf
new file mode 100644
index 0000000..9ae5838
--- /dev/null
+++ b/modules/nf-core/fastqc/main.nf
@@ -0,0 +1,51 @@
+process FASTQC {
+ tag "$meta.id"
+ label 'process_medium'
+
+ conda "bioconda::fastqc=0.11.9"
+ container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
+ 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' :
+ 'quay.io/biocontainers/fastqc:0.11.9--0' }"
+
+ input:
+ tuple val(meta), path(reads)
+
+ output:
+ tuple val(meta), path("*.html"), emit: html
+ tuple val(meta), path("*.zip") , emit: zip
+ path "versions.yml" , emit: versions
+
+ when:
+ task.ext.when == null || task.ext.when
+
+ script:
+ def args = task.ext.args ?: ''
+ def prefix = task.ext.prefix ?: "${meta.id}"
+ // Make list of old name and new name pairs to use for renaming in the bash while loop
+ def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] }
+ def rename_to = old_new_pairs*.join(' ').join(' ')
+ def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ')
+ """
+ printf "%s %s\\n" $rename_to | while read old_name new_name; do
+ [ -f "\${new_name}" ] || ln -s \$old_name \$new_name
+ done
+ fastqc $args --threads $task.cpus $renamed_files
+
+ cat <<-END_VERSIONS > versions.yml
+ "${task.process}":
+ fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" )
+ END_VERSIONS
+ """
+
+ stub:
+ def prefix = task.ext.prefix ?: "${meta.id}"
+ """
+ touch ${prefix}.html
+ touch ${prefix}.zip
+
+ cat <<-END_VERSIONS > versions.yml
+ "${task.process}":
+ fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" )
+ END_VERSIONS
+ """
+}
diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml
new file mode 100644
index 0000000..4da5bb5
--- /dev/null
+++ b/modules/nf-core/fastqc/meta.yml
@@ -0,0 +1,52 @@
+name: fastqc
+description: Run FastQC on sequenced reads
+keywords:
+ - quality control
+ - qc
+ - adapters
+ - fastq
+tools:
+ - fastqc:
+ description: |
+ FastQC gives general quality metrics about your reads.
+ It provides information about the quality score distribution
+ across your reads, the per base sequence content (%A/C/G/T).
+ You get information about adapter contamination and other
+ overrepresented sequences.
+ homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/
+ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/
+ licence: ["GPL-2.0-only"]
+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.
+output:
+ - meta:
+ type: map
+ description: |
+ Groovy Map containing sample information
+ e.g. [ id:'test', single_end:false ]
+ - html:
+ type: file
+ description: FastQC report
+ pattern: "*_{fastqc.html}"
+ - zip:
+ type: file
+ description: FastQC report archive
+ pattern: "*_{fastqc.zip}"
+ - versions:
+ type: file
+ description: File containing software versions
+ pattern: "versions.yml"
+authors:
+ - "@drpatelh"
+ - "@grst"
+ - "@ewels"
+ - "@FelixKrueger"
diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py
deleted file mode 100644
index d139039..0000000
--- a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env python
-
-import yaml
-import platform
-from textwrap import dedent
-
-
-def _make_versions_html(versions):
- html = [
- dedent(
- """\\
-
-
-
-
- Process Name |
- Software |
- Version |
-
-
- """
- )
- ]
- for process, tmp_versions in sorted(versions.items()):
- html.append("")
- for i, (tool, version) in enumerate(sorted(tmp_versions.items())):
- html.append(
- dedent(
- f"""\\
-
- {process if (i == 0) else ''} |
- {tool} |
- {version} |
-
- """
- )
- )
- html.append("")
- html.append("
")
- return "\\n".join(html)
-
-
-versions_this_module = {}
-versions_this_module["${task.process}"] = {
- "python": platform.python_version(),
- "yaml": yaml.__version__,
-}
-
-with open("$versions") as f:
- versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module
-
-# aggregate versions by the module name (derived from fully-qualified process name)
-versions_by_module = {}
-for process, process_versions in versions_by_process.items():
- module = process.split(":")[-1]
- try:
- assert versions_by_module[module] == process_versions, (
- "We assume that software versions are the same between all modules. "
- "If you see this error-message it means you discovered an edge-case "
- "and should open an issue in nf-core/tools. "
- )
- except KeyError:
- versions_by_module[module] = process_versions
-
-versions_by_module["Workflow"] = {
- "Nextflow": "$workflow.nextflow.version",
- "$workflow.manifest.name": "$workflow.manifest.version",
-}
-
-versions_mqc = {
- "id": "software_versions",
- "section_name": "${workflow.manifest.name} Software Versions",
- "section_href": "https://github.com/${workflow.manifest.name}",
- "plot_type": "html",
- "description": "are collected at run time from the software output.",
- "data": _make_versions_html(versions_by_module),
-}
-
-with open("software_versions.yml", "w") as f:
- yaml.dump(versions_by_module, f, default_flow_style=False)
-with open("software_versions_mqc.yml", "w") as f:
- yaml.dump(versions_mqc, f, default_flow_style=False)
-
-with open("versions.yml", "w") as f:
- yaml.dump(versions_this_module, f, default_flow_style=False)
diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf
deleted file mode 100644
index d250eca..0000000
--- a/modules/nf-core/modules/fastqc/main.nf
+++ /dev/null
@@ -1,44 +0,0 @@
-process FASTQC {
- tag "$meta.id"
- label 'process_medium'
-
- conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null)
- container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
- 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' :
- 'quay.io/biocontainers/fastqc:0.11.9--0' }"
-
- input:
- tuple val(meta), path(reads)
-
- output:
- tuple val(meta), path("*.html"), emit: html
- tuple val(meta), path("*.zip") , emit: zip
- path "versions.yml" , emit: versions
-
- script:
- def args = task.ext.args ?: ''
- // Add soft-links to original FastQs for consistent naming in pipeline
- def prefix = task.ext.prefix ?: "${meta.id}"
- if (meta.single_end) {
- """
- [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz
- fastqc $args --threads $task.cpus ${prefix}.fastq.gz
-
- cat <<-END_VERSIONS > versions.yml
- "${task.process}":
- fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" )
- END_VERSIONS
- """
- } else {
- """
- [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz
- [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz
- fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz
-
- cat <<-END_VERSIONS > versions.yml
- "${task.process}":
- fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" )
- END_VERSIONS
- """
- }
-}
diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml
deleted file mode 100644
index b09553a..0000000
--- a/modules/nf-core/modules/fastqc/meta.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-name: fastqc
-description: Run FastQC on sequenced reads
-keywords:
- - quality control
- - qc
- - adapters
- - fastq
-tools:
- - fastqc:
- description: |
- FastQC gives general quality metrics about your reads.
- It provides information about the quality score distribution
- across your reads, the per base sequence content (%A/C/G/T).
- You get information about adapter contamination and other
- overrepresented sequences.
- homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/
- documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/
- licence: ['GPL-2.0-only']
-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.
-output:
- - meta:
- type: map
- description: |
- Groovy Map containing sample information
- e.g. [ id:'test', single_end:false ]
- - html:
- type: file
- description: FastQC report
- pattern: "*_{fastqc.html}"
- - zip:
- type: file
- description: FastQC report archive
- pattern: "*_{fastqc.zip}"
- - versions:
- type: file
- description: File containing software versions
- pattern: "versions.yml"
-authors:
- - "@drpatelh"
- - "@grst"
- - "@ewels"
- - "@FelixKrueger"
diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml
deleted file mode 100644
index 63c75a4..0000000
--- a/modules/nf-core/modules/multiqc/meta.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-name: MultiQC
-description: Aggregate results from bioinformatics analyses across many samples into a single report
-keywords:
- - QC
- - bioinformatics tools
- - Beautiful stand-alone HTML report
-tools:
- - multiqc:
- description: |
- MultiQC searches a given directory for analysis logs and compiles a HTML report.
- It's a general use tool, perfect for summarising the output from numerous bioinformatics tools.
- homepage: https://multiqc.info/
- documentation: https://multiqc.info/docs/
- licence: ['GPL-3.0-or-later']
-input:
- - multiqc_files:
- type: file
- description: |
- List of reports / files recognised by MultiQC, for example the html and zip output of FastQC
-output:
- - report:
- type: file
- description: MultiQC report file
- pattern: "multiqc_report.html"
- - data:
- type: dir
- description: MultiQC data dir
- pattern: "multiqc_data"
- - plots:
- type: file
- description: Plots created by MultiQC
- pattern: "*_data"
- - versions:
- type: file
- description: File containing software versions
- pattern: "versions.yml"
-authors:
- - "@abhi18av"
- - "@bunop"
- - "@drpatelh"
diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/multiqc/main.nf
similarity index 52%
rename from modules/nf-core/modules/multiqc/main.nf
rename to modules/nf-core/multiqc/main.nf
index 3dceb16..b65b8f0 100644
--- a/modules/nf-core/modules/multiqc/main.nf
+++ b/modules/nf-core/multiqc/main.nf
@@ -1,13 +1,16 @@
process MULTIQC {
- label 'process_medium'
+ label 'process_single'
- conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null)
+ conda "bioconda::multiqc=1.14"
container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
- 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' :
- 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }"
+ 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' :
+ 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }"
input:
- path multiqc_files
+ path multiqc_files, stageAs: "?/*"
+ path(multiqc_config)
+ path(extra_multiqc_config)
+ path(multiqc_logo)
output:
path "*multiqc_report.html", emit: report
@@ -15,14 +18,25 @@ process MULTIQC {
path "*_plots" , optional:true, emit: plots
path "versions.yml" , emit: versions
+ when:
+ task.ext.when == null || task.ext.when
+
script:
def args = task.ext.args ?: ''
+ def config = multiqc_config ? "--config $multiqc_config" : ''
+ def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : ''
"""
- multiqc -f $args .
+ multiqc \\
+ --force \\
+ $args \\
+ $config \\
+ $extra_config \\
+ .
cat <<-END_VERSIONS > versions.yml
"${task.process}":
multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" )
END_VERSIONS
"""
+
}
diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml
new file mode 100644
index 0000000..ebc29b2
--- /dev/null
+++ b/modules/nf-core/multiqc/meta.yml
@@ -0,0 +1,55 @@
+name: MultiQC
+description: Aggregate results from bioinformatics analyses across many samples into a single report
+keywords:
+ - QC
+ - bioinformatics tools
+ - Beautiful stand-alone HTML report
+tools:
+ - multiqc:
+ description: |
+ MultiQC searches a given directory for analysis logs and compiles a HTML report.
+ It's a general use tool, perfect for summarising the output from numerous bioinformatics tools.
+ homepage: https://multiqc.info/
+ documentation: https://multiqc.info/docs/
+ licence: ["GPL-3.0-or-later"]
+
+input:
+ - multiqc_files:
+ type: file
+ description: |
+ List of reports / files recognised by MultiQC, for example the html and zip output of FastQC
+ - multiqc_config:
+ type: file
+ description: Optional config yml for MultiQC
+ pattern: "*.{yml,yaml}"
+ - extra_multiqc_config:
+ type: file
+ description: Second optional config yml for MultiQC. Will override common sections in multiqc_config.
+ pattern: "*.{yml,yaml}"
+ - multiqc_logo:
+ type: file
+ description: Optional logo file for MultiQC
+ pattern: "*.{png}"
+
+output:
+ - report:
+ type: file
+ description: MultiQC report file
+ pattern: "multiqc_report.html"
+ - data:
+ type: dir
+ description: MultiQC data dir
+ pattern: "multiqc_data"
+ - plots:
+ type: file
+ description: Plots created by MultiQC
+ pattern: "*_data"
+ - versions:
+ type: file
+ description: File containing software versions
+ pattern: "versions.yml"
+authors:
+ - "@abhi18av"
+ - "@bunop"
+ - "@drpatelh"
+ - "@jfy133"
diff --git a/modules/nf-core/multiqc/multiqc.diff b/modules/nf-core/multiqc/multiqc.diff
new file mode 100644
index 0000000..1c798fb
--- /dev/null
+++ b/modules/nf-core/multiqc/multiqc.diff
@@ -0,0 +1,21 @@
+Changes in module 'nf-core/multiqc'
+--- modules/nf-core/multiqc/main.nf
++++ modules/nf-core/multiqc/main.nf
+@@ -39,15 +39,4 @@
+ END_VERSIONS
+ """
+
+- stub:
+- """
+- touch multiqc_data
+- touch multiqc_plots
+- touch multiqc_report.html
+-
+- cat <<-END_VERSIONS > versions.yml
+- "${task.process}":
+- multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" )
+- END_VERSIONS
+- """
+ }
+
+************************************************************
diff --git a/nextflow.config b/nextflow.config
index ec79952..98c886b 100644
--- a/nextflow.config
+++ b/nextflow.config
@@ -23,9 +23,11 @@ params {
igenomes_ignore = false
// MultiQC options
- multiqc_config = null
- multiqc_title = null
- max_multiqc_email_size = '25.MB'
+ multiqc_config = null
+ multiqc_title = null
+ max_multiqc_email_size = '25.MB'
+ multiqc_logo = null
+ multiqc_methods_description = null
// Boilerplate options
outdir = './results'
@@ -84,6 +86,9 @@ profiles {
shifter.enabled = false
charliecloud.enabled = false
}
+ arm {
+ docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64'
+ }
singularity {
singularity.enabled = true
singularity.autoMounts = true
diff --git a/nextflow_schema.json b/nextflow_schema.json
index 26b21bd..e40bf9d 100644
--- a/nextflow_schema.json
+++ b/nextflow_schema.json
@@ -226,6 +226,17 @@
"fa_icon": "fas fa-cog",
"hidden": true
},
+ "multiqc_logo": {
+ "type": "string",
+ "description": "Custom logo file to supply to MultiQC. File name must also be set in the MultiQC config file",
+ "fa_icon": "fas fa-image",
+ "hidden": true
+ },
+ "multiqc_methods_description": {
+ "type": "string",
+ "description": "Custom MultiQC yaml file containing HTML including a methods description.",
+ "fa_icon": "fas fa-cog"
+ },
"tracedir": {
"type": "string",
"description": "Directory to keep pipeline Nextflow logs and reports.",
diff --git a/workflows/dragen.nf b/workflows/dragen.nf
index be28045..c99edc1 100644
--- a/workflows/dragen.nf
+++ b/workflows/dragen.nf
@@ -24,8 +24,10 @@ if (params.fasta) { ch_fasta = file(params.fasta) } else { exit 1, 'Genome fasta
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
-ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true)
-ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty()
+ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yaml", checkIfExists: true)
+ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true ) : Channel.empty()
+ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty()
+ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true)
/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -56,9 +58,9 @@ include { INPUT_CHECK } from '../subworkflows/local/input_check'
//
// MODULE: Installed directly from nf-core/modules
//
-include { FASTQC } from '../modules/nf-core/modules/fastqc/main'
-include { MULTIQC } from '../modules/nf-core/modules/multiqc/main'
-include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main'
+include { FASTQC } from '../modules/nf-core/fastqc/main'
+include { MULTIQC } from '../modules/nf-core/multiqc/main'
+include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main'
/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -93,6 +95,10 @@ workflow DRAGEN {
ch_multiqc_fastqc = FASTQC.out.zip
}
+ //
+ // SUBWORKFLOW: Build index and run DRAGEN
+ //
+ ch_multiqc_dragen = Channel.empty()
if (!params.skip_dragen) {
//
@@ -119,6 +125,7 @@ workflow DRAGEN {
DRAGEN_BUILDHASHTABLE_DNA.out.index
)
ch_versions = ch_versions.mix(DRAGEN_FASTQ_TO_BAM_DNA.out.versions.first())
+ ch_multiqc_dragen = ch_multiqc_dragen.mix(DRAGEN_FASTQ_TO_BAM_DNA.out.csv)
//
// MODULE: Run DRAGEN on DNA samples to generate VCF from FastQ
@@ -128,6 +135,7 @@ workflow DRAGEN {
DRAGEN_BUILDHASHTABLE_DNA.out.index
)
ch_versions = ch_versions.mix(DRAGEN_FASTQ_TO_VCF_DNA.out.versions.first())
+ ch_multiqc_dragen = ch_multiqc_dragen.mix(DRAGEN_FASTQ_TO_VCF_DNA.out.csv)
//
// MODULE: Run DRAGEN on RNA samples to generate BAM from FastQ
@@ -137,6 +145,7 @@ workflow DRAGEN {
DRAGEN_BUILDHASHTABLE_RNA.out.index
)
ch_versions = ch_versions.mix(DRAGEN_FASTQ_TO_BAM_RNA.out.versions.first())
+ ch_multiqc_dragen = ch_multiqc_dragen.mix(DRAGEN_FASTQ_TO_BAM_RNA.out.csv)
}
//
@@ -152,15 +161,21 @@ workflow DRAGEN {
workflow_summary = WorkflowDragen.paramsSummaryMultiqc(workflow, summary_params)
ch_workflow_summary = Channel.value(workflow_summary)
+ methods_description = WorkflowDragen.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description)
+ ch_methods_description = Channel.value(methods_description)
+
ch_multiqc_files = Channel.empty()
- ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config))
- ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([]))
ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'))
+ ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml'))
ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect())
ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_fastqc.collect{it[1]}.ifEmpty([]))
+ ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_dragen.collect{it[1]}.ifEmpty([]))
MULTIQC (
- ch_multiqc_files.collect()
+ ch_multiqc_files.collect(),
+ ch_multiqc_config.toList(),
+ ch_multiqc_custom_config.toList(),
+ ch_multiqc_logo.toList()
)
multiqc_report = MULTIQC.out.report.toList()
ch_versions = ch_versions.mix(MULTIQC.out.versions)