From 661537179402675cc75949833ed4ed451d42503d Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 7 Oct 2022 17:00:55 +0100 Subject: [PATCH 01/85] .first() is not needed --- subworkflows/local/params_check.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/params_check.nf b/subworkflows/local/params_check.nf index e1fcf63..3b7610b 100644 --- a/subworkflows/local/params_check.nf +++ b/subworkflows/local/params_check.nf @@ -31,7 +31,7 @@ workflow PARAMS_CHECK { ] } .set { ch_inputs } - ch_versions = ch_versions.mix(SAMPLESHEET_CHECK.out.versions.first()) + ch_versions = ch_versions.mix(SAMPLESHEET_CHECK.out.versions) } else { From cf0e48fb35b9a40dffd492f71f7cfb96310fa355 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 8 Oct 2022 10:48:58 +0100 Subject: [PATCH 02/85] Version bump --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 8263dc8..93c7650 100644 --- a/nextflow.config +++ b/nextflow.config @@ -173,7 +173,7 @@ manifest { description = 'Pipeline that downloads assemblies from INSDC into a Tree of Life directory structure' mainScript = 'main.nf' nextflowVersion = '!>=22.04.0' - version = '1.1.0' + version = '1.2dev' } // Load modules.config for DSL2 module specific options From b63474ec06f72931bebd9278a9b74fc832ad7d26 Mon Sep 17 00:00:00 2001 From: Guoying Qi Date: Sat, 3 Dec 2022 13:34:18 +0000 Subject: [PATCH 03/85] add missing light logo image in assets directory --- assets/sanger-tol-insdcdownload_logo_light.png | Bin 0 -> 159422 bytes assets/sendmail_template.txt | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100755 assets/sanger-tol-insdcdownload_logo_light.png diff --git a/assets/sanger-tol-insdcdownload_logo_light.png b/assets/sanger-tol-insdcdownload_logo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..74c692ea7e9c93e53dfd74fefb4731f8d8d631bc GIT binary patch literal 159422 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%0ADD#Sp$;ETakvTj9pL{l* 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
C+58jFNr8%d1w@!5GO@# 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∋p_*okNG;{`NEG_66DDtkd_ml0o&|a4yU$gcJ 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 Content-Disposition: inline; filename="sanger-tol-insdcdownload_logo_light.png" From cd0c71054e002eef5ebd9b0298954bb1f1d0a30e Mon Sep 17 00:00:00 2001 From: Guoying Qi Date: Sat, 3 Dec 2022 13:35:18 +0000 Subject: [PATCH 04/85] resize logo image size in html email --- assets/email_template.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/email_template.html b/assets/email_template.html index d63771d..01675b1 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -10,7 +10,7 @@
- +

sanger-tol/insdcdownload v${version}

Run Name: $runName

From ba63cebd6890bfafe18069f915fc4669ccaa6282 Mon Sep 17 00:00:00 2001 From: Guoying Qi Date: Sun, 4 Dec 2022 12:05:42 +0000 Subject: [PATCH 05/85] reduce the logo image furthrer and show the full size in the email html template --- assets/email_template.html | 2 +- .../sanger-tol-insdcdownload_logo_light.png | Bin 159422 -> 102793 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/email_template.html b/assets/email_template.html index 01675b1..d63771d 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -10,7 +10,7 @@
- +

sanger-tol/insdcdownload v${version}

Run Name: $runName

diff --git a/assets/sanger-tol-insdcdownload_logo_light.png b/assets/sanger-tol-insdcdownload_logo_light.png index 74c692ea7e9c93e53dfd74fefb4731f8d8d631bc..aab5faf99a07281064c457f0caf9387ecc3ac611 100755 GIT binary patch literal 102793 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 literal 159422 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%0ADD#Sp$;ETakvTj9pL{l* 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
C+58jFNr8%d1w@!5GO@# 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∋p_*okNG;{`NEG_66DDtkd_ml0o&|a4yU$gcJ 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 Date: Wed, 7 Dec 2022 15:26:24 +0000 Subject: [PATCH 06/85] Create tower_lsf_full_tests.yml --- .github/workflows/tower_lsf_full_tests.yml | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/tower_lsf_full_tests.yml diff --git a/.github/workflows/tower_lsf_full_tests.yml b/.github/workflows/tower_lsf_full_tests.yml new file mode 100644 index 0000000..0b799af --- /dev/null +++ b/.github/workflows/tower_lsf_full_tests.yml @@ -0,0 +1,31 @@ +name: nf-core LSF full size tests + +on: + pull_request: + branches: + - main + - dev +jobs: + run-tower: + name: Run LSF full size tests + runs-on: ubuntu-latest + steps: + - name: Launch workflow via tower + uses: nf-core/tower-action@v2 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.event.pull_request.head.sha }} + workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/readmapping/work-${{ github.event.pull_request.head.sha }} + parameters: | + { + "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/readmapping/results-${{ github.event.pull_request.head.sha }}", + "email": "${{ secrets.TOWER_RUN_EMAIL }}", + "email_on_fail": "${{ secrets.TOWER_RUN_EMAIL }}" + } + profiles: test_full,sanger,singularity + nextflow_config: | + process.errorStrategy = 'retry' + process.maxRetries = 3 From 33e89e36c943d2c3bf6967bbc887181777c69809 Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Thu, 8 Dec 2022 09:13:46 +0000 Subject: [PATCH 07/85] Update tower_lsf_full_tests.yml Remove email for notification and retry --- .github/workflows/tower_lsf_full_tests.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/tower_lsf_full_tests.yml b/.github/workflows/tower_lsf_full_tests.yml index 0b799af..749995e 100644 --- a/.github/workflows/tower_lsf_full_tests.yml +++ b/.github/workflows/tower_lsf_full_tests.yml @@ -22,10 +22,5 @@ jobs: parameters: | { "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/readmapping/results-${{ github.event.pull_request.head.sha }}", - "email": "${{ secrets.TOWER_RUN_EMAIL }}", - "email_on_fail": "${{ secrets.TOWER_RUN_EMAIL }}" } profiles: test_full,sanger,singularity - nextflow_config: | - process.errorStrategy = 'retry' - process.maxRetries = 3 From 6a8820f9712b00f0641a054b7fb2877726a15b76 Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Thu, 8 Dec 2022 17:28:47 +0000 Subject: [PATCH 08/85] Update and rename tower_lsf_full_tests.yml to sangerfulltest.yml only run when release or manual --- ...ower_lsf_full_tests.yml => sangerfulltest.yml} | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) rename .github/workflows/{tower_lsf_full_tests.yml => sangerfulltest.yml} (69%) diff --git a/.github/workflows/tower_lsf_full_tests.yml b/.github/workflows/sangerfulltest.yml similarity index 69% rename from .github/workflows/tower_lsf_full_tests.yml rename to .github/workflows/sangerfulltest.yml index 749995e..308e77a 100644 --- a/.github/workflows/tower_lsf_full_tests.yml +++ b/.github/workflows/sangerfulltest.yml @@ -1,10 +1,9 @@ -name: nf-core LSF full size tests +name: nf-core Sanger LSF full size tests on: - pull_request: - branches: - - main - - dev + release: + types: [published] + workflow_dispatch: jobs: run-tower: name: Run LSF full size tests @@ -17,10 +16,10 @@ jobs: access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} - revision: ${{ github.event.pull_request.head.sha }} - workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/readmapping/work-${{ github.event.pull_request.head.sha }} + revision: ${{ github.sha }} + workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/readmapping/work-${{ github.sha }} parameters: | { - "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/readmapping/results-${{ github.event.pull_request.head.sha }}", + "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/readmapping/results-${{ github.sha }}", } profiles: test_full,sanger,singularity From afd58b623fa549dd39ca7164e070c1ca77970eab Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Thu, 8 Dec 2022 17:30:38 +0000 Subject: [PATCH 09/85] Create sangertest.yml to manaully run test on Sanger LSF --- .github/workflows/sangertest.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/sangertest.yml diff --git a/.github/workflows/sangertest.yml b/.github/workflows/sangertest.yml new file mode 100644 index 0000000..13a0867 --- /dev/null +++ b/.github/workflows/sangertest.yml @@ -0,0 +1,23 @@ +name: nf-core Sanger LSF tests + +on: + workflow_dispatch: +jobs: + run-tower: + name: Run LSF tests + runs-on: ubuntu-latest + steps: + - name: Launch workflow via tower + uses: nf-core/tower-action@v2 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} + workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/readmapping/work-${{ github.sha }} + parameters: | + { + "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/readmapping/results-${{ github.sha }}", + } + profiles: test,sanger,singularity From f0f1c95eae7e73d0e6bd2953e74ceef1f05d1d7b Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Mon, 12 Dec 2022 15:13:58 +0000 Subject: [PATCH 10/85] Update sangerfulltest.yml trigger the full test workflow when push to main or dev --- .github/workflows/sangerfulltest.yml | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/.github/workflows/sangerfulltest.yml b/.github/workflows/sangerfulltest.yml index 308e77a..971cb24 100644 --- a/.github/workflows/sangerfulltest.yml +++ b/.github/workflows/sangerfulltest.yml @@ -1,14 +1,27 @@ name: nf-core Sanger LSF full size tests on: - release: - types: [published] + push: + branches: + - main + - dev workflow_dispatch: jobs: run-tower: name: Run LSF full size tests runs-on: ubuntu-latest steps: + + - name: Sets env vars for push + run: | + echo "REVISION=${{ github.sha }}" >> $GITHUB_ENV + if: github.event_name == 'pull_request' + + - name: Sets env vars for workflow_dispatch + run: | + echo "REVISION=${{ github.sha }}" >> $GITHUB_ENV + if: github.event_name == 'workflow_dispatch' + - name: Launch workflow via tower uses: nf-core/tower-action@v2 with: @@ -16,10 +29,10 @@ jobs: access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} - revision: ${{ github.sha }} - workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/readmapping/work-${{ github.sha }} + revision: ${{ env.REVISION }} + workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/readmapping/work-${{ env.REVISION }} parameters: | { - "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/readmapping/results-${{ github.sha }}", + "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/readmapping/results-${{ env.REVISION }}", } profiles: test_full,sanger,singularity From 10416fcae0c3063048c62a2efb47f166daaeb482 Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Mon, 12 Dec 2022 15:57:36 +0000 Subject: [PATCH 11/85] Update sangerfulltest.yml update the wrong event name for push --- .github/workflows/sangerfulltest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sangerfulltest.yml b/.github/workflows/sangerfulltest.yml index 971cb24..dbf8caa 100644 --- a/.github/workflows/sangerfulltest.yml +++ b/.github/workflows/sangerfulltest.yml @@ -15,7 +15,7 @@ jobs: - name: Sets env vars for push run: | echo "REVISION=${{ github.sha }}" >> $GITHUB_ENV - if: github.event_name == 'pull_request' + if: github.event_name == 'push' - name: Sets env vars for workflow_dispatch run: | From 2bacd5ebe3f32db88954b94d281e40618645cbab Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Tue, 13 Dec 2022 10:38:43 +0000 Subject: [PATCH 12/85] Update sangerfulltest.yml update the work and results directory name --- .github/workflows/sangerfulltest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sangerfulltest.yml b/.github/workflows/sangerfulltest.yml index dbf8caa..b40dd66 100644 --- a/.github/workflows/sangerfulltest.yml +++ b/.github/workflows/sangerfulltest.yml @@ -30,9 +30,9 @@ jobs: compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ env.REVISION }} - workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/readmapping/work-${{ env.REVISION }} + workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/insdcdownload/work-${{ env.REVISION }} parameters: | { - "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/readmapping/results-${{ env.REVISION }}", + "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/insdcdownload/results-${{ env.REVISION }}", } profiles: test_full,sanger,singularity From be8188027f08b255f89ace2c782cc1059bbb04ce Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Tue, 13 Dec 2022 10:39:33 +0000 Subject: [PATCH 13/85] Update sangertest.yml update outdir and work directory name --- .github/workflows/sangertest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sangertest.yml b/.github/workflows/sangertest.yml index 13a0867..c0c89b2 100644 --- a/.github/workflows/sangertest.yml +++ b/.github/workflows/sangertest.yml @@ -15,9 +15,9 @@ jobs: compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} - workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/readmapping/work-${{ github.sha }} + workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/insdcdownload/work-${{ github.sha }} parameters: | { - "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/readmapping/results-${{ github.sha }}", + "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/insdcdownload/results-${{ github.sha }}", } profiles: test,sanger,singularity From af7588a0adb62985ad9990dd10d1d4bb93620f70 Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Wed, 14 Dec 2022 11:51:30 +0000 Subject: [PATCH 14/85] Update sangertest.yml using variables for out and work dir --- .github/workflows/sangertest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sangertest.yml b/.github/workflows/sangertest.yml index c0c89b2..f9befb3 100644 --- a/.github/workflows/sangertest.yml +++ b/.github/workflows/sangertest.yml @@ -15,9 +15,9 @@ jobs: compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} - workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/insdcdownload/work-${{ github.sha }} + workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/${{ github.repository }}/work-${{ github.sha }} parameters: | { - "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/insdcdownload/results-${{ github.sha }}", + "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/${{ github.repository }}/results-${{ github.sha }}", } profiles: test,sanger,singularity From 91dcc6aee208958cd0ba909d3bf95af34b6919e3 Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Wed, 14 Dec 2022 11:52:11 +0000 Subject: [PATCH 15/85] Update sangerfulltest.yml using variable for our and work dir --- .github/workflows/sangerfulltest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sangerfulltest.yml b/.github/workflows/sangerfulltest.yml index b40dd66..e89f0dd 100644 --- a/.github/workflows/sangerfulltest.yml +++ b/.github/workflows/sangerfulltest.yml @@ -30,9 +30,9 @@ jobs: compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ env.REVISION }} - workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/insdcdownload/work-${{ env.REVISION }} + workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/${{ github.repository }}/work-${{ env.REVISION }} parameters: | { - "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/insdcdownload/results-${{ env.REVISION }}", + "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/${{ github.repository }}/results-${{ env.REVISION }}", } profiles: test_full,sanger,singularity From 858714be84ff86f9a2656bf64b3e7ebad3572dae Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 19 Jan 2023 17:08:34 +0000 Subject: [PATCH 16/85] Updated logo --- lib/NfcoreTemplate.groovy | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 78966e9..835aecc 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -223,12 +223,12 @@ class NfcoreTemplate { String.format( """\n ${dashedLine(monochrome_logs)} - ${colors.blue} _____ ${colors.green} _______ ${colors.red} _${colors.reset} - ${colors.blue} / ____| ${colors.green}|__ __| ${colors.red}| |${colors.reset} - ${colors.blue} | (___ __ _ _ __ __ _ ___ _ __ ${colors.reset}______${colors.green}| |${colors.yellow} ___ ${colors.red}| |${colors.reset} - ${colors.blue} \\___ \\ / _` | '_ \\ / _` |/ _ \\ '__|${colors.reset}______${colors.green}| |${colors.yellow}/ _ \\${colors.red}| |${colors.reset} - ${colors.blue} ____) | (_| | | | | (_| | __/ | ${colors.green}| |${colors.yellow} (_) ${colors.red}| |____${colors.reset} - ${colors.blue} |_____/ \\__,_|_| |_|\\__, |\\___|_| ${colors.green}|_|${colors.yellow}\\___/${colors.red}}|______|${colors.reset} + ${colors.blue} _____ ${colors.green} _______ ${colors.red} _${colors.reset} + ${colors.blue} / ____| ${colors.green}|__ __| ${colors.red}| |${colors.reset} + ${colors.blue} | (___ __ _ _ __ __ _ ___ _ __ ${colors.reset} ___ ${colors.green}| |${colors.yellow} ___ ${colors.red}| |${colors.reset} + ${colors.blue} \\___ \\ / _` | '_ \\ / _` |/ _ \\ '__|${colors.reset}|___|${colors.green}| |${colors.yellow}/ _ \\${colors.red}| |${colors.reset} + ${colors.blue} ____) | (_| | | | | (_| | __/ | ${colors.green}| |${colors.yellow} (_) ${colors.red}| |____${colors.reset} + ${colors.blue} |_____/ \\__,_|_| |_|\\__, |\\___|_| ${colors.green}|_|${colors.yellow}\\___/${colors.red}|______|${colors.reset} ${colors.blue} __/ |${colors.reset} ${colors.blue} |___/${colors.reset} ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} From d2e10453a95390ac1e788d001703f533217d1cf3 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 19 Jan 2023 17:08:49 +0000 Subject: [PATCH 17/85] Support compressed files too --- bin/repeats_bed.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/repeats_bed.py b/bin/repeats_bed.py index 71043ea..d4ff4b7 100755 --- a/bin/repeats_bed.py +++ b/bin/repeats_bed.py @@ -2,6 +2,7 @@ # This script was originally conceived by @muffato import argparse +import gzip import sys __doc__ = "This script prints a BED file of the masked regions a fasta file." @@ -10,7 +11,7 @@ def fasta_to_bed(fasta): in_gap = None - with open(sys.argv[1]) as fh: + with gzip.open(fasta, "rt") if fasta.endswith(".gz") else open(fasta) as fh: for line in fh: line = line[:-1] if line.startswith(">"): @@ -41,7 +42,7 @@ def fasta_to_bed(fasta): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("fasta", help="Input Fasta file.") - parser.add_argument("--version", action="version", version="%(prog)s 1.0") + parser.add_argument("--version", action="version", version="%(prog)s 1.1") args = parser.parse_args() fasta_to_bed(args.fasta) From 8ac8ff2ec29b01b7c9a9f37f2bc79cc08de4174f Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 19 Jan 2023 17:09:42 +0000 Subject: [PATCH 18/85] Imported the latest shared subworkflows --- conf/base.config | 6 +-- subworkflows/sanger-tol/prepare_fasta.nf | 47 +++++++++++++++++++--- subworkflows/sanger-tol/prepare_repeats.nf | 21 ++++++++-- workflows/insdcdownload.nf | 2 +- 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/conf/base.config b/conf/base.config index aa29932..3a47a90 100644 --- a/conf/base.config +++ b/conf/base.config @@ -16,10 +16,10 @@ process { memory = { check_max( 50.MB * task.attempt, 'memory' ) } time = { check_max( 30.min * task.attempt, 'time' ) } - // samtools dict takes more memory on larger genomes + // samtools dict loads entire sequences in memory withName: 'SAMTOOLS_DICT' { - // 50 MB per 500 Mbp - memory = { check_max( 50.MB + 50.MB * task.attempt * Math.ceil(fasta.size() / 500000000), 'memory' ) } + // 50 MB per 50 Mbp + memory = { check_max( 50.MB + 50.MB * task.attempt * Math.ceil(meta.max_length / 50000000), 'memory' ) } } withName:CUSTOM_DUMPSOFTWAREVERSIONS { diff --git a/subworkflows/sanger-tol/prepare_fasta.nf b/subworkflows/sanger-tol/prepare_fasta.nf index c2c576d..13b6859 100644 --- a/subworkflows/sanger-tol/prepare_fasta.nf +++ b/subworkflows/sanger-tol/prepare_fasta.nf @@ -24,16 +24,53 @@ workflow PREPARE_FASTA { ch_samtools_faidx = CUSTOM_GETCHROMSIZES (ch_compressed_fasta).fai ch_versions = ch_versions.mix(CUSTOM_GETCHROMSIZES.out.versions) + // Read the .fai file, extract sequence statistics, and make an extended meta map + sequence_map = ch_samtools_faidx.map { + meta, fai -> [meta, meta + get_sequence_map(fai)] + } + // Update all channels to use the extended meta map + fasta_gz = ch_compressed_fasta.join(sequence_map).map { [it[2], it[1]]} + faidx = ch_samtools_faidx.join(sequence_map).map { [it[2], it[1]]} + gzi = CUSTOM_GETCHROMSIZES.out.gzi.join(sequence_map).map { [it[2], it[1]]} + sizes = CUSTOM_GETCHROMSIZES.out.sizes.join(sequence_map).map { [it[2], it[1]]} + expanded_fasta = fasta.join(sequence_map).map { [it[2], it[1]]} + // Generate Samtools dictionary - ch_samtools_dict = SAMTOOLS_DICT (fasta).dict + ch_samtools_dict = SAMTOOLS_DICT (expanded_fasta).dict ch_versions = ch_versions.mix(SAMTOOLS_DICT.out.versions) emit: - fasta_gz = ch_compressed_fasta // path: genome.fa.gz - faidx = ch_samtools_faidx // path: genome.fa.gz.fai + fasta_gz = fasta_gz // path: genome.fa.gz + faidx = faidx // path: genome.fa.gz.fai dict = ch_samtools_dict // path: genome.fa.dict - gzi = CUSTOM_GETCHROMSIZES.out.gzi // path: genome.fa.gz.gzi - sizes = CUSTOM_GETCHROMSIZES.out.sizes // path: genome.fa.gz.sizes + gzi = gzi // path: genome.fa.gz.gzi + sizes = sizes // path: genome.fa.gz.sizes versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } + +// Read the .fai file to extract the number of sequences, the maximum and total sequence length +// Inspired from https://github.com/nf-core/rnaseq/blob/3.10.1/lib/WorkflowRnaseq.groovy +def get_sequence_map(fai_file) { + def n_sequences = 0 + def max_length = 0 + def total_length = 0 + fai_file.eachLine { line -> + def lspl = line.split('\t') + def chrom = lspl[0] + def length = lspl[1].toInteger() + n_sequences ++ + total_length += length + if (length > max_length) { + max_length = length + } + } + + def sequence_map = [:] + sequence_map.n_sequences = n_sequences + sequence_map.total_length = total_length + if (n_sequences) { + sequence_map.max_length = max_length + } + return sequence_map +} diff --git a/subworkflows/sanger-tol/prepare_repeats.nf b/subworkflows/sanger-tol/prepare_repeats.nf index 7b25e03..64d23f1 100644 --- a/subworkflows/sanger-tol/prepare_repeats.nf +++ b/subworkflows/sanger-tol/prepare_repeats.nf @@ -26,10 +26,23 @@ workflow PREPARE_REPEATS { ch_compressed_bed = TABIX_BGZIP ( ch_bed ).output ch_versions = ch_versions.mix(TABIX_BGZIP.out.versions) - // Index the BED file in two formats for maximum compatibility - ch_indexed_bed_csi = TABIX_TABIX_CSI ( ch_compressed_bed ).csi + // Try indexing the BED file in two formats for maximum compatibility + // but each has its own limitations + tabix_selector = ch_compressed_bed.branch { meta, bed -> + tbi_and_csi: meta.max_length < 2**29 + only_csi: meta.max_length < 2**32 + no_tabix: true + } + + // Output channels to tell the downstream subworkflows which indexes are missing + // (therefore, only meta is available) + no_csi = tabix_selector.no_tabix.map {it[0]} + no_tbi = tabix_selector.only_csi.mix(tabix_selector.no_tabix).map {it[0]} + + // Do the indexing on the compatible Fasta files + ch_indexed_bed_csi = TABIX_TABIX_CSI ( tabix_selector.tbi_and_csi.mix(tabix_selector.only_csi) ).csi ch_versions = ch_versions.mix(TABIX_TABIX_CSI.out.versions) - ch_indexed_bed_tbi = TABIX_TABIX_TBI ( ch_compressed_bed ).tbi + ch_indexed_bed_tbi = TABIX_TABIX_TBI ( tabix_selector.tbi_and_csi ).tbi ch_versions = ch_versions.mix(TABIX_TABIX_TBI.out.versions) @@ -37,5 +50,7 @@ workflow PREPARE_REPEATS { bed_gz = ch_compressed_bed // path: genome.bed.gz bed_csi = ch_indexed_bed_csi // path: genome.bed.gz.csi bed_tbi = ch_indexed_bed_tbi // path: genome.bed.gz.tbi + no_csi = no_csi // (only meta) + no_tbi = no_tbi // (only meta) versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/insdcdownload.nf b/workflows/insdcdownload.nf index cfcb5cf..7308ce7 100644 --- a/workflows/insdcdownload.nf +++ b/workflows/insdcdownload.nf @@ -73,7 +73,7 @@ workflow INSDCDOWNLOAD { ) ch_versions = ch_versions.mix(PREPARE_REPEAT_MASKED_FASTA.out.versions) PREPARE_REPEATS ( - DOWNLOAD_GENOME.out.fasta_masked + PREPARE_REPEAT_MASKED_FASTA.out.fasta_gz ) ch_versions = ch_versions.mix(PREPARE_REPEATS.out.versions) From 0f538f951bde818e1846413ef1b0842f55beb335 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 19 Jan 2023 17:10:41 +0000 Subject: [PATCH 19/85] Reordering of parameters to match the other pipelines and connect relative paths from the samplesheet to the --outdir parameter --- subworkflows/local/params_check.nf | 20 +++++++------------- workflows/insdcdownload.nf | 14 ++++++++------ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/subworkflows/local/params_check.nf b/subworkflows/local/params_check.nf index 3b7610b..8d4e31f 100644 --- a/subworkflows/local/params_check.nf +++ b/subworkflows/local/params_check.nf @@ -7,13 +7,13 @@ include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow PARAMS_CHECK { take: - inputs // tuple, see below + samplesheet // file + cli_params // tuple, see below + outdir // file output directory main: - def (samplesheet, assembly_accession, assembly_name, outdir) = inputs - ch_versions = Channel.empty() ch_inputs = Channel.empty() @@ -27,22 +27,16 @@ workflow PARAMS_CHECK { .map { [ it["assembly_accession"], it["assembly_name"], - it["species_dir"], + it["species_dir"].startsWith("/") ? "" : outdir + "/", ] } .set { ch_inputs } ch_versions = ch_versions.mix(SAMPLESHEET_CHECK.out.versions) } else { - - ch_inputs = Channel.of( - [ - assembly_accession, - assembly_name, - outdir, - ] - ) - + // Add the other input channel in, as it's expected to have all the parameters in the right order + // except the output directory which must be appended + ch_inputs = ch_inputs.mix(cli_params.map { it + [outdir] } ) } diff --git a/workflows/insdcdownload.nf b/workflows/insdcdownload.nf index 7308ce7..ac449b5 100644 --- a/workflows/insdcdownload.nf +++ b/workflows/insdcdownload.nf @@ -46,12 +46,14 @@ workflow INSDCDOWNLOAD { ch_versions = Channel.empty() PARAMS_CHECK ( - [ - params.input, - params.assembly_accession, - params.assembly_name, - params.outdir, - ] + params.input, + Channel.of( + [ + params.assembly_accession, + params.assembly_name, + ] + ), + params.outdir, ) ch_versions = ch_versions.mix(PARAMS_CHECK.out.versions) From b0212c4d8b44790e13836ab1e0ae52545e04111f Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 19 Jan 2023 17:11:52 +0000 Subject: [PATCH 20/85] Exclude the gene annotation files from md5checksums.txt --- modules/local/ncbi_download.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/local/ncbi_download.nf b/modules/local/ncbi_download.nf index 829e3bc..dc57a21 100644 --- a/modules/local/ncbi_download.nf +++ b/modules/local/ncbi_download.nf @@ -52,7 +52,8 @@ process NCBI_DOWNLOAD { wget ${ftp_path}/${remote_filename_stem}_genomic.fna.gz wget ${ftp_path}/md5checksums.txt - grep "\\(_assembly_report\\.txt\$\\|_assembly_stats\\.txt\$\\|_genomic\\.fna\\.gz\$\\)" md5checksums.txt > md5checksums_restricted.txt + grep "\\(_assembly_report\\.txt\$\\|_assembly_stats\\.txt\$\\|_genomic\\.fna\\.gz\$\\)" md5checksums.txt \ + | grep -v "\\(_from_genomic\\.fna\\.gz\$\\)"> md5checksums_restricted.txt md5sum -c md5checksums_restricted.txt mv ${remote_filename_stem}_assembly_report.txt ${filename_assembly_report} mv ${remote_filename_stem}_assembly_stats.txt ${filename_assembly_stats} From 1c292c4fdcdd77e7dbaf857c4059cdaf34537538 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 19 Jan 2023 17:12:05 +0000 Subject: [PATCH 21/85] Provide a default value for --outdir --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 93c7650..92ff15b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -16,7 +16,7 @@ params { ftp_root = "https://ftp.ncbi.nlm.nih.gov/genomes/all/GCA" // Boilerplate options - outdir = null + outdir = 'results' tracedir = "${params.outdir}/pipeline_info" publish_dir_mode = 'copy' email = null From 51437fd17df1acbb3cdd0a98b64561c6df5e202c Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 20 Jan 2023 13:11:34 +0000 Subject: [PATCH 22/85] [prettier] --- .github/workflows/sangerfulltest.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/sangerfulltest.yml b/.github/workflows/sangerfulltest.yml index e89f0dd..9b68e67 100644 --- a/.github/workflows/sangerfulltest.yml +++ b/.github/workflows/sangerfulltest.yml @@ -11,7 +11,6 @@ jobs: name: Run LSF full size tests runs-on: ubuntu-latest steps: - - name: Sets env vars for push run: | echo "REVISION=${{ github.sha }}" >> $GITHUB_ENV From 9d4c07d04244a85c3d4c25d09a44acba75cd0380 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 20 Jan 2023 13:15:07 +0000 Subject: [PATCH 23/85] nf-core lint fixes --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index 093639e..4c29df8 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -12,6 +12,7 @@ lint: - .github/workflows/awsfulltest.yml files_unchanged: - LICENSE + - .gitattributes - .github/CONTRIBUTING.md - .github/ISSUE_TEMPLATE/bug_report.yml - .github/workflows/linting.yml From 5d2f67edf43f07b3119f459db2367e93f3752952 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 20 Jan 2023 13:34:53 +0000 Subject: [PATCH 24/85] Pin nf-core to 2.5 since that is the version of the template I used --- .github/workflows/linting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 8a5ce69..3a91d8e 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -82,7 +82,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install nf-core + pip install nf-core==2.5.0 - name: Run nf-core lint env: From cf19126e9f1ba4a429859cf6b88b3744c1895c0a Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 20 Jan 2023 16:45:33 +0000 Subject: [PATCH 25/85] --outdir is now mandatory --- lib/WorkflowInsdcdownload.groovy | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/WorkflowInsdcdownload.groovy b/lib/WorkflowInsdcdownload.groovy index 81b679d..893d8b8 100755 --- a/lib/WorkflowInsdcdownload.groovy +++ b/lib/WorkflowInsdcdownload.groovy @@ -17,11 +17,15 @@ class WorkflowInsdcdownload { System.exit(1) } } else { - if (!params.assembly_accession || !params.assembly_name || !params.outdir) { - log.error "Either --input, or --assembly_accession, --assembly_name, and --outdir must be provided" + if (!params.assembly_accession || !params.assembly_name) { + log.error "Either --input, or --assembly_accession and --assembly_name must be provided" System.exit(1) } } + if (!params.outdir) { + log.error "--outdir is mandatory" + System.exit(1) + } } } From 9bb76be43d621a13058ae7f13ab5221ca43a9c62 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 20 Jan 2023 18:36:49 +0000 Subject: [PATCH 26/85] Updated the change-log --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b386e7..b518284 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,18 @@ 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.2.0 - [date] + +### `Fixed` + +- Relative paths in the sample-sheet are now evaluated from the `--outdir` parameter +- Memory usage rules for `samtools dict` +- Appropriate use of `tabix`'s TBI and CSI indexing, depending on the sequence lengths + +### `Added` + +- `--outdir` is a _mandatory_ parameter + ## v1.1.0 - [2022-10-07] Minor update that fixes a few bugs From d2b5de94cf3e90c50b841745b5a912c2895fd9c1 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 20 Jan 2023 18:37:01 +0000 Subject: [PATCH 27/85] Doc update --- docs/output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index d5ccd56..2820121 100644 --- a/docs/output.md +++ b/docs/output.md @@ -70,7 +70,7 @@ the directory structure includes the assembly name, e.g. `gfLaeSulp1.1`, and all - `GCA_*.masked.ncbi.fa.gz`: Masked assembly in Fasta format, compressed with `bgzip` (whose index is `GCA_*.fa.gz.gzi`) - `GCA_*.masked.ncbi.fa.gz.fai`: `samtools faidx` index, which allows accessing any region of the assembly in constant time - `GCA_*.masked.ncbi.fa.dict`: `samtools dict` index, which allows identifying a sequence by its MD5 checksum -- `GCA_*.masked.ncbi.bed.gz`: BED file with the coordinates of the regions masked by the NCBI pipeline, with accompanying `tabix` indices (`.csi` and `.tbi`) +- `GCA_*.masked.ncbi.bed.gz`: BED file with the coordinates of the regions masked by the NCBI pipeline, with accompanying `tabix` indices (`.csi` and `.tbi`), depending on the sequence lengths ### Pipeline information From 631688ce4d9481c768c93e0246aed5b935851ec8 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 23 Jan 2023 10:23:13 +0000 Subject: [PATCH 28/85] bugfix: was discarding species_dir --- subworkflows/local/params_check.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/params_check.nf b/subworkflows/local/params_check.nf index 8d4e31f..8992365 100644 --- a/subworkflows/local/params_check.nf +++ b/subworkflows/local/params_check.nf @@ -27,7 +27,7 @@ workflow PARAMS_CHECK { .map { [ it["assembly_accession"], it["assembly_name"], - it["species_dir"].startsWith("/") ? "" : outdir + "/", + (it["species_dir"].startsWith("/") ? "" : outdir + "/") + it["species_dir"], ] } .set { ch_inputs } From 8ab4b3a15bfe8af2ca9c9d89148d08b33aaf92aa Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Wed, 1 Feb 2023 08:11:20 +0000 Subject: [PATCH 29/85] Optimised resource usage for tabix too --- conf/base.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/base.config b/conf/base.config index 3a47a90..c3863bb 100644 --- a/conf/base.config +++ b/conf/base.config @@ -16,6 +16,12 @@ process { memory = { check_max( 50.MB * task.attempt, 'memory' ) } time = { check_max( 30.min * task.attempt, 'time' ) } + // tabix needs pointers to the sequences in memory + withName: '.*:.*:PREPARE_REPEATS:TABIX_TABIX_.*' { + // 50 MB per 25,000 sequences + memory = { check_max( 50.MB * task.attempt * Math.ceil(meta.n_sequences / 25000), 'memory' ) } + } + // samtools dict loads entire sequences in memory withName: 'SAMTOOLS_DICT' { // 50 MB per 50 Mbp From fedd540dea03f5c65f0dbf1084670b626c96df99 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Wed, 1 Feb 2023 08:19:26 +0000 Subject: [PATCH 30/85] More information about the output files --- docs/output.md | 3 ++- docs/usage.md | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/output.md b/docs/output.md index 2820121..ab56998 100644 --- a/docs/output.md +++ b/docs/output.md @@ -4,7 +4,8 @@ This document describes the output produced by the pipeline. -The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. +The directories listed below will be created in the results directory (or `species_dir` when using a samplesheet) after the pipeline has finished. +All paths are relative to the top-level results directory. The directories comply with Tree of Life's canonical directory structure. diff --git a/docs/usage.md b/docs/usage.md index 0217a00..5499571 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -37,18 +37,22 @@ nextflow run sanger-tol/insdcdownload --input '[path to samplesheet file]' --out The values in the file must correspond to the values you would add to the `--assembly_accession` and `--assembly_name` parameters. ```console -assembly_accession,assembly_name -GCA_927399515.1,gfLaeSulp1.1 -GCA_922984935.2,mMelMel3.2_paternal_haplotype +species_dir,assembly_name,assembly_accession +darwin/data/fungi/Laetiporus_sulphureus,gfLaeSulp1.1,GCA_927399515.1 +darwin/data/mammals/Meles_meles,mMelMel3.2_paternal_haplotype,GCA_922984935.2 ``` | Column | Description | | -------------------- | ------------------------------------------------------------------------------ | -| `assembly_accession` | Accession number of the assembly to download. Typically of the form `GCA_*.*`. | +| `species_dir` | Base download directory for this species. Evaluated from `--outdir` if relative. | | `assembly_name` | Name of the assembly, as on the NCBI website, e.g. `gfLaeSulp1.1`. | +| `assembly_accession` | Accession number of the assembly to download. Typically of the form `GCA_*.*`. | An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. +`--species_dir` is used to fit the output of this pipeline into a directory structure compatible with the other pipelines +from Sanger Tree of Life. + ### Updating the pipeline When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: From 1e82b2bba11a35a6b5ff86ade6269bf9196b01ff Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Wed, 1 Feb 2023 10:53:10 +0000 Subject: [PATCH 31/85] Nextflow version bump due to the way Conda is enabled/disabled --- .github/workflows/ci.yml | 2 +- README.md | 4 ++-- nextflow.config | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8327968..34d0a5f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: NXF_VER: - - "22.04.0" + - "22.10.0" - "latest-everything" steps: - name: Check out pipeline code diff --git a/README.md b/README.md index f3d6b5d..c4ec659 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.7155119-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.7155119) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A522.04.0-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A522.10.0-23aa62.svg)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -43,7 +43,7 @@ Steps involved: ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=22.04.0`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=22.10.0`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) (you can follow [this tutorial](https://singularity-tutorial.github.io/01-installation/)), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(you can use [`Conda`](https://conda.io/miniconda.html) both to install Nextflow itself and also to manage software within pipelines. Please only use it within pipelines as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_. diff --git a/nextflow.config b/nextflow.config index 92ff15b..949b90d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -172,7 +172,7 @@ manifest { homePage = 'https://github.com/sanger-tol/insdcdownload' description = 'Pipeline that downloads assemblies from INSDC into a Tree of Life directory structure' mainScript = 'main.nf' - nextflowVersion = '!>=22.04.0' + nextflowVersion = '!>=22.10.0' version = '1.2dev' } From fc4a7894e950ea094565f5de3d6e238ba7b0d2f3 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Wed, 1 Feb 2023 10:55:42 +0000 Subject: [PATCH 32/85] Documentation update --- docs/usage.md | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 5499571..aafdd43 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -5,9 +5,13 @@ The pipeline takes an assembly accession number, as well as the assembly name, and downloads it in a given directory. It also extracts the repeat-masking performed by the NCBI, and builds a set of common indices (such as `samtools faidx`). -## Running the pipeline +##Β One-off downloads -The typical command for running the pipeline is as follows: +The pipeline accepts command-one line arguments to specify a single genome to download: + +- `--assembly_name`: The name of the assembly, +- `--assembly_accession`: The accession number of the assembly, +- `--outdir`: Where to download the data. ```console nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --assembly_name gfLaeSulp1.1 --outdir @@ -16,19 +20,11 @@ nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --ass This will launch the pipeline and download the `gfLaeSulp1.1` assembly (accession `GCA_927399515.1`) into the `/` directory, which will be created if needed. -Note that the pipeline will create the following files in your working directory: - -```bash -work # Directory containing the nextflow working files - # Finished results in specified location (defined with --outdir) -.nextflow_log # Log file from Nextflow -# Other nextflow hidden files, eg. history of pipeline runs and old logs. -``` ## Bulk download The pipeline can download multiple assemblies at once, by providing them in a `.csv` file through the `--input` parameter. -It has to be a comma-separated file with 2 columns, and a header row as shown in the examples below. +It has to be a comma-separated file with three columns, and a header row as shown in the examples below. ```console nextflow run sanger-tol/insdcdownload --input '[path to samplesheet file]' --outdir @@ -50,9 +46,21 @@ darwin/data/mammals/Meles_meles,mMelMel3.2_paternal_haplotype,GCA_922984935.2 An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. -`--species_dir` is used to fit the output of this pipeline into a directory structure compatible with the other pipelines +`species_dir` is used to fit the output of this pipeline into a directory structure compatible with the other pipelines from Sanger Tree of Life. +## Nextflow outputs + +Note that the pipeline will create the following files in your working directory: + +```bash +work # Directory containing the nextflow working files + # Finished results in specified location (defined with --outdir) +.nextflow_log # Log file from Nextflow +.nextflow # Directory where Nextflow keeps track of jobs +# Other nextflow hidden files, eg. history of pipeline runs and old logs. +``` + ### Updating the pipeline When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: From 3480e0ad52b5fc91942d17f26d1addc2b811196c Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Wed, 1 Feb 2023 11:23:27 +0000 Subject: [PATCH 33/85] Documentation update --- .nf-core.yml | 1 + docs/README.md | 2 ++ docs/output.md | 1 + docs/parameters.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++ docs/usage.md | 33 +++++++++++++---------- 5 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 docs/parameters.md diff --git a/.nf-core.yml b/.nf-core.yml index 4c29df8..40826dc 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -17,6 +17,7 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml - .github/workflows/linting.yml - assets/sendmail_template.txt + - docs/README.md - lib/NfcoreTemplate.groovy nextflow_config: - manifest.name diff --git a/docs/README.md b/docs/README.md index 60d64f6..7b74c4f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,5 +4,7 @@ The sanger-tol/insdcdownload 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. +- [Parameters](parameters.md) + - An overview of the different pipeline options and how to use them. - [Output](output.md) - An overview of the different results produced by the pipeline and how to interpret them. diff --git a/docs/output.md b/docs/output.md index ab56998..30b1452 100644 --- a/docs/output.md +++ b/docs/output.md @@ -78,5 +78,6 @@ the directory structure includes the assembly name, e.g. `gfLaeSulp1.1`, and all - `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.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. + - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. [Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. diff --git a/docs/parameters.md b/docs/parameters.md new file mode 100644 index 0000000..a4d1569 --- /dev/null +++ b/docs/parameters.md @@ -0,0 +1,67 @@ +# sanger-tol/insdcdownload pipeline parameters + +Pipeline that downloads assemblies from INSDC into a Tree of Life directory structure + +## Input/output options + +Define where the pipeline should find input data and save output data. + +| Parameter | Description | Type | Default | Required | Hidden | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- | -------- | ------ | +| `assembly_accession` | Accession number of the assembly to download. Typically of the form `GCA_*.*` | `string` | | | | +| `assembly_name` | Name of the assembly, as on the NCBI website, e.g. `gfLaeSulp1.1`. | `string` | | | | +| `outdir` | The output directory where the results will be saved. Not considered when running the pipeline with a .csv file as input. | `string` | | | | +| `input` | Path to comma-separated file containing information about the assemblies to download. Used for bulk download of many assemblies.
HelpThe file has to be a | +| comma-separated file with three columns, and a header row. The columns names must be `species_dir`, `assembly_accession`, and `assembly_name`.
| `string` | | | | +| `ftp_root` | Root location of the NCBI FTP, in which all assemblies can be found. Access protocol is actually not limited to FTP, and we use HTTPS by default. | `string` | +| https://ftp.ncbi.nlm.nih.gov/genomes/all/GCA | | True | +| `email` | Email address for completion summary.
HelpSet this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow | +| exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.
| `string` | | | True | + +## Institutional config options + +Parameters used to describe centralised config profiles. These should not be edited. + +| Parameter | Description | Type | Default | Required | Hidden | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- | -------- | ------ | +| `custom_config_version` | Git commit id for Institutional configs. | `string` | master | | True | +| `custom_config_base` | Base directory for Institutional configs.
HelpIf you're running offline, Nextflow will not be able to fetch the institutional config files from the | +| internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.
| +| `string` | https://raw.githubusercontent.com/nf-core/configs/master | | True | +| `config_profile_name` | Institutional config name. | `string` | | | True | +| `config_profile_description` | Institutional config description. | `string` | | | True | +| `config_profile_contact` | Institutional config contact information. | `string` | | | True | +| `config_profile_url` | Institutional config URL link. | `string` | | | True | + +## Max job request options + +Set the top limit for requested resources for any single job. + +| Parameter | Description | Type | Default | Required | Hidden | +| ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------- | -------- | ------ | +| `max_cpus` | Maximum number of CPUs that can be requested for any single job.
HelpUse to set an upper-limit for the CPU requirement for each process. Should be an integer | +| e.g. `--max_cpus 1`
| `integer` | 16 | | True | +| `max_memory` | Maximum amount of memory that can be requested for any single job.
HelpUse to set an upper-limit for the memory requirement for each process. Should be a | +| string in the format integer-unit e.g. `--max_memory '8.GB'`
| `string` | 128.GB | | True | +| `max_time` | Maximum amount of time that can be requested for any single job.
HelpUse to set an upper-limit for the time requirement for each process. Should be a string in | +| the format integer-unit e.g. `--max_time '2.h'`
| `string` | 240.h | | True | + +## Generic options + +Less common options for the pipeline, typically set in a config file. + +| Parameter | Description | Type | Default | Required | Hidden | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ------------------------------ | -------- | ------ | +| `help` | Display help text. | `boolean` | | | True | +| `publish_dir_mode` | Method used to save pipeline results to output directory.
HelpThe Nextflow `publishDir` option specifies which intermediate files should be saved to the | +| output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.
| +| `string` | copy | | True | +| `email_on_fail` | Email address for completion summary, only when pipeline fails.
HelpAn email address to send a summary email to when the pipeline is completed - ONLY sent | +| if the pipeline does not exit successfully.
| `string` | | | True | +| `plaintext_email` | Send plain-text email instead of HTML. | `boolean` | | | True | +| `monochrome_logs` | Do not use coloured log outputs. | `boolean` | | | True | +| `tracedir` | Directory to keep pipeline Nextflow logs and reports. | `string` | ${params.outdir}/pipeline_info | | True | +| `validate_params` | Boolean whether to validate parameters against the schema at runtime | `boolean` | True | | True | +| `show_hidden_params` | Show all params when using `--help`
HelpBy default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with | +| `--help`. Specifying this option will tell the pipeline to show all parameters.
| `boolean` | | | True | +| `enable_conda` | Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter. | `boolean` | | | True | diff --git a/docs/usage.md b/docs/usage.md index aafdd43..29caf4a 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -14,41 +14,46 @@ The pipeline accepts command-one line arguments to specify a single genome to do - `--outdir`: Where to download the data. ```console -nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --assembly_name gfLaeSulp1.1 --outdir +nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --assembly_name gfLaeSulp1.1 --outdir gfLaeSulp1.1_data ``` -This will launch the pipeline and download the `gfLaeSulp1.1` assembly (accession `GCA_927399515.1`) into the `/` directory, +This will launch the pipeline and download the `gfLaeSulp1.1` assembly (accession `GCA_927399515.1`) into the `gfLaeSulp1.1_data/` directory, which will be created if needed. - ## Bulk download The pipeline can download multiple assemblies at once, by providing them in a `.csv` file through the `--input` parameter. It has to be a comma-separated file with three columns, and a header row as shown in the examples below. -```console -nextflow run sanger-tol/insdcdownload --input '[path to samplesheet file]' --outdir -``` - -The values in the file must correspond to the values you would add to the `--assembly_accession` and `--assembly_name` parameters. - ```console species_dir,assembly_name,assembly_accession darwin/data/fungi/Laetiporus_sulphureus,gfLaeSulp1.1,GCA_927399515.1 darwin/data/mammals/Meles_meles,mMelMel3.2_paternal_haplotype,GCA_922984935.2 ``` -| Column | Description | -| -------------------- | ------------------------------------------------------------------------------ | +| Column | Description | +| -------------------- | -------------------------------------------------------------------------------- | | `species_dir` | Base download directory for this species. Evaluated from `--outdir` if relative. | -| `assembly_name` | Name of the assembly, as on the NCBI website, e.g. `gfLaeSulp1.1`. | -| `assembly_accession` | Accession number of the assembly to download. Typically of the form `GCA_*.*`. | +| `assembly_name` | Name of the assembly, as on the NCBI website, e.g. `gfLaeSulp1.1`. | +| `assembly_accession` | Accession number of the assembly to download. Typically of the form `GCA_*.*`. | -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. +A samplesheet may contain: +- multiple assemblies of the same species +- multiple assemblies in the same output directory +- only one row per assembly + +All samplesheet columns correspond exactly to their corresponding command-line parameter, +except `species_dir` which overrides or complements `--oudir`. `species_dir` is used to fit the output of this pipeline into a directory structure compatible with the other pipelines from Sanger Tree of Life. +An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. + +```bash +nextflow run sanger-tol/insdcdownload -profile singularity --input /path/to/samplesheet.csv --outdir /path/to/results +``` + ## Nextflow outputs Note that the pipeline will create the following files in your working directory: From cf7443fc46258c8ecaa372a701b01dc50351f924 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 13 Apr 2023 11:33:51 +0100 Subject: [PATCH 34/85] New cleanup profile to tidy up the integration runs on the farm --- nextflow.config | 1 + 1 file changed, 1 insertion(+) diff --git a/nextflow.config b/nextflow.config index 949b90d..7fa7066 100644 --- a/nextflow.config +++ b/nextflow.config @@ -68,6 +68,7 @@ try { profiles { + cleanup { cleanup = true } debug { process.beforeScript = 'echo $HOSTNAME' } conda { params.enable_conda = true From 0a9c6486241ef4633b4c9bd9af751af8d7214c48 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 14 Jul 2023 09:56:38 +0100 Subject: [PATCH 35/85] Template update for nf-core/tools version 2.6 --- .prettierignore | 1 + CITATION.cff | 8 +-- assets/adaptivecard.json | 67 +++++++++++++++++++ assets/methods_description_template.yml | 25 +++++++ assets/multiqc_config.yml | 6 +- bin/check_samplesheet.py | 9 ++- docs/usage.md | 8 +++ lib/NfcoreTemplate.groovy | 55 +++++++++++++++ lib/Utils.groovy | 21 ++++-- lib/WorkflowInsdcdownload.groovy | 19 ++++++ modules.json | 27 ++++---- .../custom/dumpsoftwareversions/main.nf | 8 +-- .../custom/dumpsoftwareversions/meta.yml | 0 .../templates/dumpsoftwareversions.py | 0 modules/nf-core/{modules => }/fastqc/main.nf | 12 ++++ modules/nf-core/{modules => }/fastqc/meta.yml | 0 modules/nf-core/modules/multiqc/main.nf | 31 --------- modules/nf-core/multiqc/main.nf | 53 +++++++++++++++ .../nf-core/{modules => }/multiqc/meta.yml | 15 +++++ nextflow.config | 5 +- nextflow_schema.json | 18 +++++ pyproject.toml | 10 +++ workflows/insdcdownload.nf | 26 ++++--- 23 files changed, 351 insertions(+), 73 deletions(-) create mode 100644 assets/adaptivecard.json create mode 100644 assets/methods_description_template.yml mode change 100755 => 100644 lib/Utils.groovy rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/main.nf (79%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/meta.yml (100%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py (100%) rename modules/nf-core/{modules => }/fastqc/main.nf (85%) rename modules/nf-core/{modules => }/fastqc/meta.yml (100%) delete mode 100644 modules/nf-core/modules/multiqc/main.nf create mode 100644 modules/nf-core/multiqc/main.nf rename modules/nf-core/{modules => }/multiqc/meta.yml (73%) create mode 100644 pyproject.toml diff --git a/.prettierignore b/.prettierignore index d0e7ae5..eb74a57 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,5 @@ email_template.html +adaptivecard.json .nextflow* work/ data/ diff --git a/CITATION.cff b/CITATION.cff index 4533e2f..017666c 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -13,8 +13,8 @@ authors: given-names: Johannes - family-names: Wilm given-names: Andreas - - family-names: Ulysse Garcia - given-names: Maxime + - family-names: Garcia + given-names: Maxime Ulysse - family-names: Di Tommaso given-names: Paolo - family-names: Nahnsen @@ -39,8 +39,8 @@ prefered-citation: given-names: Johannes - family-names: Wilm given-names: Andreas - - family-names: Ulysse Garcia - given-names: Maxime + - family-names: Garcia + given-names: Maxime Ulysse - family-names: Di Tommaso given-names: Paolo - family-names: Nahnsen diff --git a/assets/adaptivecard.json b/assets/adaptivecard.json new file mode 100644 index 0000000..44934f8 --- /dev/null +++ b/assets/adaptivecard.json @@ -0,0 +1,67 @@ +{ + "type": "message", + "attachments": [ + { + "contentType": "application/vnd.microsoft.card.adaptive", + "contentUrl": null, + "content": { + "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "msteams": { + "width": "Full" + }, + "type": "AdaptiveCard", + "version": "1.2", + "body": [ + { + "type": "TextBlock", + "size": "Large", + "weight": "Bolder", + "color": "<% if (success) { %>Good<% } else { %>Attention<%} %>", + "text": "sanger-tol/insdcdownload v${version} - ${runName}", + "wrap": true + }, + { + "type": "TextBlock", + "spacing": "None", + "text": "Completed at ${dateComplete} (duration: ${duration})", + "isSubtle": true, + "wrap": true + }, + { + "type": "TextBlock", + "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors. The full error message was: ${errorReport}.<% } %>", + "wrap": true + }, + { + "type": "TextBlock", + "text": "The command used to launch the workflow was as follows:", + "wrap": true + }, + { + "type": "TextBlock", + "text": "${commandLine}", + "isSubtle": true, + "wrap": true + } + ], + "actions": [ + { + "type": "Action.ShowCard", + "title": "Pipeline Configuration", + "card": { + "type": "AdaptiveCard", + "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "body": [ + { + "type": "FactSet", + "facts": [<% out << summary.collect{ k,v -> "{\"title\": \"$k\", \"value\" : \"$v\"}"}.join(",\n") %> + ] + } + ] + } + } + ] + } + } + ] +} diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml new file mode 100644 index 0000000..76b0c0e --- /dev/null +++ b/assets/methods_description_template.yml @@ -0,0 +1,25 @@ +id: "sanger-tol-insdcdownload-methods-description" +description: "Suggested text and references to use when describing pipeline usage within the methods section of a publication." +section_name: "sanger-tol/insdcdownload Methods Description" +section_href: "https://github.com/sanger-tol/insdcdownload" +plot_type: "html" +## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline +## You inject any metadata in the Nextflow '${workflow}' object +data: | +

Methods

+
+

The pipeline was executed with Nextflow v${workflow.nextflow.version} (Di Tommaso et al., 2017) with the following command:

+
${workflow.commandLine}
+

References

+
    +
  • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. https://doi.org/10.1038/nbt.3820
  • +
  • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. https://doi.org/10.1038/s41587-020-0439-x
  • +
+
+
Notes:
+
    + ${nodoi_text} +
  • The command above does not include parameters contained in any configs or profiles that may have been used. Ensure the config file is also uploaded with your publication!
  • +
  • You should also cite all software used within this run. Check the "Software Versions" of this report to get version information.
  • +
+
diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 407fee5..0860151 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -2,9 +2,11 @@ report_comment: > This report has been generated by the sanger-tol/insdcdownload analysis pipeline. report_section_order: - software_versions: + "sanger-tol-insdcdownload-methods-description": order: -1000 - "sanger-tol-insdcdownload-summary": + software_versions: order: -1001 + "sanger-tol-insdcdownload-summary": + order: -1002 export_plots: true diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 9a8b896..11b1557 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -98,7 +98,9 @@ def _validate_pair(self, row): """Assert that read pairs have the same file extension. Report pair status.""" if row[self._first_col] and row[self._second_col]: row[self._single_col] = False - if Path(row[self._first_col]).suffixes[-2:] != Path(row[self._second_col]).suffixes[-2:]: + first_col_suffix = Path(row[self._first_col]).suffixes[-2:] + second_col_suffix = Path(row[self._second_col]).suffixes[-2:] + if first_col_suffix != second_col_suffix: raise AssertionError("FASTQ pairs must have the same file extensions.") else: row[self._single_col] = True @@ -157,7 +159,7 @@ def sniff_format(handle): handle.seek(0) sniffer = csv.Sniffer() if not sniffer.has_header(peek): - logger.critical(f"The given sample sheet does not appear to contain a header.") + logger.critical("The given sample sheet does not appear to contain a header.") sys.exit(1) dialect = sniffer.sniff(peek) return dialect @@ -195,7 +197,8 @@ def check_samplesheet(file_in, file_out): reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) # Validate the existence of the expected header columns. if not required_columns.issubset(reader.fieldnames): - logger.critical(f"The sample sheet **must** contain the column headers: {', '.join(required_columns)}.") + req_cols = ", ".join(required_columns) + logger.critical(f"The sample sheet **must** contain these column headers: {req_cols}.") sys.exit(1) # Validate each row. checker = RowChecker() diff --git a/docs/usage.md b/docs/usage.md index ce53d51..58365c3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -235,6 +235,14 @@ See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). +## Azure Resource Requests + +To be used with the `azurebatch` profile by specifying the `-profile azurebatch`. +We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by default but these options can be changed if required. + +Note that the choice of VM size depends on your quota and the overall workload during the analysis. +For a thorough list, please refer the [Azure Sizes for virtual machines in Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). + ## Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 8f85736..45992fa 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -145,6 +145,61 @@ class NfcoreTemplate { output_tf.withWriter { w -> w << email_txt } } + // + // Construct and send adaptive card + // https://adaptivecards.io + // + public static void adaptivecard(workflow, params, summary_params, projectDir, log) { + def hook_url = params.hook_url + + def summary = [:] + for (group in summary_params.keySet()) { + 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 + + def msg_fields = [:] + msg_fields['version'] = workflow.manifest.version + msg_fields['runName'] = workflow.runName + msg_fields['success'] = workflow.success + msg_fields['dateComplete'] = workflow.complete + msg_fields['duration'] = workflow.duration + msg_fields['exitStatus'] = workflow.exitStatus + msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + msg_fields['errorReport'] = (workflow.errorReport ?: 'None') + msg_fields['commandLine'] = workflow.commandLine + msg_fields['projectDir'] = workflow.projectDir + msg_fields['summary'] = summary << misc_fields + + // Render the JSON template + def engine = new groovy.text.GStringTemplateEngine() + def hf = new File("$projectDir/assets/adaptivecard.json") + def json_template = engine.createTemplate(hf).make(msg_fields) + def json_message = json_template.toString() + + // POST + 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()); + } + } + // // Print pipeline summary on completion // diff --git a/lib/Utils.groovy b/lib/Utils.groovy old mode 100755 new mode 100644 index 28567bd..8d030f4 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -21,19 +21,26 @@ class Utils { } // Check that all channels are present - def required_channels = ['conda-forge', 'bioconda', 'defaults'] - def conda_check_failed = !required_channels.every { ch -> ch in channels } + // This channel list is ordered by required channel priority. + def required_channels_in_order = ['conda-forge', 'bioconda', 'defaults'] + def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean // 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')) + def channel_priority_violation = false + def n = required_channels_in_order.size() + for (int i = 0; i < n - 1; i++) { + channel_priority_violation |= !(channels.indexOf(required_channels_in_order[i]) < channels.indexOf(required_channels_in_order[i+1])) + } - if (conda_check_failed) { + 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/user/install.html#set-up-channels\n" + - " NB: The order of the channels matters!\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/lib/WorkflowInsdcdownload.groovy b/lib/WorkflowInsdcdownload.groovy index 06ad804..d5d0f5d 100755 --- a/lib/WorkflowInsdcdownload.groovy +++ b/lib/WorkflowInsdcdownload.groovy @@ -2,6 +2,8 @@ // This file holds several functions specific to the workflow/insdcdownload.nf in the sanger-tol/insdcdownload pipeline // +import groovy.text.SimpleTemplateEngine + class WorkflowInsdcdownload { // @@ -41,4 +43,21 @@ class WorkflowInsdcdownload { yaml_file_text += "data: |\n" yaml_file_text += "${summary_section}" return yaml_file_text + } + + public static String methodsDescriptionText(run_workflow, mqc_methods_yaml) { + // Convert to a named map so can be used as with familar NXF ${workflow} variable syntax in the MultiQC YML file + def meta = [:] + meta.workflow = run_workflow.toMap() + meta["manifest_map"] = run_workflow.manifest.toMap() + + meta["doi_text"] = meta.manifest_map.doi ? "(doi: ${meta.manifest_map.doi})" : "" + meta["nodoi_text"] = meta.manifest_map.doi ? "": "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " + + def methods_text = mqc_methods_yaml.text + + def engine = new SimpleTemplateEngine() + def description_html = engine.createTemplate(methods_text).make(meta) + + return description_html }} diff --git a/modules.json b/modules.json index 73457fd..3ae60e0 100644 --- a/modules.json +++ b/modules.json @@ -2,20 +2,21 @@ "name": "sanger-tol/insdcdownload", "homePage": "https://github.com/sanger-tol/insdcdownload", "repos": { - "nf-core/modules": { - "git_url": "https://github.com/nf-core/modules.git", + "https://github.com/nf-core/modules.git": { "modules": { - "custom/dumpsoftwareversions": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", - "branch": "master" - }, - "fastqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", - "branch": "master" - }, - "multiqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", - "branch": "master" + "nf-core": { + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "fastqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + }, + "multiqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + } } } } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf similarity index 79% rename from modules/nf-core/modules/custom/dumpsoftwareversions/main.nf rename to modules/nf-core/custom/dumpsoftwareversions/main.nf index 327d510..cebb6e0 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -1,11 +1,11 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { - label 'process_low' + label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml rename to modules/nf-core/custom/dumpsoftwareversions/meta.yml diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py rename to modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/fastqc/main.nf similarity index 85% rename from modules/nf-core/modules/fastqc/main.nf rename to modules/nf-core/fastqc/main.nf index ed6b8c5..0573036 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -44,4 +44,16 @@ process FASTQC { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.html + touch ${prefix}.zip + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml similarity index 100% rename from modules/nf-core/modules/fastqc/meta.yml rename to modules/nf-core/fastqc/meta.yml diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf deleted file mode 100644 index 1264aac..0000000 --- a/modules/nf-core/modules/multiqc/main.nf +++ /dev/null @@ -1,31 +0,0 @@ -process MULTIQC { - label 'process_medium' - - conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" - - input: - path multiqc_files - - output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - """ - multiqc -f $args . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf new file mode 100644 index 0000000..a8159a5 --- /dev/null +++ b/modules/nf-core/multiqc/main.nf @@ -0,0 +1,53 @@ +process MULTIQC { + label 'process_single' + + conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + + input: + path multiqc_files, stageAs: "?/*" + path(multiqc_config) + path(extra_multiqc_config) + path(multiqc_logo) + + output: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def config = multiqc_config ? "--config $multiqc_config" : '' + def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + """ + multiqc \\ + --force \\ + $args \\ + $config \\ + $extra_config \\ + . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ + + stub: + """ + touch multiqc_data + touch multiqc_plots + touch multiqc_report.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml similarity index 73% rename from modules/nf-core/modules/multiqc/meta.yml rename to modules/nf-core/multiqc/meta.yml index 6fa891e..ebc29b2 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -12,11 +12,25 @@ tools: homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ licence: ["GPL-3.0-or-later"] + input: - multiqc_files: type: file description: | List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections in multiqc_config. + pattern: "*.{yml,yaml}" + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + output: - report: type: file @@ -38,3 +52,4 @@ authors: - "@abhi18av" - "@bunop" - "@drpatelh" + - "@jfy133" diff --git a/nextflow.config b/nextflow.config index a32ee58..6989b23 100644 --- a/nextflow.config +++ b/nextflow.config @@ -16,7 +16,9 @@ params { // MultiQC options multiqc_config = null multiqc_title = null + multiqc_logo = null max_multiqc_email_size = '25.MB' + multiqc_methods_description = null // Boilerplate options outdir = null @@ -26,6 +28,7 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false + hook_url = null help = false validate_params = true show_hidden_params = false @@ -69,7 +72,6 @@ try { // } - profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -177,6 +179,7 @@ manifest { mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' version = '1.0dev' + doi = '' } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index a616d06..5a4d21a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -182,12 +182,30 @@ "fa_icon": "fas fa-palette", "hidden": true }, + "hook_url": { + "type": "string", + "description": "Incoming hook URL for messaging service", + "fa_icon": "fas fa-people-group", + "help_text": "Incoming hook URL for messaging service. Currently, only MS Teams is supported.", + "hidden": true + }, "multiqc_config": { "type": "string", "description": "Custom config file to supply to MultiQC.", "fa_icon": "fas fa-cog", "hidden": true }, + "multiqc_logo": { + "type": "string", + "description": "Custom logo file to supply to MultiQC. File name must also be set in the MultiQC config file", + "fa_icon": "fas fa-image", + "hidden": true + }, + "multiqc_methods_description": { + "type": "string", + "description": "Custom MultiQC yaml file containing HTML including a methods description.", + "fa_icon": "fas fa-cog" + }, "tracedir": { "type": "string", "description": "Directory to keep pipeline Nextflow logs and reports.", diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..0d62beb --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,10 @@ +# Config file for Python. Mostly used to configure linting of bin/check_samplesheet.py with Black. +# Should be kept the same as nf-core/tools to avoid fighting with template synchronisation. +[tool.black] +line-length = 120 +target_version = ["py37", "py38", "py39", "py310"] + +[tool.isort] +profile = "black" +known_first_party = ["nf_core"] +multi_line_output = 3 diff --git a/workflows/insdcdownload.nf b/workflows/insdcdownload.nf index 748afce..564b9ac 100644 --- a/workflows/insdcdownload.nf +++ b/workflows/insdcdownload.nf @@ -23,8 +23,10 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() +ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() +ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() +ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -46,9 +48,9 @@ include { INPUT_CHECK } from '../subworkflows/local/input_check' // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' +include { FASTQC } from '../modules/nf-core/fastqc/main' +include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -89,15 +91,20 @@ workflow INSDCDOWNLOAD { workflow_summary = WorkflowInsdcdownload.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) + methods_description = WorkflowInsdcdownload.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) + ch_methods_description = Channel.value(methods_description) + ch_multiqc_files = Channel.empty() - ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) - ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( - ch_multiqc_files.collect() + ch_multiqc_files.collect(), + ch_multiqc_config.collect().ifEmpty([]), + ch_multiqc_custom_config.collect().ifEmpty([]), + ch_multiqc_logo.collect().ifEmpty([]) ) multiqc_report = MULTIQC.out.report.toList() ch_versions = ch_versions.mix(MULTIQC.out.versions) @@ -114,6 +121,9 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) } NfcoreTemplate.summary(workflow, params, log) + if (params.hook_url) { + NfcoreTemplate.adaptivecard(workflow, params, summary_params, projectDir, log) + } } /* From 9e07b9bc28677ff039c2a1e83acc3138052d3a2f Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 14 Jul 2023 10:08:08 +0100 Subject: [PATCH 36/85] Template update for nf-core/tools version 2.7 --- .devcontainer/devcontainer.json | 27 +++++ .gitattributes | 1 + .github/CONTRIBUTING.md | 16 +++ .github/ISSUE_TEMPLATE/bug_report.yml | 98 +++++++++--------- .github/workflows/ci.yml | 8 +- .github/workflows/fix-linting.yml | 6 +- .github/workflows/linting.yml | 18 ++-- .github/workflows/linting_comment.yml | 2 +- .nf-core.yml | 20 ++-- .prettierignore | 2 + CITATION.cff | 56 ----------- README.md | 4 +- assets/slackreport.json | 34 +++++++ docs/usage.md | 24 +++-- lib/NfcoreSchema.groovy | 1 - lib/NfcoreTemplate.groovy | 41 ++++++-- lib/WorkflowMain.groovy | 20 ++-- modules.json | 9 +- modules/local/samplesheet_check.nf | 6 +- .../custom/dumpsoftwareversions/main.nf | 2 +- .../templates/dumpsoftwareversions.py | 99 ++++++++++--------- modules/nf-core/fastqc/main.nf | 40 +++----- modules/nf-core/multiqc/main.nf | 2 +- nextflow.config | 15 +-- nextflow_schema.json | 30 ++++-- workflows/insdcdownload.nf | 9 +- 26 files changed, 338 insertions(+), 252 deletions(-) create mode 100644 .devcontainer/devcontainer.json delete mode 100644 CITATION.cff create mode 100644 assets/slackreport.json mode change 100644 => 100755 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..ea27a58 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,27 @@ +{ + "name": "nfcore", + "image": "nfcore/gitpod:latest", + "remoteUser": "gitpod", + + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Set *default* container specific settings.json values on container create. + "settings": { + "python.defaultInterpreterPath": "/opt/conda/bin/python", + "python.linting.enabled": true, + "python.linting.pylintEnabled": true, + "python.formatting.autopep8Path": "/opt/conda/bin/autopep8", + "python.formatting.yapfPath": "/opt/conda/bin/yapf", + "python.linting.flake8Path": "/opt/conda/bin/flake8", + "python.linting.pycodestylePath": "/opt/conda/bin/pycodestyle", + "python.linting.pydocstylePath": "/opt/conda/bin/pydocstyle", + "python.linting.pylintPath": "/opt/conda/bin/pylint" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] + } + } +} diff --git a/.gitattributes b/.gitattributes index 050bb12..7a2dabc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ *.config linguist-language=nextflow +*.nf.test linguist-language=nextflow modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a6fef83..f3f9b2b 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -95,3 +95,19 @@ If you are using a new feature from core Nextflow, you may bump the minimum requ ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). + +## GitHub Codespaces + +This repo includes a devcontainer configuration which will create a GitHub Codespaces for Nextflow development! This is an online developer environment that runs in your browser, complete with VSCode and a terminal. + +To get started: + +- Open the repo in [Codespaces](https://github.com/sanger-tol/insdcdownload/codespaces) +- Tools installed + - nf-core + - Nextflow + +Devcontainer specs: + +- [DevContainer config](.devcontainer/devcontainer.json) +- [Dockerfile](.devcontainer/Dockerfile) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e142079..73b6550 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -2,52 +2,52 @@ name: Bug report description: Report something that is broken or incorrect labels: bug body: - - type: textarea - id: description - attributes: - label: Description of the bug - description: A clear and concise description of what the bug is. - validations: - required: true - - type: textarea - id: command_used - attributes: - label: Command used and terminal output - description: Steps to reproduce the behaviour. Please paste the command you used - to launch the pipeline and the output from your terminal. - render: console - placeholder: "$ nextflow run ... - - - Some output where something broke - - " - - type: textarea - id: files - attributes: - label: Relevant files - description: "Please drag and drop the relevant files here. Create a `.zip` archive - if the extension is not allowed. - - Your verbose log file `.nextflow.log` is often useful _(this is a hidden file - in the directory where you launched the pipeline)_ as well as custom Nextflow - configuration files. - - " - - type: textarea - id: system - attributes: - label: System information - description: "* Nextflow version _(eg. 21.10.3)_ - - * Hardware _(eg. HPC, Desktop, Cloud)_ - - * Executor _(eg. slurm, local, awsbatch)_ - - * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ - - * OS _(eg. CentOS Linux, macOS, Linux Mint)_ - - * Version of sanger-tol/insdcdownload _(eg. 1.1, 1.5, 1.8.2)_ - - " +- type: textarea + id: description + attributes: + label: Description of the bug + description: A clear and concise description of what the bug is. + validations: + required: true +- type: textarea + id: command_used + attributes: + label: Command used and terminal output + description: Steps to reproduce the behaviour. Please paste the command you used + to launch the pipeline and the output from your terminal. + render: console + placeholder: '$ nextflow run ... + + + Some output where something broke + + ' +- type: textarea + id: files + attributes: + label: Relevant files + description: 'Please drag and drop the relevant files here. Create a `.zip` archive + if the extension is not allowed. + + Your verbose log file `.nextflow.log` is often useful _(this is a hidden file + in the directory where you launched the pipeline)_ as well as custom Nextflow + configuration files. + + ' +- type: textarea + id: system + attributes: + label: System information + description: '* Nextflow version _(eg. 22.10.1)_ + + * Hardware _(eg. HPC, Desktop, Cloud)_ + + * Executor _(eg. slurm, local, awsbatch)_ + + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + + * OS _(eg. CentOS Linux, macOS, Linux Mint)_ + + * Version of sanger-tol/insdcdownload _(eg. 1.1, 1.5, 1.8.2)_ + + ' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19841ae..c2181c3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,10 @@ on: env: NXF_ANSI_LOG: false +concurrency: + group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" + cancel-in-progress: true + jobs: test: name: Run pipeline with test data @@ -20,11 +24,11 @@ jobs: strategy: matrix: NXF_VER: - - "21.10.3" + - "22.10.1" - "latest-everything" steps: - name: Check out pipeline code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Nextflow uses: nf-core/setup-nextflow@v1 diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 1c18c1d..d8478c7 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -24,7 +24,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 - name: Install Prettier run: npm install -g prettier @prettier/plugin-php @@ -34,9 +34,9 @@ jobs: id: prettier_status run: | if prettier --check ${GITHUB_WORKSPACE}; then - echo "::set-output name=result::pass" + echo "result=pass" >> $GITHUB_OUTPUT else - echo "::set-output name=result::fail" + echo "result=fail" >> $GITHUB_OUTPUT fi - name: Run 'prettier --write' diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 8a5ce69..858d622 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -4,6 +4,8 @@ name: nf-core linting # that the code meets the nf-core guidelines. on: push: + branches: + - dev pull_request: release: types: [published] @@ -12,9 +14,9 @@ jobs: EditorConfig: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -25,9 +27,9 @@ jobs: Prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 - name: Install Prettier run: npm install -g prettier @@ -38,7 +40,7 @@ jobs: PythonBlack: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Check code lints with Black uses: psf/black@stable @@ -69,12 +71,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Nextflow uses: nf-core/setup-nextflow@v1 - - uses: actions/setup-python@v3 + - uses: actions/setup-python@v4 with: python-version: "3.7" architecture: "x64" @@ -97,7 +99,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 04758f6..0bbcd30 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -18,7 +18,7 @@ jobs: - name: Get PR number id: pr_number - run: echo "::set-output name=pr_number::$(cat linting-logs/PR_number.txt)" + run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment uses: marocchino/sticky-pull-request-comment@v2 diff --git a/.nf-core.yml b/.nf-core.yml index eb63018..ae51a08 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,15 +1,15 @@ repository_type: pipeline lint: files_exist: - - CODE_OF_CONDUCT.md - - assets/nf-core-insdcdownload_logo_light.png - - docs/images/nf-core-insdcdownload_logo_light.png - - docs/images/nf-core-insdcdownload_logo_dark.png - - .github/ISSUE_TEMPLATE/config.yml - - .github/workflows/awstest.yml - - .github/workflows/awsfulltest.yml + - CODE_OF_CONDUCT.md + - assets/nf-core-insdcdownload_logo_light.png + - docs/images/nf-core-insdcdownload_logo_light.png + - docs/images/nf-core-insdcdownload_logo_dark.png + - .github/ISSUE_TEMPLATE/config.yml + - .github/workflows/awstest.yml + - .github/workflows/awsfulltest.yml nextflow_config: - - manifest.name - - manifest.homePage + - manifest.name + - manifest.homePage multiqc_config: - - report_comment + - report_comment diff --git a/.prettierignore b/.prettierignore index eb74a57..437d763 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,6 @@ email_template.html adaptivecard.json +slackreport.json .nextflow* work/ data/ @@ -8,3 +9,4 @@ results/ testing/ testing* *.pyc +bin/ diff --git a/CITATION.cff b/CITATION.cff deleted file mode 100644 index 017666c..0000000 --- a/CITATION.cff +++ /dev/null @@ -1,56 +0,0 @@ -cff-version: 1.2.0 -message: "If you use `nf-core tools` in your work, please cite the `nf-core` publication" -authors: - - family-names: Ewels - given-names: Philip - - family-names: Peltzer - given-names: Alexander - - family-names: Fillinger - given-names: Sven - - family-names: Patel - given-names: Harshil - - family-names: Alneberg - given-names: Johannes - - family-names: Wilm - given-names: Andreas - - family-names: Garcia - given-names: Maxime Ulysse - - family-names: Di Tommaso - given-names: Paolo - - family-names: Nahnsen - given-names: Sven -title: "The nf-core framework for community-curated bioinformatics pipelines." -version: 2.4.1 -doi: 10.1038/s41587-020-0439-x -date-released: 2022-05-16 -url: https://github.com/nf-core/tools -prefered-citation: - type: article - authors: - - family-names: Ewels - given-names: Philip - - family-names: Peltzer - given-names: Alexander - - family-names: Fillinger - given-names: Sven - - family-names: Patel - given-names: Harshil - - family-names: Alneberg - given-names: Johannes - - family-names: Wilm - given-names: Andreas - - family-names: Garcia - given-names: Maxime Ulysse - - family-names: Di Tommaso - given-names: Paolo - - family-names: Nahnsen - given-names: Sven - doi: 10.1038/s41587-020-0439-x - journal: nature biotechnology - start: 276 - end: 278 - title: "The nf-core framework for community-curated bioinformatics pipelines." - issue: 3 - volume: 38 - year: 2020 - url: https://dx.doi.org/10.1038/s41587-020-0439-x diff --git a/README.md b/README.md index 68ee811..b5fee69 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A522.10.1-23aa62.svg)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -27,7 +27,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=22.10.1`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) (you can follow [this tutorial](https://singularity-tutorial.github.io/01-installation/)), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(you can use [`Conda`](https://conda.io/miniconda.html) both to install Nextflow itself and also to manage software within pipelines. Please only use it within pipelines as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_. diff --git a/assets/slackreport.json b/assets/slackreport.json new file mode 100644 index 0000000..043d02f --- /dev/null +++ b/assets/slackreport.json @@ -0,0 +1,34 @@ +{ + "attachments": [ + { + "fallback": "Plain-text summary of the attachment.", + "color": "<% if (success) { %>good<% } else { %>danger<%} %>", + "author_name": "sanger-tol/readmapping v${version} - ${runName}", + "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", + "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", + "fields": [ + { + "title": "Command used to launch the workflow", + "value": "```${commandLine}```", + "short": false + } + <% + if (!success) { %> + , + { + "title": "Full error message", + "value": "```${errorReport}```", + "short": false + }, + { + "title": "Pipeline configuration", + "value": "<% out << summary.collect{ k,v -> k == "hook_url" ? "_${k}_: (_hidden_)" : ( ( v.class.toString().contains('Path') || ( v.class.toString().contains('String') && v.contains('/') ) ) ? "_${k}_: `${v}`" : (v.class.toString().contains('DateTime') ? ("_${k}_: " + v.format(java.time.format.DateTimeFormatter.ofLocalizedDateTime(java.time.format.FormatStyle.MEDIUM))) : "_${k}_: ${v}") ) }.join(",\n") %>", + "short": false + } + <% } + %> + ], + "footer": "Completed at <% out << dateComplete.format(java.time.format.DateTimeFormatter.ofLocalizedDateTime(java.time.format.FormatStyle.MEDIUM)) %> (duration: ${duration})" + } + ] +} diff --git a/docs/usage.md b/docs/usage.md index 58365c3..34f317e 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -81,9 +81,9 @@ nextflow pull sanger-tol/insdcdownload It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. -First, go to the [sanger-tol/insdcdownload releases page](https://github.com/sanger-tol/insdcdownload/releases) and find the latest version number - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. +First, go to the [sanger-tol/insdcdownload releases page](https://github.com/sanger-tol/insdcdownload/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. -This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. +This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. ## Core Nextflow arguments @@ -93,7 +93,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. When using Biocontainers, most of these software packaging methods pull Docker containers from quay.io e.g [FastQC](https://quay.io/repository/biocontainers/fastqc) except for Singularity which directly downloads Singularity images via https hosted by the [Galaxy project](https://depot.galaxyproject.org/singularity/) and Conda which downloads and installs software locally from [Bioconda](https://bioconda.github.io/). +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -102,8 +102,11 @@ The pipeline also dynamically loads configurations from [https://github.com/nf-c Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! 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. +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, since it can lead to different results on different machines dependent on the computer enviroment. +- `test` + - A profile with a complete configuration for automated testing + - Includes links to test data so needs no other parameters - `docker` - A generic configuration profile to be used with [Docker](https://docker.com/) - `singularity` @@ -116,9 +119,6 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - 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. -- `test` - - A profile with a complete configuration for automated testing - - Includes links to test data so needs no other parameters ### `-resume` @@ -167,8 +167,14 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` +#### For beginners + +A first step to bypass this error, you could try to increase the amount of CPUs, memory, and time for the whole pipeline. Therefor you can try to increase the resource for the parameters `--max_cpus`, `--max_memory`, and `--max_time`. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of rnaseq](https://nf-co.re/rnaseq/3.9/parameters) and scroll down to the `show hidden parameter` button to get the default value for `--max_memory`. In this case 128GB, you than can try to run your pipeline again with `--max_memory 200GB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. + +#### Advanced option on process level + To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). -We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/software/star/align/main.nf`. +We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. @@ -187,7 +193,7 @@ process { > > If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. -### Updating containers +### Updating containers (advanced users) The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index b3d092f..33cd4f6 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -46,7 +46,6 @@ class NfcoreSchema { 'quiet', 'syslog', 'v', - 'version', // Options for `nextflow run` command 'ansi', diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 45992fa..2023f45 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -32,6 +32,25 @@ class NfcoreTemplate { } } + // + // Generate version string + // + public static String version(workflow) { + String version_string = "" + + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string + } + // // Construct and send completion email // @@ -61,7 +80,7 @@ class NfcoreTemplate { misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp def email_fields = [:] - email_fields['version'] = workflow.manifest.version + email_fields['version'] = NfcoreTemplate.version(workflow) email_fields['runName'] = workflow.runName email_fields['success'] = workflow.success email_fields['dateComplete'] = workflow.complete @@ -146,10 +165,10 @@ class NfcoreTemplate { } // - // Construct and send adaptive card - // https://adaptivecards.io + // Construct and send a notification to a web server as JSON + // e.g. Microsoft Teams and Slack // - public static void adaptivecard(workflow, params, summary_params, projectDir, log) { + public static void IM_notification(workflow, params, summary_params, projectDir, log) { def hook_url = params.hook_url def summary = [:] @@ -170,7 +189,7 @@ class NfcoreTemplate { misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp def msg_fields = [:] - msg_fields['version'] = workflow.manifest.version + msg_fields['version'] = NfcoreTemplate.version(workflow) msg_fields['runName'] = workflow.runName msg_fields['success'] = workflow.success msg_fields['dateComplete'] = workflow.complete @@ -178,13 +197,16 @@ class NfcoreTemplate { msg_fields['exitStatus'] = workflow.exitStatus msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') msg_fields['errorReport'] = (workflow.errorReport ?: 'None') - msg_fields['commandLine'] = workflow.commandLine + msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") msg_fields['projectDir'] = workflow.projectDir msg_fields['summary'] = summary << misc_fields // Render the JSON template def engine = new groovy.text.GStringTemplateEngine() - def hf = new File("$projectDir/assets/adaptivecard.json") + // Different JSON depending on the service provider + // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format + def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" + def hf = new File("$projectDir/assets/${json_path}") def json_template = engine.createTemplate(hf).make(msg_fields) def json_message = json_template.toString() @@ -209,7 +231,7 @@ class NfcoreTemplate { 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.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" + 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}-" @@ -297,10 +319,11 @@ class NfcoreTemplate { // public static String logo(workflow, monochrome_logs) { Map colors = logColours(monochrome_logs) + String workflow_version = NfcoreTemplate.version(workflow) String.format( """\n ${dashedLine(monochrome_logs)} - ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} + ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} ${dashedLine(monochrome_logs)} """.stripIndent() ) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 21c861a..9b132d5 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -19,7 +19,7 @@ class WorkflowMain { } // - // Print help to screen if required + // Generate help string // public static String help(workflow, params, log) { def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --fasta reference.fa -profile docker" @@ -32,7 +32,7 @@ class WorkflowMain { } // - // Print parameter summary log to screen + // Generate parameter summary log string // public static String paramsSummaryLog(workflow, params, log) { def summary_log = '' @@ -53,20 +53,26 @@ class WorkflowMain { System.exit(0) } - // Validate workflow parameters via the JSON schema - if (params.validate_params) { - NfcoreSchema.validateParameters(workflow, params, log) + // Print workflow version and exit on --version + if (params.version) { + String workflow_version = NfcoreTemplate.version(workflow) + log.info "${workflow.manifest.name} ${workflow_version}" + System.exit(0) } // Print parameter summary log to screen - log.info paramsSummaryLog(workflow, params, log) + // Validate workflow parameters via the JSON schema + if (params.validate_params) { + NfcoreSchema.validateParameters(workflow, params, log) + } + // Check that a -profile or Nextflow config has been provided to run the pipeline NfcoreTemplate.checkConfigProvided(workflow, log) // Check that conda channels are set-up correctly - if (params.enable_conda) { + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { Utils.checkCondaChannels(log) } diff --git a/modules.json b/modules.json index 3ae60e0..ae42760 100644 --- a/modules.json +++ b/modules.json @@ -7,15 +7,18 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] } } } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 910e7ae..a4a4d1a 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,7 +1,8 @@ process SAMPLESHEET_CHECK { tag "$samplesheet" + label 'process_single' - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + conda "conda-forge::python=3.8.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.8.3' : 'quay.io/biocontainers/python:3.8.3' }" @@ -13,6 +14,9 @@ process SAMPLESHEET_CHECK { path '*.csv' , emit: csv path "versions.yml", emit: versions + when: + task.ext.when == null || task.ext.when + script: // This script is bundled with the pipeline, in sanger-tol/insdcdownload/bin/ """ check_samplesheet.py \\ diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index cebb6e0..3df2176 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,7 +2,7 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) + conda "bioconda::multiqc=1.13" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py old mode 100644 new mode 100755 index 787bdb7..e55b8d4 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -1,5 +1,9 @@ #!/usr/bin/env python + +"""Provide functions to merge multiple versions.yml files.""" + + import platform from textwrap import dedent @@ -7,6 +11,7 @@ def _make_versions_html(versions): + """Generate a tabular HTML output of all versions for MultiQC.""" html = [ dedent( """\\ @@ -45,47 +50,53 @@ def _make_versions_html(versions): return "\\n".join(html) -versions_this_module = {} -versions_this_module["${task.process}"] = { - "python": platform.python_version(), - "yaml": yaml.__version__, -} - -with open("$versions") as f: - versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module - -# aggregate versions by the module name (derived from fully-qualified process name) -versions_by_module = {} -for process, process_versions in versions_by_process.items(): - module = process.split(":")[-1] - try: - if versions_by_module[module] != process_versions: - raise AssertionError( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) - except KeyError: - versions_by_module[module] = process_versions - -versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", -} - -versions_mqc = { - "id": "software_versions", - "section_name": "${workflow.manifest.name} Software Versions", - "section_href": "https://github.com/${workflow.manifest.name}", - "plot_type": "html", - "description": "are collected at run time from the software output.", - "data": _make_versions_html(versions_by_module), -} - -with open("software_versions.yml", "w") as f: - yaml.dump(versions_by_module, f, default_flow_style=False) -with open("software_versions_mqc.yml", "w") as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - -with open("versions.yml", "w") as f: - yaml.dump(versions_this_module, f, default_flow_style=False) +def main(): + """Load all version files and generate merged output.""" + versions_this_module = {} + versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, + } + + with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + + # aggregate versions by the module name (derived from fully-qualified process name) + versions_by_module = {} + for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + if versions_by_module[module] != process_versions: + raise AssertionError( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + + versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", + } + + versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), + } + + with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) + with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + + with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) + + +if __name__ == "__main__": + main() diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 0573036..9ae5838 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -2,7 +2,7 @@ process FASTQC { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) + conda "bioconda::fastqc=0.11.9" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : 'quay.io/biocontainers/fastqc:0.11.9--0' }" @@ -20,30 +20,22 @@ process FASTQC { script: def args = task.ext.args ?: '' - // Add soft-links to original FastQs for consistent naming in pipeline def prefix = task.ext.prefix ?: "${meta.id}" - if (meta.single_end) { - """ - [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $args --threads $task.cpus ${prefix}.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS - """ - } else { - """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS - """ - } + // Make list of old name and new name pairs to use for renaming in the bash while loop + def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } + def rename_to = old_new_pairs*.join(' ').join(' ') + def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') + """ + printf "%s %s\\n" $rename_to | while read old_name new_name; do + [ -f "\${new_name}" ] || ln -s \$old_name \$new_name + done + fastqc $args --threads $task.cpus $renamed_files + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ stub: def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index a8159a5..68f66be 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,7 +1,7 @@ process MULTIQC { label 'process_single' - conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) + conda "bioconda::multiqc=1.13" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" diff --git a/nextflow.config b/nextflow.config index 6989b23..6d815bd 100644 --- a/nextflow.config +++ b/nextflow.config @@ -30,10 +30,10 @@ params { monochrome_logs = false hook_url = null help = false + version = false validate_params = true show_hidden_params = false schema_ignore_params = 'genomes' - enable_conda = false // Config options @@ -75,7 +75,7 @@ try { profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { - params.enable_conda = true + conda.enabled = true docker.enabled = false singularity.enabled = false podman.enabled = false @@ -83,7 +83,7 @@ profiles { charliecloud.enabled = false } mamba { - params.enable_conda = true + conda.enabled = true conda.useMamba = true docker.enabled = false singularity.enabled = false @@ -99,6 +99,9 @@ profiles { shifter.enabled = false charliecloud.enabled = false } + arm { + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + } singularity { singularity.enabled = true singularity.autoMounts = true @@ -173,11 +176,11 @@ dag { manifest { name = 'sanger-tol/insdcdownload' - author = '@muffato' + author = """@muffato""" homePage = 'https://github.com/sanger-tol/insdcdownload' - description = 'Pipeline that downloads assemblies from INSDC into a Tree of Life directory structure' + description = """Pipeline that downloads assemblies from INSDC into a Tree of Life directory structure""" mainScript = 'main.nf' - nextflowVersion = '!>=21.10.3' + nextflowVersion = '!>=22.10.1' version = '1.0dev' doi = '' } diff --git a/nextflow_schema.json b/nextflow_schema.json index 5a4d21a..ec23f27 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,7 +10,10 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": ["input", "outdir"], + "required": [ + "input", + "outdir" + ], "properties": { "input": { "type": "string", @@ -145,13 +148,26 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, + "version": { + "type": "boolean", + "description": "Display version and exit.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, "publish_dir_mode": { "type": "string", "default": "copy", "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "move" + ], "hidden": true }, "email_on_fail": { @@ -186,7 +202,7 @@ "type": "string", "description": "Incoming hook URL for messaging service", "fa_icon": "fas fa-people-group", - "help_text": "Incoming hook URL for messaging service. Currently, only MS Teams is supported.", + "help_text": "Incoming hook URL for messaging service. Currently, MS Teams and Slack are supported.", "hidden": true }, "multiqc_config": { @@ -226,12 +242,6 @@ "description": "Show all params when using `--help`", "hidden": true, "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." - }, - "enable_conda": { - "type": "boolean", - "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", - "hidden": true, - "fa_icon": "fas fa-bacon" } } } @@ -253,4 +263,4 @@ "$ref": "#/definitions/generic_options" } ] -} +} \ No newline at end of file diff --git a/workflows/insdcdownload.nf b/workflows/insdcdownload.nf index 564b9ac..951e492 100644 --- a/workflows/insdcdownload.nf +++ b/workflows/insdcdownload.nf @@ -102,12 +102,11 @@ workflow INSDCDOWNLOAD { MULTIQC ( ch_multiqc_files.collect(), - ch_multiqc_config.collect().ifEmpty([]), - ch_multiqc_custom_config.collect().ifEmpty([]), - ch_multiqc_logo.collect().ifEmpty([]) + ch_multiqc_config.toList(), + ch_multiqc_custom_config.toList(), + ch_multiqc_logo.toList() ) multiqc_report = MULTIQC.out.report.toList() - ch_versions = ch_versions.mix(MULTIQC.out.versions) } /* @@ -122,7 +121,7 @@ workflow.onComplete { } NfcoreTemplate.summary(workflow, params, log) if (params.hook_url) { - NfcoreTemplate.adaptivecard(workflow, params, summary_params, projectDir, log) + NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) } } From 93863d6fab715b1d740b7bc7acd8d550e242eac0 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 14 Jul 2023 10:23:27 +0100 Subject: [PATCH 37/85] Template update for nf-core/tools version 2.8 --- .editorconfig | 2 +- .github/ISSUE_TEMPLATE/bug_report.yml | 3 +- .github/workflows/branch.yml | 2 +- .github/workflows/clean-up.yml | 24 ++++ .github/workflows/linting.yml | 2 +- .pre-commit-config.yaml | 5 + README.md | 64 +++++---- bin/check_samplesheet.py | 3 - conf/base.config | 2 +- conf/test_full.config | 2 + docs/usage.md | 130 +++++------------- lib/NfcoreSchema.groovy | 4 +- lib/WorkflowInsdcdownload.groovy | 4 +- lib/WorkflowMain.groovy | 13 +- modules.json | 4 +- modules/local/samplesheet_check.nf | 2 +- .../custom/dumpsoftwareversions/main.nf | 6 +- .../custom/dumpsoftwareversions/meta.yml | 2 + modules/nf-core/multiqc/main.nf | 6 +- modules/nf-core/multiqc/meta.yml | 3 +- nextflow.config | 29 +++- pipeline_template.yml | 3 + tower.yml | 5 + 23 files changed, 173 insertions(+), 147 deletions(-) create mode 100644 .github/workflows/clean-up.yml create mode 100644 .pre-commit-config.yaml create mode 100644 pipeline_template.yml create mode 100644 tower.yml diff --git a/.editorconfig b/.editorconfig index b78de6e..b6b3190 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,7 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{md,yml,yaml,html,css,scss,js,cff}] +[*.{md,yml,yaml,html,css,scss,js}] indent_size = 2 # These files are edited and tested upstream in nf-core/modules diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 73b6550..06441d4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -44,7 +44,8 @@ body: * Executor _(eg. slurm, local, awsbatch)_ - * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, + or Apptainer)_ * OS _(eg. CentOS Linux, macOS, Linux Mint)_ diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index c08e134..9113a81 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,7 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'sanger-tol/insdcdownload' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == sanger-tol/insdcdownload ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name }} == sanger-tol/insdcdownload ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml new file mode 100644 index 0000000..694e90e --- /dev/null +++ b/.github/workflows/clean-up.yml @@ -0,0 +1,24 @@ +name: "Close user-tagged issues and PRs" +on: + schedule: + - cron: "0 0 * * 0" # Once a week + +jobs: + clean-up: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v7 + 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." + days-before-stale: 30 + days-before-close: 20 + days-before-pr-close: -1 + any-of-labels: "awaiting-changes,awaiting-feedback" + exempt-issue-labels: "WIP" + exempt-pr-labels: "WIP" + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 858d622..888cb4b 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -78,7 +78,7 @@ jobs: - uses: actions/setup-python@v4 with: - python-version: "3.7" + python-version: "3.8" architecture: "x64" - name: Install dependencies diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0c31cdb --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,5 @@ +repos: + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v2.7.1" + hooks: + - id: prettier diff --git a/README.md b/README.md index b5fee69..b23f7db 100644 --- a/README.md +++ b/README.md @@ -8,49 +8,59 @@ ## Introduction - +**sanger-tol/insdcdownload** is a bioinformatics pipeline that ... -**sanger-tol/insdcdownload** is a pipeline that downloads assemblies from INSDC into a Tree of Life directory structure. - -The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! - - - -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. - -## Pipeline summary + + 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) 2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) -## Quick Start +## Usage + +> **Note** +> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how +> to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) +> with `-profile test` before running the workflow on actual data. + + - > - The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. - > - 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 ` 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`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you 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. +Now, you can run the pipeline using: -4. Start running your own analysis! + - +```bash +nextflow run sanger-tol/insdcdownload \ + -profile \ + --input samplesheet.csv \ + --outdir +``` - ```bash - nextflow run sanger-tol/insdcdownload --input samplesheet.csv --outdir --genome GRCh37 -profile - ``` +> **Warning:** +> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those +> provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; +> see [docs](https://nf-co.re/usage/configuration#custom-configuration-files). ## Credits diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 11b1557..4a758fe 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -158,9 +158,6 @@ def sniff_format(handle): peek = read_head(handle) handle.seek(0) sniffer = csv.Sniffer() - if not sniffer.has_header(peek): - logger.critical("The given sample sheet does not appear to contain a header.") - sys.exit(1) dialect = sniffer.sniff(peek) return dialect diff --git a/conf/base.config b/conf/base.config index e6ea465..3a67fb1 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ process { 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' } + errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' diff --git a/conf/test_full.config b/conf/test_full.config index c4d71f7..952ecbe 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -10,6 +10,8 @@ ---------------------------------------------------------------------------------------- */ +cleanup = true + params { config_profile_name = 'Full test profile' config_profile_description = 'Full test dataset to check pipeline function' diff --git a/docs/usage.md b/docs/usage.md index 34f317e..b98bfaf 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -69,6 +69,29 @@ work # Directory containing the nextflow working files # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` +If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. + +Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. + +> ⚠️ Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). +> The above pipeline run specified with a params file in yaml format: + +```bash +nextflow run sanger-tol/insdcdownload -profile docker -params-file params.yaml +``` + +with `params.yaml` containing: + +```yaml +input: './samplesheet.csv' +outdir: './results/' +genome: 'GRCh37' +input: 'data' +<...> +``` + +You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). + ### Updating the pipeline When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: @@ -85,6 +108,10 @@ First, go to the [sanger-tol/insdcdownload releases page](https://github.com/san This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. +To further assist in reproducbility, you can use share and re-use [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. + +> πŸ’‘ If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. + ## Core Nextflow arguments > **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). @@ -93,7 +120,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Apptainer, Conda) - see below. > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -117,8 +144,10 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - 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/) +- `apptainer` + - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `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, Charliecloud, or Apptainer. ### `-resume` @@ -136,102 +165,19 @@ Specify the path to a specific config file (this is a core Nextflow command). Se Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. -For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: - -```console -[62/149eb0] NOTE: Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) -Error executing process > 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' - -Caused by: - Process `NFCORE_RNASEQ: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. \ - - -Command exit status: - 137 - -Command output: - (empty) - -Command error: - .command.sh: line 9: 30 Killed STAR --genomeDir star --readFilesIn WT_REP1_trimmed.fq.gz --runThreadN 2 --outFileNamePrefix WT_REP1. -Work dir: - /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` -``` - -#### For beginners - -A first step to bypass this error, you could try to increase the amount of CPUs, memory, and time for the whole pipeline. Therefor you can try to increase the resource for the parameters `--max_cpus`, `--max_memory`, and `--max_time`. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of rnaseq](https://nf-co.re/rnaseq/3.9/parameters) and scroll down to the `show hidden parameter` button to get the default value for `--max_memory`. In this case 128GB, you than can try to run your pipeline again with `--max_memory 200GB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. - -#### Advanced option on process level - -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). -We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/star/align/main.nf`. -If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). -The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. -The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. -Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. -The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. - -```nextflow -process { - withName: 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN' { - memory = 100.GB - } -} -``` - -> **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. -> -> If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. - -### Updating containers (advanced users) - -The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. - -1. Check the default version used by the pipeline in the module file for [Pangolin](https://github.com/nf-core/viralrecon/blob/a85d5969f9025409e3618d6c280ef15ce417df65/modules/nf-core/software/pangolin/main.nf#L14-L19) -2. Find the latest version of the Biocontainer available on [Quay.io](https://quay.io/repository/biocontainers/pangolin?tag=latest&tab=tags) -3. Create the custom config accordingly: - - - For Docker: +To change the resource requests, please see the [max resources](https://nf-co.re/docs/usage/configuration#max-resources) and [tuning workflow resources](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources) section of the nf-core website. - ```nextflow - process { - withName: PANGOLIN { - container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` +### Custom Containers - - For Singularity: +In some cases you may wish to change which container or conda environment a step of the pipeline uses for a particular tool. By default nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However in some cases the pipeline specified version maybe out of date. - ```nextflow - process { - withName: PANGOLIN { - container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` +To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/usage/configuration#updating-tool-versions) section of the nf-core website. - - For Conda: +### Custom Tool Arguments - ```nextflow - process { - withName: PANGOLIN { - conda = 'bioconda::pangolin=3.0.5' - } - } - ``` +A pipeline might not always support every possible argument or option of a particular tool used in pipeline. Fortunately, nf-core pipelines provide some freedom to users to insert additional parameters that the pipeline does not include by default. -> **NB:** If you wish to periodically update individual tool-specific results (e.g. Pangolin) generated by the pipeline then you must ensure to keep the `work/` directory otherwise the `-resume` ability of the pipeline will be compromised and it will restart from scratch. +To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/usage/configuration#customising-tool-arguments) section of the nf-core website. ### nf-core/configs diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 33cd4f6..9b34804 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -2,6 +2,7 @@ // This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. // +import nextflow.Nextflow import org.everit.json.schema.Schema import org.everit.json.schema.loader.SchemaLoader import org.everit.json.schema.ValidationException @@ -83,6 +84,7 @@ class NfcoreSchema { 'stub-run', 'test', 'w', + 'with-apptainer', 'with-charliecloud', 'with-conda', 'with-dag', @@ -177,7 +179,7 @@ class NfcoreSchema { } if (has_error) { - System.exit(1) + Nextflow.error('Exiting!') } } diff --git a/lib/WorkflowInsdcdownload.groovy b/lib/WorkflowInsdcdownload.groovy index d5d0f5d..9d211b8 100755 --- a/lib/WorkflowInsdcdownload.groovy +++ b/lib/WorkflowInsdcdownload.groovy @@ -2,6 +2,7 @@ // This file holds several functions specific to the workflow/insdcdownload.nf in the sanger-tol/insdcdownload pipeline // +import nextflow.Nextflow import groovy.text.SimpleTemplateEngine class WorkflowInsdcdownload { @@ -13,8 +14,7 @@ class WorkflowInsdcdownload { 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) + Nextflow.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 9b132d5..6f9bfff 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -2,6 +2,8 @@ // This file holds several functions specific to the main.nf workflow in the sanger-tol/insdcdownload pipeline // +import nextflow.Nextflow + class WorkflowMain { // @@ -21,7 +23,7 @@ class WorkflowMain { // // Generate help string // - public static String help(workflow, params, log) { + public static String help(workflow, params) { def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --fasta reference.fa -profile docker" def help_string = '' help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) @@ -34,7 +36,7 @@ class WorkflowMain { // // Generate parameter summary log string // - public static String paramsSummaryLog(workflow, params, log) { + public static String paramsSummaryLog(workflow, params) { def summary_log = '' summary_log += NfcoreTemplate.logo(workflow, params.monochrome_logs) summary_log += NfcoreSchema.paramsSummaryLog(workflow, params) @@ -49,7 +51,7 @@ class WorkflowMain { public static void initialise(workflow, params, log) { // Print help to screen if required if (params.help) { - log.info help(workflow, params, log) + log.info help(workflow, params) System.exit(0) } @@ -61,7 +63,7 @@ class WorkflowMain { } // Print parameter summary log to screen - log.info paramsSummaryLog(workflow, params, log) + log.info paramsSummaryLog(workflow, params) // Validate workflow parameters via the JSON schema if (params.validate_params) { @@ -81,8 +83,7 @@ class WorkflowMain { // Check input has been provided if (!params.input) { - log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" - System.exit(1) + Nextflow.error("Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'") } } } diff --git a/modules.json b/modules.json index ae42760..dc96cc3 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", "installed_by": ["modules"] }, "fastqc": { @@ -17,7 +17,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "f2d63bd5b68925f98f572eed70993d205cc694b7", "installed_by": ["modules"] } } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index a4a4d1a..78ef1b6 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -5,7 +5,7 @@ process SAMPLESHEET_CHECK { conda "conda-forge::python=3.8.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - 'quay.io/biocontainers/python:3.8.3' }" + 'biocontainers/python:3.8.3' }" input: path samplesheet diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 3df2176..800a609 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.13" + conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml index 60b546a..c32657d 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -1,7 +1,9 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json name: custom_dumpsoftwareversions description: Custom module used to dump software versions within the nf-core pipeline template keywords: - custom + - dump - version tools: - custom: diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 68f66be..4b60474 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_single' - conda "bioconda::multiqc=1.13" + conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ebc29b2..f93b5ee 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json name: MultiQC description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: @@ -37,7 +38,7 @@ output: description: MultiQC report file pattern: "multiqc_report.html" - data: - type: dir + type: directory description: MultiQC data dir pattern: "multiqc_data" - plots: diff --git a/nextflow.config b/nextflow.config index 6d815bd..883c216 100644 --- a/nextflow.config +++ b/nextflow.config @@ -73,7 +73,11 @@ try { profiles { - debug { process.beforeScript = 'echo $HOSTNAME' } + debug { + dumpHashes = true + process.beforeScript = 'echo $HOSTNAME' + cleanup = false + } conda { conda.enabled = true docker.enabled = false @@ -81,6 +85,7 @@ profiles { podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } mamba { conda.enabled = true @@ -90,14 +95,18 @@ profiles { podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } docker { docker.enabled = true + docker.registry = 'quay.io' docker.userEmulation = true + conda.enabled = false singularity.enabled = false podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } arm { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' @@ -105,31 +114,49 @@ profiles { singularity { singularity.enabled = true singularity.autoMounts = true + conda.enabled = false docker.enabled = false podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } podman { podman.enabled = true + podman.registry = 'quay.io' + conda.enabled = false docker.enabled = false singularity.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } shifter { shifter.enabled = true + conda.enabled = false docker.enabled = false singularity.enabled = false podman.enabled = false charliecloud.enabled = false + apptainer.enabled = false } charliecloud { charliecloud.enabled = true + conda.enabled = false docker.enabled = false singularity.enabled = false podman.enabled = false shifter.enabled = false + apptainer.enabled = false + } + apptainer { + apptainer.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false } gitpod { executor.name = 'local' diff --git a/pipeline_template.yml b/pipeline_template.yml new file mode 100644 index 0000000..09d0664 --- /dev/null +++ b/pipeline_template.yml @@ -0,0 +1,3 @@ +prefix: sanger-tol +skip: +- igenomes diff --git a/tower.yml b/tower.yml new file mode 100644 index 0000000..787aedf --- /dev/null +++ b/tower.yml @@ -0,0 +1,5 @@ +reports: + multiqc_report.html: + display: "MultiQC HTML report" + samplesheet.csv: + display: "Auto-created samplesheet with collated metadata and FASTQ paths" From 23f24b78983e940dfea350561f40f93eabed394b Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 14 Jul 2023 11:29:16 +0100 Subject: [PATCH 38/85] Fixed the modules installation --- modules.json | 68 ++++++++++++------- .../nf-core-pipeline => local}/repeats_bed.nf | 0 .../custom/dumpsoftwareversions/main.nf | 2 +- .../templates/dumpsoftwareversions.py | 1 + .../custom/getchromsizes/main.nf | 6 +- .../custom/getchromsizes/meta.yml | 0 .../{modules => }/samtools/dict/main.nf | 6 +- .../{modules => }/samtools/dict/meta.yml | 0 .../{modules => }/samtools/faidx/main.nf | 22 +++--- .../{modules => }/samtools/faidx/meta.yml | 14 +++- .../nf-core/{modules => }/tabix/bgzip/main.nf | 26 +++++-- .../{modules => }/tabix/bgzip/meta.yml | 1 + .../nf-core/{modules => }/tabix/tabix/main.nf | 4 +- .../{modules => }/tabix/tabix/meta.yml | 0 14 files changed, 101 insertions(+), 49 deletions(-) rename modules/{sanger-tol/nf-core-pipeline => local}/repeats_bed.nf (100%) rename modules/nf-core/{modules => }/custom/getchromsizes/main.nf (88%) rename modules/nf-core/{modules => }/custom/getchromsizes/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/dict/main.nf (86%) rename modules/nf-core/{modules => }/samtools/dict/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/faidx/main.nf (59%) rename modules/nf-core/{modules => }/samtools/faidx/meta.yml (79%) rename modules/nf-core/{modules => }/tabix/bgzip/main.nf (65%) rename modules/nf-core/{modules => }/tabix/bgzip/meta.yml (98%) rename modules/nf-core/{modules => }/tabix/tabix/main.nf (89%) rename modules/nf-core/{modules => }/tabix/tabix/meta.yml (100%) diff --git a/modules.json b/modules.json index b6ef8d4..738eadc 100644 --- a/modules.json +++ b/modules.json @@ -4,31 +4,51 @@ "repos": { "https://github.com/nf-core/modules.git": { "modules": { - "custom/dumpsoftwareversions": { - "branch": "master", - "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543" - }, - "custom/getchromsizes": { - "branch": "master", - "git_sha": "d75b37fef175f241230ee25c485bd574c768e282" - }, - "samtools/dict": { - "branch": "master", - "git_sha": "31409f5e727ec932f0b3a399c7a3847d70b21374" - }, - "samtools/faidx": { - "branch": "master", - "git_sha": "3eb99152cedbb7280258858e5df08478a4670696" - }, - "tabix/bgzip": { - "branch": "master", - "git_sha": "31c0b49f6527ef196e89eca49a36af2de71711f8" - }, - "tabix/tabix": { - "branch": "master", - "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247" + "nf-core": { + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "custom/getchromsizes": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "samtools/dict": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "samtools/faidx": { + "branch": "master", + "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", + "installed_by": [ + "modules" + ] + }, + "tabix/bgzip": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "tabix/tabix": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + } } } } } -} +} \ No newline at end of file diff --git a/modules/sanger-tol/nf-core-pipeline/repeats_bed.nf b/modules/local/repeats_bed.nf similarity index 100% rename from modules/sanger-tol/nf-core-pipeline/repeats_bed.nf rename to modules/local/repeats_bed.nf diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 800a609..ebc8727 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -5,7 +5,7 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index b10e0a5..da03340 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -4,6 +4,7 @@ """Provide functions to merge multiple versions.yml files.""" +import yaml import platform from textwrap import dedent diff --git a/modules/nf-core/modules/custom/getchromsizes/main.nf b/modules/nf-core/custom/getchromsizes/main.nf similarity index 88% rename from modules/nf-core/modules/custom/getchromsizes/main.nf rename to modules/nf-core/custom/getchromsizes/main.nf index 8e1693d..060a2e8 100644 --- a/modules/nf-core/modules/custom/getchromsizes/main.nf +++ b/modules/nf-core/custom/getchromsizes/main.nf @@ -2,10 +2,10 @@ process CUSTOM_GETCHROMSIZES { tag "$fasta" label 'process_single' - conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) + conda "bioconda::samtools=1.16.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : + 'biocontainers/samtools:1.16.1--h6899075_1' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/modules/custom/getchromsizes/meta.yml b/modules/nf-core/custom/getchromsizes/meta.yml similarity index 100% rename from modules/nf-core/modules/custom/getchromsizes/meta.yml rename to modules/nf-core/custom/getchromsizes/meta.yml diff --git a/modules/nf-core/modules/samtools/dict/main.nf b/modules/nf-core/samtools/dict/main.nf similarity index 86% rename from modules/nf-core/modules/samtools/dict/main.nf rename to modules/nf-core/samtools/dict/main.nf index 91f782b..f5b469b 100644 --- a/modules/nf-core/modules/samtools/dict/main.nf +++ b/modules/nf-core/samtools/dict/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_DICT { tag "$fasta" label 'process_single' - conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) + conda "bioconda::samtools=1.17" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : + 'biocontainers/samtools:1.17--h00cdaf9_0' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/modules/samtools/dict/meta.yml b/modules/nf-core/samtools/dict/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/dict/meta.yml rename to modules/nf-core/samtools/dict/meta.yml diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf similarity index 59% rename from modules/nf-core/modules/samtools/faidx/main.nf rename to modules/nf-core/samtools/faidx/main.nf index ef940db..59ed308 100644 --- a/modules/nf-core/modules/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -2,18 +2,20 @@ process SAMTOOLS_FAIDX { tag "$fasta" label 'process_single' - conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) + conda "bioconda::samtools=1.17" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : + 'biocontainers/samtools:1.17--h00cdaf9_0' }" input: tuple val(meta), path(fasta) + tuple val(meta2), path(fai) output: - tuple val(meta), path ("*.fai"), emit: fai - tuple val(meta), path ("*.gzi"), emit: gzi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path ("*.{fa,fasta}") , emit: fa , optional: true + tuple val(meta), path ("*.fai") , emit: fai, optional: true + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -23,8 +25,8 @@ process SAMTOOLS_FAIDX { """ samtools \\ faidx \\ - $args \\ - $fasta + $fasta \\ + $args cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -33,8 +35,12 @@ process SAMTOOLS_FAIDX { """ stub: + def match = (task.ext.args =~ /-o(?:utput)?\s(.*)\s?/).findAll() + def fastacmd = match[0] ? "touch ${match[0][1]}" : '' """ + ${fastacmd} touch ${fasta}.fai + cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml similarity index 79% rename from modules/nf-core/modules/samtools/faidx/meta.yml rename to modules/nf-core/samtools/faidx/meta.yml index fe2fe9a..957b25e 100644 --- a/modules/nf-core/modules/samtools/faidx/meta.yml +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -3,6 +3,7 @@ description: Index FASTA file keywords: - index - fasta + - faidx tools: - samtools: description: | @@ -17,12 +18,21 @@ input: - meta: type: map description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing reference information + e.g. [ id:'test' ] - fasta: type: file description: FASTA file pattern: "*.{fa,fasta}" + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" output: - meta: type: map diff --git a/modules/nf-core/modules/tabix/bgzip/main.nf b/modules/nf-core/tabix/bgzip/main.nf similarity index 65% rename from modules/nf-core/modules/tabix/bgzip/main.nf rename to modules/nf-core/tabix/bgzip/main.nf index aaef785..8c47d9e 100644 --- a/modules/nf-core/modules/tabix/bgzip/main.nf +++ b/modules/nf-core/tabix/bgzip/main.nf @@ -2,10 +2,10 @@ process TABIX_BGZIP { tag "$meta.id" label 'process_single' - conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + conda "bioconda::tabix=1.11" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : - 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" + 'biocontainers/tabix:1.11--hdfd78af_0' }" input: tuple val(meta), path(input) @@ -22,15 +22,29 @@ process TABIX_BGZIP { def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" in_bgzip = ["gz", "bgz", "bgzf"].contains(input.getExtension()) - output = in_bgzip ? input.getBaseName() : "${prefix}.${input.getExtension()}.gz" - command1 = in_bgzip ? '-d' : '-c' - command2 = in_bgzip ? '' : " > ${output}" + extension = in_bgzip ? input.getBaseName().tokenize(".")[-1] : input.getExtension() + output = in_bgzip ? "${prefix}.${extension}" : "${prefix}.${extension}.gz" + command = in_bgzip ? '-d' : '' // Name the index according to $prefix, unless a name has been requested if ((args.matches("(^| )-i\\b") || args.matches("(^| )--index(\$| )")) && !args.matches("(^| )-I\\b") && !args.matches("(^| )--index-name\\b")) { args = args + " -I ${output}.gzi" } """ - bgzip $command1 $args -@${task.cpus} $input $command2 + bgzip $command -c $args -@${task.cpus} $input > ${output} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + in_bgzip = ["gz", "bgz", "bgzf"].contains(input.getExtension()) + output = in_bgzip ? input.getBaseName() : "${prefix}.${input.getExtension()}.gz" + + """ + touch ${output} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/tabix/bgzip/meta.yml b/modules/nf-core/tabix/bgzip/meta.yml similarity index 98% rename from modules/nf-core/modules/tabix/bgzip/meta.yml rename to modules/nf-core/tabix/bgzip/meta.yml index 72f0abc..c3ea210 100644 --- a/modules/nf-core/modules/tabix/bgzip/meta.yml +++ b/modules/nf-core/tabix/bgzip/meta.yml @@ -44,3 +44,4 @@ authors: - "@joseespinosa" - "@drpatelh" - "@maxulysse" + - "@nvnieuwk" diff --git a/modules/nf-core/modules/tabix/tabix/main.nf b/modules/nf-core/tabix/tabix/main.nf similarity index 89% rename from modules/nf-core/modules/tabix/tabix/main.nf rename to modules/nf-core/tabix/tabix/main.nf index 21b2e79..5bf332e 100644 --- a/modules/nf-core/modules/tabix/tabix/main.nf +++ b/modules/nf-core/tabix/tabix/main.nf @@ -2,10 +2,10 @@ process TABIX_TABIX { tag "$meta.id" label 'process_single' - conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + conda "bioconda::tabix=1.11" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : - 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" + 'biocontainers/tabix:1.11--hdfd78af_0' }" input: tuple val(meta), path(tab) diff --git a/modules/nf-core/modules/tabix/tabix/meta.yml b/modules/nf-core/tabix/tabix/meta.yml similarity index 100% rename from modules/nf-core/modules/tabix/tabix/meta.yml rename to modules/nf-core/tabix/tabix/meta.yml From bfce31fb9e0ad1c03c7dd3b4caea37ba36ef2722 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 14 Jul 2023 11:29:52 +0100 Subject: [PATCH 39/85] [linting] prettier --- .github/ISSUE_TEMPLATE/bug_report.yml | 100 +++++++++++++------------- CITATION.cff | 24 +++---- README.md | 6 +- modules.json | 26 ++----- nextflow_schema.json | 9 +-- pipeline_template.yml | 2 +- 6 files changed, 74 insertions(+), 93 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 06441d4..ffd6c7c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -2,53 +2,53 @@ name: Bug report description: Report something that is broken or incorrect labels: bug body: -- type: textarea - id: description - attributes: - label: Description of the bug - description: A clear and concise description of what the bug is. - validations: - required: true -- type: textarea - id: command_used - attributes: - label: Command used and terminal output - description: Steps to reproduce the behaviour. Please paste the command you used - to launch the pipeline and the output from your terminal. - render: console - placeholder: '$ nextflow run ... - - - Some output where something broke - - ' -- type: textarea - id: files - attributes: - label: Relevant files - description: 'Please drag and drop the relevant files here. Create a `.zip` archive - if the extension is not allowed. - - Your verbose log file `.nextflow.log` is often useful _(this is a hidden file - in the directory where you launched the pipeline)_ as well as custom Nextflow - configuration files. - - ' -- type: textarea - id: system - attributes: - label: System information - description: '* Nextflow version _(eg. 22.10.1)_ - - * Hardware _(eg. HPC, Desktop, Cloud)_ - - * Executor _(eg. slurm, local, awsbatch)_ - - * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, - or Apptainer)_ - - * OS _(eg. CentOS Linux, macOS, Linux Mint)_ - - * Version of sanger-tol/insdcdownload _(eg. 1.1, 1.5, 1.8.2)_ - - ' + - type: textarea + id: description + attributes: + label: Description of the bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + id: command_used + attributes: + label: Command used and terminal output + description: Steps to reproduce the behaviour. Please paste the command you used + to launch the pipeline and the output from your terminal. + render: console + placeholder: "$ nextflow run ... + + + Some output where something broke + + " + - type: textarea + id: files + attributes: + label: Relevant files + description: "Please drag and drop the relevant files here. Create a `.zip` archive + if the extension is not allowed. + + Your verbose log file `.nextflow.log` is often useful _(this is a hidden file + in the directory where you launched the pipeline)_ as well as custom Nextflow + configuration files. + + " + - type: textarea + id: system + attributes: + label: System information + description: "* Nextflow version _(eg. 22.10.1)_ + + * Hardware _(eg. HPC, Desktop, Cloud)_ + + * Executor _(eg. slurm, local, awsbatch)_ + + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, + or Apptainer)_ + + * OS _(eg. CentOS Linux, macOS, Linux Mint)_ + + * Version of sanger-tol/insdcdownload _(eg. 1.1, 1.5, 1.8.2)_ + + " diff --git a/CITATION.cff b/CITATION.cff index 5e7a3c3..b7b4573 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -4,21 +4,21 @@ cff-version: 1.2.0 title: sanger-tol/insdcdownload v1.1.0 - Deciduous ent message: >- - If you use this software, please cite it using the - metadata from this file. + If you use this software, please cite it using the + metadata from this file. type: software authors: - - given-names: Matthieu - family-names: Muffato - affiliation: Wellcome Sanger Institute - orcid: "https://orcid.org/0000-0002-7860-3560" - - given-names: Priyanka - family-names: Surana - orcid: "https://orcid.org/0000-0002-7167-0875" - affiliation: Wellcome Sanger Institute + - given-names: Matthieu + family-names: Muffato + affiliation: Wellcome Sanger Institute + orcid: "https://orcid.org/0000-0002-7860-3560" + - given-names: Priyanka + family-names: Surana + orcid: "https://orcid.org/0000-0002-7167-0875" + affiliation: Wellcome Sanger Institute identifiers: - - type: doi - value: 10.5281/zenodo.7155119 + - type: doi + value: 10.5281/zenodo.7155119 repository-code: "https://github.com/sanger-tol/insdcdownload" license: MIT commit: TODO diff --git a/README.md b/README.md index 0daff90..21eae34 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,9 @@ Steps involved: > to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) > with `-profile test` before running the workflow on actual data. - ```console - nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --assembly_name gfLaeSulp1.1 --outdir results - ``` +```console +nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --assembly_name gfLaeSulp1.1 --outdir results +``` > **Warning:** > Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those diff --git a/modules.json b/modules.json index 738eadc..b3f059d 100644 --- a/modules.json +++ b/modules.json @@ -8,47 +8,35 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/getchromsizes": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/dict": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgzip": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/tabix": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index 7c22167..4af1a8a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -165,14 +165,7 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], "hidden": true }, "email_on_fail": { diff --git a/pipeline_template.yml b/pipeline_template.yml index 09d0664..0aa7398 100644 --- a/pipeline_template.yml +++ b/pipeline_template.yml @@ -1,3 +1,3 @@ prefix: sanger-tol skip: -- igenomes + - igenomes From 31e5f8c2b540deafa3487f331eff75c2b35b6ef0 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 14 Jul 2023 11:30:11 +0100 Subject: [PATCH 40/85] [linting] black --- bin/check_samplesheet.py | 4 +--- bin/repeats_bed.py | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index a8acaa1..de6852e 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -78,9 +78,7 @@ def _validate_accession(self, row): if not row[self._accession_col]: raise AssertionError("Accession number is required.") if not self._regex_accession.match(row[self._accession_col]): - raise AssertionError( - "Accession numbers must match %s." % self._regex_accession - ) + raise AssertionError("Accession numbers must match %s." % self._regex_accession) def _validate_name(self, row): """Assert that the assembly name is non-empty and has no space.""" diff --git a/bin/repeats_bed.py b/bin/repeats_bed.py index d4ff4b7..e4bd8cd 100755 --- a/bin/repeats_bed.py +++ b/bin/repeats_bed.py @@ -9,7 +9,6 @@ def fasta_to_bed(fasta): - in_gap = None with gzip.open(fasta, "rt") if fasta.endswith(".gz") else open(fasta) as fh: for line in fh: @@ -39,7 +38,6 @@ def fasta_to_bed(fasta): if __name__ == "__main__": - parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("fasta", help="Input Fasta file.") parser.add_argument("--version", action="version", version="%(prog)s 1.1") From 9268ef6b605150fd9eeb750f678b1fd27afade06 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 14 Jul 2023 12:12:54 +0100 Subject: [PATCH 41/85] Fixed the modules path --- subworkflows/sanger-tol/prepare_fasta.nf | 6 +++--- subworkflows/sanger-tol/prepare_repeats.nf | 8 ++++---- workflows/insdcdownload.nf | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/subworkflows/sanger-tol/prepare_fasta.nf b/subworkflows/sanger-tol/prepare_fasta.nf index 13b6859..c615e63 100644 --- a/subworkflows/sanger-tol/prepare_fasta.nf +++ b/subworkflows/sanger-tol/prepare_fasta.nf @@ -2,9 +2,9 @@ // Prepare all the indexes for a Fasta file // -include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/modules/custom/getchromsizes/main' -include { SAMTOOLS_DICT } from '../../modules/nf-core/modules/samtools/dict/main' -include { TABIX_BGZIP } from '../../modules/nf-core/modules/tabix/bgzip/main' +include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/custom/getchromsizes/main' +include { SAMTOOLS_DICT } from '../../modules/nf-core/samtools/dict/main' +include { TABIX_BGZIP } from '../../modules/nf-core/tabix/bgzip/main' workflow PREPARE_FASTA { diff --git a/subworkflows/sanger-tol/prepare_repeats.nf b/subworkflows/sanger-tol/prepare_repeats.nf index 64d23f1..df42c52 100644 --- a/subworkflows/sanger-tol/prepare_repeats.nf +++ b/subworkflows/sanger-tol/prepare_repeats.nf @@ -3,10 +3,10 @@ // and prepare indexes for it // -include { REPEATS_BED } from '../../modules/sanger-tol/nf-core-pipeline/repeats_bed' -include { TABIX_BGZIP } from '../../modules/nf-core/modules/tabix/bgzip/main' -include { TABIX_TABIX as TABIX_TABIX_CSI } from '../../modules/nf-core/modules/tabix/tabix/main' -include { TABIX_TABIX as TABIX_TABIX_TBI } from '../../modules/nf-core/modules/tabix/tabix/main' +include { REPEATS_BED } from '../../modules/local/repeats_bed' +include { TABIX_BGZIP } from '../../modules/nf-core/tabix/bgzip/main' +include { TABIX_TABIX as TABIX_TABIX_CSI } from '../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_TABIX_TBI } from '../../modules/nf-core/tabix/tabix/main' workflow PREPARE_REPEATS { diff --git a/workflows/insdcdownload.nf b/workflows/insdcdownload.nf index 67d4b20..3974a30 100644 --- a/workflows/insdcdownload.nf +++ b/workflows/insdcdownload.nf @@ -33,7 +33,7 @@ include { PREPARE_REPEATS } from '../subworkflows/s // // MODULE: Installed directly from nf-core/modules // -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 2d86b293cb5d565cd75d5789e8711ce393a7ba90 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 10:09:21 +0100 Subject: [PATCH 42/85] Now need nf-core 2.8 --- .github/workflows/linting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index a19f141..a5be907 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -84,7 +84,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install nf-core==2.5.0 + pip install nf-core==2.8 - name: Run nf-core lint env: From f9dadd032d0774006fcea45acc9abb0e27cdec81 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 10:09:59 +0100 Subject: [PATCH 43/85] we use prettier for the cff files --- .github/workflows/linting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index a5be907..7ebc310 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -22,7 +22,7 @@ jobs: run: npm install -g editorconfig-checker - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') + run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|cff\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') Prettier: runs-on: ubuntu-latest From cb4d091637295c95f48fccad6b3c671570e86fd1 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 10:24:34 +0100 Subject: [PATCH 44/85] Need to use Nextflow.error --- lib/WorkflowInsdcdownload.groovy | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/WorkflowInsdcdownload.groovy b/lib/WorkflowInsdcdownload.groovy index 1a5934c..d536dde 100755 --- a/lib/WorkflowInsdcdownload.groovy +++ b/lib/WorkflowInsdcdownload.groovy @@ -3,7 +3,6 @@ // import nextflow.Nextflow -import groovy.text.SimpleTemplateEngine class WorkflowInsdcdownload { @@ -16,18 +15,15 @@ class WorkflowInsdcdownload { if (params.input) { def f = new File(params.input); if (!f.exists()) { - log.error "'${params.input}' doesn't exist" - System.exit(1) + Nextflow.error "'${params.input}' doesn't exist" } } else { if (!params.assembly_accession || !params.assembly_name) { - log.error "Either --input, or --assembly_accession and --assembly_name must be provided" - System.exit(1) + Nextflow.error "Either --input, or --assembly_accession and --assembly_name must be provided" } } if (!params.outdir) { - log.error "--outdir is mandatory" - System.exit(1) + Nextflow.error "--outdir is mandatory" } } From 4540aa1cb7464a9144b36270ef46b609bd48c453 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 10:25:25 +0100 Subject: [PATCH 45/85] [linting] prettier --- modules.json | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/modules.json b/modules.json index b3f059d..738eadc 100644 --- a/modules.json +++ b/modules.json @@ -8,35 +8,47 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/getchromsizes": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/dict": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgzip": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/tabix": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } } } } -} +} \ No newline at end of file From 931c24314dcf9ee481742274f450361087a2b668 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 10:33:09 +0100 Subject: [PATCH 46/85] Fixed the Conda directives --- modules/local/ncbi_download.nf | 2 +- modules/local/remove_masking.nf | 2 +- modules/local/repeats_bed.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/ncbi_download.nf b/modules/local/ncbi_download.nf index dc57a21..9c18357 100644 --- a/modules/local/ncbi_download.nf +++ b/modules/local/ncbi_download.nf @@ -6,7 +6,7 @@ process NCBI_DOWNLOAD { tag "$assembly_accession" label 'process_single' - conda (params.enable_conda ? "bioconda::wget=1.18" : null) + conda "bioconda::wget=1.18" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gnu-wget:1.18--h7132678_6' : 'quay.io/biocontainers/gnu-wget:1.18--h7132678_6' }" diff --git a/modules/local/remove_masking.nf b/modules/local/remove_masking.nf index b5d2cf3..fc3974b 100644 --- a/modules/local/remove_masking.nf +++ b/modules/local/remove_masking.nf @@ -3,7 +3,7 @@ process REMOVE_MASKING { tag "$genome" label 'process_single' - conda (params.enable_conda ? "conda-forge::gawk=5.1.0" : null) + conda "conda-forge::gawk=5.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gawk:5.1.0' : 'quay.io/biocontainers/gawk:5.1.0' }" diff --git a/modules/local/repeats_bed.nf b/modules/local/repeats_bed.nf index 8f66714..205c59e 100644 --- a/modules/local/repeats_bed.nf +++ b/modules/local/repeats_bed.nf @@ -4,7 +4,7 @@ process REPEATS_BED { tag "$genome" label 'process_single' - conda (params.enable_conda ? "conda-forge::python=3.9.1" : null) + conda "conda-forge::python=3.9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'quay.io/biocontainers/python:3.9--1' }" From 435fcf1d7168f5ba944d4264d798c88b9e153179 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 10:33:25 +0100 Subject: [PATCH 47/85] The quay.io prefix should now be skipped --- modules/local/ncbi_download.nf | 2 +- modules/local/remove_masking.nf | 2 +- modules/local/repeats_bed.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/ncbi_download.nf b/modules/local/ncbi_download.nf index 9c18357..ddcc70e 100644 --- a/modules/local/ncbi_download.nf +++ b/modules/local/ncbi_download.nf @@ -9,7 +9,7 @@ process NCBI_DOWNLOAD { conda "bioconda::wget=1.18" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gnu-wget:1.18--h7132678_6' : - 'quay.io/biocontainers/gnu-wget:1.18--h7132678_6' }" + 'biocontainers/gnu-wget:1.18--h7132678_6' }" input: tuple val(assembly_accession), val(assembly_name), val(species_dir) diff --git a/modules/local/remove_masking.nf b/modules/local/remove_masking.nf index fc3974b..7a865f7 100644 --- a/modules/local/remove_masking.nf +++ b/modules/local/remove_masking.nf @@ -6,7 +6,7 @@ process REMOVE_MASKING { conda "conda-forge::gawk=5.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gawk:5.1.0' : - 'quay.io/biocontainers/gawk:5.1.0' }" + 'biocontainers/gawk:5.1.0' }" input: tuple val(meta), path(genome) diff --git a/modules/local/repeats_bed.nf b/modules/local/repeats_bed.nf index 205c59e..4a7c166 100644 --- a/modules/local/repeats_bed.nf +++ b/modules/local/repeats_bed.nf @@ -7,7 +7,7 @@ process REPEATS_BED { conda "conda-forge::python=3.9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'quay.io/biocontainers/python:3.9--1' }" + 'biocontainers/python:3.9--1' }" input: tuple val(meta), path(genome) From a9551d58ede70d4a8f1f7f624fb3653ab710a15c Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 14:07:12 +0100 Subject: [PATCH 48/85] No output for Tower --- tower.yml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 tower.yml diff --git a/tower.yml b/tower.yml deleted file mode 100644 index 787aedf..0000000 --- a/tower.yml +++ /dev/null @@ -1,5 +0,0 @@ -reports: - multiqc_report.html: - display: "MultiQC HTML report" - samplesheet.csv: - display: "Auto-created samplesheet with collated metadata and FASTQ paths" From 1d2524a881e2ae3c798745c51f5f1c4268ea9062 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 14:07:30 +0100 Subject: [PATCH 49/85] We don't use MultiQC --- assets/methods_description_template.yml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 assets/methods_description_template.yml diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml deleted file mode 100644 index 76b0c0e..0000000 --- a/assets/methods_description_template.yml +++ /dev/null @@ -1,25 +0,0 @@ -id: "sanger-tol-insdcdownload-methods-description" -description: "Suggested text and references to use when describing pipeline usage within the methods section of a publication." -section_name: "sanger-tol/insdcdownload Methods Description" -section_href: "https://github.com/sanger-tol/insdcdownload" -plot_type: "html" -## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline -## You inject any metadata in the Nextflow '${workflow}' object -data: | -

    Methods

    -

    Data was processed using sanger-tol/insdcdownload v${workflow.manifest.version} ${doi_text} of the nf-core collection of workflows (Ewels et al., 2020).

    -

    The pipeline was executed with Nextflow v${workflow.nextflow.version} (Di Tommaso et al., 2017) with the following command:

    -
    ${workflow.commandLine}
    -

    References

    -
      -
    • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. https://doi.org/10.1038/nbt.3820
    • -
    • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. https://doi.org/10.1038/s41587-020-0439-x
    • -
    -
    -
    Notes:
    -
      - ${nodoi_text} -
    • The command above does not include parameters contained in any configs or profiles that may have been used. Ensure the config file is also uploaded with your publication!
    • -
    • You should also cite all software used within this run. Check the "Software Versions" of this report to get version information.
    • -
    -
    From 7254f04f88c014434377d660d1b9c8173c3499a2 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 14:07:46 +0100 Subject: [PATCH 50/85] Fixed the wget conda package --- modules/local/ncbi_download.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/ncbi_download.nf b/modules/local/ncbi_download.nf index ddcc70e..54196d2 100644 --- a/modules/local/ncbi_download.nf +++ b/modules/local/ncbi_download.nf @@ -6,7 +6,7 @@ process NCBI_DOWNLOAD { tag "$assembly_accession" label 'process_single' - conda "bioconda::wget=1.18" + conda "bioconda::gnu-wget=1.18" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/gnu-wget:1.18--h7132678_6' : 'biocontainers/gnu-wget:1.18--h7132678_6' }" From 890dbb6a490582eace424030f3a5956394f1cf33 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 14:11:11 +0100 Subject: [PATCH 51/85] [linting] prettier --- modules.json | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/modules.json b/modules.json index 738eadc..b3f059d 100644 --- a/modules.json +++ b/modules.json @@ -8,47 +8,35 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/getchromsizes": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/dict": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgzip": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/tabix": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } } } } -} \ No newline at end of file +} From e903d2510646c6744d9c0a73c670b4bed4828813 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 21:56:24 +0100 Subject: [PATCH 52/85] was 2 before the template update --- conf/base.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/base.config b/conf/base.config index bdbed0f..316a11d 100644 --- a/conf/base.config +++ b/conf/base.config @@ -7,7 +7,7 @@ process { errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } - maxRetries = 1 + maxRetries = 2 maxErrors = '-1' // Most of the pipeline requires very little resources From 81178e5a1a9e2d222d7a3c6556a9872740a84812 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 22:01:59 +0100 Subject: [PATCH 53/85] We do this through a profile --- conf/test_full.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/test_full.config b/conf/test_full.config index 03c7af7..e639d86 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -10,8 +10,6 @@ ---------------------------------------------------------------------------------------- */ -cleanup = true - params { config_profile_name = 'Full test profile' config_profile_description = 'Full test dataset to check pipeline function' From b540ef3ca41240f903e8b984d26d264f41b3b695 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 22:07:38 +0100 Subject: [PATCH 54/85] Fixed the example params.yaml --- docs/usage.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 46dd575..c3cfbb8 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -80,11 +80,9 @@ nextflow run sanger-tol/insdcdownload -profile docker -params-file params.yaml with `params.yaml` containing: ```yaml -input: './samplesheet.csv' +assembly: 'gfLaeSulp1.1' +assembly_accession: 'GCA_927399515.1' outdir: './results/' -genome: 'GRCh37' -input: 'data' -<...> ``` You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). From 9682670ea6d29a8e7000c120eb3e5258dac655d5 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 22:09:36 +0100 Subject: [PATCH 55/85] [linting] prettier --- docs/usage.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index c3cfbb8..0f25713 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -80,9 +80,9 @@ nextflow run sanger-tol/insdcdownload -profile docker -params-file params.yaml with `params.yaml` containing: ```yaml -assembly: 'gfLaeSulp1.1' -assembly_accession: 'GCA_927399515.1' -outdir: './results/' +assembly: "gfLaeSulp1.1" +assembly_accession: "GCA_927399515.1" +outdir: "./results/" ``` You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). From d7951cfe95a3a298eb5aeaa9e875d7d0eaf67742 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 22:22:32 +0100 Subject: [PATCH 56/85] We don't make shared sanger-tol workflows anymore --- .gitattributes | 2 -- subworkflows/{sanger-tol => local}/prepare_fasta.nf | 0 subworkflows/{sanger-tol => local}/prepare_repeats.nf | 0 workflows/insdcdownload.nf | 6 +++--- 4 files changed, 3 insertions(+), 5 deletions(-) rename subworkflows/{sanger-tol => local}/prepare_fasta.nf (100%) rename subworkflows/{sanger-tol => local}/prepare_repeats.nf (100%) diff --git a/.gitattributes b/.gitattributes index 2d80efd..7a2dabc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,4 @@ *.config linguist-language=nextflow *.nf.test linguist-language=nextflow modules/nf-core/** linguist-generated -modules/sanger-tol/** linguist-generated subworkflows/nf-core/** linguist-generated -subworkflows/sanger-tol/** linguist-generated diff --git a/subworkflows/sanger-tol/prepare_fasta.nf b/subworkflows/local/prepare_fasta.nf similarity index 100% rename from subworkflows/sanger-tol/prepare_fasta.nf rename to subworkflows/local/prepare_fasta.nf diff --git a/subworkflows/sanger-tol/prepare_repeats.nf b/subworkflows/local/prepare_repeats.nf similarity index 100% rename from subworkflows/sanger-tol/prepare_repeats.nf rename to subworkflows/local/prepare_repeats.nf diff --git a/workflows/insdcdownload.nf b/workflows/insdcdownload.nf index 3974a30..67793b7 100644 --- a/workflows/insdcdownload.nf +++ b/workflows/insdcdownload.nf @@ -20,9 +20,9 @@ WorkflowInsdcdownload.initialise(params, log) // include { DOWNLOAD_GENOME } from '../subworkflows/local/download_genome' include { PARAMS_CHECK } from '../subworkflows/local/params_check' -include { PREPARE_FASTA as PREPARE_UNMASKED_FASTA } from '../subworkflows/sanger-tol/prepare_fasta' -include { PREPARE_FASTA as PREPARE_REPEAT_MASKED_FASTA } from '../subworkflows/sanger-tol/prepare_fasta' -include { PREPARE_REPEATS } from '../subworkflows/sanger-tol/prepare_repeats' +include { PREPARE_FASTA as PREPARE_UNMASKED_FASTA } from '../subworkflows/local/prepare_fasta' +include { PREPARE_FASTA as PREPARE_REPEAT_MASKED_FASTA } from '../subworkflows/local/prepare_fasta' +include { PREPARE_REPEATS } from '../subworkflows/local/prepare_repeats' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From f17c7763fbdbae8ca8cf129ba28fe55c3b8c9379 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 22:55:08 +0100 Subject: [PATCH 57/85] Not needed --- docs/parameters.md | 67 ---------------------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 docs/parameters.md diff --git a/docs/parameters.md b/docs/parameters.md deleted file mode 100644 index a4d1569..0000000 --- a/docs/parameters.md +++ /dev/null @@ -1,67 +0,0 @@ -# sanger-tol/insdcdownload pipeline parameters - -Pipeline that downloads assemblies from INSDC into a Tree of Life directory structure - -## Input/output options - -Define where the pipeline should find input data and save output data. - -| Parameter | Description | Type | Default | Required | Hidden | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- | -------- | ------ | -| `assembly_accession` | Accession number of the assembly to download. Typically of the form `GCA_*.*` | `string` | | | | -| `assembly_name` | Name of the assembly, as on the NCBI website, e.g. `gfLaeSulp1.1`. | `string` | | | | -| `outdir` | The output directory where the results will be saved. Not considered when running the pipeline with a .csv file as input. | `string` | | | | -| `input` | Path to comma-separated file containing information about the assemblies to download. Used for bulk download of many assemblies.
    HelpThe file has to be a | -| comma-separated file with three columns, and a header row. The columns names must be `species_dir`, `assembly_accession`, and `assembly_name`.
    | `string` | | | | -| `ftp_root` | Root location of the NCBI FTP, in which all assemblies can be found. Access protocol is actually not limited to FTP, and we use HTTPS by default. | `string` | -| https://ftp.ncbi.nlm.nih.gov/genomes/all/GCA | | True | -| `email` | Email address for completion summary.
    HelpSet this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow | -| exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.
    | `string` | | | True | - -## Institutional config options - -Parameters used to describe centralised config profiles. These should not be edited. - -| Parameter | Description | Type | Default | Required | Hidden | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- | -------- | ------ | -| `custom_config_version` | Git commit id for Institutional configs. | `string` | master | | True | -| `custom_config_base` | Base directory for Institutional configs.
    HelpIf you're running offline, Nextflow will not be able to fetch the institutional config files from the | -| internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.
    | -| `string` | https://raw.githubusercontent.com/nf-core/configs/master | | True | -| `config_profile_name` | Institutional config name. | `string` | | | True | -| `config_profile_description` | Institutional config description. | `string` | | | True | -| `config_profile_contact` | Institutional config contact information. | `string` | | | True | -| `config_profile_url` | Institutional config URL link. | `string` | | | True | - -## Max job request options - -Set the top limit for requested resources for any single job. - -| Parameter | Description | Type | Default | Required | Hidden | -| ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------- | -------- | ------ | -| `max_cpus` | Maximum number of CPUs that can be requested for any single job.
    HelpUse to set an upper-limit for the CPU requirement for each process. Should be an integer | -| e.g. `--max_cpus 1`
    | `integer` | 16 | | True | -| `max_memory` | Maximum amount of memory that can be requested for any single job.
    HelpUse to set an upper-limit for the memory requirement for each process. Should be a | -| string in the format integer-unit e.g. `--max_memory '8.GB'`
    | `string` | 128.GB | | True | -| `max_time` | Maximum amount of time that can be requested for any single job.
    HelpUse to set an upper-limit for the time requirement for each process. Should be a string in | -| the format integer-unit e.g. `--max_time '2.h'`
    | `string` | 240.h | | True | - -## Generic options - -Less common options for the pipeline, typically set in a config file. - -| Parameter | Description | Type | Default | Required | Hidden | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ------------------------------ | -------- | ------ | -| `help` | Display help text. | `boolean` | | | True | -| `publish_dir_mode` | Method used to save pipeline results to output directory.
    HelpThe Nextflow `publishDir` option specifies which intermediate files should be saved to the | -| output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.
    | -| `string` | copy | | True | -| `email_on_fail` | Email address for completion summary, only when pipeline fails.
    HelpAn email address to send a summary email to when the pipeline is completed - ONLY sent | -| if the pipeline does not exit successfully.
    | `string` | | | True | -| `plaintext_email` | Send plain-text email instead of HTML. | `boolean` | | | True | -| `monochrome_logs` | Do not use coloured log outputs. | `boolean` | | | True | -| `tracedir` | Directory to keep pipeline Nextflow logs and reports. | `string` | ${params.outdir}/pipeline_info | | True | -| `validate_params` | Boolean whether to validate parameters against the schema at runtime | `boolean` | True | | True | -| `show_hidden_params` | Show all params when using `--help`
    HelpBy default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with | -| `--help`. Specifying this option will tell the pipeline to show all parameters.
    | `boolean` | | | True | -| `enable_conda` | Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter. | `boolean` | | | True | From d3ade9989b350e0831b08fb6b339d3cbc4c74ff9 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 15 Jul 2023 23:36:12 +0100 Subject: [PATCH 58/85] This file is now identical --- .nf-core.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 40826dc..ad4c83b 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -12,7 +12,6 @@ lint: - .github/workflows/awsfulltest.yml files_unchanged: - LICENSE - - .gitattributes - .github/CONTRIBUTING.md - .github/ISSUE_TEMPLATE/bug_report.yml - .github/workflows/linting.yml From 8d9bc1cad1541eac679fbda212e91ecce88cfc40 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 31 Jul 2023 11:58:23 +0100 Subject: [PATCH 59/85] Leftover from a copy Co-authored-by: Priyanka Surana --- assets/slackreport.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/slackreport.json b/assets/slackreport.json index 043d02f..ea96df5 100644 --- a/assets/slackreport.json +++ b/assets/slackreport.json @@ -3,7 +3,7 @@ { "fallback": "Plain-text summary of the attachment.", "color": "<% if (success) { %>good<% } else { %>danger<%} %>", - "author_name": "sanger-tol/readmapping v${version} - ${runName}", + "author_name": "sanger-tol/insdcdownload v${version} - ${runName}", "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", "fields": [ From 7b33db6a1d74f2ce0a18b8bf9051deda5fc7cf9f Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 31 Jul 2023 11:00:30 +0000 Subject: [PATCH 60/85] Added a redirection notice to the pipeline website --- docs/usage.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index 0f25713..0b120bc 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,5 +1,9 @@ # sanger-tol/insdcdownload: Usage +## :warning: Please read this documentation on the nf-core website: [https://pipelines.tol.sanger.ac.uk/insdcdownload/usage](https://pipelines.tol.sanger.ac.uk/insdcdownload/usage) + +> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ + ## Introduction The pipeline takes an assembly accession number, as well as the assembly name, and downloads it in a given directory. From c2a374fba137fee0829876e0e275ddce76e01e83 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 31 Jul 2023 15:55:46 +0000 Subject: [PATCH 61/85] The convention is now to put all the pipeline_info files in per-pipeline sub-directories --- docs/output.md | 2 +- lib/NfcoreTemplate.groovy | 2 +- nextflow.config | 2 +- nextflow_schema.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/output.md b/docs/output.md index 30b1452..009197f 100644 --- a/docs/output.md +++ b/docs/output.md @@ -75,7 +75,7 @@ the directory structure includes the assembly name, e.g. `gfLaeSulp1.1`, and all ### Pipeline information -- `pipeline_info/` +- `pipeline_info/insdcdownload/` - 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.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index c534916..85785ef 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -132,7 +132,7 @@ class NfcoreTemplate { } // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") + def output_d = new File("${params.tracedir}/") if (!output_d.exists()) { output_d.mkdirs() } diff --git a/nextflow.config b/nextflow.config index f3d56bb..f1e4a27 100644 --- a/nextflow.config +++ b/nextflow.config @@ -17,7 +17,7 @@ params { // Boilerplate options outdir = 'results' - tracedir = "${params.outdir}/pipeline_info" + tracedir = "${params.outdir}/pipeline_info/insdcdownload" publish_dir_mode = 'copy' email = null email_on_fail = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 4af1a8a..053a320 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -198,7 +198,7 @@ "tracedir": { "type": "string", "description": "Directory to keep pipeline Nextflow logs and reports.", - "default": "${params.outdir}/pipeline_info", + "default": "${params.outdir}/pipeline_info/insdcdownload", "fa_icon": "fas fa-cogs", "hidden": true }, From 7777314032c56f4bb9d62455bf54bd64ebe28a41 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 31 Jul 2023 16:42:07 +0000 Subject: [PATCH 62/85] Added the code of conduct back --- .nf-core.yml | 1 - CODE_OF_CONDUCT.md | 111 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 CODE_OF_CONDUCT.md diff --git a/.nf-core.yml b/.nf-core.yml index ad4c83b..d524328 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,7 +1,6 @@ repository_type: pipeline lint: files_exist: - - CODE_OF_CONDUCT.md - assets/multiqc_config.yml - assets/nf-core-insdcdownload_logo_light.png - conf/igenomes.config diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..f4fd052 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,111 @@ +# Code of Conduct at nf-core (v1.0) + +## Our Pledge + +In the interest of fostering an open, collaborative, and welcoming environment, we as contributors and maintainers of nf-core, pledge to making participation in our projects and community a harassment-free experience for everyone, regardless of: + +- Age +- Body size +- Familial status +- Gender identity and expression +- Geographical location +- Level of experience +- Nationality and national origins +- Native language +- Physical and neurological ability +- Race or ethnicity +- Religion +- Sexual identity and orientation +- Socioeconomic status + +Please note that the list above is alphabetised and is therefore not ranked in any order of preference or importance. + +## Preamble + +> Note: This Code of Conduct (CoC) has been drafted by the nf-core Safety Officer and been edited after input from members of the nf-core team and others. "We", in this document, refers to the Safety Officer and members of the nf-core core team, both of whom are deemed to be members of the nf-core community and are therefore required to abide by this Code of Conduct. This document will amended periodically to keep it up-to-date, and in case of any dispute, the most current version will apply. + +An up-to-date list of members of the nf-core core team can be found [here](https://nf-co.re/about). Our current safety officer is Renuka Kudva. + +nf-core is a young and growing community that welcomes contributions from anyone with a shared vision for [Open Science Policies](https://www.fosteropenscience.eu/taxonomy/term/8). Open science policies encompass inclusive behaviours and we strive to build and maintain a safe and inclusive environment for all individuals. + +We have therefore adopted this code of conduct (CoC), which we require all members of our community and attendees in nf-core events to adhere to in all our workspaces at all times. Workspaces include but are not limited to Slack, meetings on Zoom, Jitsi, YouTube live etc. + +Our CoC will be strictly enforced and the nf-core team reserve the right to exclude participants who do not comply with our guidelines from our workspaces and future nf-core activities. + +We ask all members of our community to help maintain a supportive and productive workspace and to avoid behaviours that can make individuals feel unsafe or unwelcome. Please help us maintain and uphold this CoC. + +Questions, concerns or ideas on what we can include? Contact safety [at] nf-co [dot] re + +## Our Responsibilities + +The safety officer is responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. + +The safety officer in consultation with the nf-core core team have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +Members of the core team or the safety officer who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and be subject to the same actions as others in violation of the CoC. + +## When are where does this Code of Conduct apply? + +Participation in the nf-core community is contingent on following these guidelines in all our workspaces and events. This includes but is not limited to the following listed alphabetically and therefore in no order of preference: + +- Communicating with an official project email address. +- Communicating with community members within the nf-core Slack channel. +- Participating in hackathons organised by nf-core (both online and in-person events). +- Participating in collaborative work on GitHub, Google Suite, community calls, mentorship meetings, email correspondence. +- Participating in workshops, training, and seminar series organised by nf-core (both online and in-person events). This applies to events hosted on web-based platforms such as Zoom, Jitsi, YouTube live etc. +- Representing nf-core on social media. This includes both official and personal accounts. + +## nf-core cares 😊 + +nf-core's CoC and expectations of respectful behaviours for all participants (including organisers and the nf-core team) include but are not limited to the following (listed in alphabetical order): + +- Ask for consent before sharing another community member’s personal information (including photographs) on social media. +- Be respectful of differing viewpoints and experiences. We are all here to learn from one another and a difference in opinion can present a good learning opportunity. +- Celebrate your accomplishments at events! (Get creative with your use of emojis πŸŽ‰ πŸ₯³ πŸ’― πŸ™Œ !) +- Demonstrate empathy towards other community members. (We don’t all have the same amount of time to dedicate to nf-core. If tasks are pending, don’t hesitate to gently remind members of your team. If you are leading a task, ask for help if you feel overwhelmed.) +- Engage with and enquire after others. (This is especially important given the geographically remote nature of the nf-core community, so let’s do this the best we can) +- Focus on what is best for the team and the community. (When in doubt, ask) +- Graciously accept constructive criticism, yet be unafraid to question, deliberate, and learn. +- Introduce yourself to members of the community. (We’ve all been outsiders and we know that talking to strangers can be hard for some, but remember we’re interested in getting to know you and your visions for open science!) +- Show appreciation and **provide clear feedback**. (This is especially important because we don’t see each other in person and it can be harder to interpret subtleties. Also remember that not everyone understands a certain language to the same extent as you do, so **be clear in your communications to be kind.**) +- Take breaks when you feel like you need them. +- Using welcoming and inclusive language. (Participants are encouraged to display their chosen pronouns on Zoom or in communication on Slack.) + +## nf-core frowns on πŸ˜• + +The following behaviours from any participants within the nf-core community (including the organisers) will be considered unacceptable under this code of conduct. Engaging or advocating for any of the following could result in expulsion from nf-core workspaces. + +- Deliberate intimidation, stalking or following and sustained disruption of communication among participants of the community. This includes hijacking shared screens through actions such as using the annotate tool in conferencing software such as Zoom. +- β€œDoxing” i.e. posting (or threatening to post) another person’s personal identifying information online. +- Spamming or trolling of individuals on social media. +- Use of sexual or discriminatory imagery, comments, or jokes and unwelcome sexual attention. +- Verbal and text comments that reinforce social structures of domination related to gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, religion or work experience. + +### Online Trolling + +The majority of nf-core interactions and events are held online. Unfortunately, holding events online comes with the added issue of online trolling. This is unacceptable, reports of such behaviour will be taken very seriously, and perpetrators will be excluded from activities immediately. + +All community members are required to ask members of the group they are working within for explicit consent prior to taking screenshots of individuals during video calls. + +## Procedures for Reporting CoC violations + +If someone makes you feel uncomfortable through their behaviours or actions, report it as soon as possible. + +You can reach out to members of the [nf-core core team](https://nf-co.re/about) and they will forward your concerns to the safety officer(s). + +Issues directly concerning members of the core team will be dealt with by other members of the core team and the safety manager, and possible conflicts of interest will be taken into account. nf-core is also in discussions about having an ombudsperson, and details will be shared in due course. + +All reports will be handled with utmost discretion and confidentially. + +## Attribution and Acknowledgements + +- The [Contributor Covenant, version 1.4](http://contributor-covenant.org/version/1/4) +- The [OpenCon 2017 Code of Conduct](http://www.opencon2017.org/code_of_conduct) (CC BY 4.0 OpenCon organisers, SPARC and Right to Research Coalition) +- The [eLife innovation sprint 2020 Code of Conduct](https://sprint.elifesciences.org/code-of-conduct/) +- The [Mozilla Community Participation Guidelines v3.1](https://www.mozilla.org/en-US/about/governance/policies/participation/) (version 3.1, CC BY-SA 3.0 Mozilla) + +## Changelog + +### v1.0 - March 12th, 2021 + +- Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/) CoC. From 00badc411cbeb9f4c7c1371d9367df909706ef8f Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 31 Jul 2023 16:42:36 +0000 Subject: [PATCH 63/85] There is no parameters.md page anymore --- .nf-core.yml | 1 - docs/README.md | 2 -- 2 files changed, 3 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d524328..5a3fa08 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -15,7 +15,6 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml - .github/workflows/linting.yml - assets/sendmail_template.txt - - docs/README.md - lib/NfcoreTemplate.groovy nextflow_config: - manifest.name diff --git a/docs/README.md b/docs/README.md index 7b74c4f..60d64f6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,7 +4,5 @@ The sanger-tol/insdcdownload 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. -- [Parameters](parameters.md) - - An overview of the different pipeline options and how to use them. - [Output](output.md) - An overview of the different results produced by the pipeline and how to interpret them. From 3c42dfa4a30328926f60d9c8ca6335053868db40 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 31 Jul 2023 17:14:25 +0000 Subject: [PATCH 64/85] Fixed README - now matching the template and linking to the pipeline website --- README.md | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 21eae34..010c005 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,6 @@ **sanger-tol/insdcdownload** is a pipeline that downloads assemblies from INSDC into a Tree of Life directory structure. -The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! - -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the GitHub CI infrastructure. This ensures that the pipeline runs in a third-party environment, and has sensible resource allocation defaults set to run on real-world datasets. - -## Pipeline summary - -## Overview - The pipeline takes an assembly accession number, as well as the assembly name, and downloads it. It also builds a set of common indices (such as `samtools faidx`), and extracts the repeat-masking performed by the NCBI. Steps involved: @@ -48,6 +40,8 @@ Steps involved: > to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) > with `-profile test` before running the workflow on actual data. +The easiest is to provide the exact name and accession number of the assembly like this: + ```console nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --assembly_name gfLaeSulp1.1 --outdir results ``` @@ -57,9 +51,8 @@ nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --ass > provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; > see [docs](https://nf-co.re/usage/configuration#custom-configuration-files). -## Documentation - -The sanger-tol/insdcdownload pipeline comes with documentation about the pipeline [usage](docs/usage.md) and [output](docs/output.md). +The pipeline also supports bulk downloads through a sample-sheet. +More information about this mode on our [pipeline website](https://pipelines.tol.sanger.ac.uk/insdcdownload/usage). ## Credits From 44fbe8b3c86676284b4729c37b8b648be7e2e8dc Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 3 Aug 2023 17:34:04 +0000 Subject: [PATCH 65/85] Updated the DOI --- CITATION.cff | 2 +- README.md | 4 ++-- lib/WorkflowMain.groovy | 2 +- nextflow.config | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index b7b4573..3adf05f 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -18,7 +18,7 @@ authors: affiliation: Wellcome Sanger Institute identifiers: - type: doi - value: 10.5281/zenodo.7155119 + value: 10.5281/zenodo.6983932 repository-code: "https://github.com/sanger-tol/insdcdownload" license: MIT commit: TODO diff --git a/README.md b/README.md index 010c005..ecae670 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.7155119-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.7155119) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.6983932-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.6983932) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A522.10.1-23aa62.svg)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) @@ -66,7 +66,7 @@ For further information or help, don't hesitate to get in touch on the [Slack `# ## Citations -If you use sanger-tol/insdcdownload for your analysis, please cite it using the following doi: [10.5281/zenodo.7155119](https://doi.org/10.5281/zenodo.7155119) +If you use sanger-tol/insdcdownload for your analysis, please cite it using the following doi: [10.5281/zenodo.6983932](https://doi.org/10.5281/zenodo.6983932) An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 815e847..a572108 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -12,7 +12,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" + - " https://doi.org/10.5281/zenodo.7155119\n\n" + + " https://doi.org/10.5281/zenodo.6983932\n\n" + "* The nf-core framework\n" + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + "* Software dependencies\n" + diff --git a/nextflow.config b/nextflow.config index f1e4a27..d977225 100644 --- a/nextflow.config +++ b/nextflow.config @@ -205,7 +205,7 @@ manifest { mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' version = '1.2dev' - doi = '' + doi = '10.5281/zenodo.6983932' } // Load modules.config for DSL2 module specific options From 24eea75ff5008f7353b42dc2cf21d0c486da9746 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 3 Aug 2023 17:34:16 +0000 Subject: [PATCH 66/85] This is superfluous --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ecae670..33553f1 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Steps involved: The easiest is to provide the exact name and accession number of the assembly like this: ```console -nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --assembly_name gfLaeSulp1.1 --outdir results +nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --assembly_name gfLaeSulp1.1 ``` > **Warning:** From a94039d4ac85460f09a08a7ee700b1def70c4402 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 3 Aug 2023 17:34:28 +0000 Subject: [PATCH 67/85] Updated the contributions --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 33553f1..2e62502 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,11 @@ More information about this mode on our [pipeline website](https://pipelines.tol ## Credits -sanger-tol/insdcdownload was mainly written by @muffato, with major borrowings from @priyanka-surana's [read-mapping](https://github.com/sanger-tol/readmapping) pipeline, e.g. the script to remove the repeat-masking, and the overall structure and layout of the sub-workflows. +sanger-tol/insdcdownload was mainly written by [Matthieu Muffato](https://github.com/muffato), with major borrowings from a's [read-mapping](https://github.com/sanger-tol/readmapping) pipeline, e.g. the script to remove the repeat-masking, and the overall structure and layout of the sub-workflows. + +We thank the following people for their assistance in the development of this pipeline: + +- [Priyanka Surana](https://github.com/priyanka-surana) for providing reviews. ## Contributions and Support From 322ca6cb980cba724a414fc4046f07ec64ca184c Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 3 Aug 2023 18:09:42 +0000 Subject: [PATCH 68/85] Added options to submit the pipelines to the farm from GitHub --- .github/workflows/sangerfulltest.yml | 4 ++-- .github/workflows/sangertest.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/sangerfulltest.yml b/.github/workflows/sangerfulltest.yml index 9b68e67..850d4ae 100644 --- a/.github/workflows/sangerfulltest.yml +++ b/.github/workflows/sangerfulltest.yml @@ -1,4 +1,4 @@ -name: nf-core Sanger LSF full size tests +name: sanger-tol LSF full size tests on: push: @@ -34,4 +34,4 @@ jobs: { "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/${{ github.repository }}/results-${{ env.REVISION }}", } - profiles: test_full,sanger,singularity + profiles: test_full,sanger,singularity,cleanup diff --git a/.github/workflows/sangertest.yml b/.github/workflows/sangertest.yml index f9befb3..d6d7be5 100644 --- a/.github/workflows/sangertest.yml +++ b/.github/workflows/sangertest.yml @@ -1,4 +1,4 @@ -name: nf-core Sanger LSF tests +name: sanger-tol LSF tests on: workflow_dispatch: @@ -20,4 +20,4 @@ jobs: { "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/${{ github.repository }}/results-${{ github.sha }}", } - profiles: test,sanger,singularity + profiles: test,sanger,singularity,cleanup From e1b927d126a365318162ea0dfba5c2f5322f68dc Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 4 Aug 2023 11:28:43 +0100 Subject: [PATCH 69/85] docfix --- nextflow_schema.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 053a320..90a125c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -27,7 +27,8 @@ "outdir": { "type": "string", "format": "directory-path", - "description": "The output directory where the results will be saved. Not considered when running the pipeline with a .csv file as input.", + "description": "The output directory where the results will be saved. Not considered for sample-sheet entries that have an absolute path.", + "default": "results", "fa_icon": "fas fa-folder-open" }, "input": { From e24a6f7154878410891556e06125ec9f3f3736b4 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 10 Aug 2023 16:50:15 +0000 Subject: [PATCH 70/85] Latest nomenclature --- .github/workflows/{sangertest.yml => sanger_test.yml} | 0 .github/workflows/{sangerfulltest.yml => sanger_test_full.yml} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{sangertest.yml => sanger_test.yml} (100%) rename .github/workflows/{sangerfulltest.yml => sanger_test_full.yml} (100%) diff --git a/.github/workflows/sangertest.yml b/.github/workflows/sanger_test.yml similarity index 100% rename from .github/workflows/sangertest.yml rename to .github/workflows/sanger_test.yml diff --git a/.github/workflows/sangerfulltest.yml b/.github/workflows/sanger_test_full.yml similarity index 100% rename from .github/workflows/sangerfulltest.yml rename to .github/workflows/sanger_test_full.yml From 1b7f285d6e9cb07ef6645241f6931f5c2f3931d8 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Thu, 3 Aug 2023 16:29:32 +0000 Subject: [PATCH 71/85] Now use "outdir", which is equivalent to a ToL analysis directory --- CHANGELOG.md | 4 ++- assets/samplesheet.csv | 14 ++++---- assets/schema_input.json | 4 +-- bin/check_samplesheet.py | 12 +++---- conf/modules.config | 6 ++-- docs/output.md | 50 ++++++++++++--------------- docs/usage.md | 8 ++--- modules/local/ncbi_download.nf | 6 ++-- nextflow_schema.json | 2 +- subworkflows/local/download_genome.nf | 2 +- subworkflows/local/params_check.nf | 6 ++-- 11 files changed, 54 insertions(+), 60 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b518284..e405031 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,12 @@ 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.2.0 - [date] +## v2.0.0 - [date] ### `Fixed` +- The sample-sheet column `species_dir` is replaced with the `outdir` column which + represents where the assembly and repeats are downloaded (in immediate sub-directories) - Relative paths in the sample-sheet are now evaluated from the `--outdir` parameter - Memory usage rules for `samtools dict` - Appropriate use of `tabix`'s TBI and CSI indexing, depending on the sequence lengths diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 49f1be2..0f2f8be 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,7 +1,7 @@ -species_dir,assembly_name,assembly_accession -25g/data/echinoderms/Asterias_rubens,eAstRub1.3,GCA_902459465.3 -25g/data/insects/Osmia_bicornis,iOsmBic2.1,GCA_907164935.1 -25g/data/insects/Osmia_bicornis,iOsmBic2.1_alternate_haplotype,GCA_907164925.1 -darwin/data/fungi/Laetiporus_sulphureus,gfLaeSulp1.1,GCA_927399515.1 -darwin/data/insects/Noctua_fimbriata,ilNocFimb1.1,GCA_905163415.1 -darwin/data/mammals/Meles_meles,mMelMel3.2_paternal_haplotype,GCA_922984935.2 +outdir,assembly_name,assembly_accession +Asterias_rubens/eAstRub1.3,eAstRub1.3,GCA_902459465.3 +Osmia_bicornis/iOsmBic2.1,iOsmBic2.1,GCA_907164935.1 +Osmia_bicornis/iOsmBic2.1_alternate_haplotype,iOsmBic2.1_alternate_haplotype,GCA_907164925.1 +Laetiporus_sulphureus/gfLaeSulp1.1,gfLaeSulp1.1,GCA_927399515.1 +Noctua_fimbriata/ilNocFimb1.1,ilNocFimb1.1,GCA_905163415.1 +Meles_meles/mMelMel3.2_paternal_haplotype,mMelMel3.2_paternal_haplotype,GCA_922984935.2 diff --git a/assets/schema_input.json b/assets/schema_input.json index ed91197..dafbfaa 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -7,7 +7,7 @@ "items": { "type": "object", "properties": { - "species_dir": { + "outdir": { "type": "string", "pattern": "^\\S+$", "errorMessage": "Species directory must be provided and exist" @@ -23,6 +23,6 @@ "errorMessage": "Assembly accession number must be provided and be of the form GCA_*" } }, - "required": ["species_dir", "assembly_name", "assembly_accession"] + "required": ["outdir", "assembly_name", "assembly_accession"] } } diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index de6852e..aa8bfc4 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -28,7 +28,7 @@ class RowChecker: def __init__( self, - dir_col="species_dir", + dir_col="outdir", name_col="assembly_name", accession_col="assembly_accession", **kwargs, @@ -38,7 +38,7 @@ def __init__( Args: dir_col (str): The name of the column that contains the species directory - (default "species_dir"). + (default "outdir"). name_col (str): The name of the column that contains the assembly name (default "assembly_name"). accession_col (str): The name of the column that contains the accession @@ -142,12 +142,12 @@ def check_samplesheet(file_in, file_out): Example: This function checks that the samplesheet follows the following structure:: - species_dir,assembly_name,assembly_accession - darwin/data/fungi/Laetiporus_sulphureus,gfLaeSulp1.1,GCA_927399515.1 - darwin/data/mammals/Meles_meles,mMelMel3.2_paternal_haplotype,GCA_922984935.2 + outdir,assembly_name,assembly_accession + Laetiporus_sulphureus/gfLaeSulp1.1,gfLaeSulp1.1,GCA_927399515.1 + Meles_meles/mMelMel3.2_paternal_haplotype,mMelMel3.2_paternal_haplotype,GCA_922984935.2 """ required_columns = { - "species_dir", + "outdir", "assembly_name", "assembly_accession", } diff --git a/conf/modules.config b/conf/modules.config index 091bce5..c0bcbe4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -15,7 +15,7 @@ process { withName: 'NCBI_DOWNLOAD' { maxForks = 3 publishDir = [ - path: { "${meta.species_dir}/assembly/release/${meta.assembly_name}/insdc" }, + path: { "${meta.outdir}/assembly" }, mode: 'copy', saveAs: { filename -> filename.endsWith('assembly_report.txt') || filename.endsWith('assembly_stats.txt') || filename.endsWith("ACCESSION") ? filename : null } ] @@ -23,7 +23,7 @@ process { withName: '.*:.*:PREPARE_UNMASKED_FASTA:.*' { publishDir = [ - path: { "${meta.species_dir}/assembly/release/${meta.assembly_name}/insdc" }, + path: { "${meta.outdir}/assembly" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -31,7 +31,7 @@ process { withName: '.*:.*:(PREPARE_REPEAT_MASKED_FASTA:.*|PREPARE_REPEATS:TABIX_.*)' { publishDir = [ - path: { "${meta.species_dir}/analysis/${meta.assembly_name}/repeats/ncbi" }, + path: { "${meta.outdir}/repeats/ncbi" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/docs/output.md b/docs/output.md index 009197f..312f315 100644 --- a/docs/output.md +++ b/docs/output.md @@ -4,7 +4,8 @@ This document describes the output produced by the pipeline. -The directories listed below will be created in the results directory (or `species_dir` when using a samplesheet) after the pipeline has finished. +The directories listed below will be created in a directory based on the `--outdir` command-line parameter and the `outdir` column of the samplesheet. +) after the pipeline has finished. All paths are relative to the top-level results directory. The directories comply with Tree of Life's canonical directory structure. @@ -23,20 +24,17 @@ Here are the files you can expect in the `assembly/` sub-directory. ```text assembly -└── release - └── gfLaeSulp1.1 - └── insdc - β”œβ”€β”€ ACCESSION - β”œβ”€β”€ GCA_927399515.1.assembly_report.txt - β”œβ”€β”€ GCA_927399515.1.assembly_stats.txt - β”œβ”€β”€ GCA_927399515.1.fa.dict - β”œβ”€β”€ GCA_927399515.1.fa.gz - β”œβ”€β”€ GCA_927399515.1.fa.gz.fai - β”œβ”€β”€ GCA_927399515.1.fa.gz.gzi - └── GCA_927399515.1.fa.gz.sizes +β”œβ”€β”€ ACCESSION +β”œβ”€β”€ GCA_927399515.1.assembly_report.txt +β”œβ”€β”€ GCA_927399515.1.assembly_stats.txt +β”œβ”€β”€ GCA_927399515.1.fa.dict +β”œβ”€β”€ GCA_927399515.1.fa.gz +β”œβ”€β”€ GCA_927399515.1.fa.gz.fai +β”œβ”€β”€ GCA_927399515.1.fa.gz.gzi +└── GCA_927399515.1.fa.gz.sizes ``` -The directory structure includes the assembly name, e.g. `gfLaeSulp1.1`, and all files are named after the assembly accession, e.g. `GCA_927399515.1`. +All files are named after the assembly accession, e.g. `GCA_927399515.1`. - `GCA_*.assembly_report.txt` and `GCA_*.assembly_stats.txt`: report and statistics files, straight from the NCBI FTP - `GCA_*.fa.gz`: Unmasked assembly in Fasta format, compressed with `bgzip` (whose index is `GCA_*.fa.gz.gzi`) @@ -48,25 +46,23 @@ with the exception of `ACCESSION`, which contains a single line of text: the ass ### Primary analysis files -Here are the files you can expect in the `analysis/` sub-directory. +Here are the files you can expect in the `repeats/` sub-directory. ```text -analysis -└── gfLaeSulp1.1 - └── repeats - └── ncbi - β”œβ”€β”€ GCA_927399515.1.masked.ncbi.bed.gz - β”œβ”€β”€ GCA_927399515.1.masked.ncbi.bed.gz.csi - β”œβ”€β”€ GCA_927399515.1.masked.ncbi.bed.gz.tbi - β”œβ”€β”€ GCA_927399515.1.masked.ncbi.fa.dict - β”œβ”€β”€ GCA_927399515.1.masked.ncbi.fa.gz - β”œβ”€β”€ GCA_927399515.1.masked.ncbi.fa.gz.fai - β”œβ”€β”€ GCA_927399515.1.masked.ncbi.fa.gz.gzi - └── GCA_927399515.1.masked.ncbi.fa.gz.sizes +repeats +└── ncbi + β”œβ”€β”€ GCA_927399515.1.masked.ncbi.bed.gz + β”œβ”€β”€ GCA_927399515.1.masked.ncbi.bed.gz.csi + β”œβ”€β”€ GCA_927399515.1.masked.ncbi.bed.gz.tbi + β”œβ”€β”€ GCA_927399515.1.masked.ncbi.fa.dict + β”œβ”€β”€ GCA_927399515.1.masked.ncbi.fa.gz + β”œβ”€β”€ GCA_927399515.1.masked.ncbi.fa.gz.fai + β”œβ”€β”€ GCA_927399515.1.masked.ncbi.fa.gz.gzi + └── GCA_927399515.1.masked.ncbi.fa.gz.sizes ``` They all correspond to the repeat-masking analysis run by the NCBI themselves. Like for the `assembly/` sub-directory, -the directory structure includes the assembly name, e.g. `gfLaeSulp1.1`, and all files are named after the assembly accession, e.g. `GCA_927399515.1`. +all files are named after the assembly accession, e.g. `GCA_927399515.1`. - `GCA_*.masked.ncbi.fa.gz`: Masked assembly in Fasta format, compressed with `bgzip` (whose index is `GCA_*.fa.gz.gzi`) - `GCA_*.masked.ncbi.fa.gz.fai`: `samtools faidx` index, which allows accessing any region of the assembly in constant time diff --git a/docs/usage.md b/docs/usage.md index 0b120bc..d6c683f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -30,14 +30,14 @@ The pipeline can download multiple assemblies at once, by providing them in a `. It has to be a comma-separated file with three columns, and a header row as shown in the examples below. ```console -species_dir,assembly_name,assembly_accession +outdir,assembly_name,assembly_accession darwin/data/fungi/Laetiporus_sulphureus,gfLaeSulp1.1,GCA_927399515.1 darwin/data/mammals/Meles_meles,mMelMel3.2_paternal_haplotype,GCA_922984935.2 ``` | Column | Description | | -------------------- | -------------------------------------------------------------------------------- | -| `species_dir` | Base download directory for this species. Evaluated from `--outdir` if relative. | +| `outdir` | Base download directory for this species. Evaluated from `--outdir` if relative. | | `assembly_name` | Name of the assembly, as on the NCBI website, e.g. `gfLaeSulp1.1`. | | `assembly_accession` | Accession number of the assembly to download. Typically of the form `GCA_*.*`. | @@ -48,9 +48,7 @@ A samplesheet may contain: - only one row per assembly All samplesheet columns correspond exactly to their corresponding command-line parameter, -except `species_dir` which overrides or complements `--oudir`. -`species_dir` is used to fit the output of this pipeline into a directory structure compatible with the other pipelines -from Sanger Tree of Life. +except `outdir` which overrides or complements `--oudir`. An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. diff --git a/modules/local/ncbi_download.nf b/modules/local/ncbi_download.nf index 54196d2..ae63e52 100644 --- a/modules/local/ncbi_download.nf +++ b/modules/local/ncbi_download.nf @@ -12,7 +12,7 @@ process NCBI_DOWNLOAD { 'biocontainers/gnu-wget:1.18--h7132678_6' }" input: - tuple val(assembly_accession), val(assembly_name), val(species_dir) + tuple val(assembly_accession), val(assembly_name), val(outdir) output: tuple val(meta), path(filename_fasta) , emit: fasta @@ -36,7 +36,7 @@ process NCBI_DOWNLOAD { meta = [ id : assembly_accession, assembly_name : assembly_name, - species_dir : species_dir, + outdir : outdir, ] def prefix = task.ext.prefix ?: "${meta.id}" filename_assembly_report = "${prefix}.assembly_report.txt" @@ -45,8 +45,6 @@ process NCBI_DOWNLOAD { filename_accession = "ACCESSION" """ - #export https_proxy=http://wwwcache.sanger.ac.uk:3128 - #export http_proxy=http://wwwcache.sanger.ac.uk:3128 wget ${ftp_path}/${remote_filename_stem}_assembly_report.txt wget ${ftp_path}/${remote_filename_stem}_assembly_stats.txt wget ${ftp_path}/${remote_filename_stem}_genomic.fna.gz diff --git a/nextflow_schema.json b/nextflow_schema.json index 90a125c..bc19c9b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -38,7 +38,7 @@ "pattern": "^\\S+\\.csv$", "schema": "assets/schema_input.json", "description": "Path to comma-separated file containing information about the assemblies to download. Used for bulk download of many assemblies.", - "help_text": "The file has to be a comma-separated file with three columns, and a header row. The columns names must be `species_dir`, `assembly_accession`, and `assembly_name`.", + "help_text": "The file has to be a comma-separated file with three columns, and a header row. The columns names must be `outdir`, `assembly_accession`, and `assembly_name`.", "fa_icon": "fas fa-file-csv" }, "ftp_root": { diff --git a/subworkflows/local/download_genome.nf b/subworkflows/local/download_genome.nf index 0a57503..dd4da55 100644 --- a/subworkflows/local/download_genome.nf +++ b/subworkflows/local/download_genome.nf @@ -9,7 +9,7 @@ include { REMOVE_MASKING } from '../../modules/local/remove_masking' workflow DOWNLOAD_GENOME { take: - assembly_params // tuple(assembly_accession, assembly_name, species_dir) + assembly_params // tuple(assembly_accession, assembly_name, outdir) main: diff --git a/subworkflows/local/params_check.nf b/subworkflows/local/params_check.nf index 8992365..e9e4458 100644 --- a/subworkflows/local/params_check.nf +++ b/subworkflows/local/params_check.nf @@ -21,13 +21,13 @@ workflow PARAMS_CHECK { SAMPLESHEET_CHECK ( file(samplesheet, checkIfExists: true) ) .csv - // Provides species_dir, assembly_accession, and assembly_name + // Provides outdir, assembly_accession, and assembly_name .splitCsv ( header:true, sep:',' ) // Convert to tuple, as required by the download subworkflow .map { [ it["assembly_accession"], it["assembly_name"], - (it["species_dir"].startsWith("/") ? "" : outdir + "/") + it["species_dir"], + (it["outdir"].startsWith("/") ? "" : outdir + "/") + it["outdir"], ] } .set { ch_inputs } @@ -41,7 +41,7 @@ workflow PARAMS_CHECK { emit: - assembly_params = ch_inputs // channel: tuple(assembly_accession, assembly_name, species_dir) + assembly_params = ch_inputs // channel: tuple(assembly_accession, assembly_name, outdir) versions = ch_versions // channel: versions.yml } From 9f1663137fce925a0ea17f0e0b997e89a610ac8f Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 14 Aug 2023 13:24:18 +0000 Subject: [PATCH 72/85] Use the latest version of the Tower action --- .github/workflows/sanger_test.yml | 2 +- .github/workflows/sanger_test_full.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sanger_test.yml b/.github/workflows/sanger_test.yml index d6d7be5..e7007c0 100644 --- a/.github/workflows/sanger_test.yml +++ b/.github/workflows/sanger_test.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/sanger_test_full.yml b/.github/workflows/sanger_test_full.yml index 850d4ae..fc11b07 100644 --- a/.github/workflows/sanger_test_full.yml +++ b/.github/workflows/sanger_test_full.yml @@ -22,7 +22,7 @@ jobs: if: github.event_name == 'workflow_dispatch' - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} From b4eb799a12a7dae570d9046a5a28e27761a7d81b Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Wed, 16 Aug 2023 14:03:59 +0100 Subject: [PATCH 73/85] Update sanger_test_full.yml, remove variable pipeline and upload artifacts --- .github/workflows/sanger_test_full.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sanger_test_full.yml b/.github/workflows/sanger_test_full.yml index fc11b07..01f0cb1 100644 --- a/.github/workflows/sanger_test_full.yml +++ b/.github/workflows/sanger_test_full.yml @@ -27,7 +27,6 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} revision: ${{ env.REVISION }} workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/${{ github.repository }}/work-${{ env.REVISION }} parameters: | @@ -35,3 +34,10 @@ jobs: "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/${{ github.repository }}/results-${{ env.REVISION }}", } profiles: test_full,sanger,singularity,cleanup + + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: | + tower_action_*.log + tower_action_*.json From 4fee623178ae2adfed3ae96fd9de8a8c8b97846b Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Wed, 16 Aug 2023 14:05:05 +0100 Subject: [PATCH 74/85] Update sanger_test.yml - remove pipeline variable and upload artifacts --- .github/workflows/sanger_test.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sanger_test.yml b/.github/workflows/sanger_test.yml index e7007c0..6887663 100644 --- a/.github/workflows/sanger_test.yml +++ b/.github/workflows/sanger_test.yml @@ -13,7 +13,6 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} revision: ${{ github.sha }} workdir: ${{ secrets.TOWER_WORKDIR_PARENT }}/work/${{ github.repository }}/work-${{ github.sha }} parameters: | @@ -21,3 +20,10 @@ jobs: "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/${{ github.repository }}/results-${{ github.sha }}", } profiles: test,sanger,singularity,cleanup + + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: | + tower_action_*.log + tower_action_*.json From 706a599bfd9f6425e7edb1879be6d2dba27fd618 Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Wed, 16 Aug 2023 14:50:35 +0100 Subject: [PATCH 75/85] Update sanger_test.yml --- .github/workflows/sanger_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sanger_test.yml b/.github/workflows/sanger_test.yml index 6887663..b482e93 100644 --- a/.github/workflows/sanger_test.yml +++ b/.github/workflows/sanger_test.yml @@ -26,4 +26,4 @@ jobs: name: Tower debug log file path: | tower_action_*.log - tower_action_*.json + tower_action_*.json From 231a0977f2457118f84910ab3889eec92798582f Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Wed, 16 Aug 2023 14:50:55 +0100 Subject: [PATCH 76/85] Update sanger_test_full.yml --- .github/workflows/sanger_test_full.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sanger_test_full.yml b/.github/workflows/sanger_test_full.yml index 01f0cb1..e028c6b 100644 --- a/.github/workflows/sanger_test_full.yml +++ b/.github/workflows/sanger_test_full.yml @@ -40,4 +40,4 @@ jobs: name: Tower debug log file path: | tower_action_*.log - tower_action_*.json + tower_action_*.json From b2c6f82a15b888d34466aef3b841fba09e9c07ef Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Wed, 16 Aug 2023 14:56:01 +0100 Subject: [PATCH 77/85] Update sanger_test.yml --- .github/workflows/sanger_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sanger_test.yml b/.github/workflows/sanger_test.yml index b482e93..e69af1e 100644 --- a/.github/workflows/sanger_test.yml +++ b/.github/workflows/sanger_test.yml @@ -20,7 +20,7 @@ jobs: "outdir": "${{ secrets.TOWER_WORKDIR_PARENT }}/results/${{ github.repository }}/results-${{ github.sha }}", } profiles: test,sanger,singularity,cleanup - + - uses: actions/upload-artifact@v3 with: name: Tower debug log file From 9c20644cc17d4b2fa81bb215b028efa06a757c22 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 18 Aug 2023 15:17:54 +0000 Subject: [PATCH 78/85] New tolsoft details --- .github/workflows/fix-linting.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index d8478c7..010b9f1 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -8,21 +8,21 @@ jobs: # 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 == 'sanger-tol/insdcdownload' + contains(github.event.comment.body, '@sanger-tolsoft fix linting') && + github.repository == 'sanger-tol/variantcalling' runs-on: ubuntu-latest steps: - # Use the @nf-core-bot token to check out so we can push later + # Use the @sanger-tolsoft token to check out so we can push later - uses: actions/checkout@v3 with: - token: ${{ secrets.nf_core_bot_auth_token }} + token: ${{ secrets.sangertolsoft_access_token }} # 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 }} + GITHUB_TOKEN: ${{ secrets.sangertolsoft_access_token }} - uses: actions/setup-node@v3 @@ -46,8 +46,8 @@ jobs: - name: Commit & push changes if: steps.prettier_status.outputs.result == 'fail' run: | - git config user.email "core@nf-co.re" - git config user.name "nf-core-bot" + git config user.email "105875386+sanger-tolsoft@users.noreply.github.com" + git config user.name "sanger-tolsoft" git config push.default upstream git add . git status From c2dba627afece076f3885ea717f13333d020c7bd Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 18 Aug 2023 15:29:16 +0000 Subject: [PATCH 79/85] Fixed the repository name --- .github/workflows/fix-linting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 010b9f1..324f123 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -9,7 +9,7 @@ jobs: if: > contains(github.event.comment.html_url, '/pull/') && contains(github.event.comment.body, '@sanger-tolsoft fix linting') && - github.repository == 'sanger-tol/variantcalling' + github.repository == 'sanger-tol/insdcdownload' runs-on: ubuntu-latest steps: # Use the @sanger-tolsoft token to check out so we can push later From 403f469d084d0631e0135f2cace320fdd4219491 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Sat, 23 Sep 2023 11:18:38 +0000 Subject: [PATCH 80/85] Made the relation between --outdir and the samplesheet outdir clearer --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index d6c683f..f785a05 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -15,7 +15,7 @@ The pipeline accepts command-one line arguments to specify a single genome to do - `--assembly_name`: The name of the assembly, - `--assembly_accession`: The accession number of the assembly, -- `--outdir`: Where to download the data. +- `--outdir`: Where the pipeline runtime information will be stored, and where data will be downloaded (except if absolute paths are given in the samplesheet). ```console nextflow run sanger-tol/insdcdownload --assembly_accession GCA_927399515.1 --assembly_name gfLaeSulp1.1 --outdir gfLaeSulp1.1_data From ffe15b9077959f712b48a0e7bbc7f968d8c2e4a2 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 24 May 2024 11:26:37 +0000 Subject: [PATCH 81/85] Version bump --- CHANGELOG.md | 29 +++++++++++++++++++++++------ CITATION.cff | 4 ++-- nextflow.config | 2 +- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e405031..6d8a09e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,21 +3,38 @@ 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). -## v2.0.0 - [date] +## [[2.0.0](https://github.com/sanger-tol/insdcdownload/releases/tag/2.0.0)] – Light elf – [2024-05-24] -### `Fixed` +This version supports the new FTP structure of Ensembl + +### Enhancements & fixes - The sample-sheet column `species_dir` is replaced with the `outdir` column which represents where the assembly and repeats are downloaded (in immediate sub-directories) - Relative paths in the sample-sheet are now evaluated from the `--outdir` parameter - Memory usage rules for `samtools dict` - Appropriate use of `tabix`'s TBI and CSI indexing, depending on the sequence lengths +- `--outdir` is a _mandatory_ parameter -### `Added` +### Parameters -- `--outdir` is a _mandatory_ parameter +_In the samplesheet_ + +| Old parameter | New parameter | +| ------------- | ----------------- | +| species_dir | outdir | + +> **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 new parameter information isn't present. + +### Software dependencies + +Note, since the pipeline is using Nextflow DSL2, each process will be run with its own [Biocontainer](https://biocontainers.pro/#/registry). This means that on occasion it is entirely possible for the pipeline to be using different versions of the same tool. However, the overall software dependency changes compared to the last release have been listed below for reference. Only `Docker` or `Singularity` containers are supported, `conda` is not supported. + +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | +| multiqc | 1.13 | 1.14 | -## v1.1.0 - [2022-10-07] +## [[1.1.0](https://github.com/sanger-tol/insdcdownload/releases/tag/1.1.0)] – Deciduous ent – [2022-10-07] Minor update that fixes a few bugs @@ -30,7 +47,7 @@ Minor update that fixes a few bugs - New `species_dir` column to indicate where to download the files to -## v1.0.0 - [2022-08-12] +## [[1.0.0](https://github.com/sanger-tol/insdcdownload/releases/tag/1.0.0)] – Flaming balrog – [2022-08-12] Initial release of sanger-tol/insdcdownload, created with the [nf-core](https://nf-co.re/) template. diff --git a/CITATION.cff b/CITATION.cff index 3adf05f..21a2422 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -2,7 +2,7 @@ # Visit https://bit.ly/cffinit to generate yours today! cff-version: 1.2.0 -title: sanger-tol/insdcdownload v1.1.0 - Deciduous ent +title: sanger-tol/insdcdownload message: >- If you use this software, please cite it using the metadata from this file. @@ -22,5 +22,5 @@ identifiers: repository-code: "https://github.com/sanger-tol/insdcdownload" license: MIT commit: TODO -version: 1.1.0 +version: 2.0.0 date-released: "2022-10-07" diff --git a/nextflow.config b/nextflow.config index d977225..c281633 100644 --- a/nextflow.config +++ b/nextflow.config @@ -204,7 +204,7 @@ manifest { description = """Pipeline that downloads assemblies from INSDC into a Tree of Life directory structure""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.2dev' + version = '2.0.0' doi = '10.5281/zenodo.6983932' } From 21c81bf7b83cb1164e2c31078f9ba88fa33f859b Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Fri, 24 May 2024 10:44:11 +0000 Subject: [PATCH 82/85] [prettier] --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d8a09e..8df523a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,9 +20,9 @@ This version supports the new FTP structure of Ensembl _In the samplesheet_ -| Old parameter | New parameter | -| ------------- | ----------------- | -| species_dir | outdir | +| Old parameter | New parameter | +| ------------- | ------------- | +| species_dir | outdir | > **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 new parameter information isn't present. From 6b71ac3ecea705fe33ae2d4a9bf240a4dfd9ae38 Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:33:20 +0100 Subject: [PATCH 83/85] The default branch in main now, PR to main will fail, not master --- .github/workflows/branch.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 9113a81..550c65a 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -1,15 +1,15 @@ name: nf-core branch protection -# This workflow is triggered on PRs to master branch on the repository -# It fails when someone tries to make a PR against the nf-core `master` branch instead of `dev` +# This workflow is triggered on PRs to main branch on the repository +# It fails when someone tries to make a PR against the nf-core `main` branch instead of `dev` on: pull_request_target: - branches: [master] + branches: [main] jobs: test: runs-on: ubuntu-latest steps: - # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches + # PRs to the nf-core repo main branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs if: github.repository == 'sanger-tol/insdcdownload' run: | @@ -22,7 +22,7 @@ jobs: uses: mshick/add-pr-comment@v1 with: message: | - ## This PR is against the `master` branch :x: + ## This PR is against the `main` branch :x: * Do not close this PR * Click _Edit_ and change the `base` to `dev` @@ -32,9 +32,9 @@ jobs: Hi @${{ github.event.pull_request.user.login }}, - It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `master` branch. - The `master` branch on nf-core repositories should always contain code from the latest release. - Because of this, PRs to `master` are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. + It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `main` branch. + The `main` branch on nf-core repositories should always contain code from the latest release. + Because of this, PRs to `main` are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. Note that even after this, the test will continue to show as failing until you push a new commit. From 8ee7114f83297b1d7e8c4f8ea78a6d3a4ce387a2 Mon Sep 17 00:00:00 2001 From: Guoying Qi <729395+gq1@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:37:41 +0100 Subject: [PATCH 84/85] Add one more unchanged file for nf-core linting --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index 5a3fa08..442b32c 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -16,6 +16,7 @@ lint: - .github/workflows/linting.yml - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy + - .github/workflows/branch.yml nextflow_config: - manifest.name - manifest.homePage From 89767966c3f0551c044231f03bc4304ec43716ef Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Tue, 4 Jun 2024 08:10:54 +0000 Subject: [PATCH 85/85] Updated the release date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8df523a..4a82368 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). -## [[2.0.0](https://github.com/sanger-tol/insdcdownload/releases/tag/2.0.0)] – Light elf – [2024-05-24] +## [[2.0.0](https://github.com/sanger-tol/insdcdownload/releases/tag/2.0.0)] – Light elf – [2024-06-04] This version supports the new FTP structure of Ensembl

    Data was processed using sanger-tol/insdcdownload v${workflow.manifest.version} ${doi_text} of the nf-core collection of workflows (Ewels et al., 2020).