diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..7a3ba6aad
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,24 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_size = 4
+indent_style = space
+
+[*.{yml,yaml}]
+indent_size = 2
+
+# These files are edited upstream in nf-core/modules
+[/modules/nf-core/**]
+charset = unset
+end_of_line = unset
+insert_final_newline = unset
+trim_trailing_whitespace = unset
+indent_style = unset
+indent_size = unset
+
+[/assets/email*]
+indent_size = unset
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 6ae73eacb..ead77d048 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -15,8 +15,8 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/rnas
 
 - [ ] This comment contains a description of changes (with reason).
 - [ ] If you've fixed a bug or added code that should be tested, add tests!
- - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/rnaseq/tree/master/.github/CONTRIBUTING.md)
- - [ ] If necessary, also make a PR on the nf-core/rnaseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository.
+    - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/rnaseq/tree/master/.github/CONTRIBUTING.md)
+    - [ ] If necessary, also make a PR on the nf-core/rnaseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository.
 - [ ] Make sure your code lints (`nf-core lint .`).
 - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`).
 - [ ] Usage Documentation in `docs/usage.md` is updated.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3af2827f8..4ca2a861a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -91,7 +91,7 @@ jobs:
         run: |
           wget -qO- get.nextflow.io | bash
           sudo mv nextflow /usr/local/bin/
-      
+
       - name: Run pipeline with RSEM STAR and various parameters
         run: |
           nextflow run ${GITHUB_WORKSPACE} -profile test,docker --aligner star_rsem ${{ matrix.parameters }}
diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml
index 0ee21dc44..554e1154d 100644
--- a/.github/workflows/linting.yml
+++ b/.github/workflows/linting.yml
@@ -47,6 +47,20 @@ jobs:
           repo-token: ${{ secrets.GITHUB_TOKEN }}
           allow-repeats: false
 
+  EditorConfig:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+
+      - uses: actions/setup-node@v1
+        with:
+          node-version: "10"
+
+      - name: Install editorconfig-checker
+        run: npm install -g editorconfig-checker
+
+      - name: Run ECLint check
+        run: editorconfig-checker -exclude README.md $(git ls-files | grep -v test)
 
   YAML:
     runs-on: ubuntu-latest
diff --git a/.github/markdownlint.yml b/.markdownlint.yml
similarity index 53%
rename from .github/markdownlint.yml
rename to .markdownlint.yml
index 8d7eb53b0..b5c4bbf8a 100644
--- a/.github/markdownlint.yml
+++ b/.markdownlint.yml
@@ -1,12 +1,14 @@
 # Markdownlint configuration file
 default: true
 line-length: false
+ul-indent:
+  indent: 4
 no-duplicate-header:
-    siblings_only: true
+  siblings_only: true
 no-inline-html:
     allowed_elements:
-        - img
-        - p
-        - kbd
-        - details
-        - summary
+      - img
+      - p
+      - kbd
+      - details
+      - summary
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f9264ea4f..cd5665ecb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,8 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### :warning: Major enhancements
 
 * Samplesheet format has changed from `group,replicate,fastq_1,fastq_2,strandedness` to `sample,fastq_1,fastq_2,strandedness`
-  * This gives users the flexibility to name their samples however they wish (see [#550](https://github.com/nf-core/rnaseq/issues/550]))
-  * PCA generated by DESeq2 will now be monochrome and will not be grouped by using the replicate id
+    * This gives users the flexibility to name their samples however they wish (see [#550](https://github.com/nf-core/rnaseq/issues/550]))
+    * PCA generated by DESeq2 will now be monochrome and will not be grouped by using the replicate id
 * Updated Nextflow version to `v21.04.0` (see [nextflow#572](https://github.com/nextflow-io/nextflow/issues/1964))
 * Restructure pipeline scripts into `modules/`, `subworkflows/` and `workflows/` directories
 
@@ -50,9 +50,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 |                             | `--validate_params`            |
 | `--clusterOptions`          |                                |
 
-> **NB:** Parameter has been __updated__ if both old and new parameter information is present.  
-> **NB:** Parameter has been __added__ if just the new parameter information is present.  
-> **NB:** Parameter has been __removed__ if parameter information isn't present.  
+> **NB:** Parameter has been __updated__ if both old and new parameter information is present.
+> **NB:** Parameter has been __added__ if just the new parameter information is present.
+> **NB:** Parameter has been __removed__ if parameter information isn't present.
 
 ### Software dependencies
 
@@ -64,9 +64,9 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi
 | `multiqc`   | 1.9         | 1.10.1      |
 | `preseq`    | 2.0.3       | 3.1.2       |
 
-> **NB:** Dependency has been __updated__ if both old and new version information is present.  
-> **NB:** Dependency has been __added__ if just the new version information is present.  
-> **NB:** Dependency has been __removed__ if version information isn't present.  
+> **NB:** Dependency has been __updated__ if both old and new version information is present.
+> **NB:** Dependency has been __added__ if just the new version information is present.
+> **NB:** Dependency has been __removed__ if version information isn't present.
 
 ## [[3.0](https://github.com/nf-core/rnaseq/releases/tag/3.0)] - 2020-12-15
 
@@ -74,10 +74,10 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi
 
 * You will need to install Nextflow `>=20.11.0-edge` to run the pipeline. If you are using Singularity, then features introduced in that release now enable the pipeline to directly download Singularity images hosted by Biocontainers as opposed to performing a conversion from Docker images (see [#496](https://github.com/nf-core/rnaseq/issues/496)).
 * The previous default of aligning BAM files using STAR and quantifying using featureCounts (`--aligner star`) has been removed. The new default is to align with STAR and quantify using Salmon (`--aligner star_salmon`).
-  * This decision was made primarily because of the limitations of featureCounts to appropriately quantify gene expression data. Please see [Zhao et al., 2015](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0141910#pone-0141910-t001) and [Soneson et al., 2015](https://f1000research.com/articles/4-1521/v1)).
+    * This decision was made primarily because of the limitations of featureCounts to appropriately quantify gene expression data. Please see [Zhao et al., 2015](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0141910#pone-0141910-t001) and [Soneson et al., 2015](https://f1000research.com/articles/4-1521/v1)).
 * For similar reasons, **quantification will not be performed** if using `--aligner hisat2` due to the lack of an appropriate option to calculate accurate expression estimates from HISAT2 derived genomic alignments.
-  * This pipeline option is still available for those who have a preference for the alignment, QC and other types of downstream analysis compatible with the output of HISAT2. No gene-level quantification results will be generated.
-  * In a future release we hope to add back quantitation for HISAT2 using different tools.
+    * This pipeline option is still available for those who have a preference for the alignment, QC and other types of downstream analysis compatible with the output of HISAT2. No gene-level quantification results will be generated.
+    * In a future release we hope to add back quantitation for HISAT2 using different tools.
 
 ### Enhancements & fixes
 
@@ -108,9 +108,9 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi
 |                              | `--singularity_pull_docker_container` |
 | `--skip_featurecounts`       |                                       |
 
-> **NB:** Parameter has been __updated__ if both old and new parameter information is present.  
-> **NB:** Parameter has been __added__ if just the new parameter information is present.  
-> **NB:** Parameter has been __removed__ if parameter information isn't present.  
+> **NB:** Parameter has been __updated__ if both old and new parameter information is present.
+> **NB:** Parameter has been __added__ if just the new parameter information is present.
+> **NB:** Parameter has been __removed__ if parameter information isn't present.
 
 ### Software dependencies
 
@@ -126,9 +126,9 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi
 | `ucsc-bedclip`                      |             | 377         |
 | `umi_tools`                         | 1.0.1       | 1.1.1       |
 
-> **NB:** Dependency has been __updated__ if both old and new version information is present.  
-> **NB:** Dependency has been __added__ if just the new version information is present.  
-> **NB:** Dependency has been __removed__ if version information isn't present.  
+> **NB:** Dependency has been __updated__ if both old and new version information is present.
+> **NB:** Dependency has been __added__ if just the new version information is present.
+> **NB:** Dependency has been __removed__ if version information isn't present.
 
 ## [[2.0](https://github.com/nf-core/rnaseq/releases/tag/2.0)] - 2020-11-12
 
@@ -244,10 +244,10 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi
 * `--skipEdgeR` qc not performed by DESeq2 instead
 * `--star_memory` in favour of updating centrally on nf-core/modules if required
 * Strandedness is now specified at the sample-level via the input samplesheet
-  * `--forwardStranded`
-  * `--reverseStranded`
-  * `--unStranded`
-  * `--pico`
+    * `--forwardStranded`
+    * `--reverseStranded`
+    * `--unStranded`
+    * `--pico`
 
 ### Software dependencies
 
@@ -292,9 +292,9 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi
 | `r-gplots`                          | -           | -           |
 | `r-markdown`                        | -           | -           |
 
-> **NB:** Dependency has been __updated__ if both old and new version information is present.  
-> **NB:** Dependency has been __added__ if just the new version information is present.  
-> **NB:** Dependency has been __removed__ if version information isn't present.  
+> **NB:** Dependency has been __updated__ if both old and new version information is present.
+> **NB:** Dependency has been __added__ if just the new version information is present.
+> **NB:** Dependency has been __removed__ if version information isn't present.
 
 ## [[1.4.2](https://github.com/nf-core/rnaseq/releases/tag/1.4.2)] - 2019-10-18
 
@@ -321,9 +321,9 @@ Major novel changes include:
 * Several improvements in `featureCounts` handling of types other than `exon`. It is possible now to handle nuclearRNAseq data. Nuclear RNA has un-spliced RNA, and the whole transcript, including the introns, needs to be counted, e.g. by specifying `--fc_count_type transcript`.
 * Support for [outputting unaligned data](https://github.com/nf-core/rnaseq/issues/277) to results folders.
 * Added options to skip several steps
-  * Skip trimming using `--skipTrimming`
-  * Skip BiotypeQC using `--skipBiotypeQC`
-  * Skip Alignment using `--skipAlignment` to only use pseudo-alignment using Salmon
+    * Skip trimming using `--skipTrimming`
+    * Skip BiotypeQC using `--skipBiotypeQC`
+    * Skip Alignment using `--skipAlignment` to only use pseudo-alignment using Salmon
 
 ### Documentation updates
 
@@ -434,7 +434,7 @@ Major novel changes include:
 * Remove legacy rseqc `strandRule` config code. [#119](https://github.com/nf-core/rnaseq/issues/119)
 * Added STRINGTIE ballgown output to results folder [#125](https://github.com/nf-core/rnaseq/issues/125)
 * HiSAT index build now requests `200GB` memory, enough to use the exons / splice junction option for building.
-  * Added documentation about the `--hisatBuildMemory` option.
+    * Added documentation about the `--hisatBuildMemory` option.
 * BAM indices are stored and re-used between processes [#71](https://github.com/nf-core/rnaseq/issues/71)
 
 ### Bug Fixes
@@ -474,25 +474,25 @@ In summary, the main changes are:
 * Rebranding and renaming throughout the pipeline to nf-core
 * Updating many parts of the pipeline config and style to meet nf-core standards
 * Support for GFF files in addition to GTF files
-  * Just use `--gff` instead of `--gtf` when specifying a file path
+    * Just use `--gff` instead of `--gtf` when specifying a file path
 * New command line options to skip various quality control steps
 * More safety checks when launching a pipeline
-  * Several new sanity checks - for example, that the specified reference genome exists
+    * Several new sanity checks - for example, that the specified reference genome exists
 * Improved performance with memory usage (especially STAR and Picard)
 * New BigWig file outputs for plotting coverage across the genome
 * Refactored gene body coverage calculation, now much faster and using much less memory
 * Bugfixes in the MultiQC process to avoid edge cases where it wouldn't run
 * MultiQC report now automatically attached to the email sent when the pipeline completes
 * New testing method, with data on GitHub
-  * Now run pipeline with `-profile test` instead of using bash scripts
+    * Now run pipeline with `-profile test` instead of using bash scripts
 * Rewritten continuous integration tests with Travis CI
 * New explicit support for Singularity containers
 * Improved MultiQC support for DupRadar and featureCounts
-  * Now works for all users instead of just NGI Stockholm
+    * Now works for all users instead of just NGI Stockholm
 * New configuration for use on AWS batch
 * Updated config syntax to support latest versions of Nextflow
 * Built-in support for a number of new local HPC systems
-  * CCGA, GIS, UCT HEX, updates to UPPMAX, CFC, BINAC, Hebbe, c3se
+    * CCGA, GIS, UCT HEX, updates to UPPMAX, CFC, BINAC, Hebbe, c3se
 * Slightly improved documentation (more updates to come)
 * Updated software packages
 
diff --git a/CITATIONS.md b/CITATIONS.md
index cefda54d8..41487d48e 100644
--- a/CITATIONS.md
+++ b/CITATIONS.md
@@ -1,110 +1,110 @@
-# nf-core/rnaseq: Citations
-
-## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/)
-
-> Ewels PA, Peltzer A, Fillinger S, Patel H, Alneberg J, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol. 2020 Mar;38(3):276-278. doi: 10.1038/s41587-020-0439-x. PubMed PMID: 32055031.
-
-## [Nextflow](https://pubmed.ncbi.nlm.nih.gov/28398311/)
-
-> Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017 Apr 11;35(4):316-319. doi: 10.1038/nbt.3820. PubMed PMID: 28398311.
-
-## Pipeline tools
-
-* [BEDTools](https://pubmed.ncbi.nlm.nih.gov/20110278/)
-  > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824.
-
-* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)
-
-* [featureCounts](https://pubmed.ncbi.nlm.nih.gov/24227677/)
-  > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677.
-
-* [GffRead](https://pubmed.ncbi.nlm.nih.gov/32489650/)
-  > Pertea G, Pertea M. GFF Utilities: GffRead and GffCompare. F1000Res. 2020 Apr 28;9:ISCB Comm J-304. doi: 10.12688/f1000research.23297.2. eCollection 2020. PubMed PMID: 32489650; PubMed Central PMCID: PMC7222033.
-
-* [HISAT2](https://pubmed.ncbi.nlm.nih.gov/31375807/)
-  > Kim D, Paggi JM, Park C, Bennett C, Salzberg SL. Graph-based genome alignment and genotyping with HISAT2 and HISAT-genotype Graph-based genome alignment and genotyping with HISAT2 and HISAT-genotype. Nat Biotechnol. 2019 Aug;37(8):907-915. doi: 10.1038/s41587-019-0201-4. Epub 2019 Aug 2. PubMed PMID: 31375807.
-
-* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/)
-  > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924.
-
-* [picard-tools](http://broadinstitute.github.io/picard)
-
-* [preseq](https://pubmed.ncbi.nlm.nih.gov/23435259/)
-  > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374.
-
-* [Qualimap 2](https://pubmed.ncbi.nlm.nih.gov/26428292/)
-  > Okonechnikov K, Conesa A, García-Alcalde F. Qualimap 2: advanced multi-sample quality control for high-throughput sequencing data Bioinformatics. 2016 Jan 15;32(2):292-4. doi: 10.1093/bioinformatics/btv566. Epub 2015 Oct 1. PubMed PMID: 26428292; PubMed Central PMCID: PMC4708105.
-
-* [RSEM](https://pubmed.ncbi.nlm.nih.gov/21816040/)
-  > Li B, Dewey CN. RSEM: accurate transcript quantification from RNA-Seq data with or without a reference genome BMC Bioinformatics. 2011 Aug 4;12:323. doi: 10.1186/1471-2105-12-323. PubMed PMID: 21816040; PubMed Central PMCID: PMC3163565.
-
-* [RSeQC](https://pubmed.ncbi.nlm.nih.gov/22743226/)
-  > Wang L, Wang S, Li W. RSeQC: quality control of RNA-seq experiments Bioinformatics. 2012 Aug 15;28(16):2184-5. doi: 10.1093/bioinformatics/bts356. Epub 2012 Jun 27. PubMed PMID: 22743226.
-
-* [Salmon](https://pubmed.ncbi.nlm.nih.gov/28263959/)
-  > Patro R, Duggal G, Love MI, Irizarry RA, Kingsford C. Salmon provides fast and bias-aware quantification of transcript expression Nat Methods. 2017 Apr;14(4):417-419. doi: 10.1038/nmeth.4197. Epub 2017 Mar 6. PubMed PMID: 28263959; PubMed Central PMCID: PMC5600148.
-
-* [SAMtools](https://pubmed.ncbi.nlm.nih.gov/19505943/)
-  > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002.
-
-* [SortMeRNA](https://pubmed.ncbi.nlm.nih.gov/23071270/)
-  > Kopylova E, Noé L, Touzet H. SortMeRNA: fast and accurate filtering of ribosomal RNAs in metatranscriptomic data Bioinformatics. 2012 Dec 15;28(24):3211-7. doi: 10.1093/bioinformatics/bts611. Epub 2012 Oct 15. PubMed PMID: 23071270.
-
-* [STAR](https://pubmed.ncbi.nlm.nih.gov/23104886/)
-  > Dobin A, Davis CA, Schlesinger F, Drenkow J, Zaleski C, Jha S, Batut P, Chaisson M, Gingeras TR. STAR: ultrafast universal RNA-seq aligner Bioinformatics. 2013 Jan 1;29(1):15-21. doi: 10.1093/bioinformatics/bts635. Epub 2012 Oct 25. PubMed PMID: 23104886; PubMed Central PMCID: PMC3530905.
-
-* [StringTie2](https://pubmed.ncbi.nlm.nih.gov/31842956/)
-  > Kovaka S, Zimin AV, Pertea GM, Razaghi R, Salzberg SL, Pertea M. Transcriptome assembly from long-read RNA-seq alignments with StringTie2 Genome Biol. 2019 Dec 16;20(1):278. doi: 10.1186/s13059-019-1910-1. PubMed PMID: 31842956; PubMed Central PMCID: PMC6912988.
-
-* [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/)
-
-* [UMI-tools](https://pubmed.ncbi.nlm.nih.gov/28100584/)
-  > Smith T, Heger A, Sudbery I. UMI-tools: modeling sequencing errors in Unique Molecular Identifiers to improve quantification accuracy Genome Res. 2017 Mar;27(3):491-499. doi: 10.1101/gr.209601.116. Epub 2017 Jan 18. PubMed PMID: 28100584; PubMed Central PMCID: PMC5340976.
-
-* [UCSC tools](https://pubmed.ncbi.nlm.nih.gov/20639541/)
-  > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891.
-
-## R packages
-
-* [R](https://www.R-project.org/)
-  > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria.
-
-* [DESeq2](https://pubmed.ncbi.nlm.nih.gov/25516281/)
-  > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049.
-
-* [dupRadar](https://pubmed.ncbi.nlm.nih.gov/27769170/)
-  > Sayols S, Scherzinger D, Klein H. dupRadar: a Bioconductor package for the assessment of PCR artifacts in RNA-Seq data BMC Bioinformatics. 2016 Oct 21;17(1):428. doi: 10.1186/s12859-016-1276-2. PubMed PMID: 27769170; PubMed Central PMCID: PMC5073875.
-
-* [ggplot2](https://cran.r-project.org/web/packages/ggplot2/index.html)
-  > H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.
-
-* [optparse](https://CRAN.R-project.org/package=optparse)
-  > Trevor L Davis (2018). optparse: Command Line Option Parser.
-
-* [pheatmap](https://CRAN.R-project.org/package=pheatmap)
-  > Raivo Kolde (2018). pheatmap: Pretty Heatmaps.
-
-* [RColorBrewer](https://CRAN.R-project.org/package=RColorBrewer)
-  > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes.
-
-* [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html)
-  > Morgan M, Obenchain V, Hester J and Pagès H (2020). SummarizedExperiment: SummarizedExperiment container.
-
-* [Tximeta](https://pubmed.ncbi.nlm.nih.gov/32097405/)
-  > Love MI, Soneson C, Hickey PF, Johnson LK, Pierce NT, Shepherd L, Morgan M, Patro R. Tximeta: Reference sequence checksums for provenance identification in RNA-seq PLoS Comput Biol. 2020 Feb 25;16(2):e1007664. doi: 10.1371/journal.pcbi.1007664. eCollection 2020 Feb. PubMed PMID: 32097405; PubMed Central PMCID: PMC7059966.
-
-## Software packaging/containerisation tools
-
-* [Anaconda](https://anaconda.com)
-  > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web.
-
-* [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/)
-  > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506.
-
-* [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/)
-  > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671.
-
-* [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241)
-
-* [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/)
-  > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675.
+# nf-core/rnaseq: Citations
+
+## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/)
+
+> Ewels PA, Peltzer A, Fillinger S, Patel H, Alneberg J, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol. 2020 Mar;38(3):276-278. doi: 10.1038/s41587-020-0439-x. PubMed PMID: 32055031.
+
+## [Nextflow](https://pubmed.ncbi.nlm.nih.gov/28398311/)
+
+> Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017 Apr 11;35(4):316-319. doi: 10.1038/nbt.3820. PubMed PMID: 28398311.
+
+## Pipeline tools
+
+* [BEDTools](https://pubmed.ncbi.nlm.nih.gov/20110278/)
+    > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824.
+
+* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)
+
+* [featureCounts](https://pubmed.ncbi.nlm.nih.gov/24227677/)
+    > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677.
+
+* [GffRead](https://pubmed.ncbi.nlm.nih.gov/32489650/)
+    > Pertea G, Pertea M. GFF Utilities: GffRead and GffCompare. F1000Res. 2020 Apr 28;9:ISCB Comm J-304. doi: 10.12688/f1000research.23297.2. eCollection 2020. PubMed PMID: 32489650; PubMed Central PMCID: PMC7222033.
+
+* [HISAT2](https://pubmed.ncbi.nlm.nih.gov/31375807/)
+    > Kim D, Paggi JM, Park C, Bennett C, Salzberg SL. Graph-based genome alignment and genotyping with HISAT2 and HISAT-genotype Graph-based genome alignment and genotyping with HISAT2 and HISAT-genotype. Nat Biotechnol. 2019 Aug;37(8):907-915. doi: 10.1038/s41587-019-0201-4. Epub 2019 Aug 2. PubMed PMID: 31375807.
+
+* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/)
+    > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924.
+
+* [picard-tools](http://broadinstitute.github.io/picard)
+
+* [preseq](https://pubmed.ncbi.nlm.nih.gov/23435259/)
+    > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374.
+
+* [Qualimap 2](https://pubmed.ncbi.nlm.nih.gov/26428292/)
+    > Okonechnikov K, Conesa A, García-Alcalde F. Qualimap 2: advanced multi-sample quality control for high-throughput sequencing data Bioinformatics. 2016 Jan 15;32(2):292-4. doi: 10.1093/bioinformatics/btv566. Epub 2015 Oct 1. PubMed PMID: 26428292; PubMed Central PMCID: PMC4708105.
+
+* [RSEM](https://pubmed.ncbi.nlm.nih.gov/21816040/)
+    > Li B, Dewey CN. RSEM: accurate transcript quantification from RNA-Seq data with or without a reference genome BMC Bioinformatics. 2011 Aug 4;12:323. doi: 10.1186/1471-2105-12-323. PubMed PMID: 21816040; PubMed Central PMCID: PMC3163565.
+
+* [RSeQC](https://pubmed.ncbi.nlm.nih.gov/22743226/)
+    > Wang L, Wang S, Li W. RSeQC: quality control of RNA-seq experiments Bioinformatics. 2012 Aug 15;28(16):2184-5. doi: 10.1093/bioinformatics/bts356. Epub 2012 Jun 27. PubMed PMID: 22743226.
+
+* [Salmon](https://pubmed.ncbi.nlm.nih.gov/28263959/)
+    > Patro R, Duggal G, Love MI, Irizarry RA, Kingsford C. Salmon provides fast and bias-aware quantification of transcript expression Nat Methods. 2017 Apr;14(4):417-419. doi: 10.1038/nmeth.4197. Epub 2017 Mar 6. PubMed PMID: 28263959; PubMed Central PMCID: PMC5600148.
+
+* [SAMtools](https://pubmed.ncbi.nlm.nih.gov/19505943/)
+    > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002.
+
+* [SortMeRNA](https://pubmed.ncbi.nlm.nih.gov/23071270/)
+    > Kopylova E, Noé L, Touzet H. SortMeRNA: fast and accurate filtering of ribosomal RNAs in metatranscriptomic data Bioinformatics. 2012 Dec 15;28(24):3211-7. doi: 10.1093/bioinformatics/bts611. Epub 2012 Oct 15. PubMed PMID: 23071270.
+
+* [STAR](https://pubmed.ncbi.nlm.nih.gov/23104886/)
+    > Dobin A, Davis CA, Schlesinger F, Drenkow J, Zaleski C, Jha S, Batut P, Chaisson M, Gingeras TR. STAR: ultrafast universal RNA-seq aligner Bioinformatics. 2013 Jan 1;29(1):15-21. doi: 10.1093/bioinformatics/bts635. Epub 2012 Oct 25. PubMed PMID: 23104886; PubMed Central PMCID: PMC3530905.
+
+* [StringTie2](https://pubmed.ncbi.nlm.nih.gov/31842956/)
+    > Kovaka S, Zimin AV, Pertea GM, Razaghi R, Salzberg SL, Pertea M. Transcriptome assembly from long-read RNA-seq alignments with StringTie2 Genome Biol. 2019 Dec 16;20(1):278. doi: 10.1186/s13059-019-1910-1. PubMed PMID: 31842956; PubMed Central PMCID: PMC6912988.
+
+* [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/)
+
+* [UMI-tools](https://pubmed.ncbi.nlm.nih.gov/28100584/)
+    > Smith T, Heger A, Sudbery I. UMI-tools: modeling sequencing errors in Unique Molecular Identifiers to improve quantification accuracy Genome Res. 2017 Mar;27(3):491-499. doi: 10.1101/gr.209601.116. Epub 2017 Jan 18. PubMed PMID: 28100584; PubMed Central PMCID: PMC5340976.
+
+* [UCSC tools](https://pubmed.ncbi.nlm.nih.gov/20639541/)
+    > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891.
+
+## R packages
+
+* [R](https://www.R-project.org/)
+    > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria.
+
+* [DESeq2](https://pubmed.ncbi.nlm.nih.gov/25516281/)
+    > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049.
+
+* [dupRadar](https://pubmed.ncbi.nlm.nih.gov/27769170/)
+    > Sayols S, Scherzinger D, Klein H. dupRadar: a Bioconductor package for the assessment of PCR artifacts in RNA-Seq data BMC Bioinformatics. 2016 Oct 21;17(1):428. doi: 10.1186/s12859-016-1276-2. PubMed PMID: 27769170; PubMed Central PMCID: PMC5073875.
+
+* [ggplot2](https://cran.r-project.org/web/packages/ggplot2/index.html)
+    > H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.
+
+* [optparse](https://CRAN.R-project.org/package=optparse)
+    > Trevor L Davis (2018). optparse: Command Line Option Parser.
+
+* [pheatmap](https://CRAN.R-project.org/package=pheatmap)
+    > Raivo Kolde (2018). pheatmap: Pretty Heatmaps.
+
+* [RColorBrewer](https://CRAN.R-project.org/package=RColorBrewer)
+    > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes.
+
+* [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html)
+    > Morgan M, Obenchain V, Hester J and Pagès H (2020). SummarizedExperiment: SummarizedExperiment container.
+
+* [Tximeta](https://pubmed.ncbi.nlm.nih.gov/32097405/)
+    > Love MI, Soneson C, Hickey PF, Johnson LK, Pierce NT, Shepherd L, Morgan M, Patro R. Tximeta: Reference sequence checksums for provenance identification in RNA-seq PLoS Comput Biol. 2020 Feb 25;16(2):e1007664. doi: 10.1371/journal.pcbi.1007664. eCollection 2020 Feb. PubMed PMID: 32097405; PubMed Central PMCID: PMC7059966.
+
+## Software packaging/containerisation tools
+
+* [Anaconda](https://anaconda.com)
+    > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web.
+
+* [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/)
+    > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506.
+
+* [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/)
+    > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671.
+
+* [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241)
+
+* [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/)
+    > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675.
diff --git a/README.md b/README.md
index c3eef4c0f..de0e0c510 100644
--- a/README.md
+++ b/README.md
@@ -31,24 +31,24 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool
 5. Adapter and quality trimming ([`Trim Galore!`](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/))
 6. Removal of ribosomal RNA ([`SortMeRNA`](https://github.com/biocore/sortmerna))
 7. Choice of multiple alignment and quantification routes:
-    1. [`STAR`](https://github.com/alexdobin/STAR) -> [`Salmon`](https://combine-lab.github.io/salmon/)
-    2. [`STAR`](https://github.com/alexdobin/STAR) -> [`RSEM`](https://github.com/deweylab/RSEM)
-    3. [`HiSAT2`](https://ccb.jhu.edu/software/hisat2/index.shtml) -> **NO QUANTIFICATION**
+        1. [`STAR`](https://github.com/alexdobin/STAR) -> [`Salmon`](https://combine-lab.github.io/salmon/)
+        2. [`STAR`](https://github.com/alexdobin/STAR) -> [`RSEM`](https://github.com/deweylab/RSEM)
+        3. [`HiSAT2`](https://ccb.jhu.edu/software/hisat2/index.shtml) -> **NO QUANTIFICATION**
 8. Sort and index alignments ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/))
 9. UMI-based deduplication ([`UMI-tools`](https://github.com/CGATOxford/UMI-tools))
 10. Duplicate read marking ([`picard MarkDuplicates`](https://broadinstitute.github.io/picard/))
 11. Transcript assembly and quantification ([`StringTie`](https://ccb.jhu.edu/software/stringtie/))
 12. Create bigWig coverage files ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/))
 13. Extensive quality control:
-    1. [`RSeQC`](http://rseqc.sourceforge.net/)
-    2. [`Qualimap`](http://qualimap.bioinfo.cipf.es/)
-    3. [`dupRadar`](https://bioconductor.org/packages/release/bioc/html/dupRadar.html)
-    4. [`Preseq`](http://smithlabresearch.org/software/preseq/)
-    5. [`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html)
+        1. [`RSeQC`](http://rseqc.sourceforge.net/)
+        2. [`Qualimap`](http://qualimap.bioinfo.cipf.es/)
+        3. [`dupRadar`](https://bioconductor.org/packages/release/bioc/html/dupRadar.html)
+        4. [`Preseq`](http://smithlabresearch.org/software/preseq/)
+        5. [`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html)
 14. Pseudo-alignment and quantification ([`Salmon`](https://combine-lab.github.io/salmon/); *optional*)
 15. Present QC for raw read, alignment, gene biotype, sample similarity, and strand-specificity checks ([`MultiQC`](http://multiqc.info/), [`R`](https://www.r-project.org/))
 
-> **NB:** Quantification isn't performed if using `--aligner hisat2` due to the lack of an appropriate option to calculate accurate expression estimates from HISAT2 derived genomic alignments. However, you can use this route if you have a preference for the alignment, QC and other types of downstream analysis compatible with the output of HISAT2.  
+> **NB:** Quantification isn't performed if using `--aligner hisat2` due to the lack of an appropriate option to calculate accurate expression estimates from HISAT2 derived genomic alignments. However, you can use this route if you have a preference for the alignment, QC and other types of downstream analysis compatible with the output of HISAT2.
 > **NB:** The `--aligner star_rsem` option will require STAR indices built from version 2.7.6a or later. However, in order to support legacy usage of genomes hosted on AWS iGenomes the `--aligner star_salmon` option requires indices built with STAR 2.6.1d or earlier. Please refer to this [issue](https://github.com/nf-core/rnaseq/issues/498) for further details.
 
 ## Quick Start
@@ -59,34 +59,34 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool
 
 3. Download the pipeline and test it on a minimal dataset with a single command:
 
-    ```bash
-    nextflow run nf-core/rnaseq -profile test,<docker/singularity/podman/shifter/charliecloud/conda/institute>
-    ```
+        ```bash
+        nextflow run nf-core/rnaseq -profile test,<docker/singularity/podman/shifter/charliecloud/conda/institute>
+        ```
 
-    > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile <institute>` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment.
-    > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs.
-    > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs.
+        > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile <institute>` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment.
+        > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs.
+        > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs.
 
 4. Start running your own analysis!
 
-    * Typical command for RNA-seq analysis:
+        * Typical command for RNA-seq analysis:
 
-        ```bash
-        nextflow run nf-core/rnaseq \
-            --input samplesheet.csv \
-            --genome GRCh37 \
-            -profile <docker/singularity/podman/conda/institute>
-        ```
+                ```bash
+                nextflow run nf-core/rnaseq \
+                        --input samplesheet.csv \
+                        --genome GRCh37 \
+                        -profile <docker/singularity/podman/conda/institute>
+                ```
 
-    * Typical command for downloading public data:
+        * Typical command for downloading public data:
 
-        ```bash
-        nextflow run nf-core/rnaseq \
-            --public_data_ids ids.txt \
-            -profile <docker/singularity/podman/conda/institute>
-        ```
+                ```bash
+                nextflow run nf-core/rnaseq \
+                        --public_data_ids ids.txt \
+                        -profile <docker/singularity/podman/conda/institute>
+                ```
 
-    > **NB:** The commands to obtain public data and to run the main arm of the pipeline are completely independent. This is intentional because it allows you to download all of the raw data in an initial pipeline run (`results/public_data/`) and then to curate the auto-created samplesheet based on the available sample metadata before you run the pipeline again properly.
+        > **NB:** The commands to obtain public data and to run the main arm of the pipeline are completely independent. This is intentional because it allows you to download all of the raw data in an initial pipeline run (`results/public_data/`) and then to curate the auto-created samplesheet based on the available sample metadata before you run the pipeline again properly.
 
 See [usage](https://nf-co.re/rnaseq/usage) and [parameter](https://nf-co.re/rnaseq/parameters) docs for all of the available options when running the pipeline.
 
diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt
index 41387bfd5..df93faab7 100644
--- a/assets/sendmail_template.txt
+++ b/assets/sendmail_template.txt
@@ -15,15 +15,15 @@ Content-ID: <nfcorepipelinelogo>
 Content-Disposition: inline; filename="nf-core-rnaseq_logo.png"
 
 <% out << new File("$projectDir/assets/nf-core-rnaseq_logo.png").
-  bytes.
-  encodeBase64().
-  toString().
-  tokenize( '\n' )*.
-  toList()*.
-  collate( 76 )*.
-  collect { it.join() }.
-  flatten().
-  join( '\n' ) %>
+    bytes.
+    encodeBase64().
+    toString().
+    tokenize( '\n' )*.
+    toList()*.
+    collate( 76 )*.
+    collect { it.join() }.
+    flatten().
+    join( '\n' ) %>
 
 <%
 if (mqcFile){
@@ -37,15 +37,15 @@ Content-ID: <mqcreport>
 Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\"
 
 ${mqcFileObj.
-  bytes.
-  encodeBase64().
-  toString().
-  tokenize( '\n' )*.
-  toList()*.
-  collate( 76 )*.
-  collect { it.join() }.
-  flatten().
-  join( '\n' )}
+    bytes.
+    encodeBase64().
+    toString().
+    tokenize( '\n' )*.
+    toList()*.
+    collate( 76 )*.
+    collect { it.join() }.
+    flatten().
+    join( '\n' )}
 """
 }}
 %>
diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py
index 3f74a5bd5..d7480a078 100755
--- a/bin/check_samplesheet.py
+++ b/bin/check_samplesheet.py
@@ -60,7 +60,7 @@ def check_samplesheet(file_in, file_out):
             ## Check valid number of columns per row
             if len(lspl) < len(HEADER):
                 print_error(f"Invalid number of columns (minimum = {len(HEADER)})!", 'Line', line)
-            
+
             num_cols = len([x for x in lspl if x])
             if num_cols < MIN_COLS:
                 print_error(f"Invalid number of populated columns (minimum = {MIN_COLS})!", 'Line', line)
@@ -119,7 +119,7 @@ def check_samplesheet(file_in, file_out):
                 if not all(x[0] == sample_mapping_dict[sample][0][0] for x in sample_mapping_dict[sample]):
                     print_error(f"Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end!", "Sample", sample)
 
-                ## Check that multiple runs of the same sample are of the same strandedness 
+                ## Check that multiple runs of the same sample are of the same strandedness
                 if not all(x[-1] == sample_mapping_dict[sample][0][-1] for x in sample_mapping_dict[sample]):
                     print_error(f"Multiple runs of a sample must have the same strandedness!", "Sample", sample)
 
diff --git a/bin/deseq2_qc.r b/bin/deseq2_qc.r
index 02073ab96..022c0e320 100755
--- a/bin/deseq2_qc.r
+++ b/bin/deseq2_qc.r
@@ -73,7 +73,7 @@ setwd(opt$outdir)
 samples.vec     <- colnames(count.table)
 name_components <- strsplit(samples.vec, "_")
 n_components    <- length(name_components[[1]])
-decompose       <- n_components!=1 && all(sapply(name_components, length)==n_components) 
+decompose       <- n_components!=1 && all(sapply(name_components, length)==n_components)
 coldata         <- data.frame(samples.vec, sample=samples.vec, row.names=1)
 if (decompose) {
     groupings        <- as.data.frame(lapply(1:n_components, function(i) sapply(name_components, "[[", i)))
@@ -130,7 +130,7 @@ if (min(dim(count.table))<=1)  { # No point if only one sample, or one gene
 ##' in which an assay containing a variance-stabilised matrix of counts is
 ##' stored. Copied from DESeq2::plotPCA, but with additional ability to
 ##' say which assay to run the PCA on.
-##' 
+##'
 ##' @param object The DESeq2DataSet object.
 ##' @param ntop number of top genes to use for principla components, selected by highest row variance.
 ##' @param assay the name or index of the assay that stores the variance-stabilised data.
@@ -162,10 +162,10 @@ if (file.exists(PlotFile) == FALSE) {
         plot_subtitle <- ifelse(n_top_var==Inf, "All genes", paste("Top", n_top_var, "genes"))
         pl <- ggplot(pca.data, aes(PC1, PC2, label=paste0(" ", sample, " "))) +
             geom_point() +
-            geom_text(check_overlap=TRUE, vjust=0.5, hjust="inward") +           
+            geom_text(check_overlap=TRUE, vjust=0.5, hjust="inward") +
             xlab(paste0("PC1: ",percentVar[1],"% variance")) +
             ylab(paste0("PC2: ",percentVar[2],"% variance")) +
-            labs(title = paste0("First PCs on ", vst_name, "-transformed data"), subtitle = plot_subtitle) + 
+            labs(title = paste0("First PCs on ", vst_name, "-transformed data"), subtitle = plot_subtitle) +
             theme(legend.position="top",
                 panel.grid.major = element_blank(),
                 panel.grid.minor = element_blank(),
@@ -176,7 +176,7 @@ if (file.exists(PlotFile) == FALSE) {
         if (decompose) {
             pc_names <- paste0("PC", attr(pca.data, "percentVar")$PC)
             long_pc <- reshape(pca.data, varying=pc_names, direction="long", sep="", timevar="component", idvar="pcrow")
-            long_pc <- subset(long_pc, component<=5) 
+            long_pc <- subset(long_pc, component<=5)
             long_pc_grp <- reshape(long_pc, varying=names(groupings), direction="long", sep="", timevar="grouper")
             long_pc_grp <- subset(long_pc_grp, grouper<=5)
             long_pc_grp$component <- paste("PC", long_pc_grp$component)
@@ -190,7 +190,7 @@ if (file.exists(PlotFile) == FALSE) {
             print(pl)
         }
     } # at end of loop, we'll be using the user-defined ntop if any, else all genes
-    
+
     ## WRITE PC1 vs PC2 VALUES TO FILE
     pca.vals           <- pca.data[,c("PC1","PC2")]
     colnames(pca.vals) <- paste0(colnames(pca.vals), ": ", percentVar[1:2], '% variance')
diff --git a/bin/dupradar.r b/bin/dupradar.r
index 1fb0dc1b2..daf5a5798 100755
--- a/bin/dupradar.r
+++ b/bin/dupradar.r
@@ -3,7 +3,7 @@
 # Command line argument processing
 args = commandArgs(trailingOnly=TRUE)
 if (length(args) < 5) {
-  stop("Usage: dupRadar.r <input.bam> <annotation.gtf> <strandDirection:0=unstranded/1=forward/2=reverse> <paired/single> <nbThreads> <R-package-location (optional)>", call.=FALSE)
+    stop("Usage: dupRadar.r <input.bam> <annotation.gtf> <strandDirection:0=unstranded/1=forward/2=reverse> <paired/single> <nbThreads> <R-package-location (optional)>", call.=FALSE)
 }
 input_bam <- args[1]
 output_prefix <- args[2]
@@ -32,13 +32,13 @@ message("Output basename       : ", output_prefix)
 # Load / install packages
 if (length(args) > 5) { .libPaths( c( args[6], .libPaths() ) ) }
 if (!require("dupRadar")){
-  source("http://bioconductor.org/biocLite.R")
-  biocLite("dupRadar", suppressUpdates=TRUE)
-  library("dupRadar")
+    source("http://bioconductor.org/biocLite.R")
+    biocLite("dupRadar", suppressUpdates=TRUE)
+    library("dupRadar")
 }
 if (!require("parallel")) {
-  install.packages("parallel", dependencies=TRUE, repos='http://cloud.r-project.org/')
-  library("parallel")
+    install.packages("parallel", dependencies=TRUE, repos='http://cloud.r-project.org/')
+    library("parallel")
 }
 
 # Duplicate stats
@@ -53,10 +53,10 @@ mtext(output_prefix, side=3)
 dev.off()
 fit <- duprateExpFit(DupMat=dm)
 cat(
-  paste("- dupRadar Int (duprate at low read counts):", fit$intercept),
-  paste("- dupRadar Sl (progression of the duplication rate):", fit$slope),
-  fill=TRUE, labels=output_prefix,
-  file=paste0(output_prefix, "_intercept_slope.txt"), append=FALSE
+    paste("- dupRadar Int (duprate at low read counts):", fit$intercept),
+    paste("- dupRadar Sl (progression of the duplication rate):", fit$slope),
+    fill=TRUE, labels=output_prefix,
+    file=paste0(output_prefix, "_intercept_slope.txt"), append=FALSE
 )
 
 # Create a multiqc file dupInt
@@ -125,9 +125,9 @@ line="#id: dupradar
 
 write(line,file=paste0(output_prefix, "_duprateExpDensCurve_mqc.txt"),append=TRUE)
 write.table(
-  cbind(curve_x, curve_y),
-  file=paste0(output_prefix, "_duprateExpDensCurve_mqc.txt"),
-  quote=FALSE, row.names=FALSE, col.names=FALSE, append=TRUE,
+    cbind(curve_x, curve_y),
+    file=paste0(output_prefix, "_duprateExpDensCurve_mqc.txt"),
+    quote=FALSE, row.names=FALSE, col.names=FALSE, append=TRUE,
 )
 
 # Distribution of expression box plot
diff --git a/bin/gtf2bed b/bin/gtf2bed
index 62d0f49fd..66d523067 100755
--- a/bin/gtf2bed
+++ b/bin/gtf2bed
@@ -33,90 +33,90 @@ my $in_cmd =($in =~ /\.gz$/ ? "gunzip -c $in|" : $in =~ /\.zip$/ ? "unzip -p $in
 open IN, $in_cmd;
 
 while (<IN>) {
-	$gff = 2 if /^##gff-version 2/;
-	$gff = 3 if /^##gff-version 3/;
-	next if /^#/ && $gff;
-
-	s/\s+$//;
-	# 0-chr 1-src 2-feat 3-beg 4-end 5-scor 6-dir 7-fram 8-attr
-	my @f = split /\t/;
-	if ($gff) {
+    $gff = 2 if /^##gff-version 2/;
+    $gff = 3 if /^##gff-version 3/;
+    next if /^#/ && $gff;
+
+    s/\s+$//;
+    # 0-chr 1-src 2-feat 3-beg 4-end 5-scor 6-dir 7-fram 8-attr
+    my @f = split /\t/;
+    if ($gff) {
         # most ver 2's stick gene names in the id field
-		($id) = $f[8]=~ /\bID="([^"]+)"/;
+        ($id) = $f[8]=~ /\bID="([^"]+)"/;
         # most ver 3's stick unquoted names in the name field
-		($id) = $f[8]=~ /\bName=([^";]+)/ if !$id && $gff == 3;
-	} else {
-		($id) = $f[8]=~ /transcript_id "([^"]+)"/;
-	}
+        ($id) = $f[8]=~ /\bName=([^";]+)/ if !$id && $gff == 3;
+    } else {
+        ($id) = $f[8]=~ /transcript_id "([^"]+)"/;
+    }
 
-	next unless $id && $f[0];
+    next unless $id && $f[0];
 
-	if ($f[2] eq 'exon') {
-		die "no position at exon on line $." if ! $f[3];
+    if ($f[2] eq 'exon') {
+        die "no position at exon on line $." if ! $f[3];
         # gff3 puts :\d in exons sometimes
         $id =~ s/:\d+$// if $gff == 3;
-		push @{$exons{$id}}, \@f;
-		# save lowest start
-		$trans{$id} = \@f if !$trans{$id};
-	} elsif ($f[2] eq 'start_codon') {
-		#optional, output codon start/stop as "thick" region in bed
-		$sc{$id}->[0] = $f[3];
-	} elsif ($f[2] eq 'stop_codon') {
-		$sc{$id}->[1] = $f[4];
-	} elsif ($f[2] eq 'miRNA' ) {
-		$trans{$id} = \@f if !$trans{$id};
-		push @{$exons{$id}}, \@f;
-	}
+        push @{$exons{$id}}, \@f;
+        # save lowest start
+        $trans{$id} = \@f if !$trans{$id};
+    } elsif ($f[2] eq 'start_codon') {
+        #optional, output codon start/stop as "thick" region in bed
+        $sc{$id}->[0] = $f[3];
+    } elsif ($f[2] eq 'stop_codon') {
+        $sc{$id}->[1] = $f[4];
+    } elsif ($f[2] eq 'miRNA' ) {
+        $trans{$id} = \@f if !$trans{$id};
+        push @{$exons{$id}}, \@f;
+    }
 }
 
 for $id (
-	# sort by chr then pos
-	sort {
-		$trans{$a}->[0] eq $trans{$b}->[0] ?
-		$trans{$a}->[3] <=> $trans{$b}->[3] :
-		$trans{$a}->[0] cmp $trans{$b}->[0]
-	} (keys(%trans)) ) {
-		my ($chr, undef, undef, undef, undef, undef, $dir, undef, $attr, undef, $cds, $cde) = @{$trans{$id}};
+    # sort by chr then pos
+    sort {
+        $trans{$a}->[0] eq $trans{$b}->[0] ?
+        $trans{$a}->[3] <=> $trans{$b}->[3] :
+        $trans{$a}->[0] cmp $trans{$b}->[0]
+    } (keys(%trans)) ) {
+        my ($chr, undef, undef, undef, undef, undef, $dir, undef, $attr, undef, $cds, $cde) = @{$trans{$id}};
         my ($cds, $cde);
         ($cds, $cde) = @{$sc{$id}} if $sc{$id};
 
-		# sort by pos
-		my @ex = sort {
-			$a->[3] <=> $b->[3]
-		} @{$exons{$id}};
-
-		my $beg = $ex[0][3];
-		my $end = $ex[-1][4];
-		
-		if ($dir eq '-') {
-			# swap
-			$tmp=$cds;
-			$cds=$cde;
-			$cde=$tmp;
-			$cds -= 2 if $cds;
-			$cde += 2 if $cde;
-		}
-
-		# not specified, just use exons
-		$cds = $beg if !$cds;
-		$cde = $end if !$cde;
-
-		# adjust start for bed
-		--$beg; --$cds;
-	
-		my $exn = @ex;												# exon count
-		my $exst = join ",", map {$_->[3]-$beg-1} @ex;				# exon start
-		my $exsz = join ",", map {$_->[4]-$_->[3]+1} @ex;			# exon size
+        # sort by pos
+        my @ex = sort {
+            $a->[3] <=> $b->[3]
+        } @{$exons{$id}};
+
+        my $beg = $ex[0][3];
+        my $end = $ex[-1][4];
+
+        if ($dir eq '-') {
+            # swap
+            $tmp=$cds;
+            $cds=$cde;
+            $cde=$tmp;
+            $cds -= 2 if $cds;
+            $cde += 2 if $cde;
+        }
+
+        # not specified, just use exons
+        $cds = $beg if !$cds;
+        $cde = $end if !$cde;
+
+        # adjust start for bed
+        --$beg; --$cds;
+
+        my $exn = @ex;												# exon count
+        my $exst = join ",", map {$_->[3]-$beg-1} @ex;				# exon start
+        my $exsz = join ",", map {$_->[4]-$_->[3]+1} @ex;			# exon size
 
         my $gene_id;
         my $extend = "";
         if ($extended) {
-    	    ($gene_id) = $attr =~ /gene_name "([^"]+)"/;
-    	    ($gene_id) = $attr =~ /gene_id "([^"]+)"/ unless $gene_id;
+            ($gene_id) = $attr =~ /gene_name "([^"]+)"/;
+            ($gene_id) = $attr =~ /gene_id "([^"]+)"/ unless $gene_id;
             $extend="\t$gene_id";
         }
-		# added an extra comma to make it look exactly like ucsc's beds
-		print "$chr\t$beg\t$end\t$id\t0\t$dir\t$cds\t$cde\t0\t$exn\t$exsz,\t$exst,$extend\n";
+        # added an extra comma to make it look exactly like ucsc's beds
+        print "$chr\t$beg\t$end\t$id\t0\t$dir\t$cds\t$cde\t0\t$exn\t$exsz,\t$exst,$extend\n";
 }
 
 
diff --git a/bin/salmon_summarizedexperiment.r b/bin/salmon_summarizedexperiment.r
index a43732efd..75485ccb4 100755
--- a/bin/salmon_summarizedexperiment.r
+++ b/bin/salmon_summarizedexperiment.r
@@ -52,8 +52,10 @@ if (length(extra) > 0) {
 
 rowdata = rowdata[match(rownames(counts), as.character(rowdata[[by_what]])),]
 rownames(rowdata) = rowdata[[by_what]]
-se = SummarizedExperiment(assays = list(counts = counts, abundance = tpm),
-                          colData = DataFrame(coldata),
-                          rowData = rowdata)
+se = SummarizedExperiment(
+    assays = list(counts = counts, abundance = tpm),
+    colData = DataFrame(coldata),
+    rowData = rowdata
+)
 
 saveRDS(se, file = paste0(tools::file_path_sans_ext(counts_fn), ".rds"))
diff --git a/bin/salmon_tximport.r b/bin/salmon_tximport.r
index ac4d477bd..ccb69ff7f 100755
--- a/bin/salmon_tximport.r
+++ b/bin/salmon_tximport.r
@@ -44,9 +44,11 @@ if (length(extra) > 0) {
 }
 rowdata = rowdata[match(rownames(txi[[1]]), as.character(rowdata[["tx"]])),]
 rownames(rowdata) = rowdata[["tx"]]
-se = SummarizedExperiment(assays = list(counts = txi[["counts"]], abundance = txi[["abundance"]], length = txi[["length"]]),
-                          colData = DataFrame(coldata),
-                          rowData = rowdata)
+se = SummarizedExperiment(
+    assays = list(counts = txi[["counts"]], abundance = txi[["abundance"]], length = txi[["length"]]),
+    colData = DataFrame(coldata),
+    rowData = rowdata
+)
 if (!is.null(tx2gene)) {
     gi = summarizeToGene(txi, tx2gene = tx2gene)
     gi.ls = summarizeToGene(txi, tx2gene = tx2gene,countsFromAbundance="lengthScaledTPM")
@@ -54,15 +56,21 @@ if (!is.null(tx2gene)) {
     growdata = unique(rowdata[,2:3])
     growdata = growdata[match(rownames(gi[[1]]), growdata[["gene_id"]]),]
     rownames(growdata) = growdata[["tx"]]
-    gse = SummarizedExperiment(assays = list(counts = gi[["counts"]], abundance = gi[["abundance"]], length = gi[["length"]]),
-                                colData = DataFrame(coldata),
-                                rowData = growdata)
-    gse.ls = SummarizedExperiment(assays = list(counts = gi.ls[["counts"]], abundance = gi.ls[["abundance"]], length = gi.ls[["length"]]),
-                                  colData = DataFrame(coldata),
-                                  rowData = growdata)
-    gse.s = SummarizedExperiment(assays = list(counts = gi.s[["counts"]], abundance = gi.s[["abundance"]], length = gi.s[["length"]]),
-                                  colData = DataFrame(coldata),
-                                  rowData = growdata)
+    gse = SummarizedExperiment(
+        assays = list(counts = gi[["counts"]], abundance = gi[["abundance"]], length = gi[["length"]]),
+        colData = DataFrame(coldata),
+        rowData = growdata
+    )
+    gse.ls = SummarizedExperiment(
+        assays = list(counts = gi.ls[["counts"]], abundance = gi.ls[["abundance"]], length = gi.ls[["length"]]),
+        colData = DataFrame(coldata),
+        rowData = growdata
+    )
+    gse.s = SummarizedExperiment(
+        assays = list(counts = gi.s[["counts"]], abundance = gi.s[["abundance"]], length = gi.s[["length"]]),
+        colData = DataFrame(coldata),
+        rowData = growdata
+    )
 }
 
 build_table = function(se.obj, slot) {
diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py
index 9e9935898..002a859ab 100755
--- a/bin/sra_ids_to_runinfo.py
+++ b/bin/sra_ids_to_runinfo.py
@@ -110,7 +110,7 @@ def fetch_sra_runinfo(file_in,file_out,platform_list=[],library_layout_list=[]):
                 prefix = match.group()
                 if prefix in PREFIX_LIST:
                     if not db_id in seen_ids:
-                        
+
                         ids = [db_id]
                         ## Resolve/expand these ids against GEO URL
                         if prefix in ['GSE']:
diff --git a/bin/sra_runinfo_to_ftp.py b/bin/sra_runinfo_to_ftp.py
index 6fd09aeb7..80a8c1d7d 100755
--- a/bin/sra_runinfo_to_ftp.py
+++ b/bin/sra_runinfo_to_ftp.py
@@ -48,10 +48,10 @@ def parse_sra_runinfo(file_in):
                     sample_dict['fastq_1']  = fastq_files
                     sample_dict['md5_1']    = fastq_md5
                 else:
-                    ## In some instances FTP links don't exist for FastQ files 
+                    ## In some instances FTP links don't exist for FastQ files
                     ## These have to be downloaded via fastq-dump / fasterq-dump / parallel-fastq-dump via the run id
                     db_id = run_id
-            
+
             elif library == 'PAIRED':
                 sample_dict = collections.OrderedDict([('fastq_1',''), ('fastq_2',''), ('md5_1',''), ('md5_2',''), ('single_end','false')])
                 if fastq_files:
@@ -62,14 +62,14 @@ def parse_sra_runinfo(file_in):
                             sample_dict['fastq_1'] = fq_files[0]
                             sample_dict['fastq_2'] = fq_files[1]
                             sample_dict['md5_1']   = fq_md5[0]
-                            sample_dict['md5_2']   = fq_md5[1]                        
+                            sample_dict['md5_2']   = fq_md5[1]
                         else:
                             print("Invalid FastQ files found for database id:'{}'!.".format(run_id))
                     else:
                         print("Invalid number of FastQ files ({}) found for paired-end database id:'{}'!.".format(len(fq_files), run_id))
                 else:
                     db_id = run_id
-            
+
             if sample_dict:
                 sample_dict.update(line_dict)
                 if db_id not in runinfo_dict:
@@ -79,20 +79,20 @@ def parse_sra_runinfo(file_in):
                         print("Input run info file contains duplicate rows!\nLine: '{}'".format(line))
                     else:
                         runinfo_dict[db_id].append(sample_dict)
-    
+
     return runinfo_dict
 
 
 def sra_runinfo_to_ftp(files_in,file_out):
     samplesheet_dict = {}
     for file_in in files_in:
-        runinfo_dict = parse_sra_runinfo(file_in)        
+        runinfo_dict = parse_sra_runinfo(file_in)
         for db_id in runinfo_dict.keys():
             if db_id not in samplesheet_dict:
                 samplesheet_dict[db_id] = runinfo_dict[db_id]
             else:
                 print("Duplicate sample identifier found!\nID: '{}'".format(db_id))
-    
+
     ## Write samplesheet with paths to FastQ files and md5 sums
     if samplesheet_dict:
         out_dir = os.path.dirname(file_out)
@@ -108,7 +108,7 @@ def sra_runinfo_to_ftp(files_in,file_out):
 def main(args=None):
     args = parse_args(args)
     sra_runinfo_to_ftp([x.strip() for x in args.FILES_IN.split(',')], args.FILE_OUT)
-    
+
 
 if __name__ == '__main__':
     sys.exit(main())
diff --git a/conf/base.config b/conf/base.config
index 42e8aa9fd..42cdf6f26 100644
--- a/conf/base.config
+++ b/conf/base.config
@@ -11,41 +11,41 @@
 
 process {
 
-  cpus   = { check_max( 1    * task.attempt, 'cpus'   ) }
-  memory = { check_max( 6.GB * task.attempt, 'memory' ) }
-  time   = { check_max( 4.h  * task.attempt, 'time'   ) }
+    cpus   = { check_max( 1    * task.attempt, 'cpus'   ) }
+    memory = { check_max( 6.GB * task.attempt, 'memory' ) }
+    time   = { check_max( 4.h  * task.attempt, 'time'   ) }
 
-  errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' }
-  maxRetries    = 1
-  maxErrors     = '-1'
+    errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' }
+    maxRetries    = 1
+    maxErrors     = '-1'
 
-  // Process-specific resource requirements
-  withLabel:process_low {
-    cpus   = { check_max( 2     * task.attempt, 'cpus'    ) }
-    memory = { check_max( 12.GB * task.attempt, 'memory'  ) }
-    time   = { check_max( 4.h   * task.attempt, 'time'    ) }
-  }
-  withLabel:process_medium {
-    cpus   = { check_max( 6     * task.attempt, 'cpus'    ) }
-    memory = { check_max( 36.GB * task.attempt, 'memory'  ) }
-    time   = { check_max( 8.h   * task.attempt, 'time'    ) }
-  }
-  withLabel:process_high {
-    cpus   = { check_max( 12    * task.attempt, 'cpus'    ) }
-    memory = { check_max( 72.GB * task.attempt, 'memory'  ) }
-    time   = { check_max( 16.h  * task.attempt, 'time'    ) }
-  }
-  withLabel:process_long {
-    time   = { check_max( 20.h  * task.attempt, 'time'    ) }
-  }
-  withLabel:process_high_memory {
-    memory = { check_max( 200.GB * task.attempt, 'memory' ) }
-  }
-  withLabel:error_ignore {
-    errorStrategy = 'ignore'
-  }
-  withLabel:error_retry {
-    errorStrategy = 'retry'
-    maxRetries    = 2
-  }
-}
\ No newline at end of file
+    // Process-specific resource requirements
+    withLabel:process_low {
+        cpus   = { check_max( 2     * task.attempt, 'cpus'    ) }
+        memory = { check_max( 12.GB * task.attempt, 'memory'  ) }
+        time   = { check_max( 4.h   * task.attempt, 'time'    ) }
+    }
+    withLabel:process_medium {
+        cpus   = { check_max( 6     * task.attempt, 'cpus'    ) }
+        memory = { check_max( 36.GB * task.attempt, 'memory'  ) }
+        time   = { check_max( 8.h   * task.attempt, 'time'    ) }
+    }
+    withLabel:process_high {
+        cpus   = { check_max( 12    * task.attempt, 'cpus'    ) }
+        memory = { check_max( 72.GB * task.attempt, 'memory'  ) }
+        time   = { check_max( 16.h  * task.attempt, 'time'    ) }
+    }
+    withLabel:process_long {
+        time   = { check_max( 20.h  * task.attempt, 'time'    ) }
+    }
+    withLabel:process_high_memory {
+        memory = { check_max( 200.GB * task.attempt, 'memory' ) }
+    }
+    withLabel:error_ignore {
+        errorStrategy = 'ignore'
+    }
+    withLabel:error_retry {
+        errorStrategy = 'retry'
+        maxRetries    = 2
+    }
+}
diff --git a/conf/igenomes.config b/conf/igenomes.config
index 31b7ee613..1bcca3f38 100644
--- a/conf/igenomes.config
+++ b/conf/igenomes.config
@@ -8,414 +8,414 @@
  */
 
 params {
-  // illumina iGenomes reference file paths
-  genomes {
-    'GRCh37' {
-      fasta       = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt"
-      mito_name   = "MT"
-      macs_gsize  = "2.7e9"
-      blacklist   = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed"
+    // illumina iGenomes reference file paths
+    genomes {
+        'GRCh37' {
+            fasta       = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt"
+            mito_name   = "MT"
+            macs_gsize  = "2.7e9"
+            blacklist   = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed"
+        }
+        'GRCh38' {
+            fasta       = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed"
+            mito_name   = "chrM"
+            macs_gsize  = "2.7e9"
+            blacklist   = "${projectDir}/assets/blacklists/hg38-blacklist.bed"
+        }
+        'GRCm38' {
+            fasta       = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt"
+            mito_name   = "MT"
+            macs_gsize  = "1.87e9"
+            blacklist   = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed"
+        }
+        'TAIR10' {
+            fasta       = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt"
+            mito_name   = "Mt"
+        }
+        'EB2' {
+            fasta       = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt"
+        }
+        'UMD3.1' {
+            fasta       = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt"
+            mito_name   = "MT"
+        }
+        'WBcel235' {
+            fasta       = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed"
+            mito_name   = "MtDNA"
+            macs_gsize  = "9e7"
+        }
+        'CanFam3.1' {
+            fasta       = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt"
+            mito_name   = "MT"
+        }
+        'GRCz10' {
+            fasta       = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed"
+            mito_name   = "MT"
+        }
+        'BDGP6' {
+            fasta       = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed"
+            mito_name   = "M"
+            macs_gsize  = "1.2e8"
+        }
+        'EquCab2' {
+            fasta       = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt"
+            mito_name   = "MT"
+        }
+        'EB1' {
+            fasta       = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt"
+        }
+        'Galgal4' {
+            fasta       = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed"
+            mito_name   = "MT"
+        }
+        'Gm01' {
+            fasta       = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt"
+        }
+        'Mmul_1' {
+            fasta       = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt"
+            mito_name   = "MT"
+        }
+        'IRGSP-1.0' {
+            fasta       = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed"
+            mito_name   = "Mt"
+        }
+        'CHIMP2.1.4' {
+            fasta       = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt"
+            mito_name   = "MT"
+        }
+        'Rnor_6.0' {
+            fasta       = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed"
+            mito_name   = "MT"
+        }
+        'R64-1-1' {
+            fasta       = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed"
+            mito_name   = "MT"
+            macs_gsize  = "1.2e7"
+        }
+        'EF2' {
+            fasta       = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt"
+            mito_name   = "MT"
+            macs_gsize  = "1.21e7"
+        }
+        'Sbi1' {
+            fasta       = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt"
+        }
+        'Sscrofa10.2' {
+            fasta       = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt"
+            mito_name   = "MT"
+        }
+        'AGPv3' {
+            fasta       = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed"
+            mito_name   = "Mt"
+        }
+        'hg38' {
+            fasta       = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed"
+            mito_name   = "chrM"
+            macs_gsize  = "2.7e9"
+            blacklist   = "${projectDir}/assets/blacklists/hg38-blacklist.bed"
+        }
+        'hg19' {
+            fasta       = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt"
+            mito_name   = "chrM"
+            macs_gsize  = "2.7e9"
+            blacklist   = "${projectDir}/assets/blacklists/hg19-blacklist.bed"
+        }
+        'mm10' {
+            fasta       = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt"
+            mito_name   = "chrM"
+            macs_gsize  = "1.87e9"
+            blacklist   = "${projectDir}/assets/blacklists/mm10-blacklist.bed"
+        }
+        'bosTau8' {
+            fasta       = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed"
+            mito_name   = "chrM"
+        }
+        'ce10' {
+            fasta       = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt"
+            mito_name   = "chrM"
+            macs_gsize  = "9e7"
+        }
+        'canFam3' {
+            fasta       = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt"
+            mito_name   = "chrM"
+        }
+        'danRer10' {
+            fasta       = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed"
+            mito_name   = "chrM"
+            macs_gsize  = "1.37e9"
+        }
+        'dm6' {
+            fasta       = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed"
+            mito_name   = "chrM"
+            macs_gsize  = "1.2e8"
+        }
+        'equCab2' {
+            fasta       = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt"
+            mito_name   = "chrM"
+        }
+        'galGal4' {
+            fasta       = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt"
+            mito_name   = "chrM"
+        }
+        'panTro4' {
+            fasta       = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt"
+            mito_name   = "chrM"
+        }
+        'rn6' {
+            fasta       = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed"
+            mito_name   = "chrM"
+        }
+        'sacCer3' {
+            fasta       = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/"
+            readme      = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt"
+            mito_name   = "chrM"
+            macs_gsize  = "1.2e7"
+        }
+        'susScr3' {
+            fasta       = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa"
+            bwa         = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa"
+            bowtie2     = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/"
+            star        = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/"
+            bismark     = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/"
+            gtf         = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf"
+            bed12       = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed"
+            readme      = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt"
+            mito_name   = "chrM"
+        }
     }
-    'GRCh38' {
-      fasta       = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed"
-      mito_name   = "chrM"
-      macs_gsize  = "2.7e9"
-      blacklist   = "${projectDir}/assets/blacklists/hg38-blacklist.bed"
-    }
-    'GRCm38' {
-      fasta       = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt"
-      mito_name   = "MT"
-      macs_gsize  = "1.87e9"
-      blacklist   = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed"
-    }
-    'TAIR10' {
-      fasta       = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt"
-      mito_name   = "Mt"
-    }
-    'EB2' {
-      fasta       = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt"
-    }
-    'UMD3.1' {
-      fasta       = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt"
-      mito_name   = "MT"
-    }
-    'WBcel235' {
-      fasta       = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed"
-      mito_name   = "MtDNA"
-      macs_gsize  = "9e7"
-    }
-    'CanFam3.1' {
-      fasta       = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt"
-      mito_name   = "MT"
-    }
-    'GRCz10' {
-      fasta       = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed"
-      mito_name   = "MT"
-    }
-    'BDGP6' {
-      fasta       = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed"
-      mito_name   = "M"
-      macs_gsize  = "1.2e8"
-    }
-    'EquCab2' {
-      fasta       = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt"
-      mito_name   = "MT"
-    }
-    'EB1' {
-      fasta       = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt"
-    }
-    'Galgal4' {
-      fasta       = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed"
-      mito_name   = "MT"
-    }
-    'Gm01' {
-      fasta       = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt"
-    }
-    'Mmul_1' {
-      fasta       = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt"
-      mito_name   = "MT"
-    }
-    'IRGSP-1.0' {
-      fasta       = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed"
-      mito_name   = "Mt"
-    }
-    'CHIMP2.1.4' {
-      fasta       = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt"
-      mito_name   = "MT"
-    }
-    'Rnor_6.0' {
-      fasta       = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed"
-      mito_name   = "MT"
-    }
-    'R64-1-1' {
-      fasta       = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed"
-      mito_name   = "MT"
-      macs_gsize  = "1.2e7"
-    }
-    'EF2' {
-      fasta       = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt"
-      mito_name   = "MT"
-      macs_gsize  = "1.21e7"
-    }
-    'Sbi1' {
-      fasta       = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt"
-    }
-    'Sscrofa10.2' {
-      fasta       = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt"
-      mito_name   = "MT"
-    }
-    'AGPv3' {
-      fasta       = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed"
-      mito_name   = "Mt"
-    }
-    'hg38' {
-      fasta       = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed"
-      mito_name   = "chrM"
-      macs_gsize  = "2.7e9"
-      blacklist   = "${projectDir}/assets/blacklists/hg38-blacklist.bed"
-    }
-    'hg19' {
-      fasta       = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt"
-      mito_name   = "chrM"
-      macs_gsize  = "2.7e9"
-      blacklist   = "${projectDir}/assets/blacklists/hg19-blacklist.bed"
-    }
-    'mm10' {
-      fasta       = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt"
-      mito_name   = "chrM"
-      macs_gsize  = "1.87e9"
-      blacklist   = "${projectDir}/assets/blacklists/mm10-blacklist.bed"
-    }
-    'bosTau8' {
-      fasta       = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed"
-      mito_name   = "chrM"
-    }
-    'ce10' {
-      fasta       = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt"
-      mito_name   = "chrM"
-      macs_gsize  = "9e7"
-    }
-    'canFam3' {
-      fasta       = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt"
-      mito_name   = "chrM"
-    }
-    'danRer10' {
-      fasta       = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed"
-      mito_name   = "chrM"
-      macs_gsize  = "1.37e9"
-    }
-    'dm6' {
-      fasta       = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed"
-      mito_name   = "chrM"
-      macs_gsize  = "1.2e8"
-    }
-    'equCab2' {
-      fasta       = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt"
-      mito_name   = "chrM"
-    }
-    'galGal4' {
-      fasta       = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt"
-      mito_name   = "chrM"
-    }
-    'panTro4' {
-      fasta       = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt"
-      mito_name   = "chrM"
-    }
-    'rn6' {
-      fasta       = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed"
-      mito_name   = "chrM"
-    }
-    'sacCer3' {
-      fasta       = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/"
-      readme      = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt"
-      mito_name   = "chrM"
-      macs_gsize  = "1.2e7"
-    }
-    'susScr3' {
-      fasta       = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa"
-      bwa         = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa"
-      bowtie2     = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/"
-      star        = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/"
-      bismark     = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/"
-      gtf         = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf"
-      bed12       = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed"
-      readme      = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt"
-      mito_name   = "chrM"
-    }
-  }
 }
diff --git a/conf/modules.config b/conf/modules.config
index 86d5153ef..f769177cd 100644
--- a/conf/modules.config
+++ b/conf/modules.config
@@ -11,7 +11,7 @@
  *       publish_by_meta = Groovy list of keys available in meta map to append as directories to "publish_dir" path
  *                         If publish_by_meta = true                 - Value of ${meta['id']} is appended as a directory to "publish_dir" path
  *                         If publish_by_meta = ['id', 'custompath'] - If "id" is in meta map and "custompath" isn't then "${meta['id']}/custompath/"
- *                                                                     is appended as a directory to "publish_dir" path 
+ *                                                                     is appended as a directory to "publish_dir" path
  *                         If publish_by_meta = false / null         - No directories are appended to "publish_dir" path
  *       publish_files   = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension
  *                         The value of "directory" is appended to the standard "publish_dir" path as defined above.
diff --git a/docs/README.md b/docs/README.md
index 3775cdd28..052f60f03 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -3,8 +3,8 @@
 The nf-core/rnaseq documentation is split into the following pages:
 
 * [Usage](usage.md)
-  * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags.
+    * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags.
 * [Output](output.md)
-  * An overview of the different results produced by the pipeline and how to interpret them.
+    * An overview of the different results produced by the pipeline and how to interpret them.
 
 You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re)
diff --git a/docs/output.md b/docs/output.md
index 8caf518e0..f479b417f 100644
--- a/docs/output.md
+++ b/docs/output.md
@@ -15,36 +15,36 @@ The directories listed below will be created in the results directory after the
 The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps:
 
 * [Preprocessing](#preprocessing)
-  * [ENA FTP](#ena-ftp) - Download FastQ files via SRA / ENA / GEO ids
-  * [cat](#cat) - Merge re-sequenced FastQ files
-  * [FastQC](#fastqc) - Raw read QC
-  * [UMI-tools extract](#umi-tools-extract) - UMI barcode extraction
-  * [TrimGalore](#trimgalore) - Adapter and quality trimming
-  * [SortMeRNA](#sortmerna) - Removal of ribosomal RNA
+    * [ENA FTP](#ena-ftp) - Download FastQ files via SRA / ENA / GEO ids
+    * [cat](#cat) - Merge re-sequenced FastQ files
+    * [FastQC](#fastqc) - Raw read QC
+    * [UMI-tools extract](#umi-tools-extract) - UMI barcode extraction
+    * [TrimGalore](#trimgalore) - Adapter and quality trimming
+    * [SortMeRNA](#sortmerna) - Removal of ribosomal RNA
 * [Alignment and quantification](#alignment-and-quantification)
-  * [STAR and Salmon](#star-and-salmon) - Fast spliced aware genome alignment and transcriptome quantification
-  * [STAR via RSEM](#star-via-rsem) - Alignment and quantification of expression levels
-  * [HISAT2](#hisat2) - Memory efficient splice aware alignment to a reference
+    * [STAR and Salmon](#star-and-salmon) - Fast spliced aware genome alignment and transcriptome quantification
+    * [STAR via RSEM](#star-via-rsem) - Alignment and quantification of expression levels
+    * [HISAT2](#hisat2) - Memory efficient splice aware alignment to a reference
 * [Alignment post-processing](#alignment-post-processing)
-  * [SAMtools](#samtools) - Sort and index alignments
-  * [UMI-tools dedup](#umi-tools-dedup) - UMI-based deduplication
-  * [picard MarkDuplicates](#picard-markduplicates) - Duplicate read marking
+    * [SAMtools](#samtools) - Sort and index alignments
+    * [UMI-tools dedup](#umi-tools-dedup) - UMI-based deduplication
+    * [picard MarkDuplicates](#picard-markduplicates) - Duplicate read marking
 * [Other steps](#other-steps)
-  * [StringTie](#stringtie) - Transcript assembly and quantification
-  * [BEDTools and bedGraphToBigWig](#bedtools-and-bedgraphtobigwig) - Create bigWig coverage files
+    * [StringTie](#stringtie) - Transcript assembly and quantification
+    * [BEDTools and bedGraphToBigWig](#bedtools-and-bedgraphtobigwig) - Create bigWig coverage files
 * [Quality control](#quality-control)
-  * [RSeQC](#rseqc) - Various RNA-seq QC metrics
-  * [Qualimap](#qualimap) - Various RNA-seq QC metrics
-  * [dupRadar](#dupradar) - Assessment of technical / biological read duplication
-  * [Preseq](#preseq) - Estimation of library complexity
-  * [featureCounts](#featurecounts) - Read counting relative to gene biotype
-  * [DESeq2](#deseq2) - PCA plot and sample pairwise distance heatmap and dendrogram
-  * [MultiQC](#multiqc) - Present QC for raw reads, alignment, read counting and sample similiarity
+    * [RSeQC](#rseqc) - Various RNA-seq QC metrics
+    * [Qualimap](#qualimap) - Various RNA-seq QC metrics
+    * [dupRadar](#dupradar) - Assessment of technical / biological read duplication
+    * [Preseq](#preseq) - Estimation of library complexity
+    * [featureCounts](#featurecounts) - Read counting relative to gene biotype
+    * [DESeq2](#deseq2) - PCA plot and sample pairwise distance heatmap and dendrogram
+    * [MultiQC](#multiqc) - Present QC for raw reads, alignment, read counting and sample similiarity
 * [Pseudo-alignment and quantification](#pseudo-alignment-and-quantification)
-  * [Salmon](#salmon) - Wicked fast gene and isoform quantification relative to the transcriptome
+    * [Salmon](#salmon) - Wicked fast gene and isoform quantification relative to the transcriptome
 * [Workflow reporting and genomes](#workflow-reporting-and-genomes)
-  * [Reference genome files](#reference-genome-files) - Saving reference genome indices/files
-  * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution
+    * [Reference genome files](#reference-genome-files) - Saving reference genome indices/files
+    * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution
 
 ## Preprocessing
 
@@ -54,13 +54,13 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d
 <summary>Output files</summary>
 
 * `public_data/`
-  * `samplesheet.csv`: Auto-created samplesheet that can be used to run the pipeline.
-  * `*.fastq.gz`: Paired-end/single-end reads downloaded from the ENA / SRA.
+    * `samplesheet.csv`: Auto-created samplesheet that can be used to run the pipeline.
+    * `*.fastq.gz`: Paired-end/single-end reads downloaded from the ENA / SRA.
 * `public_data/md5/`
-  * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA / SRA.
+    * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA / SRA.
 * `public_data/runinfo/`
-  * `*.runinfo.tsv`: Original metadata file downloaded from the ENA
-  * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA
+    * `*.runinfo.tsv`: Original metadata file downloaded from the ENA
+    * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA
 
 </details>
 
@@ -72,7 +72,7 @@ Please see the [usage documentation](https://nf-co.re/rnaseq/usage#direct-downlo
 <summary>Output files</summary>
 
 * `fastq/`
-  * `*.merged.fastq.gz`: If `--save_merged_fastq` is specified, concatenated FastQ files will be placed in this directory.
+    * `*.merged.fastq.gz`: If `--save_merged_fastq` is specified, concatenated FastQ files will be placed in this directory.
 
 </details>
 
@@ -84,8 +84,8 @@ If multiple libraries/runs have been provided for the same sample in the input s
 <summary>Output files</summary>
 
 * `fastqc/`
-  * `*_fastqc.html`: FastQC report containing quality metrics.
-  * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
+    * `*_fastqc.html`: FastQC report containing quality metrics.
+    * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
 
 > **NB:** The FastQC plots in this directory are generated relative to the raw, input reads. They may contain adapter sequence and regions of low quality. To see how your reads look after adapter and quality trimming please refer to the FastQC reports in the `trimgalore/fastqc/` directory.
 
@@ -105,8 +105,8 @@ If multiple libraries/runs have been provided for the same sample in the input s
 <summary>Output files</summary>
 
 * `umitools/`
-  * `*.fastq.gz`: If `--save_umi_intermeds` is specified, FastQ files **after** UMI extraction will be placed in this directory.
-  * `*.log`: Log file generated by the UMI-tools `extract` command.
+    * `*.fastq.gz`: If `--save_umi_intermeds` is specified, FastQ files **after** UMI extraction will be placed in this directory.
+    * `*.log`: Log file generated by the UMI-tools `extract` command.
 
 </details>
 
@@ -118,11 +118,11 @@ If multiple libraries/runs have been provided for the same sample in the input s
 <summary>Output files</summary>
 
 * `trimgalore/`
-  * `*.fq.gz`: If `--save_trimmed` is specified, FastQ files **after** adapter trimming will be placed in this directory.
-  * `*_trimming_report.txt`: Log file generated by Trim Galore!.
+    * `*.fq.gz`: If `--save_trimmed` is specified, FastQ files **after** adapter trimming will be placed in this directory.
+    * `*_trimming_report.txt`: Log file generated by Trim Galore!.
 * `trimgalore/fastqc/`
-  * `*_fastqc.html`: FastQC report containing quality metrics for read 1 (*and read2 if paired-end*) **after** adapter trimming.
-  * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
+    * `*_fastqc.html`: FastQC report containing quality metrics for read 1 (*and read2 if paired-end*) **after** adapter trimming.
+    * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
 
 </details>
 
@@ -138,8 +138,8 @@ If multiple libraries/runs have been provided for the same sample in the input s
 <summary>Output files</summary>
 
 * `sortmerna/`
-  * `*.fastq.gz`: If `--save_non_ribo_reads` is specified, FastQ files containing non-rRNA reads will be placed in this directory.
-  * `*.log`: Log file generated by SortMeRNA with information regarding reads that matched the reference database(s).
+    * `*.fastq.gz`: If `--save_non_ribo_reads` is specified, FastQ files containing non-rRNA reads will be placed in this directory.
+    * `*.log`: Log file generated by SortMeRNA with information regarding reads that matched the reference database(s).
 
 </details>
 
@@ -155,14 +155,14 @@ When `--remove_ribo_rna` is specified, the pipeline uses [SortMeRNA](https://git
 <summary>Output files</summary>
 
 * `star_salmon/`
-  * `*.Aligned.out.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the reference genome will be placed in this directory.
-  * `*.Aligned.toTranscriptome.out.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the transcriptome will be placed in this directory.
+    * `*.Aligned.out.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the reference genome will be placed in this directory.
+    * `*.Aligned.toTranscriptome.out.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the transcriptome will be placed in this directory.
 * `star_salmon/log/`
-  * `*.SJ.out.tab`: File containing filtered splice junctions detected after mapping the reads.
-  * `*.Log.final.out`: STAR alignment report containing the mapping results summary.
-  * `*.Log.out` and `*.Log.progress.out`: STAR log files containing detailed information about the run. Typically only useful for debugging purposes.
+    * `*.SJ.out.tab`: File containing filtered splice junctions detected after mapping the reads.
+    * `*.Log.final.out`: STAR alignment report containing the mapping results summary.
+    * `*.Log.out` and `*.Log.progress.out`: STAR log files containing detailed information about the run. Typically only useful for debugging purposes.
 * `star_salmon/unmapped/`
-  * `*.fastq.gz`: If `--save_unaligned` is specified, FastQ files containing unmapped reads will be placed in this directory.
+    * `*.fastq.gz`: If `--save_unaligned` is specified, FastQ files containing unmapped reads will be placed in this directory.
 
 </details>
 
@@ -180,18 +180,18 @@ The STAR section of the MultiQC report shows a bar plot with alignment rates: go
 <summary>Output files</summary>
 
 * `star_rsem/`
-  * `rsem.merged.gene_counts.tsv`: Matrix of gene-level raw counts across all samples.
-  * `rsem.merged.gene_tpm.tsv`: Matrix of gene-level TPM values across all samples.
-  * `rsem.merged.transcript_counts.tsv`: Matrix of isoform-level raw counts across all samples.
-  * `rsem.merged.transcript_tpm.tsv`: Matrix of isoform-level TPM values across all samples.
-  * `*.genes.results`: RSEM gene-level quantification results for each sample.
-  * `*.isoforms.results`: RSEM isoform-level quantification results for each sample.
-  * `*.STAR.genome.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the reference genome will be placed in this directory.
-  * `*.transcript.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the transcriptome will be placed in this directory.
+    * `rsem.merged.gene_counts.tsv`: Matrix of gene-level raw counts across all samples.
+    * `rsem.merged.gene_tpm.tsv`: Matrix of gene-level TPM values across all samples.
+    * `rsem.merged.transcript_counts.tsv`: Matrix of isoform-level raw counts across all samples.
+    * `rsem.merged.transcript_tpm.tsv`: Matrix of isoform-level TPM values across all samples.
+    * `*.genes.results`: RSEM gene-level quantification results for each sample.
+    * `*.isoforms.results`: RSEM isoform-level quantification results for each sample.
+    * `*.STAR.genome.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the reference genome will be placed in this directory.
+    * `*.transcript.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the transcriptome will be placed in this directory.
 * `star_rsem/<SAMPLE>.stat/`
-  * `*.cnt`, `*.model`, `*.theta`: RSEM counts and statistics for each sample.
+    * `*.cnt`, `*.model`, `*.theta`: RSEM counts and statistics for each sample.
 * `star_rsem/log/`
-  * `*.log`: STAR alignment report containing the mapping results summary.
+    * `*.log`: STAR alignment report containing the mapping results summary.
 
 </details>
 
@@ -209,15 +209,15 @@ You can choose to align and quantify your data with RSEM by providing the `--ali
 <summary>Output files</summary>
 
 * `hisat2/`
-  * `<SAMPLE>.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the reference genome will be placed in this directory.
+    * `<SAMPLE>.bam`: If `--save_align_intermeds` is specified the original BAM file containing read alignments to the reference genome will be placed in this directory.
 * `hisat2/log/`
-  * `*.log`: HISAT2 alignment report containing the mapping results summary.
+    * `*.log`: HISAT2 alignment report containing the mapping results summary.
 * `hisat2/unmapped/`
-  * `*.fastq.gz`: If `--save_unaligned` is specified, FastQ files containing unmapped reads will be placed in this directory.
+    * `*.fastq.gz`: If `--save_unaligned` is specified, FastQ files containing unmapped reads will be placed in this directory.
 
 </details>
 
-[HISAT2](http://daehwankimlab.github.io/hisat2/) is a fast and sensitive alignment program for mapping next-generation sequencing reads (both DNA and RNA) to a population of human genomes as well as to a single reference genome. It introduced a new indexing scheme called a Hierarchical Graph FM index (HGFM) which when combined with several alignment strategies, enable rapid and accurate alignment of sequencing reads. The HISAT2 route through the pipeline is a good option if you have memory limitations on your compute. However, quantification isn't performed if using `--aligner hisat2` due to the lack of an appropriate option to calculate accurate expression estimates from HISAT2 derived genomic alignments. However, you can use this route if you have a preference for the alignment, QC and other types of downstream analysis compatible with the output of HISAT2.  
+[HISAT2](http://daehwankimlab.github.io/hisat2/) is a fast and sensitive alignment program for mapping next-generation sequencing reads (both DNA and RNA) to a population of human genomes as well as to a single reference genome. It introduced a new indexing scheme called a Hierarchical Graph FM index (HGFM) which when combined with several alignment strategies, enable rapid and accurate alignment of sequencing reads. The HISAT2 route through the pipeline is a good option if you have memory limitations on your compute. However, quantification isn't performed if using `--aligner hisat2` due to the lack of an appropriate option to calculate accurate expression estimates from HISAT2 derived genomic alignments. However, you can use this route if you have a preference for the alignment, QC and other types of downstream analysis compatible with the output of HISAT2.
 
 You can choose to align your data with HISAT2 by providing the `--aligner hisat2` parameter.
 
@@ -233,11 +233,11 @@ The pipeline has been written in a way where all the files generated downstream
 <summary>Output files</summary>
 
 * `<ALIGNER>/`
-  * `<SAMPLE>.sorted.bam`: If `--save_align_intermeds` is specified the original coordinate sorted BAM file containing read alignments will be placed in this directory.
-  * `<SAMPLE>.sorted.bam.bai`: If `--save_align_intermeds` is specified the BAI index file for the original coordinate sorted BAM file will be placed in this directory.
-  * `<SAMPLE>.sorted.bam.csi`: If `--save_align_intermeds --bam_csi_index` is specified the CSI index file for the original coordinate sorted BAM file will be placed in this directory.
+    * `<SAMPLE>.sorted.bam`: If `--save_align_intermeds` is specified the original coordinate sorted BAM file containing read alignments will be placed in this directory.
+    * `<SAMPLE>.sorted.bam.bai`: If `--save_align_intermeds` is specified the BAI index file for the original coordinate sorted BAM file will be placed in this directory.
+    * `<SAMPLE>.sorted.bam.csi`: If `--save_align_intermeds --bam_csi_index` is specified the CSI index file for the original coordinate sorted BAM file will be placed in this directory.
 * `<ALIGNER>/samtools_stats/`
-  * SAMtools `<SAMPLE>.sorted.bam.flagstat`, `<SAMPLE>.sorted.bam.idxstats` and `<SAMPLE>.sorted.bam.stats` files generated from the alignment files.
+    * SAMtools `<SAMPLE>.sorted.bam.flagstat`, `<SAMPLE>.sorted.bam.idxstats` and `<SAMPLE>.sorted.bam.stats` files generated from the alignment files.
 
 </details>
 
@@ -253,13 +253,13 @@ The original BAM files generated by the selected alignment algorithm are further
 <summary>Output files</summary>
 
 * `<ALIGNER>/`
-  * `<SAMPLE>.umi_dedup.sorted.bam`: If `--save_umi_intermeds` is specified the UMI deduplicated, coordinate sorted BAM file containing read alignments will be placed in this directory.
-  * `<SAMPLE>.umi_dedup.sorted.bam.bai`: If `--save_umi_intermeds` is specified the BAI index file for the UMI deduplicated, coordinate sorted BAM file will be placed in this directory.
-  * `<SAMPLE>.umi_dedup.sorted.bam.csi`: If `--save_umi_intermeds --bam_csi_index` is specified the CSI index file for the UMI deduplicated, coordinate sorted BAM file will be placed in this directory.
+    * `<SAMPLE>.umi_dedup.sorted.bam`: If `--save_umi_intermeds` is specified the UMI deduplicated, coordinate sorted BAM file containing read alignments will be placed in this directory.
+    * `<SAMPLE>.umi_dedup.sorted.bam.bai`: If `--save_umi_intermeds` is specified the BAI index file for the UMI deduplicated, coordinate sorted BAM file will be placed in this directory.
+    * `<SAMPLE>.umi_dedup.sorted.bam.csi`: If `--save_umi_intermeds --bam_csi_index` is specified the CSI index file for the UMI deduplicated, coordinate sorted BAM file will be placed in this directory.
 * `<ALIGNER>/umitools/`
-  * `*_edit_distance.tsv`: Reports the (binned) average edit distance between the UMIs at each position.
-  * `*_per_umi.tsv`: UMI-level summary statistics.
-  * `*_per_umi_per_position.tsv`: Tabulates the counts for unique combinations of UMI and position.
+    * `*_edit_distance.tsv`: Reports the (binned) average edit distance between the UMIs at each position.
+    * `*_per_umi.tsv`: UMI-level summary statistics.
+    * `*_per_umi_per_position.tsv`: Tabulates the counts for unique combinations of UMI and position.
 
 The content of the files above is explained in more detail in the [UMI-tools documentation](https://umi-tools.readthedocs.io/en/latest/reference/dedup.html#dedup-specific-options).
 
@@ -273,13 +273,13 @@ After extracting the UMI information from the read sequence (see [UMI-tools extr
 <summary>Output files</summary>
 
 * `<ALIGNER>/`
-  * `<SAMPLE>.markdup.sorted.bam`: Coordinate sorted BAM file after duplicate marking. This is the final post-processed BAM file and so will be saved by default in the results directory.
-  * `<SAMPLE>.markdup.sorted.bam.bai`: BAI index file for coordinate sorted BAM file after duplicate marking. This is the final post-processed BAM index file and so will be saved by default in the results directory.
-  * `<SAMPLE>.markdup.sorted.bam.csi`: CSI index file for coordinate sorted BAM file after duplicate marking. This is the final post-processed BAM index file and so will be saved by default in the results directory. Only generated if `--bam_csi_index` is specified as a parameter.
+    * `<SAMPLE>.markdup.sorted.bam`: Coordinate sorted BAM file after duplicate marking. This is the final post-processed BAM file and so will be saved by default in the results directory.
+    * `<SAMPLE>.markdup.sorted.bam.bai`: BAI index file for coordinate sorted BAM file after duplicate marking. This is the final post-processed BAM index file and so will be saved by default in the results directory.
+    * `<SAMPLE>.markdup.sorted.bam.csi`: CSI index file for coordinate sorted BAM file after duplicate marking. This is the final post-processed BAM index file and so will be saved by default in the results directory. Only generated if `--bam_csi_index` is specified as a parameter.
 * `<ALIGNER>/samtools_stats/`
-  * SAMtools `<SAMPLE>.markdup.sorted.bam.flagstat`, `<SAMPLE>.markdup.sorted.bam.idxstats` and `<SAMPLE>.markdup.sorted.bam.stats` files generated from the duplicate marked alignment files.
+    * SAMtools `<SAMPLE>.markdup.sorted.bam.flagstat`, `<SAMPLE>.markdup.sorted.bam.idxstats` and `<SAMPLE>.markdup.sorted.bam.stats` files generated from the duplicate marked alignment files.
 * `<ALIGNER>/picard_metrics/`
-  * `<SAMPLE>.markdup.sorted.MarkDuplicates.metrics.txt`: Metrics file from MarkDuplicates.
+    * `<SAMPLE>.markdup.sorted.MarkDuplicates.metrics.txt`: Metrics file from MarkDuplicates.
 
 </details>
 
@@ -295,9 +295,9 @@ Unless you are using [UMIs](https://emea.illumina.com/science/sequencing-method-
 <summary>Output files</summary>
 
 * `<ALIGNER>/stringtie/`
-  * `*.coverage.gtf`: GTF file containing transcripts that are fully covered by reads.
-  * `*.transcripts.gtf`: GTF file containing all of the assembled transcipts from StringTie.
-  * `*.gene_abundance.txt`: Text file containing gene aboundances and FPKM values.  
+    * `*.coverage.gtf`: GTF file containing transcripts that are fully covered by reads.
+    * `*.transcripts.gtf`: GTF file containing all of the assembled transcipts from StringTie.
+    * `*.gene_abundance.txt`: Text file containing gene aboundances and FPKM values.
 * `<ALIGNER>/stringtie/<SAMPLE>.ballgown/`: Ballgown output directory.
 
 </details>
@@ -310,8 +310,8 @@ Unless you are using [UMIs](https://emea.illumina.com/science/sequencing-method-
 <summary>Output files</summary>
 
 * `<ALIGNER>/bigwig/`
-  * `*.sense.bigWig`: bigWig coverage file relative to genes on the sense strand.
-  * `*.antisense.bigWig`: bigWig coverage file relative to genes on the anti-sense strand.
+    * `*.sense.bigWig`: bigWig coverage file relative to genes on the sense strand.
+    * `*.antisense.bigWig`: bigWig coverage file relative to genes on the anti-sense strand.
 
 </details>
 
@@ -331,7 +331,7 @@ The majority of RSeQC scripts generate output files which can be plotted and sum
 <summary>Output files</summary>
 
 * `<ALIGNER>/rseqc/infer_experiment/`
-  * `*.infer_experiment.txt`: File containing fraction of reads mapping to given strandedness configurations.
+    * `*.infer_experiment.txt`: File containing fraction of reads mapping to given strandedness configurations.
 
 </details>
 
@@ -349,7 +349,7 @@ RSeQC documentation: [infer_experiment.py](http://rseqc.sourceforge.net/#infer-e
 <summary>Output files</summary>
 
 * `<ALIGNER>/rseqc/read_distribution/`
-  * `*.read_distribution.txt`: File containing fraction of reads mapping to genome feature e.g. CDS exon, 5’UTR exon, 3’ UTR exon, Intron, Intergenic regions etc.
+    * `*.read_distribution.txt`: File containing fraction of reads mapping to genome feature e.g. CDS exon, 5’UTR exon, 3’ UTR exon, Intron, Intergenic regions etc.
 
 </details>
 
@@ -365,17 +365,17 @@ RSeQC documentation: [read_distribution.py](http://rseqc.sourceforge.net/#read-d
 <summary>Output files</summary>
 
 * `<ALIGNER>/rseqc/junction_annotation/bed/`
-  * `*.junction.bed`: BED file containing splice junctions.
-  * `*.junction.Interact.bed`: BED file containing interacting splice junctions.
+    * `*.junction.bed`: BED file containing splice junctions.
+    * `*.junction.Interact.bed`: BED file containing interacting splice junctions.
 * `<ALIGNER>/rseqc/junction_annotation/log/`
-  * `*.junction_annotation.log`: Log file generated by the program.
+    * `*.junction_annotation.log`: Log file generated by the program.
 * `<ALIGNER>/rseqc/junction_annotation/pdf/`
-  * `*.splice_events.pdf`: PDF file containing splicing events plot.
-  * `*.splice_junction.pdf`: PDF file containing splice junctions plot.
+    * `*.splice_events.pdf`: PDF file containing splicing events plot.
+    * `*.splice_junction.pdf`: PDF file containing splice junctions plot.
 * `<ALIGNER>/rseqc/junction_annotation/rscript/`
-  * `*.junction_plot.r`: R script used to generate pdf plots above.
+    * `*.junction_plot.r`: R script used to generate pdf plots above.
 * `<ALIGNER>/rseqc/junction_annotation/xls/`
-  * `*.junction.xls`: Excel spreadsheet with junction information.
+    * `*.junction.xls`: Excel spreadsheet with junction information.
 
 </details>
 
@@ -391,12 +391,12 @@ RSeQC documentation: [junction_annotation.py](http://rseqc.sourceforge.net/#junc
 <summary>Output files</summary>
 
 * `<ALIGNER>/rseqc/inner_distance/pdf/`
-  * `*.inner_distance_plot.pdf`: PDF file containing inner distance plot.
+    * `*.inner_distance_plot.pdf`: PDF file containing inner distance plot.
 * `<ALIGNER>/rseqc/inner_distance/rscript/`
-  * `*.inner_distance_plot.r`: R script used to generate pdf plot above.
+    * `*.inner_distance_plot.r`: R script used to generate pdf plot above.
 * `<ALIGNER>/rseqc/inner_distance/txt/`
-  * `*.inner_distance_freq.txt`: File containing frequency of insert sizes.
-  * `*.inner_distance_mean.txt`: File containing mean, median and standard deviation of insert sizes.
+    * `*.inner_distance_freq.txt`: File containing frequency of insert sizes.
+    * `*.inner_distance_mean.txt`: File containing mean, median and standard deviation of insert sizes.
 
 </details>
 
@@ -414,9 +414,9 @@ RSeQC documentation: [inner_distance.py](http://rseqc.sourceforge.net/#inner-dis
 <summary>Output files</summary>
 
 * `<ALIGNER>/rseqc/junction_saturation/pdf/`
-  * `*.junctionSaturation_plot.pdf`: PDF file containing junction saturation plot.
+    * `*.junctionSaturation_plot.pdf`: PDF file containing junction saturation plot.
 * `<ALIGNER>/rseqc/junction_saturation/rscript/`
-  * `*.junctionSaturation_plot.r`: R script used to generate pdf plot above.
+    * `*.junctionSaturation_plot.r`: R script used to generate pdf plot above.
 
 </details>
 
@@ -432,12 +432,12 @@ RSeQC documentation: [junction_saturation.py](http://rseqc.sourceforge.net/#junc
 <summary>Output files</summary>
 
 * `<ALIGNER>/rseqc/read_duplication/pdf/`
-  * `*.DupRate_plot.pdf`: PDF file containing read duplication plot.
+    * `*.DupRate_plot.pdf`: PDF file containing read duplication plot.
 * `<ALIGNER>/rseqc/read_duplication/rscript/`
-  * `*.DupRate_plot.r`: R script used to generate pdf plot above.
+    * `*.DupRate_plot.r`: R script used to generate pdf plot above.
 * `<ALIGNER>/rseqc/read_duplication/xls/`
-  * `*.pos.DupRate.xls`: Read duplication rate determined from mapping position of read. First column is “occurrence” or duplication times, second column is number of uniquely mapped reads.
-  * `*.seq.DupRate.xls`: Read duplication rate determined from sequence of read. First column is “occurrence” or duplication times, second column is number of uniquely mapped reads.
+    * `*.pos.DupRate.xls`: Read duplication rate determined from mapping position of read. First column is “occurrence” or duplication times, second column is number of uniquely mapped reads.
+    * `*.seq.DupRate.xls`: Read duplication rate determined from sequence of read. First column is “occurrence” or duplication times, second column is number of uniquely mapped reads.
 
 </details>
 
@@ -453,7 +453,7 @@ RSeQC documentation: [read_duplication.py](http://rseqc.sourceforge.net/#read-du
 <summary>Output files</summary>
 
 * `<ALIGNER>/rseqc/bam_stat/`
-  * `*.bam_stat.txt`: Mapping statistics for the BAM file.
+    * `*.bam_stat.txt`: Mapping statistics for the BAM file.
 
 </details>
 
@@ -490,8 +490,8 @@ RSeQC documentation: [bam_stat.py](http://rseqc.sourceforge.net/#bam-stat-py)
 <summary>Output files</summary>
 
 * `<ALIGNER>/qualimap/<SAMPLE>/`
-  * `qualimapReport.html`: Qualimap HTML report that can be viewed in a web browser.
-  * `rnaseq_qc_results.txt`: Textual results output.
+    * `qualimapReport.html`: Qualimap HTML report that can be viewed in a web browser.
+    * `rnaseq_qc_results.txt`: Textual results output.
 * `<ALIGNER>/qualimap/<SAMPLE>/images_qualimapReport/`: Images required for the HTML report.
 * `<ALIGNER>/qualimap/<SAMPLE>/raw_data_qualimapReport/`: Raw data required for the HTML report.
 * `<ALIGNER>/qualimap/<SAMPLE>/css/`: CSS files required for the HTML report.
@@ -515,15 +515,15 @@ The [Qualimap RNA-seq QC module](http://qualimap.bioinfo.cipf.es/doc_html/analys
 <summary>Output files</summary>
 
 * `<ALIGNER>/dupradar/box_plot/`
-  * `*_duprateExpBoxplot.pdf`: PDF file containing box plot for duplicate rate relative to mean expression.
+    * `*_duprateExpBoxplot.pdf`: PDF file containing box plot for duplicate rate relative to mean expression.
 * `<ALIGNER>/dupradar/gene_data/`
-  * `*_dupMatrix.txt`: Text file containing duplicate metrics per gene.
+    * `*_dupMatrix.txt`: Text file containing duplicate metrics per gene.
 * `<ALIGNER>/dupradar/histogram/`
-  * `*_expressionHist.pdf`: PDF file containing histogram of reads per kilobase values per gene.
+    * `*_expressionHist.pdf`: PDF file containing histogram of reads per kilobase values per gene.
 * `<ALIGNER>/dupradar/intercepts_slope/`
-  * `*_intercept_slope.txt`: Text file containing intercept slope values.
+    * `*_intercept_slope.txt`: Text file containing intercept slope values.
 * `<ALIGNER>/dupradar/scatter_plot/`
-  * `*_duprateExpDens.pdf`: PDF file containing typical dupRadar 2D density scatter plot.
+    * `*_duprateExpDens.pdf`: PDF file containing typical dupRadar 2D density scatter plot.
 
 See [dupRadar docs](https://www.bioconductor.org/packages/devel/bioc/vignettes/dupRadar/inst/doc/dupRadar.html) for further information regarding the content of these files.
 
@@ -541,9 +541,9 @@ See [dupRadar docs](https://www.bioconductor.org/packages/devel/bioc/vignettes/d
 <summary>Output files</summary>
 
 * `<ALIGNER>/preseq/`
-  * `*.ccurve.txt`: Preseq expected future yield file.
+    * `*.ccurve.txt`: Preseq expected future yield file.
 * `<ALIGNER>/preseq/log/`
-  * `*.command.log`: Standard error output from command.
+    * `*.command.log`: Standard error output from command.
 
 </details>
 
@@ -557,9 +557,9 @@ The [Preseq](http://smithlabresearch.org/software/preseq/) package is aimed at p
 <summary>Output files</summary>
 
 * `<ALIGNER>/featurecounts/`
-  * `*.featureCounts.txt`: featureCounts biotype-level quantification results for each sample.
-  * `*.featureCounts.txt.summary`: featureCounts summary file containing overall statistics about the counts.
-  * `*_mqc.tsv`: MultiQC custom content files used to plot biotypes in report.
+    * `*.featureCounts.txt`: featureCounts biotype-level quantification results for each sample.
+    * `*.featureCounts.txt.summary`: featureCounts summary file containing overall statistics about the counts.
+    * `*_mqc.tsv`: MultiQC custom content files used to plot biotypes in report.
 
 </details>
 
@@ -573,17 +573,17 @@ The [Preseq](http://smithlabresearch.org/software/preseq/) package is aimed at p
 <summary>Output files</summary>
 
 * `<ALIGNER/PSEUDOALIGNER>/deseq2_qc/`
-  * `*.plots.pdf`: File containing PCA and hierarchical clustering plots.
-  * `*.dds.RData`: File containing R `DESeqDataSet` object  generated
-    by DESeq2, with either an rlog or vst `assay` storing the
-    variance-stabilised data.
-  * `*.rds`: Alternative version of the RData file suitable for
-    `readRDS` to give user control of the eventual object name.
-  * `*pca.vals.txt`: Matrix of values for the first 2 principal components.
-  * `*sample.dists.txt`: Sample distance matrix.
-  * `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages.
+    * `*.plots.pdf`: File containing PCA and hierarchical clustering plots.
+    * `*.dds.RData`: File containing R `DESeqDataSet` object  generated
+        by DESeq2, with either an rlog or vst `assay` storing the
+        variance-stabilised data.
+    * `*.rds`: Alternative version of the RData file suitable for
+        `readRDS` to give user control of the eventual object name.
+    * `*pca.vals.txt`: Matrix of values for the first 2 principal components.
+    * `*sample.dists.txt`: Sample distance matrix.
+    * `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages.
 * `<ALIGNER/PSEUDOALIGNER>/deseq2_qc/size_factors/`
-  * `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample.
+    * `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample.
 
 </details>
 
@@ -616,9 +616,9 @@ The plot on the left hand side shows the standard PC plot - notice the variable
 <details markdown="1">
 <summary>Output files</summary>
 
-* `multiqc/<ALIGNER>/`  
-  * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser.
-  * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline.
+* `multiqc/<ALIGNER>/`
+    * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser.
+    * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline.
 
 </details>
 
@@ -634,24 +634,24 @@ Results generated by MultiQC collate pipeline QC from supported tools i.e. FastQ
 <summary>Output files</summary>
 
 * `salmon/`
-  * `salmon.merged.gene_counts.tsv`: Matrix of gene-level raw counts across all samples.
-  * `salmon.merged.gene_tpm.tsv`: Matrix of gene-level TPM values across all samples.
-  * `salmon.merged.gene_counts.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated counts (`counts`) and transcript length (`length`) in the assays slot for genes.
-  * `salmon.merged.gene_counts_scaled.tsv`: Matrix of gene-level scaled counts across all samples.
-  * `salmon.merged.gene_counts_scaled.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated counts (`counts`) and transcript length (`length`) in the assays slot for genes.
-  * `salmon.merged.gene_counts_length_scaled.tsv`: Matrix of gene-level length-scaled counts across all samples.
-  * `salmon.merged.gene_counts_length_scaled.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated counts (`counts`) and transcript length (`length`) in the assays slot for genes.
-  * `salmon.merged.transcript_counts.tsv`: Matrix of isoform-level raw counts across all samples.
-  * `salmon.merged.transcript_tpm.tsv`: Matrix of isoform-level TPM values across all samples.
-  * `salmon.merged.transcript_counts.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated counts (`counts`) and transcript length (`length`) in the assays slot for transcripts.
+    * `salmon.merged.gene_counts.tsv`: Matrix of gene-level raw counts across all samples.
+    * `salmon.merged.gene_tpm.tsv`: Matrix of gene-level TPM values across all samples.
+    * `salmon.merged.gene_counts.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated counts (`counts`) and transcript length (`length`) in the assays slot for genes.
+    * `salmon.merged.gene_counts_scaled.tsv`: Matrix of gene-level scaled counts across all samples.
+    * `salmon.merged.gene_counts_scaled.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated counts (`counts`) and transcript length (`length`) in the assays slot for genes.
+    * `salmon.merged.gene_counts_length_scaled.tsv`: Matrix of gene-level length-scaled counts across all samples.
+    * `salmon.merged.gene_counts_length_scaled.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated counts (`counts`) and transcript length (`length`) in the assays slot for genes.
+    * `salmon.merged.transcript_counts.tsv`: Matrix of isoform-level raw counts across all samples.
+    * `salmon.merged.transcript_tpm.tsv`: Matrix of isoform-level TPM values across all samples.
+    * `salmon.merged.transcript_counts.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated counts (`counts`) and transcript length (`length`) in the assays slot for transcripts.
 * `salmon/<SAMPLE>/`
-  * `aux_info/`: Auxiliary info e.g. versions and number of mapped reads.
-  * `cmd_info.json`: Information about the Salmon quantification command, version and options.
-  * `lib_format_counts.json`: Number of fragments assigned, unassigned and incompatible.
-  * `libParams/`: Contains the file `flenDist.txt` for the fragment length distribution.
-  * `logs/`: Contains the file `salmon_quant.log` giving a record of Salmon's quantification.
-  * `quant.genes.sf`: Salmon _gene_-level quantification of the sample, including feature length, effective length, TPM, and number of reads.
-  * `quant.sf`: Salmon _transcript_-level quantification of the sample, including feature length, effective length, TPM, and number of reads.
+    * `aux_info/`: Auxiliary info e.g. versions and number of mapped reads.
+    * `cmd_info.json`: Information about the Salmon quantification command, version and options.
+    * `lib_format_counts.json`: Number of fragments assigned, unassigned and incompatible.
+    * `libParams/`: Contains the file `flenDist.txt` for the fragment length distribution.
+    * `logs/`: Contains the file `salmon_quant.log` giving a record of Salmon's quantification.
+    * `quant.genes.sf`: Salmon _gene_-level quantification of the sample, including feature length, effective length, TPM, and number of reads.
+    * `quant.sf`: Salmon _transcript_-level quantification of the sample, including feature length, effective length, TPM, and number of reads.
 
 </details>
 
@@ -678,13 +678,13 @@ According to the `txtimport` documentation you can do one of the following:
 <details markdown="1">
 <summary>Output files</summary>
 
-* `genome/`  
-  * `*.fa`, `*.gtf`, `*.gff`, `*.bed`, `.tsv`: If the `--save_reference` parameter is provided then all of the genome reference files will be placed in this directory.
-* `genome/index/`  
-  * `star/`: Directory containing STAR indices.
-  * `hisat2/`: Directory containing HISAT2 indices.
-  * `rsem/`: Directory containing STAR and RSEM indices.
-  * `salmon/`: Directory containing Salmon indices.
+* `genome/`
+    * `*.fa`, `*.gtf`, `*.gff`, `*.bed`, `.tsv`: If the `--save_reference` parameter is provided then all of the genome reference files will be placed in this directory.
+* `genome/index/`
+    * `star/`: Directory containing STAR indices.
+    * `hisat2/`: Directory containing HISAT2 indices.
+    * `rsem/`: Directory containing STAR and RSEM indices.
+    * `salmon/`: Directory containing Salmon indices.
 
 </details>
 
@@ -696,9 +696,9 @@ A number of genome-specific files are generated by the pipeline because they are
 <summary>Output files</summary>
 
 * `pipeline_info/`
-  * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`.
-  * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.csv`.
-  * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`.
+    * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`.
+    * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.csv`.
+    * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`.
 
 </details>
 
diff --git a/docs/usage.md b/docs/usage.md
index 7b7b911ab..aa1306ac9 100644
--- a/docs/usage.md
+++ b/docs/usage.md
@@ -162,20 +162,20 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles.
 If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended.
 
 * `docker`
-  * A generic configuration profile to be used with [Docker](https://docker.com/)
+    * A generic configuration profile to be used with [Docker](https://docker.com/)
 * `singularity`
-  * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/)
+    * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/)
 * `podman`
-  * A generic configuration profile to be used with [Podman](https://podman.io/)
+    * A generic configuration profile to be used with [Podman](https://podman.io/)
 * `shifter`
-  * A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/)
+    * A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/)
 * `charliecloud`
-  * A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/)
+    * A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/)
 * `conda`
-  * A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud.
+    * A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud.
 * `test`
-  * A profile with a complete configuration for automated testing
-  * Includes links to test data so needs no other parameters
+    * A profile with a complete configuration for automated testing
+    * Includes links to test data so needs no other parameters
 
 ### `-resume`
 
@@ -200,26 +200,26 @@ For example, if the nf-core/rnaseq pipeline is failing after multiple re-submiss
 Error executing process > 'RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)'
 
 Caused by:
-  Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137)
+    Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137)
 
 Command executed:
-  STAR \
-      --genomeDir star \
-      --readFilesIn WT_REP1_trimmed.fq.gz  \
-      --runThreadN 2 \
-      --outFileNamePrefix WT_REP1. \
-      <TRUNCATED>
+    STAR \
+            --genomeDir star \
+            --readFilesIn WT_REP1_trimmed.fq.gz  \
+            --runThreadN 2 \
+            --outFileNamePrefix WT_REP1. \
+            <TRUNCATED>
 
 Command exit status:
-  137
+    137
 
 Command output:
-  (empty)
+    (empty)
 
 Command error:
-  .command.sh: line 9:  30 Killed    STAR --genomeDir star --readFilesIn WT_REP1_trimmed.fq.gz --runThreadN 2 --outFileNamePrefix WT_REP1. <TRUNCATED>
+    .command.sh: line 9:  30 Killed    STAR --genomeDir star --readFilesIn WT_REP1_trimmed.fq.gz --runThreadN 2 --outFileNamePrefix WT_REP1. <TRUNCATED>
 Work dir:
-  /home/pipelinetest/work/9d/172ca5881234073e8d76f2a19c88fb
+    /home/pipelinetest/work/9d/172ca5881234073e8d76f2a19c88fb
 
 Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run`
 ```
@@ -228,9 +228,9 @@ To bypass this error you would need to find exactly which resources are set by t
 
 ```nextflow
 process {
-  withName: STAR_ALIGN {
-    memory = 100.GB
-  }
+    withName: STAR_ALIGN {
+        memory = 100.GB
+    }
 }
 ```
 
@@ -262,13 +262,13 @@ As you will see in the example below, we have:
 
 ```nextflow
 params {
-    modules {
-      'star_align' {
-        args          = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16"
-        publish_dir   = "my_star_directory"
-        publish_files = ['out':'log', 'tab':'log', 'bam':'']
-      }
-    }
+        modules {
+            'star_align' {
+                args          = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16"
+                publish_dir   = "my_star_directory"
+                publish_files = ['out':'log', 'tab':'log', 'bam':'']
+            }
+        }
 }
 ```
 
diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy
index 30ac1a7f1..3b3ff5050 100755
--- a/lib/NfcoreSchema.groovy
+++ b/lib/NfcoreSchema.groovy
@@ -12,7 +12,7 @@ import groovy.json.JsonSlurper
 import groovy.json.JsonBuilder
 
 class NfcoreSchema {
-    
+
     /*
      * Resolve Schema path relative to main workflow directory
      */
@@ -319,7 +319,7 @@ class NfcoreSchema {
         output += NfcoreTemplate.dashedLine(params.monochrome_logs)
         return output
     }
-    
+
     /*
      * Loop over nested exceptions and print the causingException
      */
diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy
index 5f671b576..94283ed9b 100755
--- a/lib/NfcoreTemplate.groovy
+++ b/lib/NfcoreTemplate.groovy
@@ -57,7 +57,7 @@ class NfcoreTemplate {
         for (group in summary_params.keySet()) {
             summary << summary_params[group]
         }
-        
+
         def misc_fields = [:]
         misc_fields['Date Started']              = workflow.start
         misc_fields['Date Completed']            = workflow.complete
@@ -84,7 +84,7 @@ class NfcoreTemplate {
         email_fields['summary']             = summary << misc_fields
         email_fields['fail_percent_mapped'] = fail_percent_mapped.keySet()
         email_fields['min_mapped_reads']    = params.min_mapped_reads
-        
+
         // On success try attach the multiqc report
         def mqc_report = null
         try {
@@ -121,7 +121,7 @@ class NfcoreTemplate {
         def email_html    = html_template.toString()
 
         // Render the sendmail template
-        def max_multiqc_email_size = params.max_multiqc_email_size as nextflow.util.MemoryUnit 
+        def max_multiqc_email_size = params.max_multiqc_email_size as nextflow.util.MemoryUnit
         def smail_fields           = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize:  max_multiqc_email_size.toBytes()]
         def sf                     = new File("$projectDir/assets/sendmail_template.txt")
         def sendmail_template      = engine.createTemplate(sf).make(smail_fields)
@@ -275,7 +275,7 @@ class NfcoreTemplate {
 
     /*
      * nf-core logo
-     */         
+     */
     public static String logo(workflow, monochrome_logs) {
         Map colors = logColours(monochrome_logs)
         String.format(
diff --git a/lib/Utils.groovy b/lib/Utils.groovy
index cdbafc31b..8164a16c2 100755
--- a/lib/Utils.groovy
+++ b/lib/Utils.groovy
@@ -1,47 +1,47 @@
-/*
- * This file holds several Groovy functions that could be useful for any Nextflow pipeline
- */
-
-import org.yaml.snakeyaml.Yaml
-
-class Utils {
-
-    /*
-     * When running with -profile conda, warn if channels have not been set-up appropriately
-     */
-    public static void checkCondaChannels(log) {
-        Yaml parser = new Yaml()
-        def channels = []
-        try {
-            def config = parser.load("conda config --show channels".execute().text)
-            channels = config.channels
-        } catch(NullPointerException | IOException e) {
-            log.warn "Could not verify conda channel configuration."
-            return
-        }
-
-        // Check that all channels are present
-        def required_channels = ['conda-forge', 'bioconda', 'defaults']
-        def conda_check_failed = !required_channels.every { ch -> ch in channels }
-
-        // Check that they are in the right order
-        conda_check_failed |= !(channels.indexOf('conda-forge') < channels.indexOf('bioconda'))
-        conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults'))
-
-        if (conda_check_failed) {
-            log.warn "=============================================================================\n" +
-                "  There is a problem with your Conda configuration!\n\n" + 
-                "  You will need to set-up the conda-forge and bioconda channels correctly.\n" +
-                "  Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" +
-                "  NB: The order of the channels matters!\n" +
-                "==================================================================================="
-        }
-    }
-
-    /*
-     * Join module args with appropriate spacing
-     */
-    public static String joinModuleArgs(args_list) {
-        return ' ' + args_list.join(' ')
-    }
-}
+/*
+ * This file holds several Groovy functions that could be useful for any Nextflow pipeline
+ */
+
+import org.yaml.snakeyaml.Yaml
+
+class Utils {
+
+    /*
+     * When running with -profile conda, warn if channels have not been set-up appropriately
+     */
+    public static void checkCondaChannels(log) {
+        Yaml parser = new Yaml()
+        def channels = []
+        try {
+            def config = parser.load("conda config --show channels".execute().text)
+            channels = config.channels
+        } catch(NullPointerException | IOException e) {
+            log.warn "Could not verify conda channel configuration."
+            return
+        }
+
+        // Check that all channels are present
+        def required_channels = ['conda-forge', 'bioconda', 'defaults']
+        def conda_check_failed = !required_channels.every { ch -> ch in channels }
+
+        // Check that they are in the right order
+        conda_check_failed |= !(channels.indexOf('conda-forge') < channels.indexOf('bioconda'))
+        conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults'))
+
+        if (conda_check_failed) {
+            log.warn "=============================================================================\n" +
+                "  There is a problem with your Conda configuration!\n\n" +
+                "  You will need to set-up the conda-forge and bioconda channels correctly.\n" +
+                "  Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" +
+                "  NB: The order of the channels matters!\n" +
+                "==================================================================================="
+        }
+    }
+
+    /*
+     * Join module args with appropriate spacing
+     */
+    public static String joinModuleArgs(args_list) {
+        return ' ' + args_list.join(' ')
+    }
+}
diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy
index 20cab4753..1e9bffe12 100755
--- a/lib/WorkflowMain.groovy
+++ b/lib/WorkflowMain.groovy
@@ -9,7 +9,7 @@ class WorkflowMain {
      */
     public static String citation(workflow) {
         return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" +
-            "* The pipeline\n" + 
+            "* The pipeline\n" +
             "  https://doi.org/10.5281/zenodo.1400710\n\n" +
             "* The nf-core framework\n" +
             "  https://doi.org/10.1038/s41587-020-0439-x\n\n" +
diff --git a/lib/WorkflowRnaseq.groovy b/lib/WorkflowRnaseq.groovy
index f884c568a..4cc3007b0 100755
--- a/lib/WorkflowRnaseq.groovy
+++ b/lib/WorkflowRnaseq.groovy
@@ -10,19 +10,19 @@ class WorkflowRnaseq {
     public static void initialise(params, log, valid_params) {
         genomeExistsError(params, log)
 
-        if (!params.fasta) { 
+        if (!params.fasta) {
             log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file."
             System.exit(1)
         }
 
-        if (!params.gtf && !params.gff) { 
+        if (!params.gtf && !params.gff) {
             log.error "No GTF or GFF3 annotation specified! The pipeline requires at least one of these files."
             System.exit(1)
         }
-        
-        if (params.gtf) { 
+
+        if (params.gtf) {
             if (params.gff) {
-                gtfGffWarn(log) 
+                gtfGffWarn(log)
             }
             if (params.genome == 'GRCh38' && params.gtf.contains('Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf')) {
                 ncbiGenomeWarn(log)
@@ -63,7 +63,7 @@ class WorkflowRnaseq {
                 rsemUmiError(log)
             }
             if (params.rsem_index && params.star_index) {
-                rsemStarIndexWarn(log)   
+                rsemStarIndexWarn(log)
             }
         }
 
@@ -241,7 +241,7 @@ class WorkflowRnaseq {
         log.error "=============================================================================\n" +
             "  When using '--aligner star_rsem', STAR is run by RSEM itself and so it is\n" +
             "  not possible to remove UMIs before the quantification.\n\n" +
-            "  If you would like to remove UMI barcodes using the '--with_umi' option\n" + 
+            "  If you would like to remove UMI barcodes using the '--with_umi' option\n" +
             "  please use either '--aligner star_salmon' or '--aligner hisat2'.\n" +
             "============================================================================="
         System.exit(1)
@@ -254,7 +254,7 @@ class WorkflowRnaseq {
         log.warn "=============================================================================\n" +
             "  When using '--aligner star_rsem', both the STAR and RSEM indices should\n" +
             "  be present in the path specified by '--rsem_index'.\n\n" +
-            "  This warning has been generated because you have provided both\n" + 
+            "  This warning has been generated because you have provided both\n" +
             "  '--rsem_index' and '--star_index'. The pipeline will ignore the latter.\n\n" +
             "  Please see:\n" +
             "  https://github.com/nf-core/rnaseq/issues/568\n" +
diff --git a/lib/WorkflowSraDownload.groovy b/lib/WorkflowSraDownload.groovy
index ed06763aa..5d0f7e5b7 100755
--- a/lib/WorkflowSraDownload.groovy
+++ b/lib/WorkflowSraDownload.groovy
@@ -12,7 +12,7 @@ class WorkflowSraDownload {
             "  Please double-check the samplesheet that has been auto-created using the\n" +
             "  public database ids provided via the '--public_data_ids' parameter.\n\n" +
             "  Public databases don't reliably hold information such as strandedness\n" +
-            "  information.\n\n" +  
+            "  information.\n\n" +
             "  All of the sample metadata obtained from the ENA has been appended\n" +
             "  as additional columns to help you manually curate the samplesheet before\n" +
             "  you run the main workflow(s) in the pipeline.\n" +
diff --git a/lib/nfcore_external_java_deps.jar b/lib/nfcore_external_java_deps.jar
index 805c8bb5e..531f50a9b 100644
Binary files a/lib/nfcore_external_java_deps.jar and b/lib/nfcore_external_java_deps.jar differ
diff --git a/main.nf b/main.nf
index 6c80b2a48..d30c05533 100755
--- a/main.nf
+++ b/main.nf
@@ -13,7 +13,7 @@ nextflow.enable.dsl = 2
 
 /*
 ========================================================================================
-    GENOME PARAMETER VALUES       
+    GENOME PARAMETER VALUES
 ========================================================================================
 */
 
@@ -48,7 +48,7 @@ workflow NFCORE_RNASEQ {
     if (params.public_data_ids) {
         include { SRA_DOWNLOAD } from './workflows/sra_download'
         SRA_DOWNLOAD ()
-    
+
     /*
      * WORKFLOW: Run main nf-core/rnaseq analysis pipeline
      */
diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf
index 6768044ba..b1338de06 100644
--- a/modules/local/bedtools_genomecov.nf
+++ b/modules/local/bedtools_genomecov.nf
@@ -1,59 +1,59 @@
-// Import generic module functions
-include { initOptions; saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-options        = initOptions(params.options)
-
-process BEDTOOLS_GENOMECOV {
-    tag "$meta.id"
-    label 'process_medium'
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
-        
-    conda (params.enable_conda ? "bioconda::bedtools=2.30.0" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0"
-    } else {
-        container "quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0"
-    }
-
-    input:
-    tuple val(meta), path(bam)
-    
-    output:
-    tuple val(meta), path("*.sense.bedGraph")    , emit: bedgraph_sense
-    tuple val(meta), path("*.antisense.bedGraph"), emit: bedgraph_antisense
-    path "*.version.txt"                         , emit: version
-
-    script:
-    def software = getSoftwareName(task.process)
-    def prefix   = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}"
-
-    def prefix_sense     = "${prefix}.sense"
-    def prefix_antisense = "${prefix}.antisense"
-    if (meta.strandedness == 'reverse') {
-        prefix_sense     = "${prefix}.antisense"
-        prefix_antisense = "${prefix}.sense"        
-    }
-    """
-    bedtools \\
-        genomecov \\
-        -ibam $bam \\
-        -bg \\
-        -strand + \\
-        $options.args \\
-        | bedtools sort > ${prefix_sense}.bedGraph
-    
-    bedtools \\
-        genomecov \\
-        -ibam $bam \\
-        -bg \\
-        -strand - \\
-        $options.args \\
-        | bedtools sort > ${prefix_antisense}.bedGraph
-
-    bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt
-    """
-}
-
+// Import generic module functions
+include { initOptions; saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+options        = initOptions(params.options)
+
+process BEDTOOLS_GENOMECOV {
+    tag "$meta.id"
+    label 'process_medium'
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
+
+    conda (params.enable_conda ? "bioconda::bedtools=2.30.0" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0"
+    } else {
+        container "quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0"
+    }
+
+    input:
+    tuple val(meta), path(bam)
+
+    output:
+    tuple val(meta), path("*.sense.bedGraph")    , emit: bedgraph_sense
+    tuple val(meta), path("*.antisense.bedGraph"), emit: bedgraph_antisense
+    path "*.version.txt"                         , emit: version
+
+    script:
+    def software = getSoftwareName(task.process)
+    def prefix   = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}"
+
+    def prefix_sense     = "${prefix}.sense"
+    def prefix_antisense = "${prefix}.antisense"
+    if (meta.strandedness == 'reverse') {
+        prefix_sense     = "${prefix}.antisense"
+        prefix_antisense = "${prefix}.sense"
+    }
+    """
+    bedtools \\
+        genomecov \\
+        -ibam $bam \\
+        -bg \\
+        -strand + \\
+        $options.args \\
+        | bedtools sort > ${prefix_sense}.bedGraph
+
+    bedtools \\
+        genomecov \\
+        -ibam $bam \\
+        -bg \\
+        -strand - \\
+        $options.args \\
+        | bedtools sort > ${prefix_antisense}.bedGraph
+
+    bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt
+    """
+}
+
diff --git a/modules/local/cat_additional_fasta.nf b/modules/local/cat_additional_fasta.nf
index ac3ae1d4b..7034fa99d 100644
--- a/modules/local/cat_additional_fasta.nf
+++ b/modules/local/cat_additional_fasta.nf
@@ -1,42 +1,42 @@
-// Import generic module functions
-include { saveFiles } from './functions'
-
-params.options = [:]
-
-/*
- * Concatenate additional fasta file e.g. ERCC spike-ins, GTF etc to primary fasta and gtf genome annotation
- */
-process CAT_ADDITIONAL_FASTA {
-    tag "$add_fasta"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/python:3.8.3"
-    } else {
-        container "quay.io/biocontainers/python:3.8.3"
-    }
-
-    input:
-    path fasta
-    path gtf
-    path add_fasta
-    val  biotype
-    
-    output:
-    path "${name}.fasta", emit: fasta
-    path "${name}.gtf"  , emit: gtf
-
-    script:
-    def genome_name  = params.genome ? params.genome : fasta.getBaseName()
-    def biotype_name = biotype ? "-b $biotype" : ''
-    def add_name     = add_fasta.getBaseName()
-    name             = "${genome_name}_${add_name}"
-    """
-    fasta2gtf.py -o ${add_fasta.baseName}.gtf $biotype_name $add_fasta
-    cat $fasta $add_fasta > ${name}.fasta
-    cat $gtf ${add_fasta.baseName}.gtf > ${name}.gtf
-    """
-}
+// Import generic module functions
+include { saveFiles } from './functions'
+
+params.options = [:]
+
+/*
+ * Concatenate additional fasta file e.g. ERCC spike-ins, GTF etc to primary fasta and gtf genome annotation
+ */
+process CAT_ADDITIONAL_FASTA {
+    tag "$add_fasta"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/python:3.8.3"
+    } else {
+        container "quay.io/biocontainers/python:3.8.3"
+    }
+
+    input:
+    path fasta
+    path gtf
+    path add_fasta
+    val  biotype
+
+    output:
+    path "${name}.fasta", emit: fasta
+    path "${name}.gtf"  , emit: gtf
+
+    script:
+    def genome_name  = params.genome ? params.genome : fasta.getBaseName()
+    def biotype_name = biotype ? "-b $biotype" : ''
+    def add_name     = add_fasta.getBaseName()
+    name             = "${genome_name}_${add_name}"
+    """
+    fasta2gtf.py -o ${add_fasta.baseName}.gtf $biotype_name $add_fasta
+    cat $fasta $add_fasta > ${name}.fasta
+    cat $gtf ${add_fasta.baseName}.gtf > ${name}.gtf
+    """
+}
diff --git a/modules/local/deseq2_qc.nf b/modules/local/deseq2_qc.nf
index ec3b0ce06..e75edee2c 100644
--- a/modules/local/deseq2_qc.nf
+++ b/modules/local/deseq2_qc.nf
@@ -1,62 +1,62 @@
-// Import generic module functions
-include { initOptions; saveFiles; getSoftwareName } from './functions'
-
-params.options       = [:]
-params.multiqc_label = ''
-options              = initOptions(params.options)
-
-process DESEQ2_QC {
-    label "process_medium"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-
-    // (Bio)conda packages have intentionally not been pinned to a specific version
-    // This was to avoid the pipeline failing due to package conflicts whilst creating the environment when using -profile conda
-    conda (params.enable_conda ? "conda-forge::r-base=4.0 bioconda::bioconductor-deseq2=1.28.0 bioconda::bioconductor-biocparallel bioconda::bioconductor-tximport bioconda::bioconductor-complexheatmap conda-forge::r-optparse conda-forge::r-ggplot2 conda-forge::r-rcolorbrewer conda-forge::r-pheatmap" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0"
-    } else {
-        container "quay.io/biocontainers/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0"
-    }
-
-    input:
-    path counts
-    path pca_header_multiqc
-    path clustering_header_multiqc
-    
-    output:    
-    path "*.pdf"                , optional:true, emit: pdf
-    path "*.RData"              , optional:true, emit: rdata
-    path "*pca.vals.txt"        , optional:true, emit: pca_txt
-    path "*pca.vals_mqc.tsv"    , optional:true, emit: pca_multiqc
-    path "*sample.dists.txt"    , optional:true, emit: dists_txt
-    path "*sample.dists_mqc.tsv", optional:true, emit: dists_multiqc
-    path "*.log"                , optional:true, emit: log
-    path "size_factors"         , optional:true, emit: size_factors
-    path  "*.version.txt"       , emit: version
-
-    script:
-    def software    = getSoftwareName(task.process)
-    def label_lower = params.multiqc_label.toLowerCase()
-    def label_upper = params.multiqc_label.toUpperCase()
-    """
-    deseq2_qc.r \\
-        --count_file $counts \\
-        --outdir ./ \\
-        --cores $task.cpus \\
-        $options.args
-    
-    if [ -f "R_sessionInfo.log" ]; then
-        sed "s/deseq2_pca/${label_lower}_deseq2_pca/g" <$pca_header_multiqc >tmp.txt
-        sed -i -e "s/DESeq2 PCA/${label_upper} DESeq2 PCA/g" tmp.txt
-        cat tmp.txt *.pca.vals.txt > ${label_lower}.pca.vals_mqc.tsv
-
-        sed "s/deseq2_clustering/${label_lower}_deseq2_clustering/g" <$clustering_header_multiqc >tmp.txt
-        sed -i -e "s/DESeq2 sample/${label_upper} DESeq2 sample/g" tmp.txt
-        cat tmp.txt *.sample.dists.txt > ${label_lower}.sample.dists_mqc.tsv
-    fi
-
-    Rscript -e "library(DESeq2); write(x=as.character(packageVersion('DESeq2')), file='${software}.version.txt')"
-    """
-}
+// Import generic module functions
+include { initOptions; saveFiles; getSoftwareName } from './functions'
+
+params.options       = [:]
+params.multiqc_label = ''
+options              = initOptions(params.options)
+
+process DESEQ2_QC {
+    label "process_medium"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
+
+    // (Bio)conda packages have intentionally not been pinned to a specific version
+    // This was to avoid the pipeline failing due to package conflicts whilst creating the environment when using -profile conda
+    conda (params.enable_conda ? "conda-forge::r-base=4.0 bioconda::bioconductor-deseq2=1.28.0 bioconda::bioconductor-biocparallel bioconda::bioconductor-tximport bioconda::bioconductor-complexheatmap conda-forge::r-optparse conda-forge::r-ggplot2 conda-forge::r-rcolorbrewer conda-forge::r-pheatmap" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0"
+    } else {
+        container "quay.io/biocontainers/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0"
+    }
+
+    input:
+    path counts
+    path pca_header_multiqc
+    path clustering_header_multiqc
+
+    output:
+    path "*.pdf"                , optional:true, emit: pdf
+    path "*.RData"              , optional:true, emit: rdata
+    path "*pca.vals.txt"        , optional:true, emit: pca_txt
+    path "*pca.vals_mqc.tsv"    , optional:true, emit: pca_multiqc
+    path "*sample.dists.txt"    , optional:true, emit: dists_txt
+    path "*sample.dists_mqc.tsv", optional:true, emit: dists_multiqc
+    path "*.log"                , optional:true, emit: log
+    path "size_factors"         , optional:true, emit: size_factors
+    path  "*.version.txt"       , emit: version
+
+    script:
+    def software    = getSoftwareName(task.process)
+    def label_lower = params.multiqc_label.toLowerCase()
+    def label_upper = params.multiqc_label.toUpperCase()
+    """
+    deseq2_qc.r \\
+        --count_file $counts \\
+        --outdir ./ \\
+        --cores $task.cpus \\
+        $options.args
+
+    if [ -f "R_sessionInfo.log" ]; then
+        sed "s/deseq2_pca/${label_lower}_deseq2_pca/g" <$pca_header_multiqc >tmp.txt
+        sed -i -e "s/DESeq2 PCA/${label_upper} DESeq2 PCA/g" tmp.txt
+        cat tmp.txt *.pca.vals.txt > ${label_lower}.pca.vals_mqc.tsv
+
+        sed "s/deseq2_clustering/${label_lower}_deseq2_clustering/g" <$clustering_header_multiqc >tmp.txt
+        sed -i -e "s/DESeq2 sample/${label_upper} DESeq2 sample/g" tmp.txt
+        cat tmp.txt *.sample.dists.txt > ${label_lower}.sample.dists_mqc.tsv
+    fi
+
+    Rscript -e "library(DESeq2); write(x=as.character(packageVersion('DESeq2')), file='${software}.version.txt')"
+    """
+}
diff --git a/modules/local/dupradar.nf b/modules/local/dupradar.nf
index 85371682c..4bf5f5f57 100644
--- a/modules/local/dupradar.nf
+++ b/modules/local/dupradar.nf
@@ -1,46 +1,46 @@
-// Import generic module functions
-include { initOptions; saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-options        = initOptions(params.options)
-
-process DUPRADAR {
-    tag "$meta.id"
-    label 'process_long'
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
-        
-    conda (params.enable_conda ? "bioconda::bioconductor-dupradar=1.18.0" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/bioconductor-dupradar:1.18.0--r40_1"
-    } else {
-        container "quay.io/biocontainers/bioconductor-dupradar:1.18.0--r40_1"
-    }
-
-    input:
-    tuple val(meta), path(bam)
-    path  gtf
-
-    output:
-    tuple val(meta), path("*.pdf")    , emit: pdf
-    tuple val(meta), path("*.txt")    , emit: txt
-    tuple val(meta), path("*_mqc.txt"), emit: multiqc
-    path  "*.version.txt"             , emit: version
-
-    script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/
-    def software = getSoftwareName(task.process)
-    def prefix   = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}"
-
-    def strandedness = 0
-    if (meta.strandedness == 'forward') {
-        strandedness = 1
-    } else if (meta.strandedness == 'reverse') {
-        strandedness = 2
-    }
-    def paired_end = meta.single_end ? 'single' :  'paired'
-    """
-    dupradar.r $bam $prefix $gtf $strandedness $paired_end $task.cpus
-    Rscript -e "library(dupRadar); write(x=as.character(packageVersion('dupRadar')), file='${software}.version.txt')"
-    """
-}
+// Import generic module functions
+include { initOptions; saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+options        = initOptions(params.options)
+
+process DUPRADAR {
+    tag "$meta.id"
+    label 'process_long'
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
+
+    conda (params.enable_conda ? "bioconda::bioconductor-dupradar=1.18.0" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/bioconductor-dupradar:1.18.0--r40_1"
+    } else {
+        container "quay.io/biocontainers/bioconductor-dupradar:1.18.0--r40_1"
+    }
+
+    input:
+    tuple val(meta), path(bam)
+    path  gtf
+
+    output:
+    tuple val(meta), path("*.pdf")    , emit: pdf
+    tuple val(meta), path("*.txt")    , emit: txt
+    tuple val(meta), path("*_mqc.txt"), emit: multiqc
+    path  "*.version.txt"             , emit: version
+
+    script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/
+    def software = getSoftwareName(task.process)
+    def prefix   = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}"
+
+    def strandedness = 0
+    if (meta.strandedness == 'forward') {
+        strandedness = 1
+    } else if (meta.strandedness == 'reverse') {
+        strandedness = 2
+    }
+    def paired_end = meta.single_end ? 'single' :  'paired'
+    """
+    dupradar.r $bam $prefix $gtf $strandedness $paired_end $task.cpus
+    Rscript -e "library(dupRadar); write(x=as.character(packageVersion('dupRadar')), file='${software}.version.txt')"
+    """
+}
diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf
index d7d69ac63..f7341b877 100644
--- a/modules/local/get_chrom_sizes.nf
+++ b/modules/local/get_chrom_sizes.nf
@@ -1,37 +1,37 @@
-// Import generic module functions
-include { saveFiles } from './functions'
-
-params.options = [:]
-
-/*
- * Get chromosome sizes from a fasta file
- */
-process GET_CHROM_SIZES {
-    tag "$fasta"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "bioconda::samtools=1.10" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2"
-    } else {
-        container "quay.io/biocontainers/samtools:1.10--h9402c20_2"
-    }
-
-    input:
-    path fasta
-
-    output:
-    path '*.sizes'      , emit: sizes
-    path '*.fai'        , emit: fai
-    path "*.version.txt", emit: version
-
-    script:
-    def software = 'samtools'
-    """
-    samtools faidx $fasta
-    cut -f 1,2 ${fasta}.fai > ${fasta}.sizes
-    echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt
-    """
-}
+// Import generic module functions
+include { saveFiles } from './functions'
+
+params.options = [:]
+
+/*
+ * Get chromosome sizes from a fasta file
+ */
+process GET_CHROM_SIZES {
+    tag "$fasta"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "bioconda::samtools=1.10" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2"
+    } else {
+        container "quay.io/biocontainers/samtools:1.10--h9402c20_2"
+    }
+
+    input:
+    path fasta
+
+    output:
+    path '*.sizes'      , emit: sizes
+    path '*.fai'        , emit: fai
+    path "*.version.txt", emit: version
+
+    script:
+    def software = 'samtools'
+    """
+    samtools faidx $fasta
+    cut -f 1,2 ${fasta}.fai > ${fasta}.sizes
+    echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt
+    """
+}
diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf
index 9b0e3585e..f0aebb762 100644
--- a/modules/local/get_software_versions.nf
+++ b/modules/local/get_software_versions.nf
@@ -10,7 +10,7 @@ process GET_SOFTWARE_VERSIONS {
     publishDir "${params.outdir}",
         mode: params.publish_dir_mode,
         saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) }
-        
+
     conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
     if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
         container "https://depot.galaxyproject.org/singularity/python:3.8.3"
@@ -22,7 +22,7 @@ process GET_SOFTWARE_VERSIONS {
 
     input:
     path versions
-    
+
     output:
     path "software_versions.csv"     , emit: csv
     path 'software_versions_mqc.yaml', emit: yaml
diff --git a/modules/local/gtf2bed.nf b/modules/local/gtf2bed.nf
index 2449f99dc..094bb0264 100644
--- a/modules/local/gtf2bed.nf
+++ b/modules/local/gtf2bed.nf
@@ -1,33 +1,33 @@
-// Import generic module functions
-include { saveFiles } from './functions'
-
-params.options = [:]
-
-/*
- * Convert GTF file to BED format
- */
-process GTF2BED {
-    tag "$gtf"
-    label 'process_low'
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "conda-forge::perl=5.26.2" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/perl:5.26.2"
-    } else {
-        container "quay.io/biocontainers/perl:5.26.2"
-    }
-
-    input:
-    path gtf
-    
-    output:
-    path '*.bed'
-
-    script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/
-    """
-    gtf2bed $gtf > ${gtf.baseName}.bed
-    """
-}
+// Import generic module functions
+include { saveFiles } from './functions'
+
+params.options = [:]
+
+/*
+ * Convert GTF file to BED format
+ */
+process GTF2BED {
+    tag "$gtf"
+    label 'process_low'
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "conda-forge::perl=5.26.2" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/perl:5.26.2"
+    } else {
+        container "quay.io/biocontainers/perl:5.26.2"
+    }
+
+    input:
+    path gtf
+
+    output:
+    path '*.bed'
+
+    script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/
+    """
+    gtf2bed $gtf > ${gtf.baseName}.bed
+    """
+}
diff --git a/modules/local/gtf_gene_filter.nf b/modules/local/gtf_gene_filter.nf
index c0b2c5c11..d30ab21bf 100644
--- a/modules/local/gtf_gene_filter.nf
+++ b/modules/local/gtf_gene_filter.nf
@@ -1,30 +1,30 @@
-// Import generic module functions
-include { saveFiles } from './functions'
-
-params.options = [:]
-
-process GTF_GENE_FILTER {
-    tag "$fasta"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/python:3.8.3"
-    } else {
-        container "quay.io/biocontainers/python:3.8.3"
-    }
-
-    input:
-    path fasta
-    path gtf
-    
-    output:
-    path "*.gtf"
-    
-    script: // filter_gtf_for_genes_in_genome.py is bundled with the pipeline, in nf-core/rnaseq/bin/
-    """
-    filter_gtf_for_genes_in_genome.py --gtf $gtf --fasta $fasta -o ${fasta.baseName}_genes.gtf
-    """
-}
+// Import generic module functions
+include { saveFiles } from './functions'
+
+params.options = [:]
+
+process GTF_GENE_FILTER {
+    tag "$fasta"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/python:3.8.3"
+    } else {
+        container "quay.io/biocontainers/python:3.8.3"
+    }
+
+    input:
+    path fasta
+    path gtf
+
+    output:
+    path "*.gtf"
+
+    script: // filter_gtf_for_genes_in_genome.py is bundled with the pipeline, in nf-core/rnaseq/bin/
+    """
+    filter_gtf_for_genes_in_genome.py --gtf $gtf --fasta $fasta -o ${fasta.baseName}_genes.gtf
+    """
+}
diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf
index cf7db1d91..fb06d4fd5 100644
--- a/modules/local/multiqc.nf
+++ b/modules/local/multiqc.nf
@@ -9,7 +9,7 @@ process MULTIQC {
     publishDir "${params.outdir}",
         mode: params.publish_dir_mode,
         saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
+
     conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null)
     if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
         container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0"
@@ -51,7 +51,7 @@ process MULTIQC {
     path ('rseqc/junction_saturation/*')
     path ('rseqc/read_distribution/*')
     path ('rseqc/read_duplication/*')
-    
+
     output:
     path "*multiqc_report.html", emit: report
     path "*_data"              , emit: data
diff --git a/modules/local/multiqc_custom_biotype.nf b/modules/local/multiqc_custom_biotype.nf
index 1d6eeaa0a..79c0e30d0 100644
--- a/modules/local/multiqc_custom_biotype.nf
+++ b/modules/local/multiqc_custom_biotype.nf
@@ -9,7 +9,7 @@ process MULTIQC_CUSTOM_BIOTYPE {
     publishDir "${params.outdir}",
         mode: params.publish_dir_mode,
         saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
-        
+
     conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
     if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
         container "https://depot.galaxyproject.org/singularity/python:3.8.3"
@@ -20,7 +20,7 @@ process MULTIQC_CUSTOM_BIOTYPE {
     input:
     tuple val(meta), path(count)
     path  header
-    
+
     output:
     tuple val(meta), path("*.tsv"), emit: tsv
 
diff --git a/modules/local/multiqc_custom_fail_mapped.nf b/modules/local/multiqc_custom_fail_mapped.nf
index 545631f53..e7dc8a22e 100644
--- a/modules/local/multiqc_custom_fail_mapped.nf
+++ b/modules/local/multiqc_custom_fail_mapped.nf
@@ -7,17 +7,17 @@ process MULTIQC_CUSTOM_FAIL_MAPPED {
     publishDir "${params.outdir}",
         mode: params.publish_dir_mode,
         saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
+
     conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
     if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
         container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
     } else {
         container "biocontainers/biocontainers:v1.2.0_cv1"
     }
-    
+
     input:
     val fail_mapped
-    
+
     output:
     path "*.tsv"
 
diff --git a/modules/local/multiqc_custom_strand_check.nf b/modules/local/multiqc_custom_strand_check.nf
index 96ed338ed..c7acf08c8 100644
--- a/modules/local/multiqc_custom_strand_check.nf
+++ b/modules/local/multiqc_custom_strand_check.nf
@@ -7,17 +7,17 @@ process MULTIQC_CUSTOM_STRAND_CHECK {
     publishDir "${params.outdir}",
         mode: params.publish_dir_mode,
         saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
+
     conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
     if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
         container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
     } else {
         container "biocontainers/biocontainers:v1.2.0_cv1"
     }
-    
+
     input:
     val fail_strand
-    
+
     output:
     path "*.tsv"
 
diff --git a/modules/local/rsem_merge_counts.nf b/modules/local/rsem_merge_counts.nf
index 30b07c802..9e86bd188 100644
--- a/modules/local/rsem_merge_counts.nf
+++ b/modules/local/rsem_merge_counts.nf
@@ -1,56 +1,56 @@
-// Import generic module functions
-include { saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-
-process RSEM_MERGE_COUNTS {
-    label "process_medium"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-
-    conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
-    } else {
-        container "biocontainers/biocontainers:v1.2.0_cv1"
-    }
-    
-    input:
-    path ('genes/*')
-    path ('isoforms/*')
-    
-    output:
-    path "rsem.merged.gene_counts.tsv"      , emit: counts_gene
-    path "rsem.merged.gene_tpm.tsv"         , emit: tpm_gene
-    path "rsem.merged.transcript_counts.tsv", emit: counts_transcript
-    path "rsem.merged.transcript_tpm.tsv"   , emit: tpm_transcript
-    
-    script:
-    """
-    mkdir -p tmp/genes
-    cut -f 1,2 `ls ./genes/* | head -n 1` > gene_ids.txt
-    for fileid in `ls ./genes/*`; do
-        samplename=`basename \$fileid | sed s/\\.genes.results\$//g`
-        echo \$samplename > tmp/genes/\${samplename}.counts.txt
-        cut -f 5 \${fileid} | tail -n+2 >> tmp/genes/\${samplename}.counts.txt
-        echo \$samplename > tmp/genes/\${samplename}.tpm.txt
-        cut -f 6 \${fileid} | tail -n+2 >> tmp/genes/\${samplename}.tpm.txt
-    done
-
-    mkdir -p tmp/isoforms
-    cut -f 1,2 `ls ./isoforms/* | head -n 1` > transcript_ids.txt
-    for fileid in `ls ./isoforms/*`; do
-        samplename=`basename \$fileid | sed s/\\.isoforms.results\$//g`
-        echo \$samplename > tmp/isoforms/\${samplename}.counts.txt
-        cut -f 5 \${fileid} | tail -n+2 >> tmp/isoforms/\${samplename}.counts.txt
-        echo \$samplename > tmp/isoforms/\${samplename}.tpm.txt
-        cut -f 6 \${fileid} | tail -n+2 >> tmp/isoforms/\${samplename}.tpm.txt
-    done
-
-    paste gene_ids.txt tmp/genes/*.counts.txt > rsem.merged.gene_counts.tsv
-    paste gene_ids.txt tmp/genes/*.tpm.txt > rsem.merged.gene_tpm.tsv
-    paste transcript_ids.txt tmp/isoforms/*.counts.txt > rsem.merged.transcript_counts.tsv
-    paste transcript_ids.txt tmp/isoforms/*.tpm.txt > rsem.merged.transcript_tpm.tsv
-    """
-}
+// Import generic module functions
+include { saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+
+process RSEM_MERGE_COUNTS {
+    label "process_medium"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
+    } else {
+        container "biocontainers/biocontainers:v1.2.0_cv1"
+    }
+
+    input:
+    path ('genes/*')
+    path ('isoforms/*')
+
+    output:
+    path "rsem.merged.gene_counts.tsv"      , emit: counts_gene
+    path "rsem.merged.gene_tpm.tsv"         , emit: tpm_gene
+    path "rsem.merged.transcript_counts.tsv", emit: counts_transcript
+    path "rsem.merged.transcript_tpm.tsv"   , emit: tpm_transcript
+
+    script:
+    """
+    mkdir -p tmp/genes
+    cut -f 1,2 `ls ./genes/* | head -n 1` > gene_ids.txt
+    for fileid in `ls ./genes/*`; do
+        samplename=`basename \$fileid | sed s/\\.genes.results\$//g`
+        echo \$samplename > tmp/genes/\${samplename}.counts.txt
+        cut -f 5 \${fileid} | tail -n+2 >> tmp/genes/\${samplename}.counts.txt
+        echo \$samplename > tmp/genes/\${samplename}.tpm.txt
+        cut -f 6 \${fileid} | tail -n+2 >> tmp/genes/\${samplename}.tpm.txt
+    done
+
+    mkdir -p tmp/isoforms
+    cut -f 1,2 `ls ./isoforms/* | head -n 1` > transcript_ids.txt
+    for fileid in `ls ./isoforms/*`; do
+        samplename=`basename \$fileid | sed s/\\.isoforms.results\$//g`
+        echo \$samplename > tmp/isoforms/\${samplename}.counts.txt
+        cut -f 5 \${fileid} | tail -n+2 >> tmp/isoforms/\${samplename}.counts.txt
+        echo \$samplename > tmp/isoforms/\${samplename}.tpm.txt
+        cut -f 6 \${fileid} | tail -n+2 >> tmp/isoforms/\${samplename}.tpm.txt
+    done
+
+    paste gene_ids.txt tmp/genes/*.counts.txt > rsem.merged.gene_counts.tsv
+    paste gene_ids.txt tmp/genes/*.tpm.txt > rsem.merged.gene_tpm.tsv
+    paste transcript_ids.txt tmp/isoforms/*.counts.txt > rsem.merged.transcript_counts.tsv
+    paste transcript_ids.txt tmp/isoforms/*.tpm.txt > rsem.merged.transcript_tpm.tsv
+    """
+}
diff --git a/modules/local/salmon_merge_counts.nf b/modules/local/salmon_merge_counts.nf
index c328b2b06..86346e239 100644
--- a/modules/local/salmon_merge_counts.nf
+++ b/modules/local/salmon_merge_counts.nf
@@ -1,96 +1,96 @@
-// Import generic module functions
-include { saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-
-process SALMON_MERGE_COUNTS {
-    label "process_medium"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
-    } else {
-        container "biocontainers/biocontainers:v1.2.0_cv1"
-    }
-    
-    input:
-    path ('genes_counts/*')
-    path ('genes_tpm/*')
-    path ('genes_counts_length_scaled/*')
-    path ('genes_counts_scaled/*')
-    path ('isoforms_counts/*')
-    path ('isoforms_tpm/*')
-    
-    output:
-    path "salmon.merged.gene_counts.tsv"              , emit: counts_gene
-    path "salmon.merged.gene_tpm.tsv"                 , emit: tpm_gene
-    path "salmon.merged.gene_counts_length_scaled.tsv", emit: counts_gene_length_scaled
-    path "salmon.merged.gene_counts_scaled.tsv"       , emit: counts_gene_scaled
-    path "salmon.merged.transcript_counts.tsv"        , emit: counts_transcript
-    path "salmon.merged.transcript_tpm.tsv"           , emit: tpm_transcript
-
-    script:
-    """
-    mkdir -p tmp/genes_counts
-    echo "${params.gtf_group_features}" > gene_ids.txt
-    cut -f 1 `ls ./genes_counts/* | head -n 1` | tail -n +2 >> gene_ids.txt
-    for fileid in `ls ./genes_counts/*`; do
-        filename=`basename \$fileid`
-        cut -f 2 \${fileid} > tmp/genes_counts/\${filename}
-    done
-
-    mkdir -p tmp/genes_tpm
-    for fileid in `ls ./genes_tpm/*`; do
-        filename=`basename \$fileid`
-        cut -f 2 \${fileid} > tmp/genes_tpm/\${filename}
-    done
-
-    mkdir -p tmp/genes_counts_length_scaled
-    for fileid in `ls ./genes_counts_length_scaled/*`; do
-        filename=`basename \$fileid`
-        cut -f 2 \${fileid} > tmp/genes_counts_length_scaled/\${filename}
-    done
-
-    mkdir -p tmp/genes_tpm_length_scaled
-    for fileid in `ls ./genes_tpm_length_scaled/*`; do
-        filename=`basename \$fileid`
-        cut -f 2 \${fileid} > tmp/genes_tpm_length_scaled/\${filename}
-    done
-
-    mkdir -p tmp/genes_counts_scaled
-    for fileid in `ls ./genes_counts_scaled/*`; do
-        filename=`basename \$fileid`
-        cut -f 2 \${fileid} > tmp/genes_counts_scaled/\${filename}
-    done
-
-    mkdir -p tmp/genes_tpm_scaled
-    for fileid in `ls ./genes_tpm_scaled/*`; do
-        filename=`basename \$fileid`
-        cut -f 2 \${fileid} > tmp/genes_tpm_scaled/\${filename}
-    done
-
-    mkdir -p tmp/isoforms_counts
-    echo "transcript_id" > transcript_ids.txt
-    cut -f 1 `ls ./isoforms_counts/* | head -n 1` | tail -n +2 >> transcript_ids.txt
-    for fileid in `ls ./isoforms_counts/*`; do
-        filename=`basename \$fileid`
-        cut -f 2 \${fileid} > tmp/isoforms_counts/\${filename}
-    done
-
-    mkdir -p tmp/isoforms_tpm
-    for fileid in `ls ./isoforms_tpm/*`; do
-        filename=`basename \$fileid`
-        cut -f 2 \${fileid} > tmp/isoforms_tpm/\${filename}
-    done
-
-    paste gene_ids.txt tmp/genes_counts/* > salmon.merged.gene_counts.tsv
-    paste gene_ids.txt tmp/genes_tpm/* > salmon.merged.gene_tpm.tsv
-    paste gene_ids.txt tmp/genes_counts_length_scaled/* > salmon.merged.gene_counts_length_scaled.tsv
-    paste gene_ids.txt tmp/genes_counts_scaled/* > salmon.merged.gene_counts_scaled.tsv
-    paste transcript_ids.txt tmp/isoforms_counts/* > salmon.merged.transcript_counts.tsv
-    paste transcript_ids.txt tmp/isoforms_tpm/* > salmon.merged.transcript_tpm.tsv
-    """
-}
+// Import generic module functions
+include { saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+
+process SALMON_MERGE_COUNTS {
+    label "process_medium"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
+    } else {
+        container "biocontainers/biocontainers:v1.2.0_cv1"
+    }
+
+    input:
+    path ('genes_counts/*')
+    path ('genes_tpm/*')
+    path ('genes_counts_length_scaled/*')
+    path ('genes_counts_scaled/*')
+    path ('isoforms_counts/*')
+    path ('isoforms_tpm/*')
+
+    output:
+    path "salmon.merged.gene_counts.tsv"              , emit: counts_gene
+    path "salmon.merged.gene_tpm.tsv"                 , emit: tpm_gene
+    path "salmon.merged.gene_counts_length_scaled.tsv", emit: counts_gene_length_scaled
+    path "salmon.merged.gene_counts_scaled.tsv"       , emit: counts_gene_scaled
+    path "salmon.merged.transcript_counts.tsv"        , emit: counts_transcript
+    path "salmon.merged.transcript_tpm.tsv"           , emit: tpm_transcript
+
+    script:
+    """
+    mkdir -p tmp/genes_counts
+    echo "${params.gtf_group_features}" > gene_ids.txt
+    cut -f 1 `ls ./genes_counts/* | head -n 1` | tail -n +2 >> gene_ids.txt
+    for fileid in `ls ./genes_counts/*`; do
+        filename=`basename \$fileid`
+        cut -f 2 \${fileid} > tmp/genes_counts/\${filename}
+    done
+
+    mkdir -p tmp/genes_tpm
+    for fileid in `ls ./genes_tpm/*`; do
+        filename=`basename \$fileid`
+        cut -f 2 \${fileid} > tmp/genes_tpm/\${filename}
+    done
+
+    mkdir -p tmp/genes_counts_length_scaled
+    for fileid in `ls ./genes_counts_length_scaled/*`; do
+        filename=`basename \$fileid`
+        cut -f 2 \${fileid} > tmp/genes_counts_length_scaled/\${filename}
+    done
+
+    mkdir -p tmp/genes_tpm_length_scaled
+    for fileid in `ls ./genes_tpm_length_scaled/*`; do
+        filename=`basename \$fileid`
+        cut -f 2 \${fileid} > tmp/genes_tpm_length_scaled/\${filename}
+    done
+
+    mkdir -p tmp/genes_counts_scaled
+    for fileid in `ls ./genes_counts_scaled/*`; do
+        filename=`basename \$fileid`
+        cut -f 2 \${fileid} > tmp/genes_counts_scaled/\${filename}
+    done
+
+    mkdir -p tmp/genes_tpm_scaled
+    for fileid in `ls ./genes_tpm_scaled/*`; do
+        filename=`basename \$fileid`
+        cut -f 2 \${fileid} > tmp/genes_tpm_scaled/\${filename}
+    done
+
+    mkdir -p tmp/isoforms_counts
+    echo "transcript_id" > transcript_ids.txt
+    cut -f 1 `ls ./isoforms_counts/* | head -n 1` | tail -n +2 >> transcript_ids.txt
+    for fileid in `ls ./isoforms_counts/*`; do
+        filename=`basename \$fileid`
+        cut -f 2 \${fileid} > tmp/isoforms_counts/\${filename}
+    done
+
+    mkdir -p tmp/isoforms_tpm
+    for fileid in `ls ./isoforms_tpm/*`; do
+        filename=`basename \$fileid`
+        cut -f 2 \${fileid} > tmp/isoforms_tpm/\${filename}
+    done
+
+    paste gene_ids.txt tmp/genes_counts/* > salmon.merged.gene_counts.tsv
+    paste gene_ids.txt tmp/genes_tpm/* > salmon.merged.gene_tpm.tsv
+    paste gene_ids.txt tmp/genes_counts_length_scaled/* > salmon.merged.gene_counts_length_scaled.tsv
+    paste gene_ids.txt tmp/genes_counts_scaled/* > salmon.merged.gene_counts_scaled.tsv
+    paste transcript_ids.txt tmp/isoforms_counts/* > salmon.merged.transcript_counts.tsv
+    paste transcript_ids.txt tmp/isoforms_tpm/* > salmon.merged.transcript_tpm.tsv
+    """
+}
diff --git a/modules/local/salmon_summarizedexperiment.nf b/modules/local/salmon_summarizedexperiment.nf
index 9cc4b1a01..55313f425 100644
--- a/modules/local/salmon_summarizedexperiment.nf
+++ b/modules/local/salmon_summarizedexperiment.nf
@@ -1,34 +1,34 @@
-// Import generic module functions
-include { saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-
-process SALMON_SUMMARIZEDEXPERIMENT {
-    tag "$tx2gene"
-    label "process_medium"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "bioconda::bioconductor-summarizedexperiment=1.20.0" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/bioconductor-summarizedexperiment:1.20.0--r40_0"
-    } else {
-        container "quay.io/biocontainers/bioconductor-summarizedexperiment:1.20.0--r40_0"
-    }
-
-    input:
-    path counts
-    path tpm
-    path tx2gene
-    
-    output:
-    path "*.rds"         , emit: rds
-    path  "*.version.txt", emit: version
-
-    script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/
-    """
-    salmon_summarizedexperiment.r NULL $counts $tpm
-    Rscript -e "library(SummarizedExperiment); write(x=as.character(packageVersion('SummarizedExperiment')), file='bioconductor-summarizedexperiment.version.txt')"
-    """
-}
+// Import generic module functions
+include { saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+
+process SALMON_SUMMARIZEDEXPERIMENT {
+    tag "$tx2gene"
+    label "process_medium"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "bioconda::bioconductor-summarizedexperiment=1.20.0" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/bioconductor-summarizedexperiment:1.20.0--r40_0"
+    } else {
+        container "quay.io/biocontainers/bioconductor-summarizedexperiment:1.20.0--r40_0"
+    }
+
+    input:
+    path counts
+    path tpm
+    path tx2gene
+
+    output:
+    path "*.rds"         , emit: rds
+    path  "*.version.txt", emit: version
+
+    script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/
+    """
+    salmon_summarizedexperiment.r NULL $counts $tpm
+    Rscript -e "library(SummarizedExperiment); write(x=as.character(packageVersion('SummarizedExperiment')), file='bioconductor-summarizedexperiment.version.txt')"
+    """
+}
diff --git a/modules/local/salmon_tx2gene.nf b/modules/local/salmon_tx2gene.nf
index 0cc2bb521..df3160799 100644
--- a/modules/local/salmon_tx2gene.nf
+++ b/modules/local/salmon_tx2gene.nf
@@ -1,36 +1,36 @@
-// Import generic module functions
-include { saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-
-process SALMON_TX2GENE {
-    tag "$gtf"
-    label "process_low"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/python:3.8.3"
-    } else {
-        container "quay.io/biocontainers/python:3.8.3"
-    }
-
-    input:
-    path ("salmon/*")
-    path gtf
-    
-    output:
-    path "*.tsv"
-
-    script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/
-    """
-    salmon_tx2gene.py \\
-        --gtf $gtf \\
-        --salmon salmon \\
-        --id $params.gtf_group_features \\
-        --extra $params.gtf_extra_attributes \\
-        -o salmon_tx2gene.tsv
-    """
-}
+// Import generic module functions
+include { saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+
+process SALMON_TX2GENE {
+    tag "$gtf"
+    label "process_low"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/python:3.8.3"
+    } else {
+        container "quay.io/biocontainers/python:3.8.3"
+    }
+
+    input:
+    path ("salmon/*")
+    path gtf
+
+    output:
+    path "*.tsv"
+
+    script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/
+    """
+    salmon_tx2gene.py \\
+        --gtf $gtf \\
+        --salmon salmon \\
+        --id $params.gtf_group_features \\
+        --extra $params.gtf_extra_attributes \\
+        -o salmon_tx2gene.tsv
+    """
+}
diff --git a/modules/local/salmon_tximport.nf b/modules/local/salmon_tximport.nf
index 40b11a331..08ca29d89 100644
--- a/modules/local/salmon_tximport.nf
+++ b/modules/local/salmon_tximport.nf
@@ -1,37 +1,37 @@
-// Import generic module functions
-include { saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-
-process SALMON_TXIMPORT {
-    label "process_medium"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "bioconda::bioconductor-tximeta=1.8.0" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/bioconductor-tximeta:1.8.0--r40_0"
-    } else {
-        container "quay.io/biocontainers/bioconductor-tximeta:1.8.0--r40_0"
-    }
-
-    input:
-    path ("salmon/*")
-    path  tx2gene
-    
-    output:
-    path "*gene_tpm.tsv"                 , emit: tpm_gene
-    path "*gene_counts.tsv"              , emit: counts_gene
-    path "*gene_counts_length_scaled.tsv", emit: counts_gene_length_scaled
-    path "*gene_counts_scaled.tsv"       , emit: counts_gene_scaled
-    path "*transcript_tpm.tsv"           , emit: tpm_transcript
-    path "*transcript_counts.tsv"        , emit: counts_transcript
-    path "*.version.txt"                 , emit: version
-
-    script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/
-    """
-    salmon_tximport.r NULL salmon salmon.merged
-    Rscript -e "library(tximeta); write(x=as.character(packageVersion('tximeta')), file='bioconductor-tximeta.version.txt')"
-    """
-}
+// Import generic module functions
+include { saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+
+process SALMON_TXIMPORT {
+    label "process_medium"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "bioconda::bioconductor-tximeta=1.8.0" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/bioconductor-tximeta:1.8.0--r40_0"
+    } else {
+        container "quay.io/biocontainers/bioconductor-tximeta:1.8.0--r40_0"
+    }
+
+    input:
+    path ("salmon/*")
+    path  tx2gene
+
+    output:
+    path "*gene_tpm.tsv"                 , emit: tpm_gene
+    path "*gene_counts.tsv"              , emit: counts_gene
+    path "*gene_counts_length_scaled.tsv", emit: counts_gene_length_scaled
+    path "*gene_counts_scaled.tsv"       , emit: counts_gene_scaled
+    path "*transcript_tpm.tsv"           , emit: tpm_transcript
+    path "*transcript_counts.tsv"        , emit: counts_transcript
+    path "*.version.txt"                 , emit: version
+
+    script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/
+    """
+    salmon_tximport.r NULL salmon salmon.merged
+    Rscript -e "library(tximeta); write(x=as.character(packageVersion('tximeta')), file='bioconductor-tximeta.version.txt')"
+    """
+}
diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf
index ca5bef4b7..955f3a255 100644
--- a/modules/local/samplesheet_check.nf
+++ b/modules/local/samplesheet_check.nf
@@ -11,7 +11,7 @@ process SAMPLESHEET_CHECK {
     publishDir "${params.outdir}",
         mode: params.publish_dir_mode,
         saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) }
-        
+
     conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
     if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
         container "https://depot.galaxyproject.org/singularity/python:3.8.3"
@@ -21,7 +21,7 @@ process SAMPLESHEET_CHECK {
 
     input:
     path samplesheet
-    
+
     output:
     path '*.csv'
 
@@ -31,4 +31,4 @@ process SAMPLESHEET_CHECK {
         $samplesheet \\
         samplesheet.valid.csv
     """
-}
\ No newline at end of file
+}
diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf
index 55bc6bfc0..1c5fe97c1 100644
--- a/modules/local/sra_fastq_ftp.nf
+++ b/modules/local/sra_fastq_ftp.nf
@@ -1,54 +1,54 @@
-// Import generic module functions
-include { initOptions; saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-options        = initOptions(params.options)
-
-
-/*
- * Download SRA data via FTP
- */
-process SRA_FASTQ_FTP {
-    tag "$meta.id"
-    label 'process_medium'
-    label 'error_retry'
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
-        
-    conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
-    } else {
-        container "biocontainers/biocontainers:v1.2.0_cv1"
-    }
-    
-    input:
-    tuple val(meta), val(fastq)
-
-    output:
-    tuple val(meta), path("*fastq.gz"), emit: fastq
-    tuple val(meta), path("*md5")     , emit: md5
-
-    script:    
-    if (meta.single_end) {
-        """
-        bash -c 'until curl $options.args -L ${fastq[0]} -o ${meta.id}.fastq.gz; do sleep 1; done';
-
-        echo "${meta.md5_1} ${meta.id}.fastq.gz" > ${meta.id}.fastq.gz.md5
-        md5sum -c ${meta.id}.fastq.gz.md5
-        """
-    } else {
-        """
-        bash -c 'until curl $options.args -L ${fastq[0]} -o ${meta.id}_1.fastq.gz; do sleep 1; done';
-
-        echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5
-        md5sum -c ${meta.id}_1.fastq.gz.md5
-
-        bash -c 'until curl $options.args -L ${fastq[1]} -o ${meta.id}_2.fastq.gz; do sleep 1; done';
-
-        echo "${meta.md5_2} ${meta.id}_2.fastq.gz" > ${meta.id}_2.fastq.gz.md5
-        md5sum -c ${meta.id}_2.fastq.gz.md5
-        """
-    }
-}
+// Import generic module functions
+include { initOptions; saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+options        = initOptions(params.options)
+
+
+/*
+ * Download SRA data via FTP
+ */
+process SRA_FASTQ_FTP {
+    tag "$meta.id"
+    label 'process_medium'
+    label 'error_retry'
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
+
+    conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
+    } else {
+        container "biocontainers/biocontainers:v1.2.0_cv1"
+    }
+
+    input:
+    tuple val(meta), val(fastq)
+
+    output:
+    tuple val(meta), path("*fastq.gz"), emit: fastq
+    tuple val(meta), path("*md5")     , emit: md5
+
+    script:
+    if (meta.single_end) {
+        """
+        bash -c 'until curl $options.args -L ${fastq[0]} -o ${meta.id}.fastq.gz; do sleep 1; done';
+
+        echo "${meta.md5_1} ${meta.id}.fastq.gz" > ${meta.id}.fastq.gz.md5
+        md5sum -c ${meta.id}.fastq.gz.md5
+        """
+    } else {
+        """
+        bash -c 'until curl $options.args -L ${fastq[0]} -o ${meta.id}_1.fastq.gz; do sleep 1; done';
+
+        echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5
+        md5sum -c ${meta.id}_1.fastq.gz.md5
+
+        bash -c 'until curl $options.args -L ${fastq[1]} -o ${meta.id}_2.fastq.gz; do sleep 1; done';
+
+        echo "${meta.md5_2} ${meta.id}_2.fastq.gz" > ${meta.id}_2.fastq.gz.md5
+        md5sum -c ${meta.id}_2.fastq.gz.md5
+        """
+    }
+}
diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo.nf
index 80d266eec..06d6ceff1 100644
--- a/modules/local/sra_ids_to_runinfo.nf
+++ b/modules/local/sra_ids_to_runinfo.nf
@@ -1,34 +1,34 @@
-// Import generic module functions
-include { saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-
-/*
- * Fetch SRA / ENA / GEO run information via the ENA API
- */
-process SRA_IDS_TO_RUNINFO {
-    tag "$id"
-    label 'error_retry'
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "conda-forge::requests=2.24.0" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/requests:2.24.0"
-    } else {
-        container "quay.io/biocontainers/requests:2.24.0"
-    }
-    
-    input:
-    val id
-    
-    output:
-    path "*.tsv", emit: tsv
-    
-    script:
-    """
-    echo $id > id.txt
-    sra_ids_to_runinfo.py id.txt ${id}.runinfo.tsv
-    """
-}
+// Import generic module functions
+include { saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+
+/*
+ * Fetch SRA / ENA / GEO run information via the ENA API
+ */
+process SRA_IDS_TO_RUNINFO {
+    tag "$id"
+    label 'error_retry'
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "conda-forge::requests=2.24.0" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/requests:2.24.0"
+    } else {
+        container "quay.io/biocontainers/requests:2.24.0"
+    }
+
+    input:
+    val id
+
+    output:
+    path "*.tsv", emit: tsv
+
+    script:
+    """
+    echo $id > id.txt
+    sra_ids_to_runinfo.py id.txt ${id}.runinfo.tsv
+    """
+}
diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf
index c2fcaf466..78cb84575 100644
--- a/modules/local/sra_merge_samplesheet.nf
+++ b/modules/local/sra_merge_samplesheet.nf
@@ -1,34 +1,34 @@
-// Import generic module functions
-include { saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-
-/*
- * Merge samplesheets across all samples
- */
-process SRA_MERGE_SAMPLESHEET {
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
-    } else {
-        container "biocontainers/biocontainers:v1.2.0_cv1"
-    }
-
-    input:
-    path ('samplesheets/*')
-    
-    output:
-    path "*csv", emit: csv
-    
-    script:
-    """
-    head -n 1 `ls ./samplesheets/* | head -n 1` > samplesheet.csv
-    for fileid in `ls ./samplesheets/*`; do
-         awk 'NR>1' \$fileid >> samplesheet.csv
-    done
-    """
-}
\ No newline at end of file
+// Import generic module functions
+include { saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+
+/*
+ * Merge samplesheets across all samples
+ */
+process SRA_MERGE_SAMPLESHEET {
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "conda-forge::sed=4.7" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img"
+    } else {
+        container "biocontainers/biocontainers:v1.2.0_cv1"
+    }
+
+    input:
+    path ('samplesheets/*')
+
+    output:
+    path "*csv", emit: csv
+
+    script:
+    """
+    head -n 1 `ls ./samplesheets/* | head -n 1` > samplesheet.csv
+    for fileid in `ls ./samplesheets/*`; do
+        awk 'NR>1' \$fileid >> samplesheet.csv
+    done
+    """
+}
diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp.nf
index 423bd1a77..634abd0ea 100644
--- a/modules/local/sra_runinfo_to_ftp.nf
+++ b/modules/local/sra_runinfo_to_ftp.nf
@@ -1,31 +1,31 @@
-// Import generic module functions
-include { saveFiles; getSoftwareName } from './functions'
-
-params.options = [:]
-
-/*
- * Create samplesheet for pipeline from SRA run information fetched via the ENA API
- */
-process SRA_RUNINFO_TO_FTP {
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
-        
-    conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
-    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
-        container "https://depot.galaxyproject.org/singularity/python:3.8.3"
-    } else {
-        container "quay.io/biocontainers/python:3.8.3"
-    }
-        
-    input:
-    path runinfo
-    
-    output:
-    path "*.tsv", emit: tsv
-    
-    script:
-    """
-    sra_runinfo_to_ftp.py ${runinfo.join(',')} ${runinfo.toString().tokenize(".")[0]}.runinfo_ftp.tsv
-    """
-}
+// Import generic module functions
+include { saveFiles; getSoftwareName } from './functions'
+
+params.options = [:]
+
+/*
+ * Create samplesheet for pipeline from SRA run information fetched via the ENA API
+ */
+process SRA_RUNINFO_TO_FTP {
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) }
+
+    conda (params.enable_conda ? "conda-forge::python=3.8.3" : null)
+    if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) {
+        container "https://depot.galaxyproject.org/singularity/python:3.8.3"
+    } else {
+        container "quay.io/biocontainers/python:3.8.3"
+    }
+
+    input:
+    path runinfo
+
+    output:
+    path "*.tsv", emit: tsv
+
+    script:
+    """
+    sra_runinfo_to_ftp.py ${runinfo.join(',')} ${runinfo.toString().tokenize(".")[0]}.runinfo_ftp.tsv
+    """
+}
diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf
index 7502ef540..e5ff7caec 100644
--- a/modules/local/sra_to_samplesheet.nf
+++ b/modules/local/sra_to_samplesheet.nf
@@ -1,47 +1,47 @@
-// Import generic module functions
-include { saveFiles; getSoftwareName } from './functions'
-
-params.options     = [:]
-params.results_dir = ''
-
-/*
- * Stage FastQ files downloaded by SRA and auto-create a samplesheet for the pipeline
- */
-process SRA_TO_SAMPLESHEET {
-    tag "$meta.id"
-    publishDir "${params.outdir}",
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
-        
-    memory 100.MB
-
-    input:
-    tuple val(meta), path(fastq)
-
-    output:
-    tuple val(meta), path("*csv"), emit: csv
-    
-    exec:
-    //  Remove custom keys needed to download the data
-    def meta_map = meta.clone()
-    meta_map.remove("id")
-    meta_map.remove("fastq_1")
-    meta_map.remove("fastq_2")
-    meta_map.remove("md5_1")
-    meta_map.remove("md5_2")
-    meta_map.remove("single_end")
-
-    // Add required fields for the pipeline to the beginning of the map
-    pipeline_map = [
-        sample      : "${meta.id.split('_')[0..-2].join('_')}",
-        fastq_1     : "${params.outdir}/${params.results_dir}/${fastq[0]}",
-        fastq_2     : meta.single_end ? '' : "${params.outdir}/${params.results_dir}/${fastq[1]}",
-        strandedness: 'unstranded'
-    ]
-    pipeline_map << meta_map
-
-    // Write to file
-    def file = task.workDir.resolve("${meta.id}.samplesheet.csv")
-    file.write pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n'
-    file.append(pipeline_map.values().collect{ '"' + it + '"'}.join(",")) + '\n'
-}
+// Import generic module functions
+include { saveFiles; getSoftwareName } from './functions'
+
+params.options     = [:]
+params.results_dir = ''
+
+/*
+ * Stage FastQ files downloaded by SRA and auto-create a samplesheet for the pipeline
+ */
+process SRA_TO_SAMPLESHEET {
+    tag "$meta.id"
+    publishDir "${params.outdir}",
+        mode: params.publish_dir_mode,
+        saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) }
+
+    memory 100.MB
+
+    input:
+    tuple val(meta), path(fastq)
+
+    output:
+    tuple val(meta), path("*csv"), emit: csv
+
+    exec:
+    //  Remove custom keys needed to download the data
+    def meta_map = meta.clone()
+    meta_map.remove("id")
+    meta_map.remove("fastq_1")
+    meta_map.remove("fastq_2")
+    meta_map.remove("md5_1")
+    meta_map.remove("md5_2")
+    meta_map.remove("single_end")
+
+    // Add required fields for the pipeline to the beginning of the map
+    pipeline_map = [
+        sample      : "${meta.id.split('_')[0..-2].join('_')}",
+        fastq_1     : "${params.outdir}/${params.results_dir}/${fastq[0]}",
+        fastq_2     : meta.single_end ? '' : "${params.outdir}/${params.results_dir}/${fastq[1]}",
+        strandedness: 'unstranded'
+    ]
+    pipeline_map << meta_map
+
+    // Write to file
+    def file = task.workDir.resolve("${meta.id}.samplesheet.csv")
+    file.write pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n'
+    file.append(pipeline_map.values().collect{ '"' + it + '"'}.join(",")) + '\n'
+}
diff --git a/nextflow.config b/nextflow.config
index a2652cca6..a0ec1679a 100644
--- a/nextflow.config
+++ b/nextflow.config
@@ -8,106 +8,106 @@
 // Global default params, used in configs
 params {
 
-  // Input options
-  input                      = null
-  public_data_ids            = null
-  skip_sra_fastq_download    = false
+    // Input options
+    input                      = null
+    public_data_ids            = null
+    skip_sra_fastq_download    = false
 
-  // References
-  genome                     = null
-  transcript_fasta           = null
-  additional_fasta           = null
-  splicesites                = null
-  gtf_extra_attributes       = 'gene_name'
-  gtf_group_features         = 'gene_id'
-  featurecounts_feature_type = 'exon'
-  featurecounts_group_type   = 'gene_biotype'
-  gencode                    = false
-  save_reference             = false
+    // References
+    genome                     = null
+    transcript_fasta           = null
+    additional_fasta           = null
+    splicesites                = null
+    gtf_extra_attributes       = 'gene_name'
+    gtf_group_features         = 'gene_id'
+    featurecounts_feature_type = 'exon'
+    featurecounts_group_type   = 'gene_biotype'
+    gencode                    = false
+    save_reference             = false
 
-  // UMI handling
-  with_umi                   = false
-  umitools_extract_method    = 'string'
-  umitools_bc_pattern        = null
-  save_umi_intermeds         = false
+    // UMI handling
+    with_umi                   = false
+    umitools_extract_method    = 'string'
+    umitools_bc_pattern        = null
+    save_umi_intermeds         = false
 
-  // Trimming
-  clip_r1                    = null
-  clip_r2                    = null
-  three_prime_clip_r1        = null
-  three_prime_clip_r2        = null
-  trim_nextseq               = null
-  save_trimmed               = false
-  skip_trimming              = false
+    // Trimming
+    clip_r1                    = null
+    clip_r2                    = null
+    three_prime_clip_r1        = null
+    three_prime_clip_r2        = null
+    trim_nextseq               = null
+    save_trimmed               = false
+    skip_trimming              = false
 
-  // Ribosomal RNA removal
-  remove_ribo_rna            = false
-  save_non_ribo_reads        = false
-  ribo_database_manifest     = "${projectDir}/assets/rrna-db-defaults.txt"
+    // Ribosomal RNA removal
+    remove_ribo_rna            = false
+    save_non_ribo_reads        = false
+    ribo_database_manifest     = "${projectDir}/assets/rrna-db-defaults.txt"
 
-  // Alignment
-  aligner                    = 'star_salmon'
-  pseudo_aligner             = null
-  seq_center                 = null
-  bam_csi_index              = false
-  star_ignore_sjdbgtf        = false
-  hisat2_build_memory        = '200.GB'  // Amount of memory required to build HISAT2 index with splice sites
-  stringtie_ignore_gtf       = false
-  min_mapped_reads           = 5
-  save_merged_fastq          = false
-  save_unaligned             = false
-  save_align_intermeds       = false
-  skip_markduplicates        = false
-  skip_alignment             = false
-  
-  // QC
-  skip_qc                    = false
-  skip_bigwig                = false
-  skip_stringtie             = false
-  skip_fastqc                = false
-  skip_preseq                = false
-  skip_dupradar              = false
-  skip_qualimap              = false
-  skip_rseqc                 = false
-  skip_biotype_qc            = false
-  skip_deseq2_qc             = false
-  skip_multiqc               = false
-  deseq2_vst                 = false
-  rseqc_modules              = 'bam_stat,inner_distance,infer_experiment,junction_annotation,junction_saturation,read_distribution,read_duplication'
+    // Alignment
+    aligner                    = 'star_salmon'
+    pseudo_aligner             = null
+    seq_center                 = null
+    bam_csi_index              = false
+    star_ignore_sjdbgtf        = false
+    hisat2_build_memory        = '200.GB'  // Amount of memory required to build HISAT2 index with splice sites
+    stringtie_ignore_gtf       = false
+    min_mapped_reads           = 5
+    save_merged_fastq          = false
+    save_unaligned             = false
+    save_align_intermeds       = false
+    skip_markduplicates        = false
+    skip_alignment             = false
 
-  // Boilerplate options
-  outdir                     = './results'
-  publish_dir_mode           = 'copy'
-  multiqc_config             = null
-  multiqc_title              = null
-  email                      = null
-  email_on_fail              = null
-  max_multiqc_email_size     = '25.MB'
-  plaintext_email            = false
-  monochrome_logs            = false
-  help                       = false
-  igenomes_base              = 's3://ngi-igenomes/igenomes/'
-  tracedir                   = "${params.outdir}/pipeline_info"
-  igenomes_ignore            = false
-  validate_params            = true
-  show_hidden_params         = false
-  schema_ignore_params       = 'genomes,modules'
-  enable_conda               = false
-  singularity_pull_docker_container = false
+    // QC
+    skip_qc                    = false
+    skip_bigwig                = false
+    skip_stringtie             = false
+    skip_fastqc                = false
+    skip_preseq                = false
+    skip_dupradar              = false
+    skip_qualimap              = false
+    skip_rseqc                 = false
+    skip_biotype_qc            = false
+    skip_deseq2_qc             = false
+    skip_multiqc               = false
+    deseq2_vst                 = false
+    rseqc_modules              = 'bam_stat,inner_distance,infer_experiment,junction_annotation,junction_saturation,read_distribution,read_duplication'
 
-  // Config options
-  custom_config_version      = 'master'
-  custom_config_base         = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}"
-  hostnames                  = [:]
-  config_profile_name        = null
-  config_profile_description = null
-  config_profile_contact     = null
-  config_profile_url         = null
+    // Boilerplate options
+    outdir                     = './results'
+    publish_dir_mode           = 'copy'
+    multiqc_config             = null
+    multiqc_title              = null
+    email                      = null
+    email_on_fail              = null
+    max_multiqc_email_size     = '25.MB'
+    plaintext_email            = false
+    monochrome_logs            = false
+    help                       = false
+    igenomes_base              = 's3://ngi-igenomes/igenomes/'
+    tracedir                   = "${params.outdir}/pipeline_info"
+    igenomes_ignore            = false
+    validate_params            = true
+    show_hidden_params         = false
+    schema_ignore_params       = 'genomes,modules'
+    enable_conda               = false
+    singularity_pull_docker_container = false
 
-  // Defaults only, expecting to be overwritten
-  max_memory                 = '128.GB'
-  max_cpus                   = 16
-  max_time                   = '240.h'
+    // Config options
+    custom_config_version      = 'master'
+    custom_config_base         = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}"
+    hostnames                  = [:]
+    config_profile_name        = null
+    config_profile_description = null
+    config_profile_contact     = null
+    config_profile_url         = null
+
+    // Defaults only, expecting to be overwritten
+    max_memory                 = '128.GB'
+    max_cpus                   = 16
+    max_time                   = '240.h'
 
 }
 
@@ -119,145 +119,145 @@ includeConfig 'conf/modules.config'
 
 // Load nf-core custom profiles from different Institutions
 try {
-  includeConfig "${params.custom_config_base}/nfcore_custom.config"
+    includeConfig "${params.custom_config_base}/nfcore_custom.config"
 } catch (Exception e) {
-  System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config")
+    System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config")
 }
 
 // Load nf-core/rnaseq custom config
 try {
-  includeConfig "${params.custom_config_base}/pipeline/rnaseq.config"
+    includeConfig "${params.custom_config_base}/pipeline/rnaseq.config"
 } catch (Exception e) {
-  System.err.println("WARNING: Could not load nf-core/config/rnaseq profiles: ${params.custom_config_base}/pipeline/rnaseq.config")
+    System.err.println("WARNING: Could not load nf-core/config/rnaseq profiles: ${params.custom_config_base}/pipeline/rnaseq.config")
 }
 
 // Load igenomes.config if required
 if (!params.igenomes_ignore) {
-  includeConfig 'conf/igenomes.config'
+    includeConfig 'conf/igenomes.config'
 } else {
-  params.genomes = [:]
+    params.genomes = [:]
 }
 
 profiles {
-  debug { process.beforeScript = 'echo $HOSTNAME' }
-  conda {
-    params.enable_conda    = true
-    docker.enabled         = false
-    singularity.enabled    = false
-    podman.enabled         = false
-    shifter.enabled        = false
-    charliecloud.enabled   = false
-  }
-  docker {
-    docker.enabled         = true
-    // Avoid this error:
-    //   WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
-    // Testing this in nf-core after discussion here https://github.com/nf-core/tools/pull/351
-    // once this is established and works well, nextflow might implement this behavior as new default.
-    docker.runOptions      = '-u \$(id -u):\$(id -g)'
-    singularity.enabled    = false
-    podman.enabled         = false
-    shifter.enabled        = false
-    charliecloud.enabled   = false
-  }
-  singularity {
-    singularity.enabled    = true
-    singularity.autoMounts = true
-    docker.enabled         = false
-    podman.enabled         = false
-    shifter.enabled        = false
-    charliecloud.enabled   = false
-  }
-  podman {
-    podman.enabled         = true
-    docker.enabled         = false
-    singularity.enabled    = false
-    shifter.enabled        = false
-    charliecloud.enabled   = false
-  }
-  shifter {
-    shifter.enabled        = true
-    docker.enabled         = false
-    singularity.enabled    = false
-    podman.enabled         = false
-    charliecloud.enabled   = false
-  }
-  charliecloud {
-    charliecloud.enabled   = true
-    docker.enabled         = false
-    singularity.enabled    = false
-    podman.enabled         = false
-    shifter.enabled        = false
-  }
-  test      { includeConfig 'conf/test.config'      }
-  test_sra  { includeConfig 'conf/test_sra.config'  }
-  test_full { includeConfig 'conf/test_full.config' }
+    debug { process.beforeScript = 'echo $HOSTNAME' }
+    conda {
+        params.enable_conda    = true
+        docker.enabled         = false
+        singularity.enabled    = false
+        podman.enabled         = false
+        shifter.enabled        = false
+        charliecloud.enabled   = false
+    }
+    docker {
+        docker.enabled         = true
+        // Avoid this error:
+        //   WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
+        // Testing this in nf-core after discussion here https://github.com/nf-core/tools/pull/351
+        // once this is established and works well, nextflow might implement this behavior as new default.
+        docker.runOptions      = '-u \$(id -u):\$(id -g)'
+        singularity.enabled    = false
+        podman.enabled         = false
+        shifter.enabled        = false
+        charliecloud.enabled   = false
+    }
+    singularity {
+        singularity.enabled    = true
+        singularity.autoMounts = true
+        docker.enabled         = false
+        podman.enabled         = false
+        shifter.enabled        = false
+        charliecloud.enabled   = false
+    }
+    podman {
+        podman.enabled         = true
+        docker.enabled         = false
+        singularity.enabled    = false
+        shifter.enabled        = false
+        charliecloud.enabled   = false
+    }
+    shifter {
+        shifter.enabled        = true
+        docker.enabled         = false
+        singularity.enabled    = false
+        podman.enabled         = false
+        charliecloud.enabled   = false
+    }
+    charliecloud {
+        charliecloud.enabled   = true
+        docker.enabled         = false
+        singularity.enabled    = false
+        podman.enabled         = false
+        shifter.enabled        = false
+    }
+    test      { includeConfig 'conf/test.config'      }
+    test_sra  { includeConfig 'conf/test_sra.config'  }
+    test_full { includeConfig 'conf/test_full.config' }
 }
 
 // Export these variables to prevent local Python/R libraries from conflicting with those in the container
 env {
-  PYTHONNOUSERSITE = 1
-  R_PROFILE_USER   = "/.Rprofile"
-  R_ENVIRON_USER   = "/.Renviron"
+    PYTHONNOUSERSITE = 1
+    R_PROFILE_USER   = "/.Rprofile"
+    R_ENVIRON_USER   = "/.Renviron"
 }
 
 def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')
 timeline {
-  enabled = true
-  file    = "${params.tracedir}/execution_timeline_${trace_timestamp}.html"
+    enabled = true
+    file    = "${params.tracedir}/execution_timeline_${trace_timestamp}.html"
 }
 report {
-  enabled = true
-  file    = "${params.tracedir}/execution_report_${trace_timestamp}.html"
+    enabled = true
+    file    = "${params.tracedir}/execution_report_${trace_timestamp}.html"
 }
 trace {
-  enabled = true
-  file    = "${params.tracedir}/execution_trace_${trace_timestamp}.txt"
+    enabled = true
+    file    = "${params.tracedir}/execution_trace_${trace_timestamp}.txt"
 }
 dag {
-  enabled = true
-  file    = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg"
+    enabled = true
+    file    = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg"
 }
 
 manifest {
-  name            = 'nf-core/rnaseq'
-  author          = 'Phil Ewels, Rickard Hammarén'
-  homePage        = 'https://github.com/nf-core/rnaseq'
-  description     = 'Nextflow RNA-Seq analysis pipeline, part of the nf-core community.'
-  mainScript      = 'main.nf'
-  nextflowVersion = '!>=21.04.0'
-  version         = '3.1'
+    name            = 'nf-core/rnaseq'
+    author          = 'Phil Ewels, Rickard Hammarén'
+    homePage        = 'https://github.com/nf-core/rnaseq'
+    description     = 'Nextflow RNA-Seq analysis pipeline, part of the nf-core community.'
+    mainScript      = 'main.nf'
+    nextflowVersion = '!>=21.04.0'
+    version         = '3.1'
 }
 
 // Function to ensure that resource requirements don't go beyond
 // a maximum limit
 def check_max(obj, type) {
-  if (type == 'memory') {
-    try {
-      if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1)
-        return params.max_memory as nextflow.util.MemoryUnit
-      else
-        return obj
-    } catch (all) {
-      println "   ### ERROR ###   Max memory '${params.max_memory}' is not valid! Using default value: $obj"
-      return obj
-    }
-  } else if (type == 'time') {
-    try {
-      if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1)
-        return params.max_time as nextflow.util.Duration
-      else
-        return obj
-    } catch (all) {
-      println "   ### ERROR ###   Max time '${params.max_time}' is not valid! Using default value: $obj"
-      return obj
-    }
-  } else if (type == 'cpus') {
-    try {
-      return Math.min( obj, params.max_cpus as int )
-    } catch (all) {
-      println "   ### ERROR ###   Max cpus '${params.max_cpus}' is not valid! Using default value: $obj"
-      return obj
+    if (type == 'memory') {
+        try {
+            if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1)
+                return params.max_memory as nextflow.util.MemoryUnit
+            else
+                return obj
+        } catch (all) {
+            println "   ### ERROR ###   Max memory '${params.max_memory}' is not valid! Using default value: $obj"
+            return obj
+        }
+    } else if (type == 'time') {
+        try {
+            if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1)
+                return params.max_time as nextflow.util.Duration
+            else
+                return obj
+        } catch (all) {
+            println "   ### ERROR ###   Max time '${params.max_time}' is not valid! Using default value: $obj"
+            return obj
+        }
+    } else if (type == 'cpus') {
+        try {
+            return Math.min( obj, params.max_cpus as int )
+        } catch (all) {
+            println "   ### ERROR ###   Max cpus '${params.max_cpus}' is not valid! Using default value: $obj"
+            return obj
+        }
     }
-  }
 }
diff --git a/nextflow_schema.json b/nextflow_schema.json
index 8e86ce96c..1c114d73b 100644
--- a/nextflow_schema.json
+++ b/nextflow_schema.json
@@ -661,4 +661,4 @@
             "$ref": "#/definitions/generic_options"
         }
     ]
-}
\ No newline at end of file
+}
diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf
index 58c1f495a..7f234561f 100644
--- a/subworkflows/local/input_check.nf
+++ b/subworkflows/local/input_check.nf
@@ -1,43 +1,43 @@
-/*
- * Check input samplesheet and get read channels
- */
-
-params.options = [:]
-
-include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options )
-
-workflow INPUT_CHECK {
-    take:
-    samplesheet // file: /path/to/samplesheet.csv
-    
-    main:
-    SAMPLESHEET_CHECK ( samplesheet )
-        .splitCsv ( header:true, sep:',' )
-        .map { create_fastq_channels(it) }
-        .set { reads }
-
-    emit:
-    reads // channel: [ val(meta), [ reads ] ]
-}
-
-// Function to get list of [ meta, [ fastq_1, fastq_2 ] ]
-def create_fastq_channels(LinkedHashMap row) {
-    def meta = [:]
-    meta.id           = row.sample
-    meta.single_end   = row.single_end.toBoolean()
-    meta.strandedness = row.strandedness
-
-    def array = []
-    if (!file(row.fastq_1).exists()) {
-        exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}"
-    }
-    if (meta.single_end) {
-        array = [ meta, [ file(row.fastq_1) ] ]
-    } else {
-        if (!file(row.fastq_2).exists()) {
-            exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}"
-        }
-        array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ]
-    }
-    return array
-}
+/*
+ * Check input samplesheet and get read channels
+ */
+
+params.options = [:]
+
+include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options )
+
+workflow INPUT_CHECK {
+    take:
+    samplesheet // file: /path/to/samplesheet.csv
+
+    main:
+    SAMPLESHEET_CHECK ( samplesheet )
+        .splitCsv ( header:true, sep:',' )
+        .map { create_fastq_channels(it) }
+        .set { reads }
+
+    emit:
+    reads // channel: [ val(meta), [ reads ] ]
+}
+
+// Function to get list of [ meta, [ fastq_1, fastq_2 ] ]
+def create_fastq_channels(LinkedHashMap row) {
+    def meta = [:]
+    meta.id           = row.sample
+    meta.single_end   = row.single_end.toBoolean()
+    meta.strandedness = row.strandedness
+
+    def array = []
+    if (!file(row.fastq_1).exists()) {
+        exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}"
+    }
+    if (meta.single_end) {
+        array = [ meta, [ file(row.fastq_1) ] ]
+    } else {
+        if (!file(row.fastq_2).exists()) {
+            exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}"
+        }
+        array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ]
+    }
+    return array
+}
diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf
index 03b0f6323..c9d29f10e 100644
--- a/subworkflows/local/prepare_genome.nf
+++ b/subworkflows/local/prepare_genome.nf
@@ -1,214 +1,213 @@
-/*
- * Uncompress and prepare reference genome files
-*/
-
-params.genome_options       = [:]
-params.index_options        = [:]
-params.gffread_options      = [:]
-params.star_index_options   = [:]
-params.rsem_index_options   = [:]
-params.hisat2_index_options = [:]
-params.salmon_index_options = [:]
-
-include {
-    GUNZIP as GUNZIP_FASTA
-    GUNZIP as GUNZIP_GTF
-    GUNZIP as GUNZIP_GFF
-    GUNZIP as GUNZIP_GENE_BED
-    GUNZIP as GUNZIP_TRANSCRIPT_FASTA
-    GUNZIP as GUNZIP_ADDITIONAL_FASTA } from '../../modules/nf-core/software/gunzip/main'                    addParams( options: params.genome_options       )
-include { UNTAR as UNTAR_STAR_INDEX   } from '../../modules/nf-core/software/untar/main'                     addParams( options: params.star_index_options   )
-include { UNTAR as UNTAR_RSEM_INDEX   } from '../../modules/nf-core/software/untar/main'                     addParams( options: params.index_options        )
-include { UNTAR as UNTAR_HISAT2_INDEX } from '../../modules/nf-core/software/untar/main'                     addParams( options: params.hisat2_index_options )
-include { UNTAR as UNTAR_SALMON_INDEX } from '../../modules/nf-core/software/untar/main'                     addParams( options: params.index_options        )
-include { GFFREAD                     } from '../../modules/nf-core/software/gffread/main'                   addParams( options: params.gffread_options      )
-include { STAR_GENOMEGENERATE         } from '../../modules/nf-core/software/star/genomegenerate/main'       addParams( options: params.star_index_options   )
-include { HISAT2_EXTRACTSPLICESITES   } from '../../modules/nf-core/software/hisat2/extractsplicesites/main' addParams( options: params.hisat2_index_options )
-include { HISAT2_BUILD                } from '../../modules/nf-core/software/hisat2/build/main'              addParams( options: params.hisat2_index_options )
-include { SALMON_INDEX                } from '../../modules/nf-core/software/salmon/index/main'              addParams( options: params.salmon_index_options )
-include { RSEM_PREPAREREFERENCE as RSEM_PREPAREREFERENCE             } from '../../modules/nf-core/software/rsem/preparereference/main' addParams( options: params.rsem_index_options )
-include { RSEM_PREPAREREFERENCE as RSEM_PREPAREREFERENCE_TRANSCRIPTS } from '../../modules/nf-core/software/rsem/preparereference/main' addParams( options: params.genome_options     )
-
-include { GTF2BED                     } from '../../modules/local/gtf2bed'              addParams( options: params.genome_options )
-include { CAT_ADDITIONAL_FASTA        } from '../../modules/local/cat_additional_fasta' addParams( options: params.genome_options )
-include { GTF_GENE_FILTER             } from '../../modules/local/gtf_gene_filter'      addParams( options: params.genome_options )
-include { GET_CHROM_SIZES             } from '../../modules/local/get_chrom_sizes'      addParams( options: params.genome_options )
-
-workflow PREPARE_GENOME {
-    take:
-    prepare_tool_indices // list  : tools to prepare indices for
-    biotype              // string: if additional fasta file is provided
-                         //         biotype value to use when appending entries to GTF file
-
-    main:
-    /*
-     * Uncompress genome fasta file if required
-     */
-    if (params.fasta.endsWith('.gz')) {
-        ch_fasta = GUNZIP_FASTA ( params.fasta ).gunzip
-    } else {
-        ch_fasta = file(params.fasta)
-    }
-    
-    /*
-     * Uncompress GTF annotation file or create from GFF3 if required
-     */
-    ch_gffread_version = Channel.empty()
-    if (params.gtf) {
-        if (params.gtf.endsWith('.gz')) {
-            ch_gtf = GUNZIP_GTF ( params.gtf ).gunzip
-        } else {
-            ch_gtf = file(params.gtf)
-        }
-    } else if (params.gff) {
-        if (params.gff.endsWith('.gz')) {
-            ch_gff = GUNZIP_GFF ( params.gff ).gunzip
-        } else {
-            ch_gff = file(params.gff)
-        }
-        ch_gtf = GFFREAD ( ch_gff ).gtf
-        ch_gffread_version = GFFREAD.out.version
-    }
-
-    /*
-     * Uncompress additional fasta file and concatenate with reference fasta and gtf files
-     */
-    if (params.additional_fasta) {
-        if (params.additional_fasta.endsWith('.gz')) {
-            ch_add_fasta = GUNZIP_ADDITIONAL_FASTA ( params.additional_fasta ).gunzip
-        } else {
-            ch_add_fasta = file(params.additional_fasta)
-        }
-        CAT_ADDITIONAL_FASTA ( ch_fasta, ch_gtf, ch_add_fasta, biotype )
-        ch_fasta = CAT_ADDITIONAL_FASTA.out.fasta
-        ch_gtf   = CAT_ADDITIONAL_FASTA.out.gtf
-    }
-
-    /*
-     * Uncompress gene BED annotation file or create from GTF if required
-     */
-    if (params.gene_bed) {
-        if (params.gene_bed.endsWith('.gz')) {
-            ch_gene_bed = GUNZIP_GENE_BED ( params.gene_bed ).gunzip
-        } else {
-            ch_gene_bed = file(params.gene_bed)
-        }
-    } else {
-        ch_gene_bed = GTF2BED ( ch_gtf )
-    }
-
-    /*
-     * Uncompress transcript fasta file / create if required
-     */
-    ch_rsem_version = Channel.empty()
-    if (params.transcript_fasta) {
-        if (params.transcript_fasta.endsWith('.gz')) {
-            ch_transcript_fasta = GUNZIP_TRANSCRIPT_FASTA ( params.transcript_fasta ).gunzip
-        } else {
-            ch_transcript_fasta = file(params.transcript_fasta)
-        }
-    } else {
-        ch_transcript_fasta = RSEM_PREPAREREFERENCE_TRANSCRIPTS ( ch_fasta, GTF_GENE_FILTER ( ch_fasta, ch_gtf ) ).transcript_fasta
-        ch_rsem_version     = RSEM_PREPAREREFERENCE_TRANSCRIPTS.out.version
-    }
-
-    /*
-     * Create chromosome sizes file
-     */
-    ch_chrom_sizes = GET_CHROM_SIZES ( ch_fasta ).sizes
-
-    /*
-     * Uncompress STAR index or generate from scratch if required
-     */
-    ch_star_index   = Channel.empty()
-    ch_star_version = Channel.empty()
-    if ('star_salmon' in prepare_tool_indices) {
-        if (params.star_index) {
-            if (params.star_index.endsWith('.tar.gz')) {
-                ch_star_index = UNTAR_STAR_INDEX ( params.star_index ).untar
-            } else {
-                ch_star_index = file(params.star_index)
-            }
-        } else {
-            ch_star_index   = STAR_GENOMEGENERATE ( ch_fasta, ch_gtf ).index
-            ch_star_version = STAR_GENOMEGENERATE.out.version
-        }
-    }
-    
-    /*
-     * Uncompress RSEM index or generate from scratch if required
-     */
-    ch_rsem_index   = Channel.empty()
-    if ('star_rsem' in prepare_tool_indices) {
-        if (params.rsem_index) {
-            if (params.rsem_index.endsWith('.tar.gz')) {
-                ch_rsem_index = UNTAR_RSEM_INDEX ( params.rsem_index ).untar
-            } else {
-                ch_rsem_index = file(params.rsem_index)
-            }
-        } else {
-            ch_rsem_index   = RSEM_PREPAREREFERENCE ( ch_fasta, ch_gtf ).index
-            ch_rsem_version = RSEM_PREPAREREFERENCE.out.version
-        }
-    }
-
-    /*
-     * Uncompress HISAT2 index or generate from scratch if required
-     */
-    ch_splicesites    = Channel.empty()
-    ch_hisat2_index   = Channel.empty()
-    ch_hisat2_version = Channel.empty()
-    if ('hisat2' in prepare_tool_indices) {
-        if (!params.splicesites) {
-            ch_splicesites    = HISAT2_EXTRACTSPLICESITES ( ch_gtf ).txt
-            ch_hisat2_version = HISAT2_EXTRACTSPLICESITES.out.version
-        } else {
-            ch_splicesites = file(params.splicesites)
-        }
-        if (params.hisat2_index) {
-            if (params.hisat2_index.endsWith('.tar.gz')) {
-                ch_hisat2_index = UNTAR_HISAT2_INDEX ( params.hisat2_index ).untar
-            } else {
-                ch_hisat2_index = file(params.hisat2_index)
-            }
-        } else {
-            ch_hisat2_index   = HISAT2_BUILD ( ch_fasta, ch_gtf, ch_splicesites ).index
-            ch_hisat2_version = HISAT2_BUILD.out.version
-        }
-    }
-
-    /*
-     * Uncompress Salmon index or generate from scratch if required
-     */
-    ch_salmon_index   = Channel.empty()
-    ch_salmon_version = Channel.empty()  
-    if ('salmon' in prepare_tool_indices) {
-        if (params.salmon_index) {
-            if (params.salmon_index.endsWith('.tar.gz')) {
-                ch_salmon_index = UNTAR_SALMON_INDEX ( params.salmon_index ).untar
-            } else {
-                ch_salmon_index = file(params.salmon_index)
-            }
-        } else {        
-            ch_salmon_index   = SALMON_INDEX ( ch_fasta, ch_transcript_fasta ).index
-            ch_salmon_version = SALMON_INDEX.out.version
-        }
-    }
-
-    emit:
-    fasta            = ch_fasta            // path: genome.fasta
-    gtf              = ch_gtf              // path: genome.gtf
-    gene_bed         = ch_gene_bed         // path: gene.bed
-    transcript_fasta = ch_transcript_fasta // path: transcript.fasta
-    chrom_sizes      = ch_chrom_sizes      // path: genome.sizes
-    splicesites      = ch_splicesites      // path: genome.splicesites.txt
-    star_index       = ch_star_index       // path: star/index/
-    rsem_index       = ch_rsem_index       // path: rsem/index/
-    hisat2_index     = ch_hisat2_index     // path: hisat2/index/
-    salmon_index     = ch_salmon_index     // path: salmon/index/
-    star_version     = ch_star_version     // path: *.version.txt
-    rsem_version     = ch_rsem_version     // path: *.version.txt
-    hisat2_version   = ch_hisat2_version   // path: *.version.txt
-    salmon_version   = ch_salmon_version   // path: *.version.txt
-    gffread_version  = ch_gffread_version  // path: *.version.txt
-}
+/*
+ * Uncompress and prepare reference genome files
+*/
+
+params.genome_options       = [:]
+params.index_options        = [:]
+params.gffread_options      = [:]
+params.star_index_options   = [:]
+params.rsem_index_options   = [:]
+params.hisat2_index_options = [:]
+params.salmon_index_options = [:]
+
+include {
+    GUNZIP as GUNZIP_FASTA
+    GUNZIP as GUNZIP_GTF
+    GUNZIP as GUNZIP_GFF
+    GUNZIP as GUNZIP_GENE_BED
+    GUNZIP as GUNZIP_TRANSCRIPT_FASTA
+    GUNZIP as GUNZIP_ADDITIONAL_FASTA } from '../../modules/nf-core/software/gunzip/main'                    addParams( options: params.genome_options       )
+include { UNTAR as UNTAR_STAR_INDEX   } from '../../modules/nf-core/software/untar/main'                     addParams( options: params.star_index_options   )
+include { UNTAR as UNTAR_RSEM_INDEX   } from '../../modules/nf-core/software/untar/main'                     addParams( options: params.index_options        )
+include { UNTAR as UNTAR_HISAT2_INDEX } from '../../modules/nf-core/software/untar/main'                     addParams( options: params.hisat2_index_options )
+include { UNTAR as UNTAR_SALMON_INDEX } from '../../modules/nf-core/software/untar/main'                     addParams( options: params.index_options        )
+include { GFFREAD                     } from '../../modules/nf-core/software/gffread/main'                   addParams( options: params.gffread_options      )
+include { STAR_GENOMEGENERATE         } from '../../modules/nf-core/software/star/genomegenerate/main'       addParams( options: params.star_index_options   )
+include { HISAT2_EXTRACTSPLICESITES   } from '../../modules/nf-core/software/hisat2/extractsplicesites/main' addParams( options: params.hisat2_index_options )
+include { HISAT2_BUILD                } from '../../modules/nf-core/software/hisat2/build/main'              addParams( options: params.hisat2_index_options )
+include { SALMON_INDEX                } from '../../modules/nf-core/software/salmon/index/main'              addParams( options: params.salmon_index_options )
+include { RSEM_PREPAREREFERENCE as RSEM_PREPAREREFERENCE             } from '../../modules/nf-core/software/rsem/preparereference/main' addParams( options: params.rsem_index_options )
+include { RSEM_PREPAREREFERENCE as RSEM_PREPAREREFERENCE_TRANSCRIPTS } from '../../modules/nf-core/software/rsem/preparereference/main' addParams( options: params.genome_options     )
+
+include { GTF2BED                     } from '../../modules/local/gtf2bed'              addParams( options: params.genome_options )
+include { CAT_ADDITIONAL_FASTA        } from '../../modules/local/cat_additional_fasta' addParams( options: params.genome_options )
+include { GTF_GENE_FILTER             } from '../../modules/local/gtf_gene_filter'      addParams( options: params.genome_options )
+include { GET_CHROM_SIZES             } from '../../modules/local/get_chrom_sizes'      addParams( options: params.genome_options )
+
+workflow PREPARE_GENOME {
+    take:
+    prepare_tool_indices // list  : tools to prepare indices for
+    biotype              // string: if additional fasta file is provided biotype value to use when appending entries to GTF file
+
+    main:
+    /*
+     * Uncompress genome fasta file if required
+     */
+    if (params.fasta.endsWith('.gz')) {
+        ch_fasta = GUNZIP_FASTA ( params.fasta ).gunzip
+    } else {
+        ch_fasta = file(params.fasta)
+    }
+
+    /*
+     * Uncompress GTF annotation file or create from GFF3 if required
+     */
+    ch_gffread_version = Channel.empty()
+    if (params.gtf) {
+        if (params.gtf.endsWith('.gz')) {
+            ch_gtf = GUNZIP_GTF ( params.gtf ).gunzip
+        } else {
+            ch_gtf = file(params.gtf)
+        }
+    } else if (params.gff) {
+        if (params.gff.endsWith('.gz')) {
+            ch_gff = GUNZIP_GFF ( params.gff ).gunzip
+        } else {
+            ch_gff = file(params.gff)
+        }
+        ch_gtf = GFFREAD ( ch_gff ).gtf
+        ch_gffread_version = GFFREAD.out.version
+    }
+
+    /*
+     * Uncompress additional fasta file and concatenate with reference fasta and gtf files
+     */
+    if (params.additional_fasta) {
+        if (params.additional_fasta.endsWith('.gz')) {
+            ch_add_fasta = GUNZIP_ADDITIONAL_FASTA ( params.additional_fasta ).gunzip
+        } else {
+            ch_add_fasta = file(params.additional_fasta)
+        }
+        CAT_ADDITIONAL_FASTA ( ch_fasta, ch_gtf, ch_add_fasta, biotype )
+        ch_fasta = CAT_ADDITIONAL_FASTA.out.fasta
+        ch_gtf   = CAT_ADDITIONAL_FASTA.out.gtf
+    }
+
+    /*
+     * Uncompress gene BED annotation file or create from GTF if required
+     */
+    if (params.gene_bed) {
+        if (params.gene_bed.endsWith('.gz')) {
+            ch_gene_bed = GUNZIP_GENE_BED ( params.gene_bed ).gunzip
+        } else {
+            ch_gene_bed = file(params.gene_bed)
+        }
+    } else {
+        ch_gene_bed = GTF2BED ( ch_gtf )
+    }
+
+    /*
+     * Uncompress transcript fasta file / create if required
+     */
+    ch_rsem_version = Channel.empty()
+    if (params.transcript_fasta) {
+        if (params.transcript_fasta.endsWith('.gz')) {
+            ch_transcript_fasta = GUNZIP_TRANSCRIPT_FASTA ( params.transcript_fasta ).gunzip
+        } else {
+            ch_transcript_fasta = file(params.transcript_fasta)
+        }
+    } else {
+        ch_transcript_fasta = RSEM_PREPAREREFERENCE_TRANSCRIPTS ( ch_fasta, GTF_GENE_FILTER ( ch_fasta, ch_gtf ) ).transcript_fasta
+        ch_rsem_version     = RSEM_PREPAREREFERENCE_TRANSCRIPTS.out.version
+    }
+
+    /*
+     * Create chromosome sizes file
+     */
+    ch_chrom_sizes = GET_CHROM_SIZES ( ch_fasta ).sizes
+
+    /*
+     * Uncompress STAR index or generate from scratch if required
+     */
+    ch_star_index   = Channel.empty()
+    ch_star_version = Channel.empty()
+    if ('star_salmon' in prepare_tool_indices) {
+        if (params.star_index) {
+            if (params.star_index.endsWith('.tar.gz')) {
+                ch_star_index = UNTAR_STAR_INDEX ( params.star_index ).untar
+            } else {
+                ch_star_index = file(params.star_index)
+            }
+        } else {
+            ch_star_index   = STAR_GENOMEGENERATE ( ch_fasta, ch_gtf ).index
+            ch_star_version = STAR_GENOMEGENERATE.out.version
+        }
+    }
+
+    /*
+     * Uncompress RSEM index or generate from scratch if required
+     */
+    ch_rsem_index   = Channel.empty()
+    if ('star_rsem' in prepare_tool_indices) {
+        if (params.rsem_index) {
+            if (params.rsem_index.endsWith('.tar.gz')) {
+                ch_rsem_index = UNTAR_RSEM_INDEX ( params.rsem_index ).untar
+            } else {
+                ch_rsem_index = file(params.rsem_index)
+            }
+        } else {
+            ch_rsem_index   = RSEM_PREPAREREFERENCE ( ch_fasta, ch_gtf ).index
+            ch_rsem_version = RSEM_PREPAREREFERENCE.out.version
+        }
+    }
+
+    /*
+     * Uncompress HISAT2 index or generate from scratch if required
+     */
+    ch_splicesites    = Channel.empty()
+    ch_hisat2_index   = Channel.empty()
+    ch_hisat2_version = Channel.empty()
+    if ('hisat2' in prepare_tool_indices) {
+        if (!params.splicesites) {
+            ch_splicesites    = HISAT2_EXTRACTSPLICESITES ( ch_gtf ).txt
+            ch_hisat2_version = HISAT2_EXTRACTSPLICESITES.out.version
+        } else {
+            ch_splicesites = file(params.splicesites)
+        }
+        if (params.hisat2_index) {
+            if (params.hisat2_index.endsWith('.tar.gz')) {
+                ch_hisat2_index = UNTAR_HISAT2_INDEX ( params.hisat2_index ).untar
+            } else {
+                ch_hisat2_index = file(params.hisat2_index)
+            }
+        } else {
+            ch_hisat2_index   = HISAT2_BUILD ( ch_fasta, ch_gtf, ch_splicesites ).index
+            ch_hisat2_version = HISAT2_BUILD.out.version
+        }
+    }
+
+    /*
+     * Uncompress Salmon index or generate from scratch if required
+     */
+    ch_salmon_index   = Channel.empty()
+    ch_salmon_version = Channel.empty()
+    if ('salmon' in prepare_tool_indices) {
+        if (params.salmon_index) {
+            if (params.salmon_index.endsWith('.tar.gz')) {
+                ch_salmon_index = UNTAR_SALMON_INDEX ( params.salmon_index ).untar
+            } else {
+                ch_salmon_index = file(params.salmon_index)
+            }
+        } else {
+            ch_salmon_index   = SALMON_INDEX ( ch_fasta, ch_transcript_fasta ).index
+            ch_salmon_version = SALMON_INDEX.out.version
+        }
+    }
+
+    emit:
+    fasta            = ch_fasta            // path: genome.fasta
+    gtf              = ch_gtf              // path: genome.gtf
+    gene_bed         = ch_gene_bed         // path: gene.bed
+    transcript_fasta = ch_transcript_fasta // path: transcript.fasta
+    chrom_sizes      = ch_chrom_sizes      // path: genome.sizes
+    splicesites      = ch_splicesites      // path: genome.splicesites.txt
+    star_index       = ch_star_index       // path: star/index/
+    rsem_index       = ch_rsem_index       // path: rsem/index/
+    hisat2_index     = ch_hisat2_index     // path: hisat2/index/
+    salmon_index     = ch_salmon_index     // path: salmon/index/
+    star_version     = ch_star_version     // path: *.version.txt
+    rsem_version     = ch_rsem_version     // path: *.version.txt
+    hisat2_version   = ch_hisat2_version   // path: *.version.txt
+    salmon_version   = ch_salmon_version   // path: *.version.txt
+    gffread_version  = ch_gffread_version  // path: *.version.txt
+}
diff --git a/subworkflows/local/quantify_rsem.nf b/subworkflows/local/quantify_rsem.nf
index 14d8479d0..ea9dc8998 100644
--- a/subworkflows/local/quantify_rsem.nf
+++ b/subworkflows/local/quantify_rsem.nf
@@ -1,61 +1,61 @@
-/*
- * Gene/transcript quantification with RSEM
- */
-
-params.calculateexpression_options = [:]
-params.samtools_sort_options       = [:]
-params.samtools_index_options      = [:]
-params.samtools_stats_options      = [:]
-params.merge_counts_options        = [:]
-
-include { RSEM_CALCULATEEXPRESSION } from '../../modules/nf-core/software/rsem/calculateexpression/main' addParams( options: params.calculateexpression_options )
-include { RSEM_MERGE_COUNTS        } from '../../modules/local/rsem_merge_counts'                        addParams( options: params.merge_counts_options        )
-include { BAM_SORT_SAMTOOLS        } from '../nf-core/bam_sort_samtools'                                 addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options )
-
-workflow QUANTIFY_RSEM {
-    take:
-    reads // channel: [ val(meta), [ reads ] ]
-    index // channel: /path/to/rsem/index/
-
-    main:
-    /*
-     * Quantify reads with RSEM
-     */
-    RSEM_CALCULATEEXPRESSION ( reads, index )
-
-    /*
-     * Sort, index BAM file and run samtools stats, flagstat and idxstats
-     */
-    BAM_SORT_SAMTOOLS ( RSEM_CALCULATEEXPRESSION.out.bam_star )
-
-    /*
-     * Merge counts across samples
-     */
-    RSEM_MERGE_COUNTS (
-        RSEM_CALCULATEEXPRESSION.out.counts_gene.collect{it[1]},       // [meta, counts]: Collect the second element (counts files) in the channel across all samples
-        RSEM_CALCULATEEXPRESSION.out.counts_transcript.collect{it[1]}
-    )
-
-    emit:
-    counts_gene              = RSEM_CALCULATEEXPRESSION.out.counts_gene       // channel: [ val(meta), counts ]
-    counts_transcript        = RSEM_CALCULATEEXPRESSION.out.counts_transcript // channel: [ val(meta), counts ]
-    stat                     = RSEM_CALCULATEEXPRESSION.out.stat              // channel: [ val(meta), stat ]
-    logs                     = RSEM_CALCULATEEXPRESSION.out.logs              // channel: [ val(meta), logs ]
-    bam_star                 = RSEM_CALCULATEEXPRESSION.out.bam_star          // channel: [ val(meta), bam ]
-    bam_genome               = RSEM_CALCULATEEXPRESSION.out.bam_genome        // channel: [ val(meta), bam ]
-    bam_transcript           = RSEM_CALCULATEEXPRESSION.out.bam_transcript    // channel: [ val(meta), bam ]
-    rsem_version             = RSEM_CALCULATEEXPRESSION.out.version           //    path: *.version.txt
-
-    bam                      = BAM_SORT_SAMTOOLS.out.bam                      // channel: [ val(meta), [ bam ] ]
-    bai                      = BAM_SORT_SAMTOOLS.out.bai                      // channel: [ val(meta), [ bai ] ]
-    csi                      = BAM_SORT_SAMTOOLS.out.csi                      // channel: [ val(meta), [ csi ] ]
-    stats                    = BAM_SORT_SAMTOOLS.out.stats                    // channel: [ val(meta), [ stats ] ]
-    flagstat                 = BAM_SORT_SAMTOOLS.out.flagstat                 // channel: [ val(meta), [ flagstat ] ]
-    idxstats                 = BAM_SORT_SAMTOOLS.out.idxstats                 // channel: [ val(meta), [ idxstats ] ]
-    samtools_version         = BAM_SORT_SAMTOOLS.out.version                  //    path: *.version.txt
-
-    merged_counts_gene       = RSEM_MERGE_COUNTS.out.counts_gene              //    path: *.gene_counts.tsv
-    merged_tpm_gene          = RSEM_MERGE_COUNTS.out.tpm_gene                 //    path: *.gene_tpm.tsv
-    merged_counts_transcript = RSEM_MERGE_COUNTS.out.counts_transcript        //    path: *.transcript_counts.tsv
-    merged_tpm_transcript    = RSEM_MERGE_COUNTS.out.tpm_transcript           //    path: *.transcript_tpm.tsv
-}
+/*
+ * Gene/transcript quantification with RSEM
+ */
+
+params.calculateexpression_options = [:]
+params.samtools_sort_options       = [:]
+params.samtools_index_options      = [:]
+params.samtools_stats_options      = [:]
+params.merge_counts_options        = [:]
+
+include { RSEM_CALCULATEEXPRESSION } from '../../modules/nf-core/software/rsem/calculateexpression/main' addParams( options: params.calculateexpression_options )
+include { RSEM_MERGE_COUNTS        } from '../../modules/local/rsem_merge_counts'                        addParams( options: params.merge_counts_options        )
+include { BAM_SORT_SAMTOOLS        } from '../nf-core/bam_sort_samtools'                                 addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options )
+
+workflow QUANTIFY_RSEM {
+    take:
+    reads // channel: [ val(meta), [ reads ] ]
+    index // channel: /path/to/rsem/index/
+
+    main:
+    /*
+     * Quantify reads with RSEM
+     */
+    RSEM_CALCULATEEXPRESSION ( reads, index )
+
+    /*
+     * Sort, index BAM file and run samtools stats, flagstat and idxstats
+     */
+    BAM_SORT_SAMTOOLS ( RSEM_CALCULATEEXPRESSION.out.bam_star )
+
+    /*
+     * Merge counts across samples
+     */
+    RSEM_MERGE_COUNTS (
+        RSEM_CALCULATEEXPRESSION.out.counts_gene.collect{it[1]},       // [meta, counts]: Collect the second element (counts files) in the channel across all samples
+        RSEM_CALCULATEEXPRESSION.out.counts_transcript.collect{it[1]}
+    )
+
+    emit:
+    counts_gene              = RSEM_CALCULATEEXPRESSION.out.counts_gene       // channel: [ val(meta), counts ]
+    counts_transcript        = RSEM_CALCULATEEXPRESSION.out.counts_transcript // channel: [ val(meta), counts ]
+    stat                     = RSEM_CALCULATEEXPRESSION.out.stat              // channel: [ val(meta), stat ]
+    logs                     = RSEM_CALCULATEEXPRESSION.out.logs              // channel: [ val(meta), logs ]
+    bam_star                 = RSEM_CALCULATEEXPRESSION.out.bam_star          // channel: [ val(meta), bam ]
+    bam_genome               = RSEM_CALCULATEEXPRESSION.out.bam_genome        // channel: [ val(meta), bam ]
+    bam_transcript           = RSEM_CALCULATEEXPRESSION.out.bam_transcript    // channel: [ val(meta), bam ]
+    rsem_version             = RSEM_CALCULATEEXPRESSION.out.version           //    path: *.version.txt
+
+    bam                      = BAM_SORT_SAMTOOLS.out.bam                      // channel: [ val(meta), [ bam ] ]
+    bai                      = BAM_SORT_SAMTOOLS.out.bai                      // channel: [ val(meta), [ bai ] ]
+    csi                      = BAM_SORT_SAMTOOLS.out.csi                      // channel: [ val(meta), [ csi ] ]
+    stats                    = BAM_SORT_SAMTOOLS.out.stats                    // channel: [ val(meta), [ stats ] ]
+    flagstat                 = BAM_SORT_SAMTOOLS.out.flagstat                 // channel: [ val(meta), [ flagstat ] ]
+    idxstats                 = BAM_SORT_SAMTOOLS.out.idxstats                 // channel: [ val(meta), [ idxstats ] ]
+    samtools_version         = BAM_SORT_SAMTOOLS.out.version                  //    path: *.version.txt
+
+    merged_counts_gene       = RSEM_MERGE_COUNTS.out.counts_gene              //    path: *.gene_counts.tsv
+    merged_tpm_gene          = RSEM_MERGE_COUNTS.out.tpm_gene                 //    path: *.gene_tpm.tsv
+    merged_counts_transcript = RSEM_MERGE_COUNTS.out.counts_transcript        //    path: *.transcript_counts.tsv
+    merged_tpm_transcript    = RSEM_MERGE_COUNTS.out.tpm_transcript           //    path: *.transcript_tpm.tsv
+}
diff --git a/subworkflows/local/quantify_salmon.nf b/subworkflows/local/quantify_salmon.nf
index d9c645ed5..003864e8b 100644
--- a/subworkflows/local/quantify_salmon.nf
+++ b/subworkflows/local/quantify_salmon.nf
@@ -1,80 +1,82 @@
-/*
- * Pseudo-alignment and quantification with Salmon
- */
-
-params.genome_options       = [:]
-params.salmon_quant_options = [:]
-params.tximport_options     = [:]
-params.merge_counts_options = [:]
-
-include { SALMON_QUANT        } from '../../modules/nf-core/software/salmon/quant/main' addParams( options: params.salmon_quant_options )
-include { SALMON_TX2GENE      } from '../../modules/local/salmon_tx2gene'               addParams( options: params.genome_options       )
-include { SALMON_TXIMPORT     } from '../../modules/local/salmon_tximport'              addParams( options: params.tximport_options     )
-include { SALMON_MERGE_COUNTS } from '../../modules/local/salmon_merge_counts'          addParams( options: params.merge_counts_options )
-include { SALMON_SUMMARIZEDEXPERIMENT as SALMON_SE_GENE
-          SALMON_SUMMARIZEDEXPERIMENT as SALMON_SE_GENE_LENGTH_SCALED
-          SALMON_SUMMARIZEDEXPERIMENT as SALMON_SE_GENE_SCALED
-          SALMON_SUMMARIZEDEXPERIMENT as SALMON_SE_TRANSCRIPT } from '../../modules/local/salmon_summarizedexperiment' addParams( options: params.merge_counts_options )
-
-workflow QUANTIFY_SALMON {
-    take:
-    reads            // channel: [ val(meta), [ reads ] ]
-    index            // channel: /path/to/salmon/index/
-    transcript_fasta // channel: /path/to/transcript.fasta
-    gtf              // channel: /path/to/genome.gtf
-    alignment_mode   //    bool: Run Salmon in alignment mode
-
-    main:    
-    /*
-     * Quantify and merge counts across samples
-     */
-    SALMON_QUANT        ( reads, index, gtf, transcript_fasta, alignment_mode )
-    SALMON_TX2GENE      ( SALMON_QUANT.out.results.collect{it[1]}, gtf )
-    SALMON_TXIMPORT     ( SALMON_QUANT.out.results.collect{it[1]}, SALMON_TX2GENE.out.collect() )
-
-
-    SALMON_SE_GENE ( 
-        SALMON_TXIMPORT.out.counts_gene,
-        SALMON_TXIMPORT.out.tpm_gene,
-        SALMON_TX2GENE.out.collect()
-    )
-
-    SALMON_SE_GENE_LENGTH_SCALED ( 
-        SALMON_TXIMPORT.out.counts_gene_length_scaled,
-        SALMON_TXIMPORT.out.tpm_gene,
-        SALMON_TX2GENE.out.collect()
-    )
-
-    SALMON_SE_GENE_SCALED ( 
-        SALMON_TXIMPORT.out.counts_gene_scaled,
-        SALMON_TXIMPORT.out.tpm_gene,
-        SALMON_TX2GENE.out.collect()
-    )
-
-    SALMON_SE_TRANSCRIPT ( 
-        SALMON_TXIMPORT.out.counts_transcript,
-        SALMON_TXIMPORT.out.tpm_transcript,
-        SALMON_TX2GENE.out.collect()
-    )
-
-    emit:
-    results                          = SALMON_QUANT.out.results                      // channel: [ val(meta), results_dir ]
-    salmon_version                   = SALMON_QUANT.out.version                      //    path: *.version.txt
-    
-    tpm_gene                         = SALMON_TXIMPORT.out.tpm_gene                  // channel: [ val(meta), counts ]
-    counts_gene                      = SALMON_TXIMPORT.out.counts_gene               // channel: [ val(meta), counts ]
-    counts_gene_length_scaled        = SALMON_TXIMPORT.out.counts_gene_length_scaled // channel: [ val(meta), counts ]
-    counts_gene_scaled               = SALMON_TXIMPORT.out.counts_gene_scaled        // channel: [ val(meta), counts ]
-    tpm_transcript                   = SALMON_TXIMPORT.out.tpm_transcript            // channel: [ val(meta), counts ]
-    counts_transcript                = SALMON_TXIMPORT.out.counts_transcript         // channel: [ val(meta), counts ]
-    tximeta_version                  = SALMON_TXIMPORT.out.version                   //    path: *.version.txt
-    
-    merged_gene_rds                  = SALMON_SE_GENE.out.rds                        //    path: *.rds
-    merged_gene_rds_length_scaled    = SALMON_SE_GENE_LENGTH_SCALED.out.rds          //    path: *.rds
-    merged_gene_rds_scaled           = SALMON_SE_GENE_SCALED.out.rds                 //    path: *.rds
-    summarizedexperiment_version     = SALMON_SE_GENE.out.version                    //    path: *.version.txt
-        
-    merged_counts_transcript         = SALMON_TXIMPORT.out.counts_transcript         //    path: *.transcript_counts.tsv
-    merged_tpm_transcript            = SALMON_TXIMPORT.out.tpm_transcript            //    path: *.transcript_tpm.tsv
-    merged_transcript_rds            = SALMON_SE_TRANSCRIPT.out.rds                  //    path: *.rds
-}
+/*
+ * Pseudo-alignment and quantification with Salmon
+ */
+
+params.genome_options       = [:]
+params.salmon_quant_options = [:]
+params.tximport_options     = [:]
+params.merge_counts_options = [:]
+
+include { SALMON_QUANT        } from '../../modules/nf-core/software/salmon/quant/main' addParams( options: params.salmon_quant_options )
+include { SALMON_TX2GENE      } from '../../modules/local/salmon_tx2gene'               addParams( options: params.genome_options       )
+include { SALMON_TXIMPORT     } from '../../modules/local/salmon_tximport'              addParams( options: params.tximport_options     )
+include { SALMON_MERGE_COUNTS } from '../../modules/local/salmon_merge_counts'          addParams( options: params.merge_counts_options )
+include {
+    SALMON_SUMMARIZEDEXPERIMENT as SALMON_SE_GENE
+    SALMON_SUMMARIZEDEXPERIMENT as SALMON_SE_GENE_LENGTH_SCALED
+    SALMON_SUMMARIZEDEXPERIMENT as SALMON_SE_GENE_SCALED
+    SALMON_SUMMARIZEDEXPERIMENT as SALMON_SE_TRANSCRIPT
+} from '../../modules/local/salmon_summarizedexperiment' addParams( options: params.merge_counts_options )
+
+workflow QUANTIFY_SALMON {
+    take:
+    reads            // channel: [ val(meta), [ reads ] ]
+    index            // channel: /path/to/salmon/index/
+    transcript_fasta // channel: /path/to/transcript.fasta
+    gtf              // channel: /path/to/genome.gtf
+    alignment_mode   //    bool: Run Salmon in alignment mode
+
+    main:
+    /*
+     * Quantify and merge counts across samples
+     */
+    SALMON_QUANT        ( reads, index, gtf, transcript_fasta, alignment_mode )
+    SALMON_TX2GENE      ( SALMON_QUANT.out.results.collect{it[1]}, gtf )
+    SALMON_TXIMPORT     ( SALMON_QUANT.out.results.collect{it[1]}, SALMON_TX2GENE.out.collect() )
+
+
+    SALMON_SE_GENE (
+        SALMON_TXIMPORT.out.counts_gene,
+        SALMON_TXIMPORT.out.tpm_gene,
+        SALMON_TX2GENE.out.collect()
+    )
+
+    SALMON_SE_GENE_LENGTH_SCALED (
+        SALMON_TXIMPORT.out.counts_gene_length_scaled,
+        SALMON_TXIMPORT.out.tpm_gene,
+        SALMON_TX2GENE.out.collect()
+    )
+
+    SALMON_SE_GENE_SCALED (
+        SALMON_TXIMPORT.out.counts_gene_scaled,
+        SALMON_TXIMPORT.out.tpm_gene,
+        SALMON_TX2GENE.out.collect()
+    )
+
+    SALMON_SE_TRANSCRIPT (
+        SALMON_TXIMPORT.out.counts_transcript,
+        SALMON_TXIMPORT.out.tpm_transcript,
+        SALMON_TX2GENE.out.collect()
+    )
+
+    emit:
+    results                          = SALMON_QUANT.out.results                      // channel: [ val(meta), results_dir ]
+    salmon_version                   = SALMON_QUANT.out.version                      //    path: *.version.txt
+
+    tpm_gene                         = SALMON_TXIMPORT.out.tpm_gene                  // channel: [ val(meta), counts ]
+    counts_gene                      = SALMON_TXIMPORT.out.counts_gene               // channel: [ val(meta), counts ]
+    counts_gene_length_scaled        = SALMON_TXIMPORT.out.counts_gene_length_scaled // channel: [ val(meta), counts ]
+    counts_gene_scaled               = SALMON_TXIMPORT.out.counts_gene_scaled        // channel: [ val(meta), counts ]
+    tpm_transcript                   = SALMON_TXIMPORT.out.tpm_transcript            // channel: [ val(meta), counts ]
+    counts_transcript                = SALMON_TXIMPORT.out.counts_transcript         // channel: [ val(meta), counts ]
+    tximeta_version                  = SALMON_TXIMPORT.out.version                   //    path: *.version.txt
+
+    merged_gene_rds                  = SALMON_SE_GENE.out.rds                        //    path: *.rds
+    merged_gene_rds_length_scaled    = SALMON_SE_GENE_LENGTH_SCALED.out.rds          //    path: *.rds
+    merged_gene_rds_scaled           = SALMON_SE_GENE_SCALED.out.rds                 //    path: *.rds
+    summarizedexperiment_version     = SALMON_SE_GENE.out.version                    //    path: *.version.txt
+
+    merged_counts_transcript         = SALMON_TXIMPORT.out.counts_transcript         //    path: *.transcript_counts.tsv
+    merged_tpm_transcript            = SALMON_TXIMPORT.out.tpm_transcript            //    path: *.transcript_tpm.tsv
+    merged_transcript_rds            = SALMON_SE_TRANSCRIPT.out.rds                  //    path: *.rds
+}
diff --git a/subworkflows/nf-core/align_hisat2.nf b/subworkflows/nf-core/align_hisat2.nf
index 03a5bd1f8..b380b0989 100644
--- a/subworkflows/nf-core/align_hisat2.nf
+++ b/subworkflows/nf-core/align_hisat2.nf
@@ -1,43 +1,43 @@
-/*
- * Alignment with HISAT2
- */
-
-params.align_options          = [:]
-params.samtools_sort_options  = [:]
-params.samtools_index_options = [:]
-params.samtools_stats_options = [:]
-
-include { HISAT2_ALIGN      } from '../../modules/nf-core/software/hisat2/align/main' addParams( options: params.align_options    )
-include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools'                              addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options )
-
-workflow ALIGN_HISAT2 {
-    take:
-    reads       // channel: [ val(meta), [ reads ] ]
-    index       // channel: /path/to/star/index/
-    splicesites // channel: /path/to/genome.splicesites.txt
-    
-    main:
-    /*
-     * Map reads with HISAT2
-     */
-    HISAT2_ALIGN ( reads, index, splicesites )
-
-    /*
-     * Sort, index BAM file and run samtools stats, flagstat and idxstats
-     */
-    BAM_SORT_SAMTOOLS ( HISAT2_ALIGN.out.bam )
-
-    emit:
-    orig_bam         = HISAT2_ALIGN.out.bam           // channel: [ val(meta), bam   ]
-    summary          = HISAT2_ALIGN.out.summary       // channel: [ val(meta), log   ]
-    fastq            = HISAT2_ALIGN.out.fastq         // channel: [ val(meta), fastq ]
-    hisat2_version   = HISAT2_ALIGN.out.version       //    path: *.version.txt
-
-    bam              = BAM_SORT_SAMTOOLS.out.bam      // channel: [ val(meta), [ bam ] ]
-    bai              = BAM_SORT_SAMTOOLS.out.bai      // channel: [ val(meta), [ bai ] ]
-    csi              = BAM_SORT_SAMTOOLS.out.csi      // channel: [ val(meta), [ csi ] ]
-    stats            = BAM_SORT_SAMTOOLS.out.stats    // channel: [ val(meta), [ stats ] ]
-    flagstat         = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ]
-    idxstats         = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
-    samtools_version = BAM_SORT_SAMTOOLS.out.version  //    path: *.version.txt
-}
+/*
+ * Alignment with HISAT2
+ */
+
+params.align_options          = [:]
+params.samtools_sort_options  = [:]
+params.samtools_index_options = [:]
+params.samtools_stats_options = [:]
+
+include { HISAT2_ALIGN      } from '../../modules/nf-core/software/hisat2/align/main' addParams( options: params.align_options    )
+include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools'                              addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options )
+
+workflow ALIGN_HISAT2 {
+    take:
+    reads       // channel: [ val(meta), [ reads ] ]
+    index       // channel: /path/to/star/index/
+    splicesites // channel: /path/to/genome.splicesites.txt
+
+    main:
+    /*
+     * Map reads with HISAT2
+     */
+    HISAT2_ALIGN ( reads, index, splicesites )
+
+    /*
+     * Sort, index BAM file and run samtools stats, flagstat and idxstats
+     */
+    BAM_SORT_SAMTOOLS ( HISAT2_ALIGN.out.bam )
+
+    emit:
+    orig_bam         = HISAT2_ALIGN.out.bam           // channel: [ val(meta), bam   ]
+    summary          = HISAT2_ALIGN.out.summary       // channel: [ val(meta), log   ]
+    fastq            = HISAT2_ALIGN.out.fastq         // channel: [ val(meta), fastq ]
+    hisat2_version   = HISAT2_ALIGN.out.version       //    path: *.version.txt
+
+    bam              = BAM_SORT_SAMTOOLS.out.bam      // channel: [ val(meta), [ bam ] ]
+    bai              = BAM_SORT_SAMTOOLS.out.bai      // channel: [ val(meta), [ bai ] ]
+    csi              = BAM_SORT_SAMTOOLS.out.csi      // channel: [ val(meta), [ csi ] ]
+    stats            = BAM_SORT_SAMTOOLS.out.stats    // channel: [ val(meta), [ stats ] ]
+    flagstat         = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ]
+    idxstats         = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
+    samtools_version = BAM_SORT_SAMTOOLS.out.version  //    path: *.version.txt
+}
diff --git a/subworkflows/nf-core/align_star.nf b/subworkflows/nf-core/align_star.nf
index 05ace30af..3ce084346 100644
--- a/subworkflows/nf-core/align_star.nf
+++ b/subworkflows/nf-core/align_star.nf
@@ -1,48 +1,48 @@
-/*
- * Alignment with STAR
- */
-
-params.align_options          = [:]
-params.samtools_sort_options  = [:]
-params.samtools_index_options = [:]
-params.samtools_stats_options = [:]
-
-include { STAR_ALIGN        } from '../../modules/nf-core/software/star/align/main' addParams( options: params.align_options    )
-include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools'                            addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options )
-
-workflow ALIGN_STAR {
-    take:
-    reads // channel: [ val(meta), [ reads ] ]
-    index // channel: /path/to/star/index/
-    gtf   // channel: /path/to/genome.gtf
-    
-    main:
-    /*
-     * Map reads with STAR
-     */
-    STAR_ALIGN ( reads, index, gtf )
-
-    /*
-     * Sort, index BAM file and run samtools stats, flagstat and idxstats
-     */
-    BAM_SORT_SAMTOOLS ( STAR_ALIGN.out.bam )
-
-    emit:
-    orig_bam         = STAR_ALIGN.out.bam             // channel: [ val(meta), bam            ]
-    log_final        = STAR_ALIGN.out.log_final       // channel: [ val(meta), log_final      ]
-    log_out          = STAR_ALIGN.out.log_out         // channel: [ val(meta), log_out        ]
-    log_progress     = STAR_ALIGN.out.log_progress    // channel: [ val(meta), log_progress   ]
-    bam_sorted       = STAR_ALIGN.out.bam_sorted      // channel: [ val(meta), bam_sorted     ]
-    bam_transcript   = STAR_ALIGN.out.bam_transcript  // channel: [ val(meta), bam_transcript ]
-    fastq            = STAR_ALIGN.out.fastq           // channel: [ val(meta), fastq          ]
-    tab              = STAR_ALIGN.out.tab             // channel: [ val(meta), tab            ]
-    star_version     = STAR_ALIGN.out.version         // path: *.version.txt
-    
-    bam              = BAM_SORT_SAMTOOLS.out.bam      // channel: [ val(meta), [ bam ] ]
-    bai              = BAM_SORT_SAMTOOLS.out.bai      // channel: [ val(meta), [ bai ] ]
-    csi              = BAM_SORT_SAMTOOLS.out.csi      // channel: [ val(meta), [ csi ] ]
-    stats            = BAM_SORT_SAMTOOLS.out.stats    // channel: [ val(meta), [ stats ] ]
-    flagstat         = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ]
-    idxstats         = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
-    samtools_version = BAM_SORT_SAMTOOLS.out.version  //    path: *.version.txt
-}
+/*
+ * Alignment with STAR
+ */
+
+params.align_options          = [:]
+params.samtools_sort_options  = [:]
+params.samtools_index_options = [:]
+params.samtools_stats_options = [:]
+
+include { STAR_ALIGN        } from '../../modules/nf-core/software/star/align/main' addParams( options: params.align_options    )
+include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools'                            addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options )
+
+workflow ALIGN_STAR {
+    take:
+    reads // channel: [ val(meta), [ reads ] ]
+    index // channel: /path/to/star/index/
+    gtf   // channel: /path/to/genome.gtf
+
+    main:
+    /*
+     * Map reads with STAR
+     */
+    STAR_ALIGN ( reads, index, gtf )
+
+    /*
+     * Sort, index BAM file and run samtools stats, flagstat and idxstats
+     */
+    BAM_SORT_SAMTOOLS ( STAR_ALIGN.out.bam )
+
+    emit:
+    orig_bam         = STAR_ALIGN.out.bam             // channel: [ val(meta), bam            ]
+    log_final        = STAR_ALIGN.out.log_final       // channel: [ val(meta), log_final      ]
+    log_out          = STAR_ALIGN.out.log_out         // channel: [ val(meta), log_out        ]
+    log_progress     = STAR_ALIGN.out.log_progress    // channel: [ val(meta), log_progress   ]
+    bam_sorted       = STAR_ALIGN.out.bam_sorted      // channel: [ val(meta), bam_sorted     ]
+    bam_transcript   = STAR_ALIGN.out.bam_transcript  // channel: [ val(meta), bam_transcript ]
+    fastq            = STAR_ALIGN.out.fastq           // channel: [ val(meta), fastq          ]
+    tab              = STAR_ALIGN.out.tab             // channel: [ val(meta), tab            ]
+    star_version     = STAR_ALIGN.out.version         // path: *.version.txt
+
+    bam              = BAM_SORT_SAMTOOLS.out.bam      // channel: [ val(meta), [ bam ] ]
+    bai              = BAM_SORT_SAMTOOLS.out.bai      // channel: [ val(meta), [ bai ] ]
+    csi              = BAM_SORT_SAMTOOLS.out.csi      // channel: [ val(meta), [ csi ] ]
+    stats            = BAM_SORT_SAMTOOLS.out.stats    // channel: [ val(meta), [ stats ] ]
+    flagstat         = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ]
+    idxstats         = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
+    samtools_version = BAM_SORT_SAMTOOLS.out.version  //    path: *.version.txt
+}
diff --git a/subworkflows/nf-core/bam_sort_samtools.nf b/subworkflows/nf-core/bam_sort_samtools.nf
index 0bc45eb80..212536cf8 100644
--- a/subworkflows/nf-core/bam_sort_samtools.nf
+++ b/subworkflows/nf-core/bam_sort_samtools.nf
@@ -1,45 +1,45 @@
-/*
- * Sort, index BAM file and run samtools stats, flagstat and idxstats
- */
-
-params.sort_options  = [:]
-params.index_options = [:]
-params.stats_options = [:]
-
-include { SAMTOOLS_SORT      } from '../../modules/nf-core/software/samtools/sort/main'  addParams( options: params.sort_options  )
-include { SAMTOOLS_INDEX     } from '../../modules/nf-core/software/samtools/index/main' addParams( options: params.index_options )
-include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools'                               addParams( options: params.stats_options )
-
-workflow BAM_SORT_SAMTOOLS {
-    take:
-    ch_bam // channel: [ val(meta), [ bam ] ]
-    
-    main:
-    SAMTOOLS_SORT      ( ch_bam )
-    SAMTOOLS_INDEX     ( SAMTOOLS_SORT.out.bam )
-
-    SAMTOOLS_SORT.out.bam
-        .join(SAMTOOLS_INDEX.out.bai, by: [0], remainder: true)
-        .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true)
-        .map { 
-            meta, bam, bai, csi ->
-                if (bai) {
-                    [ meta, bam, bai ]
-                } else {
-                    [ meta, bam, csi ]
-                }
-        }
-        .set { ch_bam_bai }
-    
-    BAM_STATS_SAMTOOLS ( ch_bam_bai )
-
-    emit:
-    bam      = SAMTOOLS_SORT.out.bam           // channel: [ val(meta), [ bam ] ]
-    bai      = SAMTOOLS_INDEX.out.bai          // channel: [ val(meta), [ bai ] ]
-    csi      = SAMTOOLS_INDEX.out.csi          // channel: [ val(meta), [ csi ] ]
-    
-    stats    = BAM_STATS_SAMTOOLS.out.stats    // channel: [ val(meta), [ stats ] ]
-    flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ]
-    idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
-    version  = SAMTOOLS_SORT.out.version       //    path: *.version.txt
-}
+/*
+ * Sort, index BAM file and run samtools stats, flagstat and idxstats
+ */
+
+params.sort_options  = [:]
+params.index_options = [:]
+params.stats_options = [:]
+
+include { SAMTOOLS_SORT      } from '../../modules/nf-core/software/samtools/sort/main'  addParams( options: params.sort_options  )
+include { SAMTOOLS_INDEX     } from '../../modules/nf-core/software/samtools/index/main' addParams( options: params.index_options )
+include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools'                               addParams( options: params.stats_options )
+
+workflow BAM_SORT_SAMTOOLS {
+    take:
+    ch_bam // channel: [ val(meta), [ bam ] ]
+
+    main:
+    SAMTOOLS_SORT      ( ch_bam )
+    SAMTOOLS_INDEX     ( SAMTOOLS_SORT.out.bam )
+
+    SAMTOOLS_SORT.out.bam
+        .join(SAMTOOLS_INDEX.out.bai, by: [0], remainder: true)
+        .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true)
+        .map {
+            meta, bam, bai, csi ->
+                if (bai) {
+                    [ meta, bam, bai ]
+                } else {
+                    [ meta, bam, csi ]
+                }
+        }
+        .set { ch_bam_bai }
+
+    BAM_STATS_SAMTOOLS ( ch_bam_bai )
+
+    emit:
+    bam      = SAMTOOLS_SORT.out.bam           // channel: [ val(meta), [ bam ] ]
+    bai      = SAMTOOLS_INDEX.out.bai          // channel: [ val(meta), [ bai ] ]
+    csi      = SAMTOOLS_INDEX.out.csi          // channel: [ val(meta), [ csi ] ]
+
+    stats    = BAM_STATS_SAMTOOLS.out.stats    // channel: [ val(meta), [ stats ] ]
+    flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ]
+    idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
+    version  = SAMTOOLS_SORT.out.version       //    path: *.version.txt
+}
diff --git a/subworkflows/nf-core/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf
index 7d30b5cfd..7e9513394 100644
--- a/subworkflows/nf-core/bam_stats_samtools.nf
+++ b/subworkflows/nf-core/bam_stats_samtools.nf
@@ -1,25 +1,25 @@
-/*
- * Run SAMtools stats, flagstat and idxstats
- */
-
-params.options = [:]
-
-include { SAMTOOLS_STATS    } from '../../modules/nf-core/software/samtools/stats/main'    addParams( options: params.options )
-include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/software/samtools/idxstats/main' addParams( options: params.options )
-include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/software/samtools/flagstat/main' addParams( options: params.options )
-
-workflow BAM_STATS_SAMTOOLS {
-    take:
-    ch_bam_bai // channel: [ val(meta), [ bam ], [bai/csi] ]
-    
-    main:
-    SAMTOOLS_STATS    ( ch_bam_bai )
-    SAMTOOLS_FLAGSTAT ( ch_bam_bai )
-    SAMTOOLS_IDXSTATS ( ch_bam_bai )
-
-    emit:
-    stats    = SAMTOOLS_STATS.out.stats       // channel: [ val(meta), [ stats ] ]
-    flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), [ flagstat ] ]
-    idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
-    version  = SAMTOOLS_STATS.out.version     //    path: *.version.txt
-}
+/*
+ * Run SAMtools stats, flagstat and idxstats
+ */
+
+params.options = [:]
+
+include { SAMTOOLS_STATS    } from '../../modules/nf-core/software/samtools/stats/main'    addParams( options: params.options )
+include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/software/samtools/idxstats/main' addParams( options: params.options )
+include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/software/samtools/flagstat/main' addParams( options: params.options )
+
+workflow BAM_STATS_SAMTOOLS {
+    take:
+    ch_bam_bai // channel: [ val(meta), [ bam ], [bai/csi] ]
+
+    main:
+    SAMTOOLS_STATS    ( ch_bam_bai )
+    SAMTOOLS_FLAGSTAT ( ch_bam_bai )
+    SAMTOOLS_IDXSTATS ( ch_bam_bai )
+
+    emit:
+    stats    = SAMTOOLS_STATS.out.stats       // channel: [ val(meta), [ stats ] ]
+    flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), [ flagstat ] ]
+    idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
+    version  = SAMTOOLS_STATS.out.version     //    path: *.version.txt
+}
diff --git a/subworkflows/nf-core/bedgraph_to_bigwig.nf b/subworkflows/nf-core/bedgraph_to_bigwig.nf
index 7ee3f076c..5b8b092ea 100644
--- a/subworkflows/nf-core/bedgraph_to_bigwig.nf
+++ b/subworkflows/nf-core/bedgraph_to_bigwig.nf
@@ -1,31 +1,31 @@
-/*
- * Clip over-running ends from bedGraph file and convert to bigWig
- */
-
-params.bedclip_options          = [:]
-params.bedgraphtobigwig_options = [:]
-
-include { UCSC_BEDCLIP          } from '../../modules/nf-core/software/ucsc/bedclip/main'          addParams( options: params.bedclip_options          )
-include { UCSC_BEDGRAPHTOBIGWIG } from '../../modules/nf-core/software/ucsc/bedgraphtobigwig/main' addParams( options: params.bedgraphtobigwig_options )
-
-workflow BEDGRAPH_TO_BIGWIG {
-    take:
-    bedgraph // channel: [ val(meta), [ bedgraph ] ]
-    sizes    //    path: chrom.sizes
-
-    main:
-    /*
-     * Clip bedGraph file
-     */
-    UCSC_BEDCLIP ( bedgraph, sizes )
-
-    /*
-     * Convert bedGraph to bigWig
-     */ 
-    UCSC_BEDGRAPHTOBIGWIG ( UCSC_BEDCLIP.out.bedgraph, sizes )
-
-    emit:
-    bigwig       = UCSC_BEDGRAPHTOBIGWIG.out.bigwig // channel: [ val(meta), [ bigwig ] ]
-    bedgraph     = UCSC_BEDCLIP.out.bedgraph        // channel: [ val(meta), [ bedgraph ] ]
-    ucsc_version = UCSC_BEDCLIP.out.version         //    path: *.version.txt
-}
+/*
+ * Clip over-running ends from bedGraph file and convert to bigWig
+ */
+
+params.bedclip_options          = [:]
+params.bedgraphtobigwig_options = [:]
+
+include { UCSC_BEDCLIP          } from '../../modules/nf-core/software/ucsc/bedclip/main'          addParams( options: params.bedclip_options          )
+include { UCSC_BEDGRAPHTOBIGWIG } from '../../modules/nf-core/software/ucsc/bedgraphtobigwig/main' addParams( options: params.bedgraphtobigwig_options )
+
+workflow BEDGRAPH_TO_BIGWIG {
+    take:
+    bedgraph // channel: [ val(meta), [ bedgraph ] ]
+    sizes    //    path: chrom.sizes
+
+    main:
+    /*
+     * Clip bedGraph file
+     */
+    UCSC_BEDCLIP ( bedgraph, sizes )
+
+    /*
+     * Convert bedGraph to bigWig
+     */
+    UCSC_BEDGRAPHTOBIGWIG ( UCSC_BEDCLIP.out.bedgraph, sizes )
+
+    emit:
+    bigwig       = UCSC_BEDGRAPHTOBIGWIG.out.bigwig // channel: [ val(meta), [ bigwig ] ]
+    bedgraph     = UCSC_BEDCLIP.out.bedgraph        // channel: [ val(meta), [ bedgraph ] ]
+    ucsc_version = UCSC_BEDCLIP.out.version         //    path: *.version.txt
+}
diff --git a/subworkflows/nf-core/dedup_umi_umitools.nf b/subworkflows/nf-core/dedup_umi_umitools.nf
index 648f20ab6..c2feda10a 100644
--- a/subworkflows/nf-core/dedup_umi_umitools.nf
+++ b/subworkflows/nf-core/dedup_umi_umitools.nf
@@ -1,54 +1,54 @@
-/*
- * UMI-tools dedup, index BAM file and run samtools stats, flagstat and idxstats
- */
-
-params.umitools_options       = [:]
-params.samtools_index_options = [:]
-params.samtools_stats_options = [:]
-
-include { UMITOOLS_DEDUP     } from '../../modules/nf-core/software/umitools/dedup/main' addParams( options: params.umitools_options       )
-include { SAMTOOLS_INDEX     } from '../../modules/nf-core/software/samtools/index/main' addParams( options: params.samtools_index_options )
-include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools'                               addParams( options: params.samtools_stats_options )
-
-workflow DEDUP_UMI_UMITOOLS {
-    take:
-    bam_bai // channel: [ val(meta), [ bam ], [ bai/csi ] ]
-
-    main:
-    /*
-     * UMI-tools dedup
-     */
-    UMITOOLS_DEDUP ( bam_bai )
-
-    /*
-     * Index BAM file and run samtools stats, flagstat and idxstats
-     */
-    SAMTOOLS_INDEX ( UMITOOLS_DEDUP.out.bam )
-
-    UMITOOLS_DEDUP.out.bam
-        .join(SAMTOOLS_INDEX.out.bai, by: [0], remainder: true)
-        .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true)
-        .map { 
-            meta, bam, bai, csi ->
-                if (bai) {
-                    [ meta, bam, bai ]
-                } else {
-                    [ meta, bam, csi ]
-                }
-        }
-        .set { ch_bam_bai }
-
-    BAM_STATS_SAMTOOLS ( ch_bam_bai )
-
-    emit:
-    bam              = UMITOOLS_DEDUP.out.bam          // channel: [ val(meta), [ bam ] ]
-    tsv              = UMITOOLS_DEDUP.out.tsv          // channel: [ val(meta), [ tsv ] ]
-    umitools_version = UMITOOLS_DEDUP.out.version      //    path: *.version.txt
-
-    bai              = SAMTOOLS_INDEX.out.bai          // channel: [ val(meta), [ bai ] ]
-    csi              = SAMTOOLS_INDEX.out.csi          // channel: [ val(meta), [ csi ] ]
-    stats            = BAM_STATS_SAMTOOLS.out.stats    // channel: [ val(meta), [ stats ] ]
-    flagstat         = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ]
-    idxstats         = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
-    samtools_version = SAMTOOLS_INDEX.out.version      //    path: *.version.txt
-}
+/*
+ * UMI-tools dedup, index BAM file and run samtools stats, flagstat and idxstats
+ */
+
+params.umitools_options       = [:]
+params.samtools_index_options = [:]
+params.samtools_stats_options = [:]
+
+include { UMITOOLS_DEDUP     } from '../../modules/nf-core/software/umitools/dedup/main' addParams( options: params.umitools_options       )
+include { SAMTOOLS_INDEX     } from '../../modules/nf-core/software/samtools/index/main' addParams( options: params.samtools_index_options )
+include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools'                               addParams( options: params.samtools_stats_options )
+
+workflow DEDUP_UMI_UMITOOLS {
+    take:
+    bam_bai // channel: [ val(meta), [ bam ], [ bai/csi ] ]
+
+    main:
+    /*
+     * UMI-tools dedup
+     */
+    UMITOOLS_DEDUP ( bam_bai )
+
+    /*
+     * Index BAM file and run samtools stats, flagstat and idxstats
+     */
+    SAMTOOLS_INDEX ( UMITOOLS_DEDUP.out.bam )
+
+    UMITOOLS_DEDUP.out.bam
+        .join(SAMTOOLS_INDEX.out.bai, by: [0], remainder: true)
+        .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true)
+        .map {
+            meta, bam, bai, csi ->
+                if (bai) {
+                    [ meta, bam, bai ]
+                } else {
+                    [ meta, bam, csi ]
+                }
+        }
+        .set { ch_bam_bai }
+
+    BAM_STATS_SAMTOOLS ( ch_bam_bai )
+
+    emit:
+    bam              = UMITOOLS_DEDUP.out.bam          // channel: [ val(meta), [ bam ] ]
+    tsv              = UMITOOLS_DEDUP.out.tsv          // channel: [ val(meta), [ tsv ] ]
+    umitools_version = UMITOOLS_DEDUP.out.version      //    path: *.version.txt
+
+    bai              = SAMTOOLS_INDEX.out.bai          // channel: [ val(meta), [ bai ] ]
+    csi              = SAMTOOLS_INDEX.out.csi          // channel: [ val(meta), [ csi ] ]
+    stats            = BAM_STATS_SAMTOOLS.out.stats    // channel: [ val(meta), [ stats ] ]
+    flagstat         = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ]
+    idxstats         = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ]
+    samtools_version = SAMTOOLS_INDEX.out.version      //    path: *.version.txt
+}
diff --git a/subworkflows/nf-core/fastqc_umitools_trimgalore.nf b/subworkflows/nf-core/fastqc_umitools_trimgalore.nf
index 7ff26b0be..2b4980f31 100644
--- a/subworkflows/nf-core/fastqc_umitools_trimgalore.nf
+++ b/subworkflows/nf-core/fastqc_umitools_trimgalore.nf
@@ -1,66 +1,66 @@
-/*
- * Read QC, UMI extraction and trimming
- */
-
-params.fastqc_options     = [:]
-params.umitools_options   = [:]
-params.trimgalore_options = [:]
-
-include { FASTQC           } from '../../modules/nf-core/software/fastqc/main'           addParams( options: params.fastqc_options     )
-include { UMITOOLS_EXTRACT } from '../../modules/nf-core/software/umitools/extract/main' addParams( options: params.umitools_options   )
-include { TRIMGALORE       } from '../../modules/nf-core/software/trimgalore/main'       addParams( options: params.trimgalore_options )
-
-workflow FASTQC_UMITOOLS_TRIMGALORE {
-    take:
-    reads         // channel: [ val(meta), [ reads ] ]
-    skip_fastqc   // boolean: true/false
-    with_umi      // boolean: true/false
-    skip_trimming // boolean: true/false
-
-    main:
-    fastqc_html    = Channel.empty()
-    fastqc_zip     = Channel.empty()
-    fastqc_version = Channel.empty()
-    if (!skip_fastqc) {
-        FASTQC ( reads ).html.set { fastqc_html }
-        fastqc_zip     = FASTQC.out.zip
-        fastqc_version = FASTQC.out.version
-    }
-
-    umi_reads        = reads
-    umi_log          = Channel.empty()
-    umitools_version = Channel.empty()
-    if (with_umi) {
-        UMITOOLS_EXTRACT ( reads ).reads.set { umi_reads }
-        umi_log          = UMITOOLS_EXTRACT.out.log
-        umitools_version = UMITOOLS_EXTRACT.out.version
-    }
-
-    trim_reads = umi_reads
-    trim_html  = Channel.empty()
-    trim_zip   = Channel.empty()
-    trim_log   = Channel.empty()
-    trimgalore_version = Channel.empty()
-    if (!skip_trimming) {
-        TRIMGALORE ( umi_reads ).reads.set { trim_reads }
-        trim_html  = TRIMGALORE.out.html
-        trim_zip   = TRIMGALORE.out.zip
-        trim_log   = TRIMGALORE.out.log
-        trimgalore_version = TRIMGALORE.out.version
-    }
-
-    emit:
-    reads = trim_reads // channel: [ val(meta), [ reads ] ]
-
-    fastqc_html        // channel: [ val(meta), [ html ] ]
-    fastqc_zip         // channel: [ val(meta), [ zip ] ]
-    fastqc_version     //    path: *.version.txt
-
-    umi_log            // channel: [ val(meta), [ log ] ]
-    umitools_version   //    path: *.version.txt
-
-    trim_html          // channel: [ val(meta), [ html ] ]
-    trim_zip           // channel: [ val(meta), [ zip ] ]
-    trim_log           // channel: [ val(meta), [ txt ] ]
-    trimgalore_version //    path: *.version.txt
-}
+/*
+ * Read QC, UMI extraction and trimming
+ */
+
+params.fastqc_options     = [:]
+params.umitools_options   = [:]
+params.trimgalore_options = [:]
+
+include { FASTQC           } from '../../modules/nf-core/software/fastqc/main'           addParams( options: params.fastqc_options     )
+include { UMITOOLS_EXTRACT } from '../../modules/nf-core/software/umitools/extract/main' addParams( options: params.umitools_options   )
+include { TRIMGALORE       } from '../../modules/nf-core/software/trimgalore/main'       addParams( options: params.trimgalore_options )
+
+workflow FASTQC_UMITOOLS_TRIMGALORE {
+    take:
+    reads         // channel: [ val(meta), [ reads ] ]
+    skip_fastqc   // boolean: true/false
+    with_umi      // boolean: true/false
+    skip_trimming // boolean: true/false
+
+    main:
+    fastqc_html    = Channel.empty()
+    fastqc_zip     = Channel.empty()
+    fastqc_version = Channel.empty()
+    if (!skip_fastqc) {
+        FASTQC ( reads ).html.set { fastqc_html }
+        fastqc_zip     = FASTQC.out.zip
+        fastqc_version = FASTQC.out.version
+    }
+
+    umi_reads        = reads
+    umi_log          = Channel.empty()
+    umitools_version = Channel.empty()
+    if (with_umi) {
+        UMITOOLS_EXTRACT ( reads ).reads.set { umi_reads }
+        umi_log          = UMITOOLS_EXTRACT.out.log
+        umitools_version = UMITOOLS_EXTRACT.out.version
+    }
+
+    trim_reads = umi_reads
+    trim_html  = Channel.empty()
+    trim_zip   = Channel.empty()
+    trim_log   = Channel.empty()
+    trimgalore_version = Channel.empty()
+    if (!skip_trimming) {
+        TRIMGALORE ( umi_reads ).reads.set { trim_reads }
+        trim_html  = TRIMGALORE.out.html
+        trim_zip   = TRIMGALORE.out.zip
+        trim_log   = TRIMGALORE.out.log
+        trimgalore_version = TRIMGALORE.out.version
+    }
+
+    emit:
+    reads = trim_reads // channel: [ val(meta), [ reads ] ]
+
+    fastqc_html        // channel: [ val(meta), [ html ] ]
+    fastqc_zip         // channel: [ val(meta), [ zip ] ]
+    fastqc_version     //    path: *.version.txt
+
+    umi_log            // channel: [ val(meta), [ log ] ]
+    umitools_version   //    path: *.version.txt
+
+    trim_html          // channel: [ val(meta), [ html ] ]
+    trim_zip           // channel: [ val(meta), [ zip ] ]
+    trim_log           // channel: [ val(meta), [ txt ] ]
+    trimgalore_version //    path: *.version.txt
+}
diff --git a/subworkflows/nf-core/mark_duplicates_picard.nf b/subworkflows/nf-core/mark_duplicates_picard.nf
index 73fcef926..e17211fb1 100644
--- a/subworkflows/nf-core/mark_duplicates_picard.nf
+++ b/subworkflows/nf-core/mark_duplicates_picard.nf
@@ -1,54 +1,54 @@
-/*
- * Picard MarkDuplicates, index BAM file and run samtools stats, flagstat and idxstats
- */
-
-params.markduplicates_options = [:]
-params.samtools_index_options = [:]
-params.samtools_stats_options = [:]
-
-include { PICARD_MARKDUPLICATES } from '../../modules/nf-core/software/picard/markduplicates/main' addParams( options: params.markduplicates_options )
-include { SAMTOOLS_INDEX        } from '../../modules/nf-core/software/samtools/index/main'        addParams( options: params.samtools_index_options )
-include { BAM_STATS_SAMTOOLS    } from './bam_stats_samtools'                                      addParams( options: params.samtools_stats_options )
-
-workflow MARK_DUPLICATES_PICARD {
-    take:
-    bam // channel: [ val(meta), [ bam ] ]
-
-    main:
-    /*
-     * Picard MarkDuplicates
-     */
-    PICARD_MARKDUPLICATES ( bam )
-
-    /*
-     * Index BAM file and run samtools stats, flagstat and idxstats
-     */
-    SAMTOOLS_INDEX ( PICARD_MARKDUPLICATES.out.bam )
-
-    PICARD_MARKDUPLICATES.out.bam
-        .join(SAMTOOLS_INDEX.out.bai, by: [0], remainder: true)
-        .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true)
-        .map { 
-            meta, bam, bai, csi ->
-                if (bai) {
-                    [ meta, bam, bai ]
-                } else {
-                    [ meta, bam, csi ]
-                }
-        }
-        .set { ch_bam_bai }
-
-    BAM_STATS_SAMTOOLS ( ch_bam_bai )
-
-    emit:
-    bam              = PICARD_MARKDUPLICATES.out.bam     // channel: [ val(meta), [ bam ] ]
-    metrics          = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ]
-    picard_version   = PICARD_MARKDUPLICATES.out.version //    path: *.version.txt
-
-    bai              = SAMTOOLS_INDEX.out.bai            // channel: [ val(meta), [ bai ] ]
-    csi              = SAMTOOLS_INDEX.out.csi            // channel: [ val(meta), [ csi ] ]
-    stats            = BAM_STATS_SAMTOOLS.out.stats      // channel: [ val(meta), [ stats ] ]
-    flagstat         = BAM_STATS_SAMTOOLS.out.flagstat   // channel: [ val(meta), [ flagstat ] ]
-    idxstats         = BAM_STATS_SAMTOOLS.out.idxstats   // channel: [ val(meta), [ idxstats ] ]
-    samtools_version = SAMTOOLS_INDEX.out.version        //    path: *.version.txt
-}
+/*
+ * Picard MarkDuplicates, index BAM file and run samtools stats, flagstat and idxstats
+ */
+
+params.markduplicates_options = [:]
+params.samtools_index_options = [:]
+params.samtools_stats_options = [:]
+
+include { PICARD_MARKDUPLICATES } from '../../modules/nf-core/software/picard/markduplicates/main' addParams( options: params.markduplicates_options )
+include { SAMTOOLS_INDEX        } from '../../modules/nf-core/software/samtools/index/main'        addParams( options: params.samtools_index_options )
+include { BAM_STATS_SAMTOOLS    } from './bam_stats_samtools'                                      addParams( options: params.samtools_stats_options )
+
+workflow MARK_DUPLICATES_PICARD {
+    take:
+    bam // channel: [ val(meta), [ bam ] ]
+
+    main:
+    /*
+     * Picard MarkDuplicates
+     */
+    PICARD_MARKDUPLICATES ( bam )
+
+    /*
+     * Index BAM file and run samtools stats, flagstat and idxstats
+     */
+    SAMTOOLS_INDEX ( PICARD_MARKDUPLICATES.out.bam )
+
+    PICARD_MARKDUPLICATES.out.bam
+        .join(SAMTOOLS_INDEX.out.bai, by: [0], remainder: true)
+        .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true)
+        .map {
+            meta, bam, bai, csi ->
+                if (bai) {
+                    [ meta, bam, bai ]
+                } else {
+                    [ meta, bam, csi ]
+                }
+        }
+        .set { ch_bam_bai }
+
+    BAM_STATS_SAMTOOLS ( ch_bam_bai )
+
+    emit:
+    bam              = PICARD_MARKDUPLICATES.out.bam     // channel: [ val(meta), [ bam ] ]
+    metrics          = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ]
+    picard_version   = PICARD_MARKDUPLICATES.out.version //    path: *.version.txt
+
+    bai              = SAMTOOLS_INDEX.out.bai            // channel: [ val(meta), [ bai ] ]
+    csi              = SAMTOOLS_INDEX.out.csi            // channel: [ val(meta), [ csi ] ]
+    stats            = BAM_STATS_SAMTOOLS.out.stats      // channel: [ val(meta), [ stats ] ]
+    flagstat         = BAM_STATS_SAMTOOLS.out.flagstat   // channel: [ val(meta), [ flagstat ] ]
+    idxstats         = BAM_STATS_SAMTOOLS.out.idxstats   // channel: [ val(meta), [ idxstats ] ]
+    samtools_version = SAMTOOLS_INDEX.out.version        //    path: *.version.txt
+}
diff --git a/subworkflows/nf-core/rseqc.nf b/subworkflows/nf-core/rseqc.nf
index b6b39ce46..f84696a35 100644
--- a/subworkflows/nf-core/rseqc.nf
+++ b/subworkflows/nf-core/rseqc.nf
@@ -1,157 +1,157 @@
-/*
- * Run RSeQC modules
- */
-
-params.bamstat_options            = [:]
-params.innerdistance_options      = [:]
-params.inferexperiment_options    = [:]
-params.junctionannotation_options = [:]
-params.junctionsaturation_options = [:]
-params.readdistribution_options   = [:]
-params.readduplication_options    = [:]
-
-include { RSEQC_BAMSTAT            } from '../../modules/nf-core/software/rseqc/bamstat/main'            addParams( options: params.bamstat_options            )
-include { RSEQC_INNERDISTANCE      } from '../../modules/nf-core/software/rseqc/innerdistance/main'      addParams( options: params.innerdistance_options      )
-include { RSEQC_INFEREXPERIMENT    } from '../../modules/nf-core/software/rseqc/inferexperiment/main'    addParams( options: params.inferexperiment_options    )
-include { RSEQC_JUNCTIONANNOTATION } from '../../modules/nf-core/software/rseqc/junctionannotation/main' addParams( options: params.junctionannotation_options )
-include { RSEQC_JUNCTIONSATURATION } from '../../modules/nf-core/software/rseqc/junctionsaturation/main' addParams( options: params.junctionsaturation_options )
-include { RSEQC_READDISTRIBUTION   } from '../../modules/nf-core/software/rseqc/readdistribution/main'   addParams( options: params.readdistribution_options   )
-include { RSEQC_READDUPLICATION    } from '../../modules/nf-core/software/rseqc/readduplication/main'    addParams( options: params.readduplication_options    )
-
-workflow RSEQC {
-    take:
-    bam           // channel: [ val(meta), [ ban ] ]
-    bed           //    file: /path/to/genome.bed
-    rseqc_modules //    list: rseqc modules to run
-
-    main:
-    /*
-     * Run RSeQC bam_stat.py
-     */
-    version       = Channel.empty()
-    bamstat_txt   = Channel.empty()
-    if ('bam_stat' in rseqc_modules) {
-        RSEQC_BAMSTAT ( bam )
-        bamstat_txt = RSEQC_BAMSTAT.out.txt
-        version     = RSEQC_BAMSTAT.out.version
-    }
-
-    /*
-     * Run RSeQC inner_distance.py
-     */
-    innerdistance_distance = Channel.empty()
-    innerdistance_freq     = Channel.empty()
-    innerdistance_mean     = Channel.empty()
-    innerdistance_pdf      = Channel.empty()
-    innerdistance_rscript  = Channel.empty()
-    if ('inner_distance' in rseqc_modules) {
-        RSEQC_INNERDISTANCE ( bam, bed )
-        innerdistance_distance = RSEQC_INNERDISTANCE.out.distance
-        innerdistance_freq     = RSEQC_INNERDISTANCE.out.freq
-        innerdistance_mean     = RSEQC_INNERDISTANCE.out.mean
-        innerdistance_pdf      = RSEQC_INNERDISTANCE.out.pdf
-        innerdistance_rscript  = RSEQC_INNERDISTANCE.out.rscript
-        version                = RSEQC_INNERDISTANCE.out.version
-    }
-
-    /*
-     * Run RSeQC infer_experiment.py
-     */
-    inferexperiment_txt   = Channel.empty()
-    if ('infer_experiment' in rseqc_modules) {
-        RSEQC_INFEREXPERIMENT ( bam, bed )
-        inferexperiment_txt = RSEQC_INFEREXPERIMENT.out.txt
-        version             = RSEQC_INFEREXPERIMENT.out.version
-    }
-
-    /*
-     * Run RSeQC junction_annotation.py
-     */
-    junctionannotation_bed          = Channel.empty()
-    junctionannotation_interact_bed = Channel.empty()
-    junctionannotation_xls          = Channel.empty()
-    junctionannotation_pdf          = Channel.empty()
-    junctionannotation_events_pdf   = Channel.empty()
-    junctionannotation_rscript      = Channel.empty()
-    junctionannotation_log          = Channel.empty()
-    if ('junction_annotation' in rseqc_modules) {
-        RSEQC_JUNCTIONANNOTATION ( bam, bed )
-        junctionannotation_bed          = RSEQC_JUNCTIONANNOTATION.out.bed
-        junctionannotation_interact_bed = RSEQC_JUNCTIONANNOTATION.out.interact_bed
-        junctionannotation_xls          = RSEQC_JUNCTIONANNOTATION.out.xls
-        junctionannotation_pdf          = RSEQC_JUNCTIONANNOTATION.out.pdf
-        junctionannotation_events_pdf   = RSEQC_JUNCTIONANNOTATION.out.events_pdf
-        junctionannotation_rscript      = RSEQC_JUNCTIONANNOTATION.out.rscript
-        junctionannotation_log          = RSEQC_JUNCTIONANNOTATION.out.log
-        version                         = RSEQC_JUNCTIONANNOTATION.out.version
-    }
-
-    /*
-     * Run RSeQC junction_saturation.py
-     */
-    junctionsaturation_pdf     = Channel.empty()
-    junctionsaturation_rscript = Channel.empty()
-    if ('junction_saturation' in rseqc_modules) {
-        RSEQC_JUNCTIONSATURATION ( bam, bed )
-        junctionsaturation_pdf     = RSEQC_JUNCTIONSATURATION.out.pdf
-        junctionsaturation_rscript = RSEQC_JUNCTIONSATURATION.out.rscript
-        version                    = RSEQC_JUNCTIONSATURATION.out.version
-    }
-
-    /*
-     * Run RSeQC read_distribution.py
-     */
-    readdistribution_txt = Channel.empty()
-    if ('read_distribution' in rseqc_modules) {
-        RSEQC_READDISTRIBUTION ( bam, bed )
-        readdistribution_txt = RSEQC_READDISTRIBUTION.out.txt
-        version              = RSEQC_READDISTRIBUTION.out.version
-    }
-
-    /*
-     * Run RSeQC read_duplication.py
-     */
-    readduplication_seq_xls = Channel.empty()
-    readduplication_pos_xls = Channel.empty()
-    readduplication_pdf     = Channel.empty()
-    readduplication_rscript = Channel.empty()
-    if ('read_duplication' in rseqc_modules) {
-        RSEQC_READDUPLICATION ( bam )
-        readduplication_seq_xls = RSEQC_READDUPLICATION.out.seq_xls
-        readduplication_pos_xls = RSEQC_READDUPLICATION.out.pos_xls
-        readduplication_pdf     = RSEQC_READDUPLICATION.out.pdf
-        readduplication_rscript = RSEQC_READDUPLICATION.out.rscript
-        version                 = RSEQC_READDUPLICATION.out.version
-    }
-
-    emit:
-    bamstat_txt                     // channel: [ val(meta), txt ]
-
-    innerdistance_distance          // channel: [ val(meta), txt ]
-    innerdistance_freq              // channel: [ val(meta), txt ]
-    innerdistance_mean              // channel: [ val(meta), txt ]
-    innerdistance_pdf               // channel: [ val(meta), pdf ]
-    innerdistance_rscript           // channel: [ val(meta), r   ]
-
-    inferexperiment_txt             // channel: [ val(meta), txt ]
-
-    junctionannotation_bed          // channel: [ val(meta), bed ]
-    junctionannotation_interact_bed // channel: [ val(meta), bed ]
-    junctionannotation_xls          // channel: [ val(meta), xls ]
-    junctionannotation_pdf          // channel: [ val(meta), pdf ]
-    junctionannotation_events_pdf   // channel: [ val(meta), pdf ]
-    junctionannotation_rscript      // channel: [ val(meta), r   ]
-    junctionannotation_log          // channel: [ val(meta), log ]
-
-    junctionsaturation_pdf          // channel: [ val(meta), pdf ]
-    junctionsaturation_rscript      // channel: [ val(meta), r   ]
-
-    readdistribution_txt            // channel: [ val(meta), txt ]
-
-    readduplication_seq_xls         // channel: [ val(meta), xls ]
-    readduplication_pos_xls         // channel: [ val(meta), xls ]
-    readduplication_pdf             // channel: [ val(meta), pdf ]
-    readduplication_rscript         // channel: [ val(meta), r   ]
-
-    version                         //    path: *.version.txt
-}
+/*
+ * Run RSeQC modules
+ */
+
+params.bamstat_options            = [:]
+params.innerdistance_options      = [:]
+params.inferexperiment_options    = [:]
+params.junctionannotation_options = [:]
+params.junctionsaturation_options = [:]
+params.readdistribution_options   = [:]
+params.readduplication_options    = [:]
+
+include { RSEQC_BAMSTAT            } from '../../modules/nf-core/software/rseqc/bamstat/main'            addParams( options: params.bamstat_options            )
+include { RSEQC_INNERDISTANCE      } from '../../modules/nf-core/software/rseqc/innerdistance/main'      addParams( options: params.innerdistance_options      )
+include { RSEQC_INFEREXPERIMENT    } from '../../modules/nf-core/software/rseqc/inferexperiment/main'    addParams( options: params.inferexperiment_options    )
+include { RSEQC_JUNCTIONANNOTATION } from '../../modules/nf-core/software/rseqc/junctionannotation/main' addParams( options: params.junctionannotation_options )
+include { RSEQC_JUNCTIONSATURATION } from '../../modules/nf-core/software/rseqc/junctionsaturation/main' addParams( options: params.junctionsaturation_options )
+include { RSEQC_READDISTRIBUTION   } from '../../modules/nf-core/software/rseqc/readdistribution/main'   addParams( options: params.readdistribution_options   )
+include { RSEQC_READDUPLICATION    } from '../../modules/nf-core/software/rseqc/readduplication/main'    addParams( options: params.readduplication_options    )
+
+workflow RSEQC {
+    take:
+    bam           // channel: [ val(meta), [ ban ] ]
+    bed           //    file: /path/to/genome.bed
+    rseqc_modules //    list: rseqc modules to run
+
+    main:
+    /*
+     * Run RSeQC bam_stat.py
+     */
+    version       = Channel.empty()
+    bamstat_txt   = Channel.empty()
+    if ('bam_stat' in rseqc_modules) {
+        RSEQC_BAMSTAT ( bam )
+        bamstat_txt = RSEQC_BAMSTAT.out.txt
+        version     = RSEQC_BAMSTAT.out.version
+    }
+
+    /*
+     * Run RSeQC inner_distance.py
+     */
+    innerdistance_distance = Channel.empty()
+    innerdistance_freq     = Channel.empty()
+    innerdistance_mean     = Channel.empty()
+    innerdistance_pdf      = Channel.empty()
+    innerdistance_rscript  = Channel.empty()
+    if ('inner_distance' in rseqc_modules) {
+        RSEQC_INNERDISTANCE ( bam, bed )
+        innerdistance_distance = RSEQC_INNERDISTANCE.out.distance
+        innerdistance_freq     = RSEQC_INNERDISTANCE.out.freq
+        innerdistance_mean     = RSEQC_INNERDISTANCE.out.mean
+        innerdistance_pdf      = RSEQC_INNERDISTANCE.out.pdf
+        innerdistance_rscript  = RSEQC_INNERDISTANCE.out.rscript
+        version                = RSEQC_INNERDISTANCE.out.version
+    }
+
+    /*
+     * Run RSeQC infer_experiment.py
+     */
+    inferexperiment_txt   = Channel.empty()
+    if ('infer_experiment' in rseqc_modules) {
+        RSEQC_INFEREXPERIMENT ( bam, bed )
+        inferexperiment_txt = RSEQC_INFEREXPERIMENT.out.txt
+        version             = RSEQC_INFEREXPERIMENT.out.version
+    }
+
+    /*
+     * Run RSeQC junction_annotation.py
+     */
+    junctionannotation_bed          = Channel.empty()
+    junctionannotation_interact_bed = Channel.empty()
+    junctionannotation_xls          = Channel.empty()
+    junctionannotation_pdf          = Channel.empty()
+    junctionannotation_events_pdf   = Channel.empty()
+    junctionannotation_rscript      = Channel.empty()
+    junctionannotation_log          = Channel.empty()
+    if ('junction_annotation' in rseqc_modules) {
+        RSEQC_JUNCTIONANNOTATION ( bam, bed )
+        junctionannotation_bed          = RSEQC_JUNCTIONANNOTATION.out.bed
+        junctionannotation_interact_bed = RSEQC_JUNCTIONANNOTATION.out.interact_bed
+        junctionannotation_xls          = RSEQC_JUNCTIONANNOTATION.out.xls
+        junctionannotation_pdf          = RSEQC_JUNCTIONANNOTATION.out.pdf
+        junctionannotation_events_pdf   = RSEQC_JUNCTIONANNOTATION.out.events_pdf
+        junctionannotation_rscript      = RSEQC_JUNCTIONANNOTATION.out.rscript
+        junctionannotation_log          = RSEQC_JUNCTIONANNOTATION.out.log
+        version                         = RSEQC_JUNCTIONANNOTATION.out.version
+    }
+
+    /*
+     * Run RSeQC junction_saturation.py
+     */
+    junctionsaturation_pdf     = Channel.empty()
+    junctionsaturation_rscript = Channel.empty()
+    if ('junction_saturation' in rseqc_modules) {
+        RSEQC_JUNCTIONSATURATION ( bam, bed )
+        junctionsaturation_pdf     = RSEQC_JUNCTIONSATURATION.out.pdf
+        junctionsaturation_rscript = RSEQC_JUNCTIONSATURATION.out.rscript
+        version                    = RSEQC_JUNCTIONSATURATION.out.version
+    }
+
+    /*
+     * Run RSeQC read_distribution.py
+     */
+    readdistribution_txt = Channel.empty()
+    if ('read_distribution' in rseqc_modules) {
+        RSEQC_READDISTRIBUTION ( bam, bed )
+        readdistribution_txt = RSEQC_READDISTRIBUTION.out.txt
+        version              = RSEQC_READDISTRIBUTION.out.version
+    }
+
+    /*
+     * Run RSeQC read_duplication.py
+     */
+    readduplication_seq_xls = Channel.empty()
+    readduplication_pos_xls = Channel.empty()
+    readduplication_pdf     = Channel.empty()
+    readduplication_rscript = Channel.empty()
+    if ('read_duplication' in rseqc_modules) {
+        RSEQC_READDUPLICATION ( bam )
+        readduplication_seq_xls = RSEQC_READDUPLICATION.out.seq_xls
+        readduplication_pos_xls = RSEQC_READDUPLICATION.out.pos_xls
+        readduplication_pdf     = RSEQC_READDUPLICATION.out.pdf
+        readduplication_rscript = RSEQC_READDUPLICATION.out.rscript
+        version                 = RSEQC_READDUPLICATION.out.version
+    }
+
+    emit:
+    bamstat_txt                     // channel: [ val(meta), txt ]
+
+    innerdistance_distance          // channel: [ val(meta), txt ]
+    innerdistance_freq              // channel: [ val(meta), txt ]
+    innerdistance_mean              // channel: [ val(meta), txt ]
+    innerdistance_pdf               // channel: [ val(meta), pdf ]
+    innerdistance_rscript           // channel: [ val(meta), r   ]
+
+    inferexperiment_txt             // channel: [ val(meta), txt ]
+
+    junctionannotation_bed          // channel: [ val(meta), bed ]
+    junctionannotation_interact_bed // channel: [ val(meta), bed ]
+    junctionannotation_xls          // channel: [ val(meta), xls ]
+    junctionannotation_pdf          // channel: [ val(meta), pdf ]
+    junctionannotation_events_pdf   // channel: [ val(meta), pdf ]
+    junctionannotation_rscript      // channel: [ val(meta), r   ]
+    junctionannotation_log          // channel: [ val(meta), log ]
+
+    junctionsaturation_pdf          // channel: [ val(meta), pdf ]
+    junctionsaturation_rscript      // channel: [ val(meta), r   ]
+
+    readdistribution_txt            // channel: [ val(meta), txt ]
+
+    readduplication_seq_xls         // channel: [ val(meta), xls ]
+    readduplication_pos_xls         // channel: [ val(meta), xls ]
+    readduplication_pdf             // channel: [ val(meta), pdf ]
+    readduplication_rscript         // channel: [ val(meta), r   ]
+
+    version                         //    path: *.version.txt
+}
diff --git a/workflows/rnaseq.nf b/workflows/rnaseq.nf
index 1d94c3b8d..40004030a 100755
--- a/workflows/rnaseq.nf
+++ b/workflows/rnaseq.nf
@@ -19,7 +19,7 @@ WorkflowRnaseq.initialise(params, log, valid_params)
 checkPathParamList = [
     params.input, params.multiqc_config,
     params.fasta, params.transcript_fasta, params.additional_fasta,
-    params.gtf, params.gff, params.gene_bed, 
+    params.gtf, params.gff, params.gene_bed,
     params.ribo_database_manifest, params.splicesites,
     params.star_index, params.hisat2_index, params.rsem_index, params.salmon_index
 ]
@@ -52,7 +52,7 @@ ch_dummy_file = file("$projectDir/assets/dummy_file.txt", checkIfExists: true)
 
 /*
 ========================================================================================
-    CONFIG FILES       
+    CONFIG FILES
 ========================================================================================
 */
 
@@ -247,7 +247,7 @@ workflow RNASEQ {
     /*
      * SUBWORKFLOW: Read in samplesheet, validate and stage input files
      */
-    INPUT_CHECK ( 
+    INPUT_CHECK (
         ch_input
     )
     .map {
@@ -263,11 +263,11 @@ workflow RNASEQ {
                 return [ meta, fastq.flatten() ]
     }
     .set { ch_fastq }
-    
+
     /*
      * MODULE: Concatenate FastQ files from same sample if required
      */
-    CAT_FASTQ ( 
+    CAT_FASTQ (
         ch_fastq.multiple
     )
     .mix(ch_fastq.single)
@@ -294,8 +294,8 @@ workflow RNASEQ {
     if (params.remove_ribo_rna) {
         ch_sortmerna_fasta = Channel.from(ch_ribo_db.readLines()).map { row -> file(row) }.collect()
 
-        SORTMERNA ( 
-            ch_trimmed_reads, 
+        SORTMERNA (
+            ch_trimmed_reads,
             ch_sortmerna_fasta
         )
         .reads
@@ -435,7 +435,7 @@ workflow RNASEQ {
      * SUBWORKFLOW: Alignment with HISAT2
      */
     ch_hisat2_multiqc = Channel.empty()
-    if (!params.skip_alignment && params.aligner == 'hisat2') {        
+    if (!params.skip_alignment && params.aligner == 'hisat2') {
         ALIGN_HISAT2 (
             ch_trimmed_reads,
             PREPARE_GENOME.out.hisat2_index,
@@ -489,7 +489,7 @@ workflow RNASEQ {
             .join(ch_percent_mapped, by: [0])
             .map { meta, ofile, mapped, pass -> if (pass) [ meta, ofile ] }
             .set { ch_genome_bam_index }
-        
+
         ch_percent_mapped
             .branch { meta, mapped, pass ->
                 pass: pass
@@ -501,7 +501,7 @@ workflow RNASEQ {
             }
             .set { ch_pass_fail_mapped }
 
-        MULTIQC_CUSTOM_FAIL_MAPPED ( 
+        MULTIQC_CUSTOM_FAIL_MAPPED (
             ch_pass_fail_mapped.fail.collect()
         )
         .set { ch_fail_mapping_multiqc }
@@ -512,7 +512,7 @@ workflow RNASEQ {
      */
     ch_preseq_multiqc = Channel.empty()
     if (!params.skip_alignment && !params.skip_qc && !params.skip_preseq) {
-        PRESEQ_LCEXTRAP ( 
+        PRESEQ_LCEXTRAP (
             ch_genome_bam
         )
         ch_preseq_multiqc    = PRESEQ_LCEXTRAP.out.ccurve
@@ -543,8 +543,8 @@ workflow RNASEQ {
      * MODULE: STRINGTIE
      */
     if (!params.skip_alignment && !params.skip_stringtie) {
-        STRINGTIE ( 
-            ch_genome_bam, 
+        STRINGTIE (
+            ch_genome_bam,
             PREPARE_GENOME.out.gtf
         )
         ch_software_versions = ch_software_versions.mix(STRINGTIE.out.version.first().ifEmpty(null))
@@ -555,7 +555,7 @@ workflow RNASEQ {
      */
     ch_featurecounts_multiqc = Channel.empty()
     if (!params.skip_alignment && !params.skip_qc && !params.skip_biotype_qc && biotype) {
-        
+
         PREPARE_GENOME
             .out
             .gtf
@@ -569,14 +569,14 @@ workflow RNASEQ {
             .filter { it[-1] }
             .map { it[0..<it.size()-1] }
             .set { ch_featurecounts }
-        
-        SUBREAD_FEATURECOUNTS ( 
+
+        SUBREAD_FEATURECOUNTS (
             ch_featurecounts
         )
         ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null))
 
-        MULTIQC_CUSTOM_BIOTYPE ( 
-            SUBREAD_FEATURECOUNTS.out.counts, 
+        MULTIQC_CUSTOM_BIOTYPE (
+            SUBREAD_FEATURECOUNTS.out.counts,
             ch_biotypes_header_multiqc
         )
         ch_featurecounts_multiqc = MULTIQC_CUSTOM_BIOTYPE.out.tsv
@@ -622,16 +622,16 @@ workflow RNASEQ {
     ch_fail_strand_multiqc        = Channel.empty()
     if (!params.skip_alignment && !params.skip_qc) {
         if (!params.skip_qualimap) {
-            QUALIMAP_RNASEQ ( 
-                ch_genome_bam, 
+            QUALIMAP_RNASEQ (
+                ch_genome_bam,
                 PREPARE_GENOME.out.gtf
             )
             ch_qualimap_multiqc  = QUALIMAP_RNASEQ.out.results
             ch_software_versions = ch_software_versions.mix(QUALIMAP_RNASEQ.out.version.first().ifEmpty(null))
         }
         if (!params.skip_dupradar) {
-            DUPRADAR ( 
-                ch_genome_bam, 
+            DUPRADAR (
+                ch_genome_bam,
                 PREPARE_GENOME.out.gtf
             )
             ch_dupradar_multiqc  = DUPRADAR.out.multiqc
@@ -660,7 +660,7 @@ workflow RNASEQ {
                 }
                 .set { ch_fail_strand }
 
-            MULTIQC_CUSTOM_STRAND_CHECK ( 
+            MULTIQC_CUSTOM_STRAND_CHECK (
                 ch_fail_strand.collect()
             )
             .set { ch_fail_strand_multiqc }
@@ -713,8 +713,8 @@ workflow RNASEQ {
         .flatten()
         .collect()
         .set { ch_software_versions }
-        
-    GET_SOFTWARE_VERSIONS ( 
+
+    GET_SOFTWARE_VERSIONS (
         ch_software_versions.map { it }.collect()
     )
 
diff --git a/workflows/sra_download.nf b/workflows/sra_download.nf
index 28d8afd2c..9545239c9 100755
--- a/workflows/sra_download.nf
+++ b/workflows/sra_download.nf
@@ -4,15 +4,15 @@
 ========================================================================================
 */
 
-if (params.public_data_ids) { 
+if (params.public_data_ids) {
     Channel
         .from(file(params.public_data_ids, checkIfExists: true))
         .splitCsv(header:false, sep:'', strip:true)
         .map { it[0] }
         .unique()
         .set { ch_public_data_ids }
-} else { 
-    exit 1, 'Input file with public database ids not specified!' 
+} else {
+    exit 1, 'Input file with public database ids not specified!'
 }
 
 /*
@@ -56,8 +56,8 @@ workflow SRA_DOWNLOAD {
         .out
         .tsv
         .splitCsv(header:true, sep:'\t')
-        .map { 
-            meta -> 
+        .map {
+            meta ->
                 meta.single_end = meta.single_end.toBoolean()
                 [ meta, [ meta.fastq_1, meta.fastq_2 ] ]
         }