From 966c6b25a6e496c208fadb4aee047b085de94aed Mon Sep 17 00:00:00 2001
From: Usman Rashid <usman@smme.edu.pk>
Date: Thu, 10 Oct 2024 11:01:34 +1300
Subject: [PATCH 1/5] Template update for nf-core/tools version 3.0.1

---
 .editorconfig                                 |   4 -
 .github/CONTRIBUTING.md                       |   2 +-
 .github/workflows/linting.yml                 |   4 +-
 .nf-core.yml                                  |  23 +-
 .prettierignore                               |   1 -
 CHANGELOG.md                                  |   2 +-
 README.md                                     |   2 +-
 assets/email_template.html                    | 150 +++-------
 modules.json                                  |   4 +-
 nextflow.config                               |  14 +-
 .../utils_nfcore_assemblyqc_pipeline/main.nf  |  12 +-
 .../nf-core/utils_nextflow_pipeline/main.nf   |  46 ++-
 .../nf-core/utils_nfcore_pipeline/main.nf     | 279 ++++++++++--------
 13 files changed, 245 insertions(+), 298 deletions(-)

diff --git a/.editorconfig b/.editorconfig
index e1058815..72dda289 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -11,7 +11,6 @@ indent_style = space
 [*.{md,yml,yaml,html,css,scss,js}]
 indent_size = 2
 
-
 # These files are edited and tested upstream in nf-core/modules
 [/modules/nf-core/**]
 charset = unset
@@ -26,12 +25,9 @@ insert_final_newline = unset
 trim_trailing_whitespace = unset
 indent_style = unset
 
-
-
 [/assets/email*]
 indent_size = unset
 
-
 # ignore python and markdown
 [*.{py,md}]
 indent_style = unset
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 1391e6f0..d8dd3c9d 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -81,7 +81,7 @@ Once there, use `nf-core pipelines schema build` to add to `nextflow_schema.json
 
 ### Default processes resource requirements
 
-Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels.
+Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/main/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels.
 
 The process resources can be passed on to the tool dynamically within the process with the `${task.cpus}` and `${task.memory}` variables in the `script:` block.
 
diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml
index b882838a..a502573c 100644
--- a/.github/workflows/linting.yml
+++ b/.github/workflows/linting.yml
@@ -42,10 +42,10 @@ jobs:
           architecture: "x64"
 
       - name: read .nf-core.yml
-        uses: pietrobolcato/action-read-yaml@1.0.0
+        uses: pietrobolcato/action-read-yaml@1.1.0
         id: read_yml
         with:
-          config: ${{ github.workspace }}/.nf-core.yaml
+          config: ${{ github.workspace }}/.nf-core.yml
 
       - name: Install dependencies
         run: |
diff --git a/.nf-core.yml b/.nf-core.yml
index 56ab1ec3..e4559f27 100644
--- a/.nf-core.yml
+++ b/.nf-core.yml
@@ -1,9 +1,6 @@
 bump_version: null
 lint:
   files_exist:
-    - conf/igenomes.config
-    - conf/igenomes_ignored.config
-    - assets/multiqc_config.yml
     - conf/igenomes.config
     - conf/igenomes_ignored.config
     - assets/multiqc_config.yml
@@ -15,15 +12,12 @@ lint:
     - .github/workflows/awstest.yml
     - .github/workflows/awsfulltest.yml
   files_unchanged:
+    - LICENSE
     - .github/CONTRIBUTING.md
-    - assets/sendmail_template.txt
-    - .github/CONTRIBUTING.md
-    - assets/sendmail_template.txt
-    - CODE_OF_CONDUCT.md
-    - assets/nf-core-assemblyqc_logo_light.png
-    - docs/images/nf-core-assemblyqc_logo_light.png
-    - docs/images/nf-core-assemblyqc_logo_dark.png
-    - .github/ISSUE_TEMPLATE/bug_report.yml
+    - .github/PULL_REQUEST_TEMPLATE.md
+    - .github/workflows/branch.yml
+    - .github/workflows/linting.yml
+    - docs/README.md
   multiqc_config: false
   nextflow_config:
     - manifest.name
@@ -32,14 +26,15 @@ lint:
     - validation.help.afterText
     - validation.summary.beforeText
     - validation.summary.afterText
-nf_core_version: 3.0.0
+  template_strings: false
+nf_core_version: 3.0.1
 org_path: null
 repository_type: pipeline
 template:
   author: Usman Rashid, Ken Smith, Ross Crowhurst, Chen Wu, Marcus Davy
   description: A NextFlow pipeline which evaluates assembly quality with multiple
     QC tools and presents the results in a unified html report.
-  force: true
+  force: false
   is_nfcore: false
   name: assemblyqc
   org: plant-food-research-open
@@ -48,5 +43,5 @@ template:
     - igenomes
     - multiqc
     - fastqc
-  version: 1.0.0dev
+  version: 3.0.0
 update: null
diff --git a/.prettierignore b/.prettierignore
index 610e5069..437d763d 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,4 +1,3 @@
-
 email_template.html
 adaptivecard.json
 slackreport.json
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7f0eabfe..c7caa0f1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,7 @@
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
-## v1.0.0+dev - [date]
+## v3.0.0 - [date]
 
 Initial release of plant-food-research-open/assemblyqc, created with the [nf-core](https://nf-co.re/) template.
 
diff --git a/README.md b/README.md
index 73512f1d..392fad19 100644
--- a/README.md
+++ b/README.md
@@ -80,7 +80,7 @@ If you would like to contribute to this pipeline, please see the [contributing g
 
 An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.
 
-This pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/master/LICENSE).
+This pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).
 
 > **The nf-core framework for community-curated bioinformatics pipelines.**
 >
diff --git a/assets/email_template.html b/assets/email_template.html
index 49545d50..5a56215f 100644
--- a/assets/email_template.html
+++ b/assets/email_template.html
@@ -1,119 +1,53 @@
 <html>
-  <head>
-    <meta charset="utf-8" />
-    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
 
-    <meta
-      name="description"
-      content="plant-food-research-open/assemblyqc: A NextFlow pipeline which evaluates assembly quality with multiple QC tools and presents the results in a unified html report."
-    />
-    <title>plant-food-research-open/assemblyqc Pipeline Report</title>
-  </head>
-  <body>
-    <div style="font-family: Helvetica, Arial, sans-serif; padding: 30px; max-width: 800px; margin: 0 auto">
-      <img src="cid:nfcorepipelinelogo" />
+  <meta name="description" content="plant-food-research-open/assemblyqc: A NextFlow pipeline which evaluates assembly quality with multiple QC tools and presents the results in a unified html report.">
+  <title>plant-food-research-open/assemblyqc Pipeline Report</title>
+</head>
+<body>
+<div style="font-family: Helvetica, Arial, sans-serif; padding: 30px; max-width: 800px; margin: 0 auto;">
 
-      <h1>plant-food-research-open/assemblyqc ${version}</h1>
-      <h2>Run Name: $runName</h2>
+<img src="cid:nfcorepipelinelogo">
 
-      <% if (!success){ out << """
-      <div
-        style="
-          color: #a94442;
-          background-color: #f2dede;
-          border-color: #ebccd1;
-          padding: 15px;
-          margin-bottom: 20px;
-          border: 1px solid transparent;
-          border-radius: 4px;
-        "
-      >
-        <h4 style="margin-top: 0; color: inherit">
-          plant-food-research-open/assemblyqc execution completed unsuccessfully!
-        </h4>
+<h1>plant-food-research-open/assemblyqc ${version}</h1>
+<h2>Run Name: $runName</h2>
+
+<% if (!success){
+    out << """
+    <div style="color: #a94442; background-color: #f2dede; border-color: #ebccd1; padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px;">
+        <h4 style="margin-top:0; color: inherit;">plant-food-research-open/assemblyqc execution completed unsuccessfully!</h4>
         <p>The exit status of the task that caused the workflow execution to fail was: <code>$exitStatus</code>.</p>
         <p>The full error message was:</p>
-        <pre style="white-space: pre-wrap; overflow: visible; margin-bottom: 0">${errorReport}</pre>
-      </div>
-      """ } else { out << """
-      <div
-        style="
-          color: #3c763d;
-          background-color: #dff0d8;
-          border-color: #d6e9c6;
-          padding: 15px;
-          margin-bottom: 20px;
-          border: 1px solid transparent;
-          border-radius: 4px;
-        "
-      >
+        <pre style="white-space: pre-wrap; overflow: visible; margin-bottom: 0;">${errorReport}</pre>
+    </div>
+    """
+} else {
+    out << """
+    <div style="color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px;">
         plant-food-research-open/assemblyqc execution completed successfully!
-      </div>
-      """ } %>
+    </div>
+    """
+}
+%>
 
-      <p>The workflow was completed at <strong>$dateComplete</strong> (duration: <strong>$duration</strong>)</p>
-      <p>The command used to launch the workflow was as follows:</p>
-      <pre
-        style="
-          white-space: pre-wrap;
-          overflow: visible;
-          background-color: #ededed;
-          padding: 15px;
-          border-radius: 4px;
-          margin-bottom: 30px;
-        "
-      >
-$commandLine</pre
-      >
+<p>The workflow was completed at <strong>$dateComplete</strong> (duration: <strong>$duration</strong>)</p>
+<p>The command used to launch the workflow was as follows:</p>
+<pre style="white-space: pre-wrap; overflow: visible; background-color: #ededed; padding: 15px; border-radius: 4px; margin-bottom:30px;">$commandLine</pre>
 
-      <h3>Pipeline Configuration:</h3>
-      <table
-        style="
-          width: 100%;
-          max-width: 100%;
-          border-spacing: 0;
-          border-collapse: collapse;
-          border: 0;
-          margin-bottom: 30px;
-        "
-      >
-        <tbody style="border-bottom: 1px solid #ddd">
-          <% out << summary.collect{ k,v -> "
-          <tr>
-            <th
-              style="
-                text-align: left;
-                padding: 8px 0;
-                line-height: 1.42857143;
-                vertical-align: top;
-                border-top: 1px solid #ddd;
-              "
-            >
-              $k
-            </th>
-            <td
-              style="
-                text-align: left;
-                padding: 8px;
-                line-height: 1.42857143;
-                vertical-align: top;
-                border-top: 1px solid #ddd;
-              "
-            >
-              <pre style="white-space: pre-wrap; overflow: visible">$v</pre>
-            </td>
-          </tr>
-          " }.join("\n") %>
-        </tbody>
-      </table>
+<h3>Pipeline Configuration:</h3>
+<table style="width:100%; max-width:100%; border-spacing: 0; border-collapse: collapse; border:0; margin-bottom: 30px;">
+    <tbody style="border-bottom: 1px solid #ddd;">
+        <% out << summary.collect{ k,v -> "<tr><th style='text-align:left; padding: 8px 0; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd;'>$k</th><td style='text-align:left; padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd;'><pre style='white-space: pre-wrap; overflow: visible;'>$v</pre></td></tr>" }.join("\n") %>
+    </tbody>
+</table>
 
-      <p>plant-food-research-open/assemblyqc</p>
-      <p>
-        <a href="https://github.com/plant-food-research-open/assemblyqc"
-          >https://github.com/plant-food-research-open/assemblyqc</a
-        >
-      </p>
-    </div>
-  </body>
+<p>plant-food-research-open/assemblyqc</p>
+<p><a href="https://github.com/plant-food-research-open/assemblyqc">https://github.com/plant-food-research-open/assemblyqc</a></p>
+
+</div>
+
+</body>
 </html>
diff --git a/modules.json b/modules.json
index 5f5fbb68..b221651c 100644
--- a/modules.json
+++ b/modules.json
@@ -10,12 +10,12 @@
                 "nf-core": {
                     "utils_nextflow_pipeline": {
                         "branch": "master",
-                        "git_sha": "d20fb2a9cc3e2835e9d067d1046a63252eb17352",
+                        "git_sha": "9d05360da397692321d377b6102d2fb22507c6ef",
                         "installed_by": ["subworkflows"]
                     },
                     "utils_nfcore_pipeline": {
                         "branch": "master",
-                        "git_sha": "2fdce49d30c0254f76bc0f13c55c17455c1251ab",
+                        "git_sha": "772684d9d66f37b650c8ba5146ac1ee3ecba2acb",
                         "installed_by": ["subworkflows"]
                     },
                     "utils_nfschema_plugin": {
diff --git a/nextflow.config b/nextflow.config
index 7cb553f5..4d55e9cc 100644
--- a/nextflow.config
+++ b/nextflow.config
@@ -13,6 +13,10 @@ params {
     // Input options
     input                      = null
 
+    
+
+    
+
     // Boilerplate options
     outdir                       = null
     publish_dir_mode             = 'copy'
@@ -26,6 +30,7 @@ params {
     show_hidden                  = false
     version                      = false
     pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/'
+
     // Config options
     config_profile_name        = null
     config_profile_description = null
@@ -34,9 +39,9 @@ params {
     custom_config_base         = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}"
     config_profile_contact     = null
     config_profile_url         = null
+
     // Schema validation default options
     validate_params            = true
-    
 }
 
 // Load base.config by default for all pipelines
@@ -151,6 +156,7 @@ includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${pa
 // Load plant-food-research-open/assemblyqc custom profiles from different institutions.
 // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs
 // includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/assemblyqc.config" : "/dev/null"
+
 // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile
 // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled
 // Set to your registry if you have a mirror of containers
@@ -160,6 +166,8 @@ podman.registry       = 'quay.io'
 singularity.registry  = 'quay.io'
 charliecloud.registry = 'quay.io'
 
+
+
 // Export these variables to prevent local Python/R libraries from conflicting with those in the container
 // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container.
 // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable.
@@ -209,7 +217,7 @@ manifest {
     description     = """A NextFlow pipeline which evaluates assembly quality with multiple QC tools and presents the results in a unified html report."""
     mainScript      = 'main.nf'
     nextflowVersion = '!>=24.04.2'
-    version         = '1.0.0dev'
+    version         = '3.0.0'
     doi             = ''
 }
 
@@ -225,9 +233,9 @@ validation {
         command = "nextflow run $manifest.name -profile <docker/singularity/.../institute> --input samplesheet.csv --outdir <OUTDIR>"
         fullParameter = "help_full"
         showHiddenParameter = "show_hidden"
+        
     }
 }
 
 // Load modules.config for DSL2 module specific options
 includeConfig 'conf/modules.config'
-
diff --git a/subworkflows/local/utils_nfcore_assemblyqc_pipeline/main.nf b/subworkflows/local/utils_nfcore_assemblyqc_pipeline/main.nf
index fdc1719f..e3af7ecb 100644
--- a/subworkflows/local/utils_nfcore_assemblyqc_pipeline/main.nf
+++ b/subworkflows/local/utils_nfcore_assemblyqc_pipeline/main.nf
@@ -18,9 +18,9 @@ include { UTILS_NFCORE_PIPELINE     } from '../../nf-core/utils_nfcore_pipeline'
 include { UTILS_NEXTFLOW_PIPELINE   } from '../../nf-core/utils_nextflow_pipeline'
 
 /*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     SUBWORKFLOW TO INITIALISE PIPELINE
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
 workflow PIPELINE_INITIALISATION {
@@ -95,9 +95,9 @@ workflow PIPELINE_INITIALISATION {
 }
 
 /*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     SUBWORKFLOW FOR PIPELINE COMPLETION
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
 workflow PIPELINE_COMPLETION {
@@ -143,9 +143,9 @@ workflow PIPELINE_COMPLETION {
 }
 
 /*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     FUNCTIONS
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
 //
diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf
index 28e32b20..2b0dc67a 100644
--- a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf
+++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf
@@ -3,13 +3,12 @@
 //
 
 /*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     SUBWORKFLOW DEFINITION
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
 workflow UTILS_NEXTFLOW_PIPELINE {
-
     take:
     print_version        // boolean: print version
     dump_parameters      // boolean: dump parameters
@@ -22,7 +21,7 @@ workflow UTILS_NEXTFLOW_PIPELINE {
     // Print workflow version and exit on --version
     //
     if (print_version) {
-        log.info "${workflow.manifest.name} ${getWorkflowVersion()}"
+        log.info("${workflow.manifest.name} ${getWorkflowVersion()}")
         System.exit(0)
     }
 
@@ -45,9 +44,9 @@ workflow UTILS_NEXTFLOW_PIPELINE {
 }
 
 /*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     FUNCTIONS
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
 //
@@ -72,11 +71,11 @@ def getWorkflowVersion() {
 // Dump pipeline parameters to a JSON file
 //
 def dumpParametersToJSON(outdir) {
-    def timestamp  = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')
-    def filename   = "params_${timestamp}.json"
-    def temp_pf    = new File(workflow.launchDir.toString(), ".${filename}")
-    def jsonStr    = groovy.json.JsonOutput.toJson(params)
-    temp_pf.text   = groovy.json.JsonOutput.prettyPrint(jsonStr)
+    def timestamp = new java.util.Date().format('yyyy-MM-dd_HH-mm-ss')
+    def filename  = "params_${timestamp}.json"
+    def temp_pf   = new File(workflow.launchDir.toString(), ".${filename}")
+    def jsonStr   = groovy.json.JsonOutput.toJson(params)
+    temp_pf.text  = groovy.json.JsonOutput.prettyPrint(jsonStr)
 
     nextflow.extension.FilesEx.copyTo(temp_pf.toPath(), "${outdir}/pipeline_info/params_${timestamp}.json")
     temp_pf.delete()
@@ -91,9 +90,14 @@ def checkCondaChannels() {
     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
+    }
+    catch (NullPointerException e) {
+        log.warn("Could not verify conda channel configuration.")
+        return null
+    }
+    catch (IOException e) {
+        log.warn("Could not verify conda channel configuration.")
+        return null
     }
 
     // Check that all channels are present
@@ -106,19 +110,13 @@ def checkCondaChannels() {
 
     required_channels_in_order.eachWithIndex { channel, index ->
         if (index < required_channels_in_order.size() - 1) {
-            channel_priority_violation |= !(channels.indexOf(channel) < channels.indexOf(required_channels_in_order[index+1]))
+            channel_priority_violation |= !(channels.indexOf(channel) < channels.indexOf(required_channels_in_order[index + 1]))
         }
     }
 
     if (channels_missing | channel_priority_violation) {
-        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/\n" +
-            "  The observed channel order is \n" +
-            "  ${channels}\n" +
-            "  but the following channel order is required:\n" +
-            "  ${required_channels_in_order}\n" +
-            "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+        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/\n" + "  The observed channel order is \n" + "  ${channels}\n" + "  but the following channel order is required:\n" + "  ${required_channels_in_order}\n" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+        )
     }
 }
diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf
index cbd8495b..b78273ca 100644
--- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf
+++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf
@@ -3,13 +3,12 @@
 //
 
 /*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     SUBWORKFLOW DEFINITION
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
 workflow UTILS_NFCORE_PIPELINE {
-
     take:
     nextflow_cli_args
 
@@ -22,9 +21,9 @@ workflow UTILS_NFCORE_PIPELINE {
 }
 
 /*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     FUNCTIONS
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
 //
@@ -33,12 +32,9 @@ workflow UTILS_NFCORE_PIPELINE {
 def checkConfigProvided() {
     def valid_config = true as Boolean
     if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) {
-        log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" +
-            "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" +
-            "   (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" +
-            "   (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" +
-            "   (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" +
-            "Please refer to the quick start section and usage docs for the pipeline.\n "
+        log.warn(
+            "[${workflow.manifest.name}] You are attempting to run the pipeline without any custom configuration!\n\n" + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + "   (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + "   (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + "   (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + "Please refer to the quick start section and usage docs for the pipeline.\n "
+        )
         valid_config = false
     }
     return valid_config
@@ -49,12 +45,14 @@ def checkConfigProvided() {
 //
 def checkProfileProvided(nextflow_cli_args) {
     if (workflow.profile.endsWith(',')) {
-        error "The `-profile` option cannot end with a trailing comma, please remove it and re-run the pipeline!\n" +
-            "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n"
+        error(
+            "The `-profile` option cannot end with a trailing comma, please remove it and re-run the pipeline!\n" + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n"
+        )
     }
     if (nextflow_cli_args[0]) {
-        log.warn "nf-core pipelines do not accept positional arguments. The positional argument `${nextflow_cli_args[0]}` has been detected.\n" +
-            "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n"
+        log.warn(
+            "nf-core pipelines do not accept positional arguments. The positional argument `${nextflow_cli_args[0]}` has been detected.\n" + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n"
+        )
     }
 }
 
@@ -70,13 +68,7 @@ def workflowCitation() {
     manifest_doi.each { doi_ref ->
         temp_doi_ref += "  https://doi.org/${doi_ref.replace('https://doi.org/', '').replace(' ', '')}\n"
     }
-    return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" +
-        "* The pipeline\n" +
-        temp_doi_ref + "\n" +
-        "* The nf-core framework\n" +
-        "  https://doi.org/10.1038/s41587-020-0439-x\n\n" +
-        "* Software dependencies\n" +
-        "  https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md"
+    return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + "* The pipeline\n" + temp_doi_ref + "\n" + "* The nf-core framework\n" + "  https://doi.org/10.1038/s41587-020-0439-x\n\n" + "* Software dependencies\n" + "  https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md"
 }
 
 //
@@ -102,7 +94,7 @@ def getWorkflowVersion() {
 //
 def processVersionsFromYAML(yaml_file) {
     def yaml = new org.yaml.snakeyaml.Yaml()
-    def versions = yaml.load(yaml_file).collectEntries { k, v -> [ k.tokenize(':')[-1], v ] }
+    def versions = yaml.load(yaml_file).collectEntries { k, v -> [k.tokenize(':')[-1], v] }
     return yaml.dumpAsMap(versions).trim()
 }
 
@@ -112,8 +104,8 @@ def processVersionsFromYAML(yaml_file) {
 def workflowVersionToYAML() {
     return """
     Workflow:
-        $workflow.manifest.name: ${getWorkflowVersion()}
-        Nextflow: $workflow.nextflow.version
+        ${workflow.manifest.name}: ${getWorkflowVersion()}
+        Nextflow: ${workflow.nextflow.version}
     """.stripIndent().trim()
 }
 
@@ -121,11 +113,7 @@ def workflowVersionToYAML() {
 // Get channel of software versions used in pipeline in YAML format
 //
 def softwareVersionsToYAML(ch_versions) {
-    return ch_versions
-                .unique()
-                .map { version -> processVersionsFromYAML(version) }
-                .unique()
-                .mix(Channel.of(workflowVersionToYAML()))
+    return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML()))
 }
 
 //
@@ -133,25 +121,31 @@ def softwareVersionsToYAML(ch_versions) {
 //
 def paramsSummaryMultiqc(summary_params) {
     def summary_section = ''
-    summary_params.keySet().each { group ->
-        def group_params = summary_params.get(group)  // This gets the parameters of that particular group
-        if (group_params) {
-            summary_section += "    <p style=\"font-size:110%\"><b>$group</b></p>\n"
-            summary_section += "    <dl class=\"dl-horizontal\">\n"
-            group_params.keySet().sort().each { param ->
-                summary_section += "        <dt>$param</dt><dd><samp>${group_params.get(param) ?: '<span style=\"color:#999999;\">N/A</a>'}</samp></dd>\n"
+    summary_params
+        .keySet()
+        .each { group ->
+            def group_params = summary_params.get(group)
+            // This gets the parameters of that particular group
+            if (group_params) {
+                summary_section += "    <p style=\"font-size:110%\"><b>${group}</b></p>\n"
+                summary_section += "    <dl class=\"dl-horizontal\">\n"
+                group_params
+                    .keySet()
+                    .sort()
+                    .each { param ->
+                        summary_section += "        <dt>${param}</dt><dd><samp>${group_params.get(param) ?: '<span style=\"color:#999999;\">N/A</a>'}</samp></dd>\n"
+                    }
+                summary_section += "    </dl>\n"
             }
-            summary_section += "    </dl>\n"
         }
-    }
 
-    def yaml_file_text  = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" as String
-    yaml_file_text        += "description: ' - this information is collected when the pipeline is started.'\n"
-    yaml_file_text        += "section_name: '${workflow.manifest.name} Workflow Summary'\n"
-    yaml_file_text        += "section_href: 'https://github.com/${workflow.manifest.name}'\n"
-    yaml_file_text        += "plot_type: 'html'\n"
-    yaml_file_text        += "data: |\n"
-    yaml_file_text        += "${summary_section}"
+    def yaml_file_text = "id: '${workflow.manifest.name.replace('/', '-')}-summary'\n" as String
+    yaml_file_text     += "description: ' - this information is collected when the pipeline is started.'\n"
+    yaml_file_text     += "section_name: '${workflow.manifest.name} Workflow Summary'\n"
+    yaml_file_text     += "section_href: 'https://github.com/${workflow.manifest.name}'\n"
+    yaml_file_text     += "plot_type: 'html'\n"
+    yaml_file_text     += "data: |\n"
+    yaml_file_text     += "${summary_section}"
 
     return yaml_file_text
 }
@@ -199,54 +193,54 @@ def logColours(monochrome_logs=true) {
     colorcodes['hidden']     = monochrome_logs ? '' : "\033[8m"
 
     // Regular Colors
-    colorcodes['black']      = monochrome_logs ? '' : "\033[0;30m"
-    colorcodes['red']        = monochrome_logs ? '' : "\033[0;31m"
-    colorcodes['green']      = monochrome_logs ? '' : "\033[0;32m"
-    colorcodes['yellow']     = monochrome_logs ? '' : "\033[0;33m"
-    colorcodes['blue']       = monochrome_logs ? '' : "\033[0;34m"
-    colorcodes['purple']     = monochrome_logs ? '' : "\033[0;35m"
-    colorcodes['cyan']       = monochrome_logs ? '' : "\033[0;36m"
-    colorcodes['white']      = monochrome_logs ? '' : "\033[0;37m"
+    colorcodes['black']  = monochrome_logs ? '' : "\033[0;30m"
+    colorcodes['red']    = monochrome_logs ? '' : "\033[0;31m"
+    colorcodes['green']  = monochrome_logs ? '' : "\033[0;32m"
+    colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m"
+    colorcodes['blue']   = monochrome_logs ? '' : "\033[0;34m"
+    colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m"
+    colorcodes['cyan']   = monochrome_logs ? '' : "\033[0;36m"
+    colorcodes['white']  = monochrome_logs ? '' : "\033[0;37m"
 
     // Bold
-    colorcodes['bblack']     = monochrome_logs ? '' : "\033[1;30m"
-    colorcodes['bred']       = monochrome_logs ? '' : "\033[1;31m"
-    colorcodes['bgreen']     = monochrome_logs ? '' : "\033[1;32m"
-    colorcodes['byellow']    = monochrome_logs ? '' : "\033[1;33m"
-    colorcodes['bblue']      = monochrome_logs ? '' : "\033[1;34m"
-    colorcodes['bpurple']    = monochrome_logs ? '' : "\033[1;35m"
-    colorcodes['bcyan']      = monochrome_logs ? '' : "\033[1;36m"
-    colorcodes['bwhite']     = monochrome_logs ? '' : "\033[1;37m"
+    colorcodes['bblack']  = monochrome_logs ? '' : "\033[1;30m"
+    colorcodes['bred']    = monochrome_logs ? '' : "\033[1;31m"
+    colorcodes['bgreen']  = monochrome_logs ? '' : "\033[1;32m"
+    colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m"
+    colorcodes['bblue']   = monochrome_logs ? '' : "\033[1;34m"
+    colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m"
+    colorcodes['bcyan']   = monochrome_logs ? '' : "\033[1;36m"
+    colorcodes['bwhite']  = monochrome_logs ? '' : "\033[1;37m"
 
     // Underline
-    colorcodes['ublack']     = monochrome_logs ? '' : "\033[4;30m"
-    colorcodes['ured']       = monochrome_logs ? '' : "\033[4;31m"
-    colorcodes['ugreen']     = monochrome_logs ? '' : "\033[4;32m"
-    colorcodes['uyellow']    = monochrome_logs ? '' : "\033[4;33m"
-    colorcodes['ublue']      = monochrome_logs ? '' : "\033[4;34m"
-    colorcodes['upurple']    = monochrome_logs ? '' : "\033[4;35m"
-    colorcodes['ucyan']      = monochrome_logs ? '' : "\033[4;36m"
-    colorcodes['uwhite']     = monochrome_logs ? '' : "\033[4;37m"
+    colorcodes['ublack']  = monochrome_logs ? '' : "\033[4;30m"
+    colorcodes['ured']    = monochrome_logs ? '' : "\033[4;31m"
+    colorcodes['ugreen']  = monochrome_logs ? '' : "\033[4;32m"
+    colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m"
+    colorcodes['ublue']   = monochrome_logs ? '' : "\033[4;34m"
+    colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m"
+    colorcodes['ucyan']   = monochrome_logs ? '' : "\033[4;36m"
+    colorcodes['uwhite']  = monochrome_logs ? '' : "\033[4;37m"
 
     // High Intensity
-    colorcodes['iblack']     = monochrome_logs ? '' : "\033[0;90m"
-    colorcodes['ired']       = monochrome_logs ? '' : "\033[0;91m"
-    colorcodes['igreen']     = monochrome_logs ? '' : "\033[0;92m"
-    colorcodes['iyellow']    = monochrome_logs ? '' : "\033[0;93m"
-    colorcodes['iblue']      = monochrome_logs ? '' : "\033[0;94m"
-    colorcodes['ipurple']    = monochrome_logs ? '' : "\033[0;95m"
-    colorcodes['icyan']      = monochrome_logs ? '' : "\033[0;96m"
-    colorcodes['iwhite']     = monochrome_logs ? '' : "\033[0;97m"
+    colorcodes['iblack']  = monochrome_logs ? '' : "\033[0;90m"
+    colorcodes['ired']    = monochrome_logs ? '' : "\033[0;91m"
+    colorcodes['igreen']  = monochrome_logs ? '' : "\033[0;92m"
+    colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m"
+    colorcodes['iblue']   = monochrome_logs ? '' : "\033[0;94m"
+    colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m"
+    colorcodes['icyan']   = monochrome_logs ? '' : "\033[0;96m"
+    colorcodes['iwhite']  = monochrome_logs ? '' : "\033[0;97m"
 
     // Bold High Intensity
-    colorcodes['biblack']    = monochrome_logs ? '' : "\033[1;90m"
-    colorcodes['bired']      = monochrome_logs ? '' : "\033[1;91m"
-    colorcodes['bigreen']    = monochrome_logs ? '' : "\033[1;92m"
-    colorcodes['biyellow']   = monochrome_logs ? '' : "\033[1;93m"
-    colorcodes['biblue']     = monochrome_logs ? '' : "\033[1;94m"
-    colorcodes['bipurple']   = monochrome_logs ? '' : "\033[1;95m"
-    colorcodes['bicyan']     = monochrome_logs ? '' : "\033[1;96m"
-    colorcodes['biwhite']    = monochrome_logs ? '' : "\033[1;97m"
+    colorcodes['biblack']  = monochrome_logs ? '' : "\033[1;90m"
+    colorcodes['bired']    = monochrome_logs ? '' : "\033[1;91m"
+    colorcodes['bigreen']  = monochrome_logs ? '' : "\033[1;92m"
+    colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m"
+    colorcodes['biblue']   = monochrome_logs ? '' : "\033[1;94m"
+    colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m"
+    colorcodes['bicyan']   = monochrome_logs ? '' : "\033[1;96m"
+    colorcodes['biwhite']  = monochrome_logs ? '' : "\033[1;97m"
 
     return colorcodes
 }
@@ -261,14 +255,15 @@ def attachMultiqcReport(multiqc_report) {
             mqc_report = multiqc_report.getVal()
             if (mqc_report.getClass() == ArrayList && mqc_report.size() >= 1) {
                 if (mqc_report.size() > 1) {
-                    log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one"
+                    log.warn("[${workflow.manifest.name}] Found multiple reports from process 'MULTIQC', will use only one")
                 }
                 mqc_report = mqc_report[0]
             }
         }
-    } catch (all) {
+    }
+    catch (Exception all) {
         if (multiqc_report) {
-            log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email"
+            log.warn("[${workflow.manifest.name}] Could not attach MultiQC report to summary email")
         }
     }
     return mqc_report
@@ -280,26 +275,35 @@ def attachMultiqcReport(multiqc_report) {
 def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs=true, multiqc_report=null) {
 
     // Set up the e-mail variables
-    def subject = "[$workflow.manifest.name] Successful: $workflow.runName"
+    def subject = "[${workflow.manifest.name}] Successful: ${workflow.runName}"
     if (!workflow.success) {
-        subject = "[$workflow.manifest.name] FAILED: $workflow.runName"
+        subject = "[${workflow.manifest.name}] FAILED: ${workflow.runName}"
     }
 
     def summary = [:]
-    summary_params.keySet().sort().each { group ->
-        summary << summary_params[group]
-    }
+    summary_params
+        .keySet()
+        .sort()
+        .each { group ->
+            summary << summary_params[group]
+        }
 
     def misc_fields = [:]
     misc_fields['Date Started']              = workflow.start
     misc_fields['Date Completed']            = workflow.complete
     misc_fields['Pipeline script file path'] = workflow.scriptFile
     misc_fields['Pipeline script hash ID']   = workflow.scriptId
-    if (workflow.repository) misc_fields['Pipeline repository Git URL']    = workflow.repository
-    if (workflow.commitId)   misc_fields['Pipeline repository Git Commit'] = workflow.commitId
-    if (workflow.revision)   misc_fields['Pipeline Git branch/tag']        = workflow.revision
-    misc_fields['Nextflow Version']           = workflow.nextflow.version
-    misc_fields['Nextflow Build']             = workflow.nextflow.build
+    if (workflow.repository) {
+        misc_fields['Pipeline repository Git URL']    = workflow.repository
+    }
+    if (workflow.commitId) {
+        misc_fields['Pipeline repository Git Commit'] = workflow.commitId
+    }
+    if (workflow.revision) {
+        misc_fields['Pipeline Git branch/tag']        = workflow.revision
+    }
+    misc_fields['Nextflow Version']          = workflow.nextflow.version
+    misc_fields['Nextflow Build']            = workflow.nextflow.build
     misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp
 
     def email_fields = [:]
@@ -337,7 +341,7 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi
 
     // Render the sendmail template
     def max_multiqc_email_size = (params.containsKey('max_multiqc_email_size') ? params.max_multiqc_email_size : 0) as nextflow.util.MemoryUnit
-    def smail_fields           = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ]
+    def smail_fields           = [email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes()]
     def sf                     = new File("${workflow.projectDir}/assets/sendmail_template.txt")
     def sendmail_template      = engine.createTemplate(sf).make(smail_fields)
     def sendmail_html          = sendmail_template.toString()
@@ -346,30 +350,32 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi
     def colors = logColours(monochrome_logs) as Map
     if (email_address) {
         try {
-            if (plaintext_email) { throw new org.codehaus.groovy.GroovyException('Send plaintext e-mail, not HTML') }
+            if (plaintext_email) {
+new org.codehaus.groovy.GroovyException('Send plaintext e-mail, not HTML')            }
             // Try to send HTML e-mail using sendmail
             def sendmail_tf = new File(workflow.launchDir.toString(), ".sendmail_tmp.html")
             sendmail_tf.withWriter { w -> w << sendmail_html }
-            [ 'sendmail', '-t' ].execute() << sendmail_html
-            log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-"
-        } catch (all) {
+            ['sendmail', '-t'].execute() << sendmail_html
+            log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Sent summary e-mail to ${email_address} (sendmail)-")
+        }
+        catch (Exception all) {
             // Catch failures and try with plaintext
-            def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ]
+            def mail_cmd = ['mail', '-s', subject, '--content-type=text/html', email_address]
             mail_cmd.execute() << email_html
-            log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-"
+            log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Sent summary e-mail to ${email_address} (mail)-")
         }
     }
 
     // Write summary e-mail HTML to a file
     def output_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html")
     output_hf.withWriter { w -> w << email_html }
-    nextflow.extension.FilesEx.copyTo(output_hf.toPath(), "${outdir}/pipeline_info/pipeline_report.html");
+    nextflow.extension.FilesEx.copyTo(output_hf.toPath(), "${outdir}/pipeline_info/pipeline_report.html")
     output_hf.delete()
 
     // Write summary e-mail TXT to a file
     def output_tf = new File(workflow.launchDir.toString(), ".pipeline_report.txt")
     output_tf.withWriter { w -> w << email_txt }
-    nextflow.extension.FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt");
+    nextflow.extension.FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt")
     output_tf.delete()
 }
 
@@ -380,12 +386,14 @@ def completionSummary(monochrome_logs=true) {
     def colors = logColours(monochrome_logs) as Map
     if (workflow.success) {
         if (workflow.stats.ignoredCount == 0) {
-            log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-"
-        } else {
-            log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-"
+            log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Pipeline completed successfully${colors.reset}-")
+        }
+        else {
+            log.info("-${colors.purple}[${workflow.manifest.name}]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-")
         }
-    } else {
-        log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-"
+    }
+    else {
+        log.info("-${colors.purple}[${workflow.manifest.name}]${colors.red} Pipeline completed with errors${colors.reset}-")
     }
 }
 
@@ -394,21 +402,30 @@ def completionSummary(monochrome_logs=true) {
 //
 def imNotification(summary_params, hook_url) {
     def summary = [:]
-    summary_params.keySet().sort().each { group ->
-        summary << summary_params[group]
-    }
+    summary_params
+        .keySet()
+        .sort()
+        .each { group ->
+            summary << summary_params[group]
+        }
 
     def misc_fields = [:]
-    misc_fields['start']                                = workflow.start
-    misc_fields['complete']                             = workflow.complete
-    misc_fields['scriptfile']                           = workflow.scriptFile
-    misc_fields['scriptid']                             = workflow.scriptId
-    if (workflow.repository) misc_fields['repository']  = workflow.repository
-    if (workflow.commitId)   misc_fields['commitid']    = workflow.commitId
-    if (workflow.revision)   misc_fields['revision']    = workflow.revision
-    misc_fields['nxf_version']                          = workflow.nextflow.version
-    misc_fields['nxf_build']                            = workflow.nextflow.build
-    misc_fields['nxf_timestamp']                        = workflow.nextflow.timestamp
+    misc_fields['start']          = workflow.start
+    misc_fields['complete']       = workflow.complete
+    misc_fields['scriptfile']     = workflow.scriptFile
+    misc_fields['scriptid']       = workflow.scriptId
+    if (workflow.repository) {
+        misc_fields['repository'] = workflow.repository
+    }
+    if (workflow.commitId) {
+        misc_fields['commitid']   = workflow.commitId
+    }
+    if (workflow.revision) {
+        misc_fields['revision']   = workflow.revision
+    }
+    misc_fields['nxf_version']    = workflow.nextflow.version
+    misc_fields['nxf_build']      = workflow.nextflow.build
+    misc_fields['nxf_timestamp']  = workflow.nextflow.timestamp
 
     def msg_fields = [:]
     msg_fields['version']      = getWorkflowVersion()
@@ -433,13 +450,13 @@ def imNotification(summary_params, hook_url) {
     def json_message  = json_template.toString()
 
     // POST
-    def post = new URL(hook_url).openConnection();
+    def post = new URL(hook_url).openConnection()
     post.setRequestMethod("POST")
     post.setDoOutput(true)
     post.setRequestProperty("Content-Type", "application/json")
-    post.getOutputStream().write(json_message.getBytes("UTF-8"));
-    def postRC = post.getResponseCode();
-    if (! postRC.equals(200)) {
-        log.warn(post.getErrorStream().getText());
+    post.getOutputStream().write(json_message.getBytes("UTF-8"))
+    def postRC = post.getResponseCode()
+    if (!postRC.equals(200)) {
+        log.warn(post.getErrorStream().getText())
     }
 }

From d2f537c74355212220faec4d4bf4771b5324a86a Mon Sep 17 00:00:00 2001
From: Usman Rashid <usman@smme.edu.pk>
Date: Thu, 10 Oct 2024 12:44:59 +1300
Subject: [PATCH 2/5] Updated version checks

---
 .github/version_checks.sh | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/.github/version_checks.sh b/.github/version_checks.sh
index 23cf619c..e7b1a90a 100755
--- a/.github/version_checks.sh
+++ b/.github/version_checks.sh
@@ -12,3 +12,8 @@ fi
 
 head -10 CHANGELOG.md | grep "## v$config_version - " >/dev/null \
     || (echo 'Failed to match CHANGELOG version'; exit 1)
+
+# Check .nf-core.yml version
+
+tail -5 .nf-core.yml | grep "version: $config_version" >/dev/null \
+    || (echo 'Failed to match .nf-core.yml version'; exit 1)

From 530734b73c289022b7ab3eae51c3c4d44541120c Mon Sep 17 00:00:00 2001
From: Usman Rashid <usman@smme.edu.pk>
Date: Thu, 10 Oct 2024 12:51:26 +1300
Subject: [PATCH 3/5] Deleted template version comment action

---
 .../workflows/template_version_comment.yml    | 43 -------------------
 1 file changed, 43 deletions(-)
 delete mode 100644 .github/workflows/template_version_comment.yml

diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template_version_comment.yml
deleted file mode 100644
index d01fb43f..00000000
--- a/.github/workflows/template_version_comment.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-name: nf-core template version comment
-# This workflow is triggered on PRs to check if the pipeline template version matches the latest nf-core version.
-# It posts a comment to the PR, even if it comes from a fork.
-
-on: pull_request_target
-
-jobs:
-  template_version:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Check out pipeline code
-        uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4
-
-      - name: Read template version from .nf-core.yml
-        uses: pietrobolcato/action-read-yaml@1.1.0
-        id: read_yml
-        with:
-          config: ${{ github.workspace }}/.nf-core.yml
-
-      - name: Install nf-core
-        run: |
-          python -m pip install --upgrade pip
-          pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }}
-
-      - name: Check nf-core outdated
-        id: nf_core_outdated
-        run: pip list --outdated | grep nf-core
-
-      - name: Post nf-core template version comment
-        uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2
-        if: |
-          ${{ steps.nf_core_outdated.outputs.stdout }} =~ 'nf-core'
-        with:
-          repo-token: ${{ secrets.NF_CORE_BOT_AUTH_TOKEN }}
-          allow-repeats: false
-          message: |
-            ## :warning: Newer version of the nf-core template is available.
-
-            Your pipeline is using an old version of the nf-core template: ${{ steps.read_yml.outputs['nf_core_version'] }}.
-            Please update your pipeline to the latest version.
-
-            For more documentation on how to update your pipeline, please see the [nf-core documentation](https://github.com/nf-core/tools?tab=readme-ov-file#sync-a-pipeline-with-the-template) and [Synchronisation documentation](https://nf-co.re/docs/contributing/sync).
-          #

From b36e86862c3f62c30983dc55d4fa2e702acd9838 Mon Sep 17 00:00:00 2001
From: Usman Rashid <usman@smme.edu.pk>
Date: Thu, 10 Oct 2024 12:52:20 +1300
Subject: [PATCH 4/5] Removed fix-linting action

---
 .github/workflows/fix-linting.yml | 89 -------------------------------
 1 file changed, 89 deletions(-)
 delete mode 100644 .github/workflows/fix-linting.yml

diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml
deleted file mode 100644
index f1e67583..00000000
--- a/.github/workflows/fix-linting.yml
+++ /dev/null
@@ -1,89 +0,0 @@
-name: Fix linting from a comment
-on:
-  issue_comment:
-    types: [created]
-
-jobs:
-  fix-linting:
-    # Only run if comment is on a PR with the main repo, and if it contains the magic keywords
-    if: >
-      contains(github.event.comment.html_url, '/pull/') &&
-      contains(github.event.comment.body, '@nf-core-bot fix linting') &&
-      github.repository == 'Plant-Food-Research-Open/assemblyqc'
-    runs-on: ubuntu-latest
-    steps:
-      # Use the @nf-core-bot token to check out so we can push later
-      - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4
-        with:
-          token: ${{ secrets.nf_core_bot_auth_token }}
-
-      # indication that the linting is being fixed
-      - name: React on comment
-        uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4
-        with:
-          comment-id: ${{ github.event.comment.id }}
-          reactions: eyes
-
-      # Action runs on the issue comment, so we don't get the PR by default
-      # Use the gh cli to check out the PR
-      - name: Checkout Pull Request
-        run: gh pr checkout ${{ github.event.issue.number }}
-        env:
-          GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }}
-
-      # Install and run pre-commit
-      - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5
-        with:
-          python-version: "3.12"
-
-      - name: Install pre-commit
-        run: pip install pre-commit
-
-      - name: Run pre-commit
-        id: pre-commit
-        run: pre-commit run --all-files
-        continue-on-error: true
-
-      # indication that the linting has finished
-      - name: react if linting finished succesfully
-        if: steps.pre-commit.outcome == 'success'
-        uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4
-        with:
-          comment-id: ${{ github.event.comment.id }}
-          reactions: "+1"
-
-      - name: Commit & push changes
-        id: commit-and-push
-        if: steps.pre-commit.outcome == 'failure'
-        run: |
-          git config user.email "core@nf-co.re"
-          git config user.name "nf-core-bot"
-          git config push.default upstream
-          git add .
-          git status
-          git commit -m "[automated] Fix code linting"
-          git push
-
-      - name: react if linting errors were fixed
-        id: react-if-fixed
-        if: steps.commit-and-push.outcome == 'success'
-        uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4
-        with:
-          comment-id: ${{ github.event.comment.id }}
-          reactions: hooray
-
-      - name: react if linting errors were not fixed
-        if: steps.commit-and-push.outcome == 'failure'
-        uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4
-        with:
-          comment-id: ${{ github.event.comment.id }}
-          reactions: confused
-
-      - name: react if linting errors were not fixed
-        if: steps.commit-and-push.outcome  == 'failure'
-        uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4
-        with:
-          issue-number: ${{ github.event.issue.number }}
-          body: |
-            @${{ github.actor }} I tried to fix the linting errors, but it didn't work. Please fix them manually.
-            See [CI log](https://github.com/plant-food-research-open/assemblyqc/actions/runs/${{ github.run_id }}) for more details.

From d7f67154e0be171656ee8f84dd2746665b44e589 Mon Sep 17 00:00:00 2001
From: Usman Rashid <usman@smme.edu.pk>
Date: Thu, 10 Oct 2024 12:55:07 +1300
Subject: [PATCH 5/5] Updated clean-up issue

---
 .github/workflows/clean-up.yml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml
index 0b6b1f27..53e721c7 100644
--- a/.github/workflows/clean-up.yml
+++ b/.github/workflows/clean-up.yml
@@ -12,9 +12,9 @@ jobs:
     steps:
       - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9
         with:
-          stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days."
-          stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful."
-          close-issue-message: "This issue was closed because it has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor and then staled for 20 days with no activity."
+          stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback. Remove stale label or add a comment otherwise this issue will be closed in 20 days."
+          stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback. Remove stale label or add a comment if it is still useful."
+          close-issue-message: "This issue was closed because it has been tagged as awaiting-changes or awaiting-feedback and then staled for 20 days with no activity."
           days-before-stale: 30
           days-before-close: 20
           days-before-pr-close: -1