From 94269b4183812fe6e92acca836db318a8af4f050 Mon Sep 17 00:00:00 2001 From: Rike Date: Mon, 2 Oct 2023 11:43:58 +0200 Subject: [PATCH 001/545] add ncbench config --- conf/test_full_germline.config | 2 +- conf/test_full_ncbench.config | 25 +++++++++++++++++++++++++ nextflow.config | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 conf/test_full_ncbench.config diff --git a/conf/test_full_germline.config b/conf/test_full_germline.config index c477f7d6f6..76e9bcc9d9 100644 --- a/conf/test_full_germline.config +++ b/conf/test_full_germline.config @@ -18,7 +18,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/csv/NA12878_WGS_30x_full_test.csv' // Other params - tools = 'strelka,freebayes,haplotypecaller,deepvariant,manta,tiddit,cnvkit,vep' + tools = 'strelka,freebayes,haplotypecaller,deepvariant,manta,tiddit,cnvkit,vep,snpeff' split_fastq = 50000000 use_annotation_cache_keys = true } diff --git a/conf/test_full_ncbench.config b/conf/test_full_ncbench.config new file mode 100644 index 0000000000..2725b39111 --- /dev/null +++ b/conf/test_full_ncbench.config @@ -0,0 +1,25 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running full-size tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a full size pipeline test. + + Use as follows: + nextflow run nf-core/sarek -profile test_full_germline, --outdir + +---------------------------------------------------------------------------------------- +*/ + +params { + config_profile_name = 'Full test profile for germline VC' + config_profile_description = 'Full test dataset to check germline VC pipeline function' + + // Input data for full size test + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/csv/NA12878_Agilent_full_test.csv' + + // Other params + intervals = 'https://zenodo.org/record/6513789/files/Agilent_v7.bed' + wes = true + tools = 'strelka,freebayes,haplotypecaller,deepvariant,manta,tiddit,cnvkit,vep,snpeff' + use_annotation_cache_keys = true +} diff --git a/nextflow.config b/nextflow.config index 123a58ae90..eefb3c1ec8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -248,6 +248,7 @@ profiles { // Extra test profiles for full tests on AWS test_full { includeConfig 'conf/test_full.config' } test_full_germline { includeConfig 'conf/test_full_germline.config' } + test_full_ncbench { includeConfig 'conf/test_full_ncbench.config' } // Extra test profiles for more complete CI alignment_to_fastq { includeConfig 'conf/test/alignment_to_fastq.config' } annotation { includeConfig 'conf/test/annotation.config' } From 798cec1a12469a2f28887900986b22214538e2cf Mon Sep 17 00:00:00 2001 From: Rike Date: Mon, 2 Oct 2023 13:50:57 +0200 Subject: [PATCH 002/545] add wes test profile --- .github/workflows/awstest.yml | 15 +++++++++++---- ...bench.config => test_full_germline_wes.config} | 0 nextflow.config | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) rename conf/{test_full_ncbench.config => test_full_germline_wes.config} (100%) diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 1f2cf7e557..2fa022da3c 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -15,8 +15,12 @@ on: description: "Trigger somatic full test on AWS" type: boolean default: false - germline: - description: "Trigger germline full test on AWS" + germline_wgs: + description: "Trigger germline full test (WGS) on AWS" + type: boolean + default: false + germline_wes: + description: "Trigger germline full test (WES) on AWS" type: boolean default: false @@ -32,8 +36,11 @@ jobs: enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.profiletest ) }} - profile: test_full enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.somatic ) }} - - profile: test_full_germline - enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.germline ) }} + - profile: test_full_germline_wgs + enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.germline_wgs ) }} + - profile: test_full_germline_wes + enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.germline_wes ) }} + steps: # Launch workflow using Tower CLI tool action - name: Launch workflow via tower diff --git a/conf/test_full_ncbench.config b/conf/test_full_germline_wes.config similarity index 100% rename from conf/test_full_ncbench.config rename to conf/test_full_germline_wes.config diff --git a/nextflow.config b/nextflow.config index eefb3c1ec8..141ffd9c34 100644 --- a/nextflow.config +++ b/nextflow.config @@ -248,7 +248,7 @@ profiles { // Extra test profiles for full tests on AWS test_full { includeConfig 'conf/test_full.config' } test_full_germline { includeConfig 'conf/test_full_germline.config' } - test_full_ncbench { includeConfig 'conf/test_full_ncbench.config' } + test_full_germline_wes { includeConfig 'conf/test_full_germline_wes.config' } // Extra test profiles for more complete CI alignment_to_fastq { includeConfig 'conf/test/alignment_to_fastq.config' } annotation { includeConfig 'conf/test/annotation.config' } From d25eef4e75a9a72effc0db9d5cddc12c79e15b98 Mon Sep 17 00:00:00 2001 From: Rike Date: Mon, 2 Oct 2023 16:44:17 +0200 Subject: [PATCH 003/545] attempt GHA to download from aws and upload to zenodo --- .github/workflows/ncbench.yml | 43 ++++++++++++++++++++++++++++++ conf/test_full_germline.config | 2 +- conf/test_full_germline_wes.config | 4 +-- 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/ncbench.yml diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml new file mode 100644 index 0000000000..3304f5227c --- /dev/null +++ b/.github/workflows/ncbench.yml @@ -0,0 +1,43 @@ +name: NCBench Zenodo Upload +# This workflow can be triggered manually with the GitHub actions workflow dispatch button. +# It runs the -profile 'test' on AWS batch + +on: + # upload can only be triggered manually for now + workflow_dispatch: + inputs: + germline_wes: + description: "Trigger NCBench upload" + type: boolean + default: true + +jobs: + ncbench-upload: + name: Move files to Zenodo + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - profile: germline_wes + enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.germline_wes ) }} + steps: + - name: Download files from AWS + uses: keithweaver/aws-s3-github-action@v1.0.0 + if: ${{ matrix.enabled }} + with: + revision: ${{ github.sha }} + source: s3://${{ secrets.AWS_S3_BUCKET }}/sarek/results-${{ github.sha }}/${{ matrix.profile }}/variant_calling/ + command: sync + destination: ./variant_calling + flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" + - name: Upload file to Zenodo + uses: popperized/zenodo/upload@master + with: + secrets: ${{ secrets.ZENODO_API_TOKEN }} + parameters: | + { + ZENODO_DEPOSIT_ID = "" + ZENODO_UPLOAD_PATH = "./variant_calling" + } + diff --git a/conf/test_full_germline.config b/conf/test_full_germline.config index 76e9bcc9d9..c0dfd980cd 100644 --- a/conf/test_full_germline.config +++ b/conf/test_full_germline.config @@ -18,7 +18,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/csv/NA12878_WGS_30x_full_test.csv' // Other params - tools = 'strelka,freebayes,haplotypecaller,deepvariant,manta,tiddit,cnvkit,vep,snpeff' + tools = 'strelka,freebayes,haplotypecaller,deepvariant,manta,tiddit,cnvkit,vep,snpeff' split_fastq = 50000000 use_annotation_cache_keys = true } diff --git a/conf/test_full_germline_wes.config b/conf/test_full_germline_wes.config index 2725b39111..c1d157e36c 100644 --- a/conf/test_full_germline_wes.config +++ b/conf/test_full_germline_wes.config @@ -18,8 +18,8 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/csv/NA12878_Agilent_full_test.csv' // Other params - intervals = 'https://zenodo.org/record/6513789/files/Agilent_v7.bed' + intervals = 'https://zenodo.org/record/6513789/files/Agilent_v7.bed' //TODO: upload own intervals files prepended with "chr" wes = true - tools = 'strelka,freebayes,haplotypecaller,deepvariant,manta,tiddit,cnvkit,vep,snpeff' + tools = 'strelka,freebayes,haplotypecaller,deepvariant' use_annotation_cache_keys = true } From 354ddced7813e9b97ae09c940362a7e7cf9400b5 Mon Sep 17 00:00:00 2001 From: Rike Date: Tue, 3 Oct 2023 15:38:30 +0200 Subject: [PATCH 004/545] test on github --- .github/workflows/ncbench.yml | 185 +++++++++++++++++++++++++++++++++- 1 file changed, 180 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 3304f5227c..7d28ec03f0 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -21,6 +21,8 @@ jobs: include: - profile: germline_wes enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.germline_wes ) }} + env: + pipeline_version: 3.2.3 steps: - name: Download files from AWS uses: keithweaver/aws-s3-github-action@v1.0.0 @@ -35,9 +37,182 @@ jobs: uses: popperized/zenodo/upload@master with: secrets: ${{ secrets.ZENODO_API_TOKEN }} - parameters: | - { - ZENODO_DEPOSIT_ID = "" - ZENODO_UPLOAD_PATH = "./variant_calling" - } + # parameters: | + # { + # ZENODO_DEPOSIT_ID = "" + # ZENODO_UPLOAD_PATH = "./nf-core-sarek-$pipeline_version" + # } + - name: Install jq + uses: sergeysova/jq-action@v2 + - name: NCBench set config + uses: actions/checkout@v4 + with: + repository: FriederikeHanssen/ncbench + path: ncbench + ref: main + token: ${{ github.token }} + sparse-checkout: | + config/config.yaml + sparse-checkout-cone-mode: false + run: | + jq --help >> config.yaml + + + + + # with: + # repository: github.com/FriederikeHanssen/ncbench + # path: ncbench + # ref: main + # TODO: how to retrieve the pipeline and tool versions + # TODO: how to get the zenodo id + #run: | + # jq --version + + +# git checkout -b ${{ github.sha }} +# echo " nf-core-sarek-$pipeline_version-deepvariants-agilent-200M:" >> config.yaml +# echo " labels:" >> config.yaml +# echo " site: nf-core" >> config.yaml +# echo " pipeline: nf-core/sarek v$" >> config.yaml +# echo " trimming: Fastp v0.23." >> config.yaml +# echo " read-mapping: bwa mem v0.7." >> config.yaml +# echo " base-quality-recalibration: gatk4 v4.4.0." >> config.yaml +# echo " realignment: " >> config.yaml +# echo " variant-detection: deepvariant v1.5." >> config.yaml +# echo " genotyping: " >> config.yaml +# echo " reads: " >> config.yaml +# echo " subcategory: NA12878-agilent" >> config.yaml +# echo " zenodo:" >> config.yaml +# echo " deposition: ?" >> config.yaml +# echo " filename: nf-core-sarek-$pipeline_version/deepvariant/NA12878_200M/NA12878_200M.deepvariant.vcf." >> config.yaml +# echo " benchmark: giab-NA12878-agilent-" >> config.yaml +# echo " rename-contigs: resources/rename-contigs/ucsc-to-ensembl.txt" >> config.yaml +# git config user.name github-actions +# git config user.email github-actions@github.com +# git add . +# git commit -m "Benchmarking ${{ github.sha }}" +# git push origin ${{ github.sha }} + + + +# TB-sarek311-freebayes-agilent-200M: +# labels: +# site: TB QBiC +# pipeline: nf-core/sarek v3.1.1 +# trimming: Fastp v0.23.2 +# read-mapping: bwa mem v0.7.17 +# base-quality-recalibration: gatk4 v4.3.0.0 +# realignment: none +# variant-detection: freebayes v1.3.6 +# genotyping: none +# reads: 200M +# subcategory: NA12878-agilent +# zenodo: +# deposition: 7376244 +# filename: WES_agilent_high_cov_sarek311_NA12878_freebayes.vcf.gz +# benchmark: giab-NA12878-agilent-200M +# rename-contigs: resources/rename-contigs/ucsc-to-ensemb +# TB-sarek311-haplotypecaller-agilent-200M: +# labels: +# site: TB QBiC +# pipeline: nf-core/sarek v3.1.1 +# trimming: Fastp v0.23.2 +# read-mapping: bwa mem v0.7.17 +# base-quality-recalibration: gatk4 v4.3.0.0 +# realignment: none +# variant-detection: gatk-haplotypecaller v4.3.0.0 +# genotyping: none +# reads: 200M +# subcategory: NA12878-agilent +# zenodo: +# deposition: 7376244 +# filename: WES_agilent_high_cov_sarek311_NA12878_haplotypecaller.vcf.gz +# benchmark: giab-NA12878-agilent-200M +# rename-contigs: resources/rename-contigs/ucsc-to-ensemb +# TB-sarek311-strelka-agilent-200M: +# labels: +# site: TB QBiC +# pipeline: nf-core/sarek v3.1.1 +# trimming: Fastp v0.23.2 +# read-mapping: bwa mem v0.7.17 +# base-quality-recalibration: gatk4 v4.3.0.0 +# realignment: none +# variant-detection: strelka2 v2.9.10 +# genotyping: none +# reads: 200M +# subcategory: NA12878-agilent +# zenodo: +# deposition: 7376244 +# filename: WES_agilent_high_cov_sarek311_NA12878_strelka.vcf.gz +# benchmark: giab-NA12878-agilent-200M +# rename-contigs: resources/rename-contigs/ucsc-to-ensemb +# TB-sarek311-deepvariants-agilent-75M: +# labels: +# site: TB QBiC +# pipeline: nf-core/sarek v3.1.1 +# trimming: Fastp v0.23.2 +# read-mapping: bwa mem v0.7.17 +# base-quality-recalibration: gatk4 v4.3.0.0 +# realignment: none +# variant-detection: DeepVariant v1.3.6 +# genotyping: none +# reads: 75M +# subcategory: NA12878-agilent +# zenodo: +# deposition: 7376244 +# filename: WES_agilent_low_cov_sarek311_NA12878_freebayes.vcf.gz +# benchmark: giab-NA12878-agilent-75M +# rename-contigs: resources/rename-contigs/ucsc-to-ensemb +# TB-sarek311-freebayes-agilent-75M: +# labels: +# site: TB QBiC +# pipeline: nf-core/sarek v3.1.1 +# trimming: Fastp v0.23.2 +# read-mapping: bwa mem v0.7.17 +# base-quality-recalibration: gatk4 v4.3.0.0 +# realignment: none +# variant-detection: freebayes v1.3.6 +# genotyping: none +# reads: 75M +# subcategory: NA12878-agilent +# zenodo: +# deposition: 7376244 +# filename: WES_agilent_low_cov_sarek311_NA12878_freebayes.vcf.gz +# benchmark: giab-NA12878-agilent-75M +# rename-contigs: resources/rename-contigs/ucsc-to-ensemb +# nfcore-sarek-${{ github.sha }}-haplotypecaller-agilent-75M: +# labels: +# site: nf-core +# pipeline: nf-core/sarek v +# trimming: Fastp v0.23.2 +# read-mapping: bwa mem v0.7.17 +# base-quality-recalibration: gatk4 v4.3.0.0 +# realignment: none +# variant-detection: gatk-haplotypecaller v4.3.0.0 +# genotyping: none +# reads: 75M +# subcategory: NA12878-agilent +# zenodo: +# deposition: +# filename: WES_agilent_low_cov_sarek311_NA12878_haplotypecaller.vcf.gz +# benchmark: giab-NA12878-agilent-75M +# rename-contigs: resources/rename-contigs/ucsc-to-ensemb +# TB-sarek311-strelka-agilent-75M: +# labels: +# site: TB QBiC +# pipeline: nf-core/sarek v3.1.1 +# trimming: Fastp v0.23.2 +# read-mapping: bwa mem v0.7.17 +# base-quality-recalibration: gatk4 v4.3.0.0 +# realignment: none +# variant-detection: strelka2 v2.9.10 +# genotyping: none +# reads: 75M +# subcategory: NA12878-agilent +# zenodo: +# deposition: 7376244 +# filename: WES_agilent_low_cov_sarek311_NA12878_strelka.vcf.gz +# benchmark: giab-NA12878-agilent-75M +# rename-contigs: resources/rename-contigs/ucsc-to-ensemb From 4a9e54ca6fb087dbb8fdf63150246c537ca9859c Mon Sep 17 00:00:00 2001 From: Rike Date: Tue, 3 Oct 2023 16:39:06 +0200 Subject: [PATCH 005/545] add metadata file to create a new zenodo entry --- .github/workflows/ncbench.yml | 53 ++++++++++++++++++++++++----------- assets/zenodo_ncbench.json | 13 +++++++++ 2 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 assets/zenodo_ncbench.json diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 7d28ec03f0..8d53fb279a 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -23,7 +23,9 @@ jobs: enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.germline_wes ) }} env: pipeline_version: 3.2.3 + steps: + - name: Download files from AWS uses: keithweaver/aws-s3-github-action@v1.0.0 if: ${{ matrix.enabled }} @@ -33,30 +35,47 @@ jobs: command: sync destination: ./variant_calling flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" - - name: Upload file to Zenodo - uses: popperized/zenodo/upload@master - with: - secrets: ${{ secrets.ZENODO_API_TOKEN }} - # parameters: | - # { - # ZENODO_DEPOSIT_ID = "" - # ZENODO_UPLOAD_PATH = "./nf-core-sarek-$pipeline_version" - # } - - name: Install jq - uses: sergeysova/jq-action@v2 - - name: NCBench set config + + - name: Download metadata file for Zenodo uses: actions/checkout@v4 with: - repository: FriederikeHanssen/ncbench - path: ncbench - ref: main - token: ${{ github.token }} sparse-checkout: | - config/config.yaml + assets/zenodo_ncbench.json sparse-checkout-cone-mode: false run: | jq --help >> config.yaml + - name: Create new Zenodo entry + uses: popperized/zenodo/create@master + env: + ZENODO_METADATA_PATH: ./metadata.json + with: + secrets: ${{ secrets.ZENODO_API_TOKEN }} + + - name: Upload file to Zenodo + uses: popperized/zenodo/upload@master + env: + ZENODO_DEPOSIT_ID: ./variant_calling + ZENODO_UPLOAD_PATH: ./variant_calling_v$pipeline_version + ZENODO_USE_SANDBOX: true + with: + secrets: ${{ secrets.ZENODO_API_TOKEN }} + + # - name: Install jq + # uses: sergeysova/jq-action@v2 + # - name: NCBench set config + # uses: actions/checkout@v4 + # with: + # repository: FriederikeHanssen/ncbench + # path: ncbench + # ref: main + # token: ${{ github.token }} + # sparse-checkout: | + # config/config.yaml + # sparse-checkout-cone-mode: false + # run: | + # jq --help >> config.yaml + diff --git a/assets/zenodo_ncbench.json b/assets/zenodo_ncbench.json new file mode 100644 index 0000000000..d96fcb719b --- /dev/null +++ b/assets/zenodo_ncbench.json @@ -0,0 +1,13 @@ +{ + "metadata": { + "title": "nf-core/sarek v3.1.1 NCBench vcf files", + "upload_type": "dataset", + "description": "Agilent datasets for NCBench", + "creators": [ + { + "name": "Garcia, Maxime U", + "name": "Hanssen, Friederike" + } + ] + } +} From 681af93927aded0f9bcfba745537744b2d72a81a Mon Sep 17 00:00:00 2001 From: Rike Date: Wed, 4 Oct 2023 19:19:45 +0200 Subject: [PATCH 006/545] try to trick GH by adding pull_request --- .github/workflows/ncbench.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 8d53fb279a..14060dbc02 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -1,6 +1,5 @@ name: NCBench Zenodo Upload # This workflow can be triggered manually with the GitHub actions workflow dispatch button. -# It runs the -profile 'test' on AWS batch on: # upload can only be triggered manually for now @@ -10,10 +9,10 @@ on: description: "Trigger NCBench upload" type: boolean default: true + pull_request: jobs: ncbench-upload: - name: Move files to Zenodo runs-on: ubuntu-latest strategy: fail-fast: false @@ -42,20 +41,18 @@ jobs: sparse-checkout: | assets/zenodo_ncbench.json sparse-checkout-cone-mode: false - run: | - jq --help >> config.yaml - name: Create new Zenodo entry uses: popperized/zenodo/create@master env: - ZENODO_METADATA_PATH: ./metadata.json + ZENODO_METADATA_PATH: assets/zenodo_ncbench.json with: secrets: ${{ secrets.ZENODO_API_TOKEN }} - name: Upload file to Zenodo uses: popperized/zenodo/upload@master env: - ZENODO_DEPOSIT_ID: ./variant_calling + ZENODO_DEPOSIT_ID: #TODO get the dposit ID from the previous step ZENODO_UPLOAD_PATH: ./variant_calling_v$pipeline_version ZENODO_USE_SANDBOX: true with: From 88accb34b2e2bc842e66fd005208e4785e665157 Mon Sep 17 00:00:00 2001 From: Rike Date: Wed, 4 Oct 2023 21:29:13 +0200 Subject: [PATCH 007/545] use existing results folder for testing --- .github/workflows/ncbench.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 14060dbc02..90cd5def0c 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -24,13 +24,12 @@ jobs: pipeline_version: 3.2.3 steps: - - name: Download files from AWS uses: keithweaver/aws-s3-github-action@v1.0.0 if: ${{ matrix.enabled }} with: revision: ${{ github.sha }} - source: s3://${{ secrets.AWS_S3_BUCKET }}/sarek/results-${{ github.sha }}/${{ matrix.profile }}/variant_calling/ + source: s3://${{ secrets.AWS_S3_BUCKET }}/sarek/results-test-59026dc07633edb83aab3bfb2f65f79db38437a1/test_full/variant_calling/strelka/ command: sync destination: ./variant_calling flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" From 13c23fc4f25c2c7ad49189d837aba5485bf19f06 Mon Sep 17 00:00:00 2001 From: Rike Date: Wed, 4 Oct 2023 21:31:27 +0200 Subject: [PATCH 008/545] use full path because secret doesn't resolve --- .github/workflows/ncbench.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 90cd5def0c..614e2dd722 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -29,7 +29,7 @@ jobs: if: ${{ matrix.enabled }} with: revision: ${{ github.sha }} - source: s3://${{ secrets.AWS_S3_BUCKET }}/sarek/results-test-59026dc07633edb83aab3bfb2f65f79db38437a1/test_full/variant_calling/strelka/ + source: s3://nf-core-awsmegatests/sarek/results-test-59026dc07633edb83aab3bfb2f65f79db38437a1/test_full/variant_calling/strelka/ command: sync destination: ./variant_calling flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" From 54f0b4a67b39e39495f9033a209ae32e60688547 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 20:15:43 +0000 Subject: [PATCH 009/545] add region --- .github/workflows/ncbench.yml | 212 ++-------------------------------- 1 file changed, 7 insertions(+), 205 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 614e2dd722..30d9eaaa13 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -4,11 +4,11 @@ name: NCBench Zenodo Upload on: # upload can only be triggered manually for now workflow_dispatch: - inputs: - germline_wes: - description: "Trigger NCBench upload" - type: boolean - default: true + inputs: + germline_wes: + description: "Trigger NCBench upload" + type: boolean + default: true pull_request: jobs: @@ -28,206 +28,8 @@ jobs: uses: keithweaver/aws-s3-github-action@v1.0.0 if: ${{ matrix.enabled }} with: - revision: ${{ github.sha }} - source: s3://nf-core-awsmegatests/sarek/results-test-59026dc07633edb83aab3bfb2f65f79db38437a1/test_full/variant_calling/strelka/ + source: s3://nf-core-awsmegatests/sarek/results-test-59026dc07633edb83aab3bfb2f65f79db38437a1/test_full/variant_calling/strelka command: sync + aws_region: eu-west-1 destination: ./variant_calling flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" - - - name: Download metadata file for Zenodo - uses: actions/checkout@v4 - with: - sparse-checkout: | - assets/zenodo_ncbench.json - sparse-checkout-cone-mode: false - - - name: Create new Zenodo entry - uses: popperized/zenodo/create@master - env: - ZENODO_METADATA_PATH: assets/zenodo_ncbench.json - with: - secrets: ${{ secrets.ZENODO_API_TOKEN }} - - - name: Upload file to Zenodo - uses: popperized/zenodo/upload@master - env: - ZENODO_DEPOSIT_ID: #TODO get the dposit ID from the previous step - ZENODO_UPLOAD_PATH: ./variant_calling_v$pipeline_version - ZENODO_USE_SANDBOX: true - with: - secrets: ${{ secrets.ZENODO_API_TOKEN }} - - # - name: Install jq - # uses: sergeysova/jq-action@v2 - # - name: NCBench set config - # uses: actions/checkout@v4 - # with: - # repository: FriederikeHanssen/ncbench - # path: ncbench - # ref: main - # token: ${{ github.token }} - # sparse-checkout: | - # config/config.yaml - # sparse-checkout-cone-mode: false - # run: | - # jq --help >> config.yaml - - - - - # with: - # repository: github.com/FriederikeHanssen/ncbench - # path: ncbench - # ref: main - # TODO: how to retrieve the pipeline and tool versions - # TODO: how to get the zenodo id - #run: | - # jq --version - - -# git checkout -b ${{ github.sha }} -# echo " nf-core-sarek-$pipeline_version-deepvariants-agilent-200M:" >> config.yaml -# echo " labels:" >> config.yaml -# echo " site: nf-core" >> config.yaml -# echo " pipeline: nf-core/sarek v$" >> config.yaml -# echo " trimming: Fastp v0.23." >> config.yaml -# echo " read-mapping: bwa mem v0.7." >> config.yaml -# echo " base-quality-recalibration: gatk4 v4.4.0." >> config.yaml -# echo " realignment: " >> config.yaml -# echo " variant-detection: deepvariant v1.5." >> config.yaml -# echo " genotyping: " >> config.yaml -# echo " reads: " >> config.yaml -# echo " subcategory: NA12878-agilent" >> config.yaml -# echo " zenodo:" >> config.yaml -# echo " deposition: ?" >> config.yaml -# echo " filename: nf-core-sarek-$pipeline_version/deepvariant/NA12878_200M/NA12878_200M.deepvariant.vcf." >> config.yaml -# echo " benchmark: giab-NA12878-agilent-" >> config.yaml -# echo " rename-contigs: resources/rename-contigs/ucsc-to-ensembl.txt" >> config.yaml -# git config user.name github-actions -# git config user.email github-actions@github.com -# git add . -# git commit -m "Benchmarking ${{ github.sha }}" -# git push origin ${{ github.sha }} - - - -# TB-sarek311-freebayes-agilent-200M: -# labels: -# site: TB QBiC -# pipeline: nf-core/sarek v3.1.1 -# trimming: Fastp v0.23.2 -# read-mapping: bwa mem v0.7.17 -# base-quality-recalibration: gatk4 v4.3.0.0 -# realignment: none -# variant-detection: freebayes v1.3.6 -# genotyping: none -# reads: 200M -# subcategory: NA12878-agilent -# zenodo: -# deposition: 7376244 -# filename: WES_agilent_high_cov_sarek311_NA12878_freebayes.vcf.gz -# benchmark: giab-NA12878-agilent-200M -# rename-contigs: resources/rename-contigs/ucsc-to-ensemb - -# TB-sarek311-haplotypecaller-agilent-200M: -# labels: -# site: TB QBiC -# pipeline: nf-core/sarek v3.1.1 -# trimming: Fastp v0.23.2 -# read-mapping: bwa mem v0.7.17 -# base-quality-recalibration: gatk4 v4.3.0.0 -# realignment: none -# variant-detection: gatk-haplotypecaller v4.3.0.0 -# genotyping: none -# reads: 200M -# subcategory: NA12878-agilent -# zenodo: -# deposition: 7376244 -# filename: WES_agilent_high_cov_sarek311_NA12878_haplotypecaller.vcf.gz -# benchmark: giab-NA12878-agilent-200M -# rename-contigs: resources/rename-contigs/ucsc-to-ensemb -# TB-sarek311-strelka-agilent-200M: -# labels: -# site: TB QBiC -# pipeline: nf-core/sarek v3.1.1 -# trimming: Fastp v0.23.2 -# read-mapping: bwa mem v0.7.17 -# base-quality-recalibration: gatk4 v4.3.0.0 -# realignment: none -# variant-detection: strelka2 v2.9.10 -# genotyping: none -# reads: 200M -# subcategory: NA12878-agilent -# zenodo: -# deposition: 7376244 -# filename: WES_agilent_high_cov_sarek311_NA12878_strelka.vcf.gz -# benchmark: giab-NA12878-agilent-200M -# rename-contigs: resources/rename-contigs/ucsc-to-ensemb -# TB-sarek311-deepvariants-agilent-75M: -# labels: -# site: TB QBiC -# pipeline: nf-core/sarek v3.1.1 -# trimming: Fastp v0.23.2 -# read-mapping: bwa mem v0.7.17 -# base-quality-recalibration: gatk4 v4.3.0.0 -# realignment: none -# variant-detection: DeepVariant v1.3.6 -# genotyping: none -# reads: 75M -# subcategory: NA12878-agilent -# zenodo: -# deposition: 7376244 -# filename: WES_agilent_low_cov_sarek311_NA12878_freebayes.vcf.gz -# benchmark: giab-NA12878-agilent-75M -# rename-contigs: resources/rename-contigs/ucsc-to-ensemb -# TB-sarek311-freebayes-agilent-75M: -# labels: -# site: TB QBiC -# pipeline: nf-core/sarek v3.1.1 -# trimming: Fastp v0.23.2 -# read-mapping: bwa mem v0.7.17 -# base-quality-recalibration: gatk4 v4.3.0.0 -# realignment: none -# variant-detection: freebayes v1.3.6 -# genotyping: none -# reads: 75M -# subcategory: NA12878-agilent -# zenodo: -# deposition: 7376244 -# filename: WES_agilent_low_cov_sarek311_NA12878_freebayes.vcf.gz -# benchmark: giab-NA12878-agilent-75M -# rename-contigs: resources/rename-contigs/ucsc-to-ensemb -# nfcore-sarek-${{ github.sha }}-haplotypecaller-agilent-75M: -# labels: -# site: nf-core -# pipeline: nf-core/sarek v -# trimming: Fastp v0.23.2 -# read-mapping: bwa mem v0.7.17 -# base-quality-recalibration: gatk4 v4.3.0.0 -# realignment: none -# variant-detection: gatk-haplotypecaller v4.3.0.0 -# genotyping: none -# reads: 75M -# subcategory: NA12878-agilent -# zenodo: -# deposition: -# filename: WES_agilent_low_cov_sarek311_NA12878_haplotypecaller.vcf.gz -# benchmark: giab-NA12878-agilent-75M -# rename-contigs: resources/rename-contigs/ucsc-to-ensemb -# TB-sarek311-strelka-agilent-75M: -# labels: -# site: TB QBiC -# pipeline: nf-core/sarek v3.1.1 -# trimming: Fastp v0.23.2 -# read-mapping: bwa mem v0.7.17 -# base-quality-recalibration: gatk4 v4.3.0.0 -# realignment: none -# variant-detection: strelka2 v2.9.10 -# genotyping: none -# reads: 75M -# subcategory: NA12878-agilent -# zenodo: -# deposition: 7376244 -# filename: WES_agilent_low_cov_sarek311_NA12878_strelka.vcf.gz -# benchmark: giab-NA12878-agilent-75M -# rename-contigs: resources/rename-contigs/ucsc-to-ensemb From 41bea1b91c9e5495cec42593b56ec02734617982 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 20:18:50 +0000 Subject: [PATCH 010/545] aws works (yay), try out metadata download --- .github/workflows/ncbench.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 30d9eaaa13..0e04dafeff 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -33,3 +33,10 @@ jobs: aws_region: eu-west-1 destination: ./variant_calling flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" + + - name: Download metadata file for Zenodo + uses: actions/checkout@v4 + with: + sparse-checkout: | + assets/zenodo_ncbench.json + sparse-checkout-cone-mode: false From 30672c08df744bd84c0b543a4cd10e90f249ca56 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 20:35:33 +0000 Subject: [PATCH 011/545] why does it not checkout --- .github/workflows/ncbench.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 0e04dafeff..dd548954d0 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -37,6 +37,8 @@ jobs: - name: Download metadata file for Zenodo uses: actions/checkout@v4 with: + repository: FriederikeHanssen/sarek + ref: ncbench sparse-checkout: | assets/zenodo_ncbench.json sparse-checkout-cone-mode: false From 6fc9cecde52f36c724323c5da56d8bb3e987fa8f Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 20:40:06 +0000 Subject: [PATCH 012/545] remove more stuff --- .github/workflows/ncbench.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index dd548954d0..a1d617ba7e 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -41,4 +41,3 @@ jobs: ref: ncbench sparse-checkout: | assets/zenodo_ncbench.json - sparse-checkout-cone-mode: false From a96dea28f582c17ea2b551ee64d87b3c925a8e5d Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 20:46:13 +0000 Subject: [PATCH 013/545] try more things --- .github/workflows/ncbench.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index a1d617ba7e..d6306f6212 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -39,5 +39,4 @@ jobs: with: repository: FriederikeHanssen/sarek ref: ncbench - sparse-checkout: | - assets/zenodo_ncbench.json + path: sarek-ncbench/ From 343ac8e11503031d4cb83b5f5ec390c96302f500 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 20:58:02 +0000 Subject: [PATCH 014/545] add zenodo action but don't have token yet --- .github/workflows/ncbench.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index d6306f6212..ae862a1184 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -40,3 +40,11 @@ jobs: repository: FriederikeHanssen/sarek ref: ncbench path: sarek-ncbench/ + + - name: Create new Zenodo entry + uses: popperized/zenodo/create@master + env: + ZENODO_METADATA_PATH: sarek-ncbench/assets/zenodo_ncbench.json + ZENODO_USE_SANDBOX: true + with: + secrets: ${{ secrets.ZENODO_API_TOKEN }} From 16b67e1c31746cdd337f43bf90968748d79db177 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 21:07:43 +0000 Subject: [PATCH 015/545] add jq action --- .github/workflows/ncbench.yml | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index ae862a1184..5b50fe047c 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -41,10 +41,29 @@ jobs: ref: ncbench path: sarek-ncbench/ - - name: Create new Zenodo entry - uses: popperized/zenodo/create@master - env: - ZENODO_METADATA_PATH: sarek-ncbench/assets/zenodo_ncbench.json - ZENODO_USE_SANDBOX: true + #- name: Create new Zenodo entry + # uses: popperized/zenodo/create@master + # env: + # ZENODO_METADATA_PATH: sarek-ncbench/assets/zenodo_ncbench.json + # ZENODO_USE_SANDBOX: true + # with: + # secrets: ${{ secrets.ZENODO_API_TOKEN }} + + #- name: Upload file to Zenodo + # uses: popperized/zenodo/upload@master + # env: + # ZENODO_DEPOSIT_ID: #TODO get the dposit ID from the previous step + # ZENODO_UPLOAD_PATH: ./variant_calling_v$pipeline_version + # ZENODO_USE_SANDBOX: true + # with: + # secrets: ${{ secrets.ZENODO_API_TOKEN }} + - name: Install jq + uses: sergeysova/jq-action@v2 + - name: NCBench set config + uses: actions/checkout@v4 with: - secrets: ${{ secrets.ZENODO_API_TOKEN }} + repository: FriederikeHanssen/ncbench + path: ncbench + ref: main + run: | + jq --help From 05a4381f4e5e221226303eb7b7e5bbe61aea25cf Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 21:10:01 +0000 Subject: [PATCH 016/545] why is it not working --- .github/workflows/ncbench.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 5b50fe047c..e38702bf1e 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -63,7 +63,6 @@ jobs: uses: actions/checkout@v4 with: repository: FriederikeHanssen/ncbench - path: ncbench - ref: main + path: ncbench/ run: | jq --help From 8c7b0b19c806d2a670f485d3d1437f053431de7b Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 21:13:54 +0000 Subject: [PATCH 017/545] add branch name --- .github/workflows/ncbench.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index e38702bf1e..73310fee3d 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -64,5 +64,6 @@ jobs: with: repository: FriederikeHanssen/ncbench path: ncbench/ + ref: main run: | jq --help From aed3de017d3291d02bb3e87ecae6a349e3b032d2 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 21:16:24 +0000 Subject: [PATCH 018/545] fix repo name --- .github/workflows/ncbench.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 73310fee3d..3ae700db56 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -62,8 +62,8 @@ jobs: - name: NCBench set config uses: actions/checkout@v4 with: - repository: FriederikeHanssen/ncbench - path: ncbench/ + repository: FriederikeHanssen/ncbench-workflow + path: ncbench-workflow/ ref: main run: | jq --help From 691592fd8b51d2efd9c826d2c43012d7ac0d0523 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 21:24:57 +0000 Subject: [PATCH 019/545] jq help --- .github/workflows/ncbench.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 3ae700db56..844b23709d 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -59,11 +59,14 @@ jobs: # secrets: ${{ secrets.ZENODO_API_TOKEN }} - name: Install jq uses: sergeysova/jq-action@v2 + - name: NCBench set config uses: actions/checkout@v4 with: repository: FriederikeHanssen/ncbench-workflow path: ncbench-workflow/ ref: main - run: | - jq --help + + - name: Add entries to config + run: | + jq --help From 2401af72f03eba8dacf73a0e6b0baa99b6694648 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 21:33:33 +0000 Subject: [PATCH 020/545] combine installation of jq with writing action --- .github/workflows/ncbench.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 844b23709d..aa2fc9c6d1 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -57,8 +57,6 @@ jobs: # ZENODO_USE_SANDBOX: true # with: # secrets: ${{ secrets.ZENODO_API_TOKEN }} - - name: Install jq - uses: sergeysova/jq-action@v2 - name: NCBench set config uses: actions/checkout@v4 @@ -68,5 +66,6 @@ jobs: ref: main - name: Add entries to config + uses: sergeysova/jq-action@v2 run: | jq --help From 557136a6b37944c55df9c84a0c9a01827116d2fc Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 21:52:32 +0000 Subject: [PATCH 021/545] print help --- .github/workflows/ncbench.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index aa2fc9c6d1..9b8f906f7a 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -57,15 +57,13 @@ jobs: # ZENODO_USE_SANDBOX: true # with: # secrets: ${{ secrets.ZENODO_API_TOKEN }} - - name: NCBench set config uses: actions/checkout@v4 with: repository: FriederikeHanssen/ncbench-workflow path: ncbench-workflow/ ref: main - - - name: Add entries to config + - name: Add entry to config uses: sergeysova/jq-action@v2 run: | jq --help From 103394aa30ed4772777a4042824b9902d6c02985 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 4 Oct 2023 21:54:05 +0000 Subject: [PATCH 022/545] print help --- .github/workflows/ncbench.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 9b8f906f7a..4c21bfb3d2 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -57,6 +57,8 @@ jobs: # ZENODO_USE_SANDBOX: true # with: # secrets: ${{ secrets.ZENODO_API_TOKEN }} + - name: Install jq + uses: sergeysova/jq-action@v2 - name: NCBench set config uses: actions/checkout@v4 with: @@ -64,6 +66,5 @@ jobs: path: ncbench-workflow/ ref: main - name: Add entry to config - uses: sergeysova/jq-action@v2 run: | jq --help From 3c15c3351ede31a0ff5a4e79ffdf435a6bd05c9a Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Fri, 6 Oct 2023 18:55:27 +0000 Subject: [PATCH 023/545] use yq to update config --- .github/workflows/ncbench.yml | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 4c21bfb3d2..37f78991b6 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -57,8 +57,6 @@ jobs: # ZENODO_USE_SANDBOX: true # with: # secrets: ${{ secrets.ZENODO_API_TOKEN }} - - name: Install jq - uses: sergeysova/jq-action@v2 - name: NCBench set config uses: actions/checkout@v4 with: @@ -66,5 +64,26 @@ jobs: path: ncbench-workflow/ ref: main - name: Add entry to config - run: | - jq --help + uses: mikefarah/yq@master + with: + cmd: yq --inplace ' + with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.labels; + .site = "nf-core" | + .pipeline = "nf-core/sarek v3.2.1" | + .trimming = "FastP v0.23.2" | + .read-mapping = "bwa mem v0.7.17" | + .base-quality-recalibration = "gatk4 v4.4.0.0" | + .realignment = "none" | + .variant-detection = "strelka2 v2.9.10" | + .genotyping = "none" | + .reads = "75M" ) | + with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.subcategory; + . = "NA12878-agilent" ) | + with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.zenodo; + .deposition = "get here proper zenodo ID" | + .filename = "get here proper file names" ) | + with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.benchmark; + . = "giab-NA12878-agilent-75M" ) | + with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.rename-contigs; + . = "resources/rename-contigs/ucsc-to-ensembl.txt" ) + ' ncbench-workflow/configs/config.yaml From 00ec858f5ad08b83b910b9fc755f2f1d646e3896 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Fri, 6 Oct 2023 18:56:49 +0000 Subject: [PATCH 024/545] fix path --- .github/workflows/ncbench.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 37f78991b6..e8630a1202 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -86,4 +86,4 @@ jobs: . = "giab-NA12878-agilent-75M" ) | with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.rename-contigs; . = "resources/rename-contigs/ucsc-to-ensembl.txt" ) - ' ncbench-workflow/configs/config.yaml + ' ncbench-workflow/config/config.yaml From e79318459ba02026b4567ffa70bbc449d9df0a8d Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Fri, 6 Oct 2023 20:18:15 +0000 Subject: [PATCH 025/545] test out pushing --- .github/workflows/ncbench.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index e8630a1202..db27fea1ac 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -87,3 +87,10 @@ jobs: with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.rename-contigs; . = "resources/rename-contigs/ucsc-to-ensembl.txt" ) ' ncbench-workflow/config/config.yaml + - name: Commit files + run: | + cd ncbench-workflow + git checkout -b test + git add config/config.yaml + git commit -a -m "Add changes" + git push origin test From eae59448ac6fc844af375c459d9f659c62256ba3 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Fri, 6 Oct 2023 20:21:41 +0000 Subject: [PATCH 026/545] add email --- .github/workflows/ncbench.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index db27fea1ac..60cf05110e 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -90,6 +90,8 @@ jobs: - name: Commit files run: | cd ncbench-workflow + git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" + git config --global user.name "FriederikeHanssen" git checkout -b test git add config/config.yaml git commit -a -m "Add changes" From 4667e4b5364d1cedd4931f468590513f67bd75b9 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 17:07:55 +0000 Subject: [PATCH 027/545] add pat --- .github/RELEASE_CHECKLIST.md | 8 ++------ .github/workflows/ncbench.yml | 7 +++++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/RELEASE_CHECKLIST.md b/.github/RELEASE_CHECKLIST.md index fd15eb72a5..402a8ff985 100644 --- a/.github/RELEASE_CHECKLIST.md +++ b/.github/RELEASE_CHECKLIST.md @@ -12,13 +12,9 @@ 4. Sync `dev` and checkout a new branch for the release 5. Bump version: - `nf-core bump-version . ` - - edit `docs/images/sarek_indices_subway.svg` - - generate a new `docs/images/sarek_indices_subway.png` - - edit `docs/images/sarek_subway.svg` - - generate a new `docs/images/sarek_subway.png` - - edit `docs/images/sarek_workflow.svg` - - generate a new `docs/images/sarek_workflow.png` - edit `CHANGELOG` + - edit multiqc yaml + - edit ncbench.yml 6. Make a PR to `master` 7. Wait for reviews 8. Merge said PR diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 60cf05110e..e98bfe99cb 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -89,10 +89,13 @@ jobs: ' ncbench-workflow/config/config.yaml - name: Commit files run: | - cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" git config --global user.name "FriederikeHanssen" git checkout -b test git add config/config.yaml git commit -a -m "Add changes" - git push origin test + - name: Push changes + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.NCBENCH_CI_TEST }} + repository: FriederikeHanssen/ncbench-workflow From 62a2f0cdd19035d7783325217e3ff20df414130c Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 17:11:14 +0000 Subject: [PATCH 028/545] cd into folder --- .github/workflows/ncbench.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index e98bfe99cb..0de7894fa1 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -89,6 +89,7 @@ jobs: ' ncbench-workflow/config/config.yaml - name: Commit files run: | + cd FriederikeHanssen/ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" git config --global user.name "FriederikeHanssen" git checkout -b test From c15d113383beeb33ea58c27240be3823baa59bf8 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 17:13:46 +0000 Subject: [PATCH 029/545] fix file path --- .github/workflows/ncbench.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 0de7894fa1..1169b1fb0a 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -89,7 +89,7 @@ jobs: ' ncbench-workflow/config/config.yaml - name: Commit files run: | - cd FriederikeHanssen/ncbench-workflow + cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" git config --global user.name "FriederikeHanssen" git checkout -b test From 7eb8d96b6fe5d8ddc1f10c104c04c7ed59399142 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 17:17:43 +0000 Subject: [PATCH 030/545] navigate around --- .github/workflows/ncbench.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 1169b1fb0a..79bfc20490 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -95,6 +95,7 @@ jobs: git checkout -b test git add config/config.yaml git commit -a -m "Add changes" + cd .. - name: Push changes uses: ad-m/github-push-action@master with: From dd8992a3cbce79ee843d84d26bc571c1612566ed Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 17:22:12 +0000 Subject: [PATCH 031/545] use branch keyword --- .github/workflows/ncbench.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 79bfc20490..61a759c5fb 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -101,3 +101,4 @@ jobs: with: github_token: ${{ secrets.NCBENCH_CI_TEST }} repository: FriederikeHanssen/ncbench-workflow + branch: test From c377bcb4933cfd012d6cd5c45f6219eb7f717542 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 17:27:48 +0000 Subject: [PATCH 032/545] more moving around --- .github/workflows/ncbench.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 61a759c5fb..d2d26226ec 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -95,7 +95,6 @@ jobs: git checkout -b test git add config/config.yaml git commit -a -m "Add changes" - cd .. - name: Push changes uses: ad-m/github-push-action@master with: From c8b08057b41c34a32e588bee70cd868950479d1b Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 17:50:52 +0000 Subject: [PATCH 033/545] try directky --- .github/workflows/ncbench.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index d2d26226ec..7b16425ad5 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -88,6 +88,11 @@ jobs: . = "resources/rename-contigs/ucsc-to-ensembl.txt" ) ' ncbench-workflow/config/config.yaml - name: Commit files + # uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.NCBENCH_CI_TEST }} + repository: FriederikeHanssen/ncbench-workflow + branch: test run: | cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" @@ -95,9 +100,3 @@ jobs: git checkout -b test git add config/config.yaml git commit -a -m "Add changes" - - name: Push changes - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.NCBENCH_CI_TEST }} - repository: FriederikeHanssen/ncbench-workflow - branch: test From c0affec669cbb8347bc33e786754066cec1896fa Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 17:52:57 +0000 Subject: [PATCH 034/545] try again withou push action --- .github/workflows/ncbench.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 7b16425ad5..32a4843df4 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -89,10 +89,10 @@ jobs: ' ncbench-workflow/config/config.yaml - name: Commit files # uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.NCBENCH_CI_TEST }} - repository: FriederikeHanssen/ncbench-workflow - branch: test + # with: + # github_token: ${{ secrets.NCBENCH_CI_TEST }} + # repository: FriederikeHanssen/ncbench-workflow + # branch: test run: | cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" @@ -100,3 +100,4 @@ jobs: git checkout -b test git add config/config.yaml git commit -a -m "Add changes" + git push origin test From 42ec7336e3107ec59a8c9d51a987e82ff73db133 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 18:01:33 +0000 Subject: [PATCH 035/545] add token again --- .github/workflows/ncbench.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 32a4843df4..a7e1ce65f9 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -88,11 +88,8 @@ jobs: . = "resources/rename-contigs/ucsc-to-ensembl.txt" ) ' ncbench-workflow/config/config.yaml - name: Commit files - # uses: ad-m/github-push-action@master - # with: - # github_token: ${{ secrets.NCBENCH_CI_TEST }} - # repository: FriederikeHanssen/ncbench-workflow - # branch: test + env: + PAT_TOKEN: ${{ secrets.NCBENCH_CI_TEST }} run: | cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" From 60030c3787a4ced1c48b9c1ae9d76788b61e4d43 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 18:09:45 +0000 Subject: [PATCH 036/545] udate token permission --- .github/workflows/ncbench.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index a7e1ce65f9..5ea467c1f7 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -89,7 +89,7 @@ jobs: ' ncbench-workflow/config/config.yaml - name: Commit files env: - PAT_TOKEN: ${{ secrets.NCBENCH_CI_TEST }} + GITHUB_TOKEN: ${{ secrets.NCBENCH_CI_TOKEN }} run: | cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" From 80bede5268bc3eec773be903c5dce21803e41079 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 18:36:29 +0000 Subject: [PATCH 037/545] use token akready at checkout --- .github/workflows/ncbench.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 5ea467c1f7..b75e03e375 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -60,6 +60,7 @@ jobs: - name: NCBench set config uses: actions/checkout@v4 with: + token: ${{ secrets.NCBENCH_CI_TOKEN }} repository: FriederikeHanssen/ncbench-workflow path: ncbench-workflow/ ref: main @@ -88,8 +89,6 @@ jobs: . = "resources/rename-contigs/ucsc-to-ensembl.txt" ) ' ncbench-workflow/config/config.yaml - name: Commit files - env: - GITHUB_TOKEN: ${{ secrets.NCBENCH_CI_TOKEN }} run: | cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" From d72fbc1cc03ecc426dc9f6af94f07f96398ddf26 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 19:17:30 +0000 Subject: [PATCH 038/545] test ncbench connection --- .github/workflows/ncbench.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index b75e03e375..65716a54dd 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -64,6 +64,7 @@ jobs: repository: FriederikeHanssen/ncbench-workflow path: ncbench-workflow/ ref: main + - name: Add entry to config uses: mikefarah/yq@master with: @@ -88,12 +89,13 @@ jobs: with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.rename-contigs; . = "resources/rename-contigs/ucsc-to-ensembl.txt" ) ' ncbench-workflow/config/config.yaml + - name: Commit files run: | cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" git config --global user.name "FriederikeHanssen" - git checkout -b test + git checkout -b test2 git add config/config.yaml git commit -a -m "Add changes" - git push origin test + git push origin test2 From e54928b54b7d9c9a72f051f447cb24118092dcf1 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 19:26:15 +0000 Subject: [PATCH 039/545] test ncbench connection --- .github/workflows/ncbench.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 65716a54dd..0b6be98e75 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -95,7 +95,7 @@ jobs: cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" git config --global user.name "FriederikeHanssen" - git checkout -b test2 + git checkout -b test3 git add config/config.yaml git commit -a -m "Add changes" - git push origin test2 + git push origin test3 From cbe8448a7c0cae1b583497091ed48067acdc40e5 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 9 Oct 2023 19:31:56 +0000 Subject: [PATCH 040/545] test ncbench connection --- .github/workflows/ncbench.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 0b6be98e75..f260aa1f27 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -95,7 +95,7 @@ jobs: cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" git config --global user.name "FriederikeHanssen" - git checkout -b test3 + git checkout -b test4 git add config/config.yaml git commit -a -m "Add changes" - git push origin test3 + git push origin test4 From 9f27eeec326e8402435269cfb3085e42469d35d3 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 10 Oct 2023 14:32:21 +0000 Subject: [PATCH 041/545] test zenodo in sandbox mode --- .github/workflows/ncbench.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index f260aa1f27..70b7ac3321 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -41,22 +41,22 @@ jobs: ref: ncbench path: sarek-ncbench/ - #- name: Create new Zenodo entry - # uses: popperized/zenodo/create@master - # env: - # ZENODO_METADATA_PATH: sarek-ncbench/assets/zenodo_ncbench.json - # ZENODO_USE_SANDBOX: true - # with: - # secrets: ${{ secrets.ZENODO_API_TOKEN }} + - name: Create new Zenodo entry + uses: popperized/zenodo/create@master + env: + ZENODO_METADATA_PATH: sarek-ncbench/assets/zenodo_ncbench.json + ZENODO_USE_SANDBOX: true + with: + secrets: ${{ secrets.ZENODO_DEPOSIT }} + + - name: Upload file to Zenodo + uses: popperized/zenodo/upload@master + env: + ZENODO_UPLOAD_PATH: ./variant_calling + ZENODO_USE_SANDBOX: true + with: + secrets: ${{ secrets.ZENODO_DEPOSIT }} - #- name: Upload file to Zenodo - # uses: popperized/zenodo/upload@master - # env: - # ZENODO_DEPOSIT_ID: #TODO get the dposit ID from the previous step - # ZENODO_UPLOAD_PATH: ./variant_calling_v$pipeline_version - # ZENODO_USE_SANDBOX: true - # with: - # secrets: ${{ secrets.ZENODO_API_TOKEN }} - name: NCBench set config uses: actions/checkout@v4 with: From 5c408533ee04b39174841a9e49d720e843cd6945 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 10:01:37 +0000 Subject: [PATCH 042/545] unsandbox it, what could go worng --- .github/workflows/ncbench.yml | 8 +++----- assets/zenodo_ncbench.json | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 70b7ac3321..e614572b78 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -21,7 +21,7 @@ jobs: - profile: germline_wes enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.germline_wes ) }} env: - pipeline_version: 3.2.3 + pipeline_version: 3.1.1test steps: - name: Download files from AWS @@ -45,7 +45,6 @@ jobs: uses: popperized/zenodo/create@master env: ZENODO_METADATA_PATH: sarek-ncbench/assets/zenodo_ncbench.json - ZENODO_USE_SANDBOX: true with: secrets: ${{ secrets.ZENODO_DEPOSIT }} @@ -53,7 +52,6 @@ jobs: uses: popperized/zenodo/upload@master env: ZENODO_UPLOAD_PATH: ./variant_calling - ZENODO_USE_SANDBOX: true with: secrets: ${{ secrets.ZENODO_DEPOSIT }} @@ -95,7 +93,7 @@ jobs: cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" git config --global user.name "FriederikeHanssen" - git checkout -b test4 + git checkout -b test5 git add config/config.yaml git commit -a -m "Add changes" - git push origin test4 + git push origin test5 diff --git a/assets/zenodo_ncbench.json b/assets/zenodo_ncbench.json index d96fcb719b..fcf1231b4c 100644 --- a/assets/zenodo_ncbench.json +++ b/assets/zenodo_ncbench.json @@ -1,6 +1,6 @@ { "metadata": { - "title": "nf-core/sarek v3.1.1 NCBench vcf files", + "title": "nf-core/sarek Test NCBench vcf files", "upload_type": "dataset", "description": "Agilent datasets for NCBench", "creators": [ From ac201101d87e3c7779d9c00118dd52f2e357b50c Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 12:07:06 +0000 Subject: [PATCH 043/545] switch to python --- .github/workflows/ncbench.yml | 28 +++++++++++-------- .github/workflows/upload.py | 51 +++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/upload.py diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index e614572b78..f298e49fa7 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -41,19 +41,25 @@ jobs: ref: ncbench path: sarek-ncbench/ - - name: Create new Zenodo entry - uses: popperized/zenodo/create@master - env: - ZENODO_METADATA_PATH: sarek-ncbench/assets/zenodo_ncbench.json - with: - secrets: ${{ secrets.ZENODO_DEPOSIT }} + #- name: Create new Zenodo entry + # uses: popperized/zenodo/create@master + # env: + # ZENODO_METADATA_PATH: sarek-ncbench/assets/zenodo_ncbench.json + # entrypoint: + # secrets: ${{ secrets.ZENODO_DEPOSIT }} + # + #- name: Upload file to Zenodo + # uses: popperized/zenodo/upload@master + # env: + # ZENODO_UPLOAD_PATH: ./variant_calling - - name: Upload file to Zenodo - uses: popperized/zenodo/upload@master + - name: Install requests + run: pip install requests + + - name: Upload to zenodo env: - ZENODO_UPLOAD_PATH: ./variant_calling - with: - secrets: ${{ secrets.ZENODO_DEPOSIT }} + ZENODO_DEPOSIT: ${{ secrets.ZENODO_DEPOSIT }} + run: python upload.py - name: NCBench set config uses: actions/checkout@v4 diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py new file mode 100644 index 0000000000..21cad3d5d4 --- /dev/null +++ b/.github/workflows/upload.py @@ -0,0 +1,51 @@ +import requests + +headers = {"Content-Type": "application/json"} +params = {'access_token': ZENODO_DEPOSIT} + +r = requests.post('https://sandbox.zenodo.org/api/deposit/depositions', + params=params, + json={}, + ''' + Headers are not necessary here since "requests" automatically + adds "Content-Type: application/json", because we're using + the "json=" keyword argument + headers=headers, + ''' + headers=headers) +r.status_code +# 201 +bucket_url = r.json()["links"]["bucket"] + +''' New API ''' +filename = "*.vcf.gz" +path = "./variant_calling/%s" % filename + +''' +The target URL is a combination of the bucket link with the desired filename +seperated by a slash. +''' +with open(path, "rb") as fp: + r = requests.put( + "%s/%s" % (bucket_url, filename), + data=fp, + params=params, + ) +r.json() + +data = { + 'metadata': { + 'title': 'My first upload', + 'upload_type': 'poster', + 'description': 'This is my first upload', + 'creators': [{'name': 'Doe, John', + 'affiliation': 'Zenodo'}] + } +} +r = requests.put('https://sandbox.zenodo.org/api/deposit/depositions%s' % deposition_id, + params={'access_token': ZENODO_DEPOSIT}, data=json.dumps(data), + headers=headers) +r.status_code +# 200 + + From f4713accc179eb16eb75961723716cfd052fb450 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 12:12:14 +0000 Subject: [PATCH 044/545] fix path --- .github/workflows/ncbench.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index f298e49fa7..e91c60a03b 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -59,7 +59,7 @@ jobs: - name: Upload to zenodo env: ZENODO_DEPOSIT: ${{ secrets.ZENODO_DEPOSIT }} - run: python upload.py + run: python .github/workflows/upload.py - name: NCBench set config uses: actions/checkout@v4 @@ -99,7 +99,7 @@ jobs: cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" git config --global user.name "FriederikeHanssen" - git checkout -b test5 + git checkout -b test6 git add config/config.yaml git commit -a -m "Add changes" - git push origin test5 + git push origin test6 From 11007ce7c94a520c4e2bdae5fe000ecabfc38464 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 12:17:35 +0000 Subject: [PATCH 045/545] check out repo --- .github/workflows/ncbench.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index e91c60a03b..aff51e9a9a 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -36,10 +36,10 @@ jobs: - name: Download metadata file for Zenodo uses: actions/checkout@v4 - with: - repository: FriederikeHanssen/sarek - ref: ncbench - path: sarek-ncbench/ + # with: + # repository: FriederikeHanssen/sarek + # ref: ncbench + # path: sarek-ncbench/ #- name: Create new Zenodo entry # uses: popperized/zenodo/create@master @@ -59,7 +59,9 @@ jobs: - name: Upload to zenodo env: ZENODO_DEPOSIT: ${{ secrets.ZENODO_DEPOSIT }} - run: python .github/workflows/upload.py + run: | + ls -lha + python sarek/.github/workflows/upload.py - name: NCBench set config uses: actions/checkout@v4 From 1614a926f6e3fa834cf4b765a9cebaa033aa3bb4 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 12:28:18 +0000 Subject: [PATCH 046/545] check out repo --- .github/workflows/ncbench.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index aff51e9a9a..a155fc6287 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -24,6 +24,9 @@ jobs: pipeline_version: 3.1.1test steps: + - name: Download pipeline + uses: actions/checkout@v4 + - name: Download files from AWS uses: keithweaver/aws-s3-github-action@v1.0.0 if: ${{ matrix.enabled }} @@ -34,13 +37,6 @@ jobs: destination: ./variant_calling flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" - - name: Download metadata file for Zenodo - uses: actions/checkout@v4 - # with: - # repository: FriederikeHanssen/sarek - # ref: ncbench - # path: sarek-ncbench/ - #- name: Create new Zenodo entry # uses: popperized/zenodo/create@master # env: From 94f6d8d5569032841a8265928558d660745e2903 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 12:30:33 +0000 Subject: [PATCH 047/545] check out repo --- .github/workflows/ncbench.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index a155fc6287..a7537316be 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -57,7 +57,7 @@ jobs: ZENODO_DEPOSIT: ${{ secrets.ZENODO_DEPOSIT }} run: | ls -lha - python sarek/.github/workflows/upload.py + python .github/workflows/upload.py - name: NCBench set config uses: actions/checkout@v4 From df4a3553d6a6696d0912925615e4c1b95396699b Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 12:32:23 +0000 Subject: [PATCH 048/545] remove comments --- .github/workflows/upload.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 21cad3d5d4..7f04664da1 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -6,25 +6,14 @@ r = requests.post('https://sandbox.zenodo.org/api/deposit/depositions', params=params, json={}, - ''' - Headers are not necessary here since "requests" automatically - adds "Content-Type: application/json", because we're using - the "json=" keyword argument - headers=headers, - ''' headers=headers) r.status_code # 201 bucket_url = r.json()["links"]["bucket"] -''' New API ''' filename = "*.vcf.gz" path = "./variant_calling/%s" % filename -''' -The target URL is a combination of the bucket link with the desired filename -seperated by a slash. -''' with open(path, "rb") as fp: r = requests.put( "%s/%s" % (bucket_url, filename), From 758c2bafb55966f00c5e9149071de3999b93dbc1 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 12:34:31 +0000 Subject: [PATCH 049/545] change env variable name --- .github/workflows/ncbench.yml | 2 +- .github/workflows/upload.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index a7537316be..f94e71cd8e 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -54,7 +54,7 @@ jobs: - name: Upload to zenodo env: - ZENODO_DEPOSIT: ${{ secrets.ZENODO_DEPOSIT }} + ACCESS_TOKEN: ${{ secrets.ZENODO_DEPOSIT }} run: | ls -lha python .github/workflows/upload.py diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 7f04664da1..5542be3455 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -1,7 +1,7 @@ import requests headers = {"Content-Type": "application/json"} -params = {'access_token': ZENODO_DEPOSIT} +params = {'access_token': ACCESS_TOKEN} r = requests.post('https://sandbox.zenodo.org/api/deposit/depositions', params=params, @@ -32,7 +32,7 @@ } } r = requests.put('https://sandbox.zenodo.org/api/deposit/depositions%s' % deposition_id, - params={'access_token': ZENODO_DEPOSIT}, data=json.dumps(data), + params={'access_token': ACCESS_TOKEN}, data=json.dumps(data), headers=headers) r.status_code # 200 From 7c341f126535a2ec3a9a65647e0c3e45723c6107 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 12:42:13 +0000 Subject: [PATCH 050/545] load access token from env --- .github/workflows/upload.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 5542be3455..26543e2359 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -1,7 +1,8 @@ import requests +import os headers = {"Content-Type": "application/json"} -params = {'access_token': ACCESS_TOKEN} +params = {'access_token': os.environ["ACCESS_TOKEN"]} r = requests.post('https://sandbox.zenodo.org/api/deposit/depositions', params=params, From 02daf0712c3e327be6e8d7f7197bb679020feb29 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 12:45:26 +0000 Subject: [PATCH 051/545] print json --- .github/workflows/ncbench.yml | 1 - .github/workflows/upload.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index f94e71cd8e..5544a8fc01 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -56,7 +56,6 @@ jobs: env: ACCESS_TOKEN: ${{ secrets.ZENODO_DEPOSIT }} run: | - ls -lha python .github/workflows/upload.py - name: NCBench set config diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 26543e2359..093f820072 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -10,6 +10,7 @@ headers=headers) r.status_code # 201 +println(r.json()) bucket_url = r.json()["links"]["bucket"] filename = "*.vcf.gz" From 7eff9ec1f33fe4021ff43561a5324120d41f6399 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 14:00:53 +0000 Subject: [PATCH 052/545] use pose instead --- .github/workflows/upload.py | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 093f820072..2e61dda4dd 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -2,22 +2,14 @@ import os headers = {"Content-Type": "application/json"} -params = {'access_token': os.environ["ACCESS_TOKEN"]} -r = requests.post('https://sandbox.zenodo.org/api/deposit/depositions', - params=params, - json={}, - headers=headers) -r.status_code -# 201 -println(r.json()) -bucket_url = r.json()["links"]["bucket"] +url = f"https://zenodo.org/api/deposit/depositions?access_token=${os.environ["ACCESS_TOKEN"]}" filename = "*.vcf.gz" path = "./variant_calling/%s" % filename with open(path, "rb") as fp: - r = requests.put( + r = requests.post( "%s/%s" % (bucket_url, filename), data=fp, params=params, @@ -33,10 +25,7 @@ 'affiliation': 'Zenodo'}] } } -r = requests.put('https://sandbox.zenodo.org/api/deposit/depositions%s' % deposition_id, - params={'access_token': ACCESS_TOKEN}, data=json.dumps(data), - headers=headers) + +r = requests.post(url, data=json.dumps(data), headers=headers) r.status_code # 200 - - From 74473f6ee5061d94fee353b11b9a8b3f97c5fc1c Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 14:04:00 +0000 Subject: [PATCH 053/545] fix access token parsing --- .github/workflows/upload.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 2e61dda4dd..cf22e845a2 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -2,8 +2,9 @@ import os headers = {"Content-Type": "application/json"} +access_token = os.environ["ACCESS_TOKEN"] -url = f"https://zenodo.org/api/deposit/depositions?access_token=${os.environ["ACCESS_TOKEN"]}" +url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" path = "./variant_calling/%s" % filename From 854d209d38ea52129f3426adea2e45c1fc64a489 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 14:05:55 +0000 Subject: [PATCH 054/545] print directory --- .github/workflows/ncbench.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 5544a8fc01..1bc6721ebd 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -56,6 +56,8 @@ jobs: env: ACCESS_TOKEN: ${{ secrets.ZENODO_DEPOSIT }} run: | + ls + ls ../ python .github/workflows/upload.py - name: NCBench set config From ace23bf2da9507b7930d104d5a668584cee7310a Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 17 Oct 2023 14:23:33 +0000 Subject: [PATCH 055/545] fix path --- .github/workflows/ncbench.yml | 2 -- .github/workflows/upload.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 1bc6721ebd..5544a8fc01 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -56,8 +56,6 @@ jobs: env: ACCESS_TOKEN: ${{ secrets.ZENODO_DEPOSIT }} run: | - ls - ls ../ python .github/workflows/upload.py - name: NCBench set config diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index cf22e845a2..0e892173b9 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -7,7 +7,7 @@ url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" -path = "./variant_calling/%s" % filename +path = "../../variant_calling/%s" % filename with open(path, "rb") as fp: r = requests.post( From ac39f0cae61ff6ff320071518e8231e38c000d11 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 15 Nov 2023 09:02:03 +0000 Subject: [PATCH 056/545] catch up, add comments --- .github/workflows/ncbench.yml | 13 +++++++++++-- .github/workflows/upload.py | 7 +++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 5544a8fc01..1033c4b55e 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -5,11 +5,12 @@ on: # upload can only be triggered manually for now workflow_dispatch: inputs: + # TODO: add in other test profiles germline_wes: description: "Trigger NCBench upload" type: boolean default: true - pull_request: + pull_request: # TODO: remove once it works jobs: ncbench-upload: @@ -18,9 +19,11 @@ jobs: fail-fast: false matrix: include: + # TODO: Add in other test profiles - profile: germline_wes enabled: ${{ ( github.repository == 'nf-core/sarek' ) && ( github.event_name != 'workflow_dispatch' || inputs.germline_wes ) }} env: + # TODO: parse this out somehow pipeline_version: 3.1.1test steps: @@ -31,12 +34,14 @@ jobs: uses: keithweaver/aws-s3-github-action@v1.0.0 if: ${{ matrix.enabled }} with: + # TODO: download all vcfs source: s3://nf-core-awsmegatests/sarek/results-test-59026dc07633edb83aab3bfb2f65f79db38437a1/test_full/variant_calling/strelka command: sync aws_region: eu-west-1 destination: ./variant_calling flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" + # TOD remove this, it is probably not needed anymore, we are using python now #- name: Create new Zenodo entry # uses: popperized/zenodo/create@master # env: @@ -50,7 +55,7 @@ jobs: # ZENODO_UPLOAD_PATH: ./variant_calling - name: Install requests - run: pip install requests + run: pip install requests # version pinning? - name: Upload to zenodo env: @@ -58,6 +63,7 @@ jobs: run: | python .github/workflows/upload.py + # update ncbench config yml - name: NCBench set config uses: actions/checkout@v4 with: @@ -69,6 +75,8 @@ jobs: - name: Add entry to config uses: mikefarah/yq@master with: + # TODO: add in values for all callers, ensure proper extension for the datasets are used. Parse out tool versions somehow + # TODO: need to retrieve new zenodo id cmd: yq --inplace ' with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.labels; .site = "nf-core" | @@ -91,6 +99,7 @@ jobs: . = "resources/rename-contigs/ucsc-to-ensembl.txt" ) ' ncbench-workflow/config/config.yaml + # TODO: enable using secrets here - name: Commit files run: | cd ncbench-workflow diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 0e892173b9..29e8e4d9b2 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -30,3 +30,10 @@ r = requests.post(url, data=json.dumps(data), headers=headers) r.status_code # 200 + +# TODO add publication step +#r = requests.post('https://zenodo.org/api/deposit/depositions/%s/actions/publish' % deposition_id, +# params={'access_token': ACCESS_TOKEN} ) +#r.status_code +# 202 + From d0d1fdbefc1e518841fde79cef532f8a055eedd1 Mon Sep 17 00:00:00 2001 From: Rike Date: Wed, 15 Nov 2023 22:20:04 +0100 Subject: [PATCH 057/545] back to dev --- CHANGELOG.md | 20 ++++++++++++++++++++ assets/multiqc_config.yml | 4 ++-- nextflow.config | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b686bd5ed7..d03e2fd654 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file. 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). +## [dev] + +### Added + +### Changed + +### Fixed + +### Removed + +### Dependencies + +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | + +### Modules / Subworkflows + +| script | Old name | New name | +| ----------------------------- | ----------------------------- | ----------------------------- | + ## [3.4.0](https://github.com/nf-core/sarek/releases/tag/3.4.0) - Pårtetjåkko Pårtetjåkko is a mountain in the south of the park. diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index e175753b62..42adcc9209 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,9 +3,9 @@ custom_logo_url: https://github.com/nf-core/sarek/ custom_logo_title: "nf-core/sarek" report_comment: > - This report has been generated by the nf-core/sarek + This report has been generated by the nf-core/sarek analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-sarek-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index cc1bdcbd4d..092662fb2c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -350,7 +350,7 @@ manifest { description = """An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '3.4.0' + version = '3.5dev' doi = '10.12688/f1000research.16665.2, 10.1101/2023.07.19.549462, 10.5281/zenodo.3476425' } From 81791c5e05519af3dfa71e967a3050008066b97d Mon Sep 17 00:00:00 2001 From: Rike Date: Wed, 15 Nov 2023 22:22:23 +0100 Subject: [PATCH 058/545] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d03e2fd654..dacbc4b3b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [#1333](https://github.com/nf-core/sarek/pull/1333) - Back to dev + ### Changed ### Fixed From e88c529864f48c5b8e863e5100da17bf29c807ba Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 15 Nov 2023 22:05:17 +0000 Subject: [PATCH 059/545] [automated] Fix linting with Prettier --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dacbc4b3b5..2c8151a556 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,8 +24,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Modules / Subworkflows -| script | Old name | New name | -| ----------------------------- | ----------------------------- | ----------------------------- | +| script | Old name | New name | +| ------ | -------- | -------- | ## [3.4.0](https://github.com/nf-core/sarek/releases/tag/3.4.0) - Pårtetjåkko From 387bc9fbde778e33d6186e95c9670083fe226da7 Mon Sep 17 00:00:00 2001 From: Rike Date: Thu, 16 Nov 2023 09:07:28 +0100 Subject: [PATCH 060/545] remove extra v for slack report --- assets/slackreport.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/slackreport.json b/assets/slackreport.json index de941028ea..6d735f5f6c 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": "nf-core/sarek v${version} - ${runName}", + "author_name": "nf-core/sarek ${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 cab03d9f0af6551a8aa28a12176692879973b7aa Mon Sep 17 00:00:00 2001 From: Rike Date: Thu, 16 Nov 2023 09:08:50 +0100 Subject: [PATCH 061/545] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c8151a556..97e4486f64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- [#1334](https://github.com/nf-core/sarek/pull/1334) - Remove extra v, when reporting tower runs on slack + ### Removed ### Dependencies From b5fbd43030ae4de61900e3c13fd6a1175833f518 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Thu, 16 Nov 2023 09:16:38 +0000 Subject: [PATCH 062/545] retrieve deposition ID --- .github/workflows/ncbench.yml | 8 ++++---- .github/workflows/upload.py | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 1033c4b55e..9cf2f05665 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -41,7 +41,7 @@ jobs: destination: ./variant_calling flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" - # TOD remove this, it is probably not needed anymore, we are using python now + # TODO remove this, it is probably not needed anymore, we are using python now #- name: Create new Zenodo entry # uses: popperized/zenodo/create@master # env: @@ -91,7 +91,7 @@ jobs: with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.subcategory; . = "NA12878-agilent" ) | with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.zenodo; - .deposition = "get here proper zenodo ID" | + .deposition = $DEPOSITION_ID | .filename = "get here proper file names" ) | with(.variant-calls.nf-core-sarek-321-strelka-agilent-75M.benchmark; . = "giab-NA12878-agilent-75M" ) | @@ -105,7 +105,7 @@ jobs: cd ncbench-workflow git config --global user.email "friederike.hanssen@qbic.uni-tuebingen.de" git config --global user.name "FriederikeHanssen" - git checkout -b test6 + git checkout -b test7 git add config/config.yaml git commit -a -m "Add changes" - git push origin test6 + git push origin test7 diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 29e8e4d9b2..96d0a8958e 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -4,7 +4,8 @@ headers = {"Content-Type": "application/json"} access_token = os.environ["ACCESS_TOKEN"] -url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" +# TODO: replace sandbox link https://zenodo.org/api/deposit/depositions +url = f"https://sandbox.zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" path = "../../variant_calling/%s" % filename @@ -31,6 +32,9 @@ r.status_code # 200 +r.json()["metadata"]["recid"] + +os.environ['DEPOSITION_ID'] = r.json()["metadata"]["recid"] # TODO add publication step #r = requests.post('https://zenodo.org/api/deposit/depositions/%s/actions/publish' % deposition_id, # params={'access_token': ACCESS_TOKEN} ) From f558bcf415de35bf3210c0cfd773c99db9b88207 Mon Sep 17 00:00:00 2001 From: Rike Date: Thu, 16 Nov 2023 11:27:44 +0100 Subject: [PATCH 063/545] add docs for bcftools annotate params --- nextflow_schema.json | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index f585103b28..5be42f1ab0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -84,7 +84,7 @@ "description": "Path to target bed file in case of whole exome or targeted sequencing or intervals file." }, "nucleotides_per_second": { - "type": "number", + "type": "integer", "fa_icon": "fas fa-clock", "description": "Estimate interval size.", "help_text": "Intervals are parts of the chopped up genome used to speed up preprocessing and variant calling. See `--intervals` for more info. \n\nChanging this parameter, changes the number of intervals that are grouped and processed together. Bed files from target sequencing can contain thousands or small intervals. Spinning up a new process for each can be quite resource intensive. Instead it can be desired to process small intervals together on larger nodes. \nIn order to make use of this parameter, no runtime estimate can be present in the bed file (column 5). ", @@ -100,8 +100,7 @@ "type": "string", "fa_icon": "fas fa-toolbox", "description": "Tools to use for duplicate marking, variant calling and/or for annotation.", - "help_text": "Multiple tools separated with commas.\n\n**Variant Calling:**\n\nGermline variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: DeepVariant, FreeBayes, GATK HaplotypeCaller, mpileup, Sentieon Haplotyper, Strelka\n- Structural Variants: Manta, TIDDIT\n- Copy-number: CNVKit\n\nTumor-only somatic variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, mpileup, Mutect2, Strelka\n- Structural Variants: Manta, TIDDIT\n- Copy-number: CNVKit, ControlFREEC\n\nSomatic variant calling can currently only be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, Mutect2, Strelka2\n- Structural variants: Manta, TIDDIT\n- Copy-Number: ASCAT, CNVKit, Control-FREEC\n- Microsatellite Instability: MSIsensorpro\n\n> **NB** Mutect2 for somatic variant calling cannot be combined with `--no_intervals`\n\n**Annotation:**\n \n- snpEff, VEP, merge (both consecutively).\n\n> **NB** As Sarek will use bgzip and tabix to compress and index VCF files annotated, it expects VCF files to be sorted when starting from `--step annotate`.", - + "help_text": "Multiple tools separated with commas.\n\n**Variant Calling:**\n\nGermline variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: DeepVariant, FreeBayes, GATK HaplotypeCaller, mpileup, Sentieon Haplotyper, Strelka\n- Structural Variants: Manta, TIDDIT\n- Copy-number: CNVKit\n\nTumor-only somatic variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, mpileup, Mutect2, Strelka\n- Structural Variants: Manta, TIDDIT\n- Copy-number: CNVKit, ControlFREEC\n\nSomatic variant calling can currently only be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, Mutect2, Strelka2\n- Structural variants: Manta, TIDDIT\n- Copy-Number: ASCAT, CNVKit, Control-FREEC\n- Microsatellite Instability: MSIsensorpro\n\n> **NB** Mutect2 for somatic variant calling cannot be combined with `--no_intervals`\n\n**Annotation:**\n \n- snpEff, VEP, merge (both consecutively), and bcftools annotate (needs `--bcftools_annotation`).\n\n> **NB** As Sarek will use bgzip and tabix to compress and index VCF files annotated, it expects VCF files to be sorted when starting from `--step annotate`.", "pattern": "^((ascat|bcfann|cnvkit|controlfreec|deepvariant|freebayes|haplotypecaller|sentieon_dnascope|sentieon_haplotyper|manta|merge|mpileup|msisensorpro|mutect2|ngscheckmate|sentieon_dedup|snpeff|strelka|tiddit|vep)?,?)*(? Date: Thu, 16 Nov 2023 11:34:26 +0100 Subject: [PATCH 064/545] add input validation --- CHANGELOG.md | 2 +- subworkflows/local/samplesheet_to_channel/main.nf | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97e4486f64..b29c9b110c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - [#1334](https://github.com/nf-core/sarek/pull/1334) - Remove extra v, when reporting tower runs on slack - +- [#1335](https://github.com/nf-core/sarek/pull/1335) - Add docs and validation for bcftools annotation parameters ### Removed ### Dependencies diff --git a/subworkflows/local/samplesheet_to_channel/main.nf b/subworkflows/local/samplesheet_to_channel/main.nf index b3f9b2311a..a15f9c6e2a 100644 --- a/subworkflows/local/samplesheet_to_channel/main.nf +++ b/subworkflows/local/samplesheet_to_channel/main.nf @@ -112,6 +112,7 @@ workflow SAMPLESHEET_TO_CHANNEL{ } } } + input_sample.filter{ it[0].status == 0 }.ifEmpty{ // In this case, the sample-sheet contains no normal/germline-samples def tools_requiring_normal_samples = ['ascat', 'deepvariant', 'haplotypecaller', 'msisensorpro'] def requested_tools_requiring_normal_samples = [] @@ -126,8 +127,8 @@ workflow SAMPLESHEET_TO_CHANNEL{ // Fails when wrongfull extension for intervals file if (params.wes && !params.step == 'annotate') { - if (params.intervals && !params.intervals.endsWith("bed")) error("Target file specified with `--intervals` must be in BED format for targeted data") - else log.warn("Intervals file was provided without parameter `--wes`: Pipeline will assume this is Whole-Genome-Sequencing data.") + if (params.intervals && !params.intervals.endsWith("bed")) error("Target file specified with `--intervals` must be in BED format for targeted data") + else log.warn("Intervals file was provided without parameter `--wes`: Pipeline will assume this is Whole-Genome-Sequencing data.") } else if (params.intervals && !params.intervals.endsWith("bed") && !params.intervals.endsWith("list")) error("Intervals file must end with .bed, .list, or .interval_list") if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && params.skip_tools.split(',').contains("baserecalibrator"))) { @@ -250,6 +251,11 @@ workflow SAMPLESHEET_TO_CHANNEL{ } } + // Fails when bcftools annotate is used but no files are supplied + if (params.tools && (params.tools.split(',').contains('bcfann') && !(params.bcftools_annotations && params.bcftools_annotations_index && params.bcftools_header_lines)) { + error("Please specify --bcftools_annotations, --bcftools_annotations_index, and --bcftools_header_lines, when using BCFTools annotations") + } + emit: input_sample } From a815fdaf1fd6dc4d0fc8e22bf6cd691cfb851f2d Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 16 Nov 2023 11:16:47 +0000 Subject: [PATCH 065/545] [automated] Fix linting with Prettier --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b29c9b110c..abdd2166ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1334](https://github.com/nf-core/sarek/pull/1334) - Remove extra v, when reporting tower runs on slack - [#1335](https://github.com/nf-core/sarek/pull/1335) - Add docs and validation for bcftools annotation parameters + ### Removed ### Dependencies From 70d52c8b0cc918265131e12b3ee0399dc8428e9c Mon Sep 17 00:00:00 2001 From: Rike Date: Thu, 16 Nov 2023 12:17:12 +0100 Subject: [PATCH 066/545] fix brackets --- subworkflows/local/samplesheet_to_channel/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/samplesheet_to_channel/main.nf b/subworkflows/local/samplesheet_to_channel/main.nf index a15f9c6e2a..d674fa1dcd 100644 --- a/subworkflows/local/samplesheet_to_channel/main.nf +++ b/subworkflows/local/samplesheet_to_channel/main.nf @@ -252,7 +252,7 @@ workflow SAMPLESHEET_TO_CHANNEL{ } // Fails when bcftools annotate is used but no files are supplied - if (params.tools && (params.tools.split(',').contains('bcfann') && !(params.bcftools_annotations && params.bcftools_annotations_index && params.bcftools_header_lines)) { + if (params.tools && params.tools.split(',').contains('bcfann') && !(params.bcftools_annotations && params.bcftools_annotations_index && params.bcftools_header_lines)) { error("Please specify --bcftools_annotations, --bcftools_annotations_index, and --bcftools_header_lines, when using BCFTools annotations") } From 8f34778bc946780b386b097b672914093614c034 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Thu, 16 Nov 2023 15:44:46 +0100 Subject: [PATCH 067/545] Update CHANGELOG.md Co-authored-by: Maxime U Garcia --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index abdd2166ef..fff0e67cce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1334](https://github.com/nf-core/sarek/pull/1334) - Remove extra v, when reporting tower runs on slack - [#1335](https://github.com/nf-core/sarek/pull/1335) - Add docs and validation for bcftools annotation parameters + ### Removed ### Dependencies From 7061e432bbefcd353e19ce3ca3134bef2f23fde2 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 16 Nov 2023 14:50:14 +0000 Subject: [PATCH 068/545] [automated] Fix linting with Prettier --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fff0e67cce..abdd2166ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1334](https://github.com/nf-core/sarek/pull/1334) - Remove extra v, when reporting tower runs on slack - [#1335](https://github.com/nf-core/sarek/pull/1335) - Add docs and validation for bcftools annotation parameters - ### Removed ### Dependencies From 4eff47ad91d1c481ef7043ee032ae685ea300dc0 Mon Sep 17 00:00:00 2001 From: Rike Date: Fri, 17 Nov 2023 16:21:48 +0100 Subject: [PATCH 069/545] compute index if missing and rename to tbi --- nextflow.config | 40 ++++----- nextflow_schema.json | 4 +- subworkflows/local/prepare_genome/main.nf | 83 ++++++++++--------- .../local/samplesheet_to_channel/main.nf | 4 +- workflows/sarek.nf | 40 ++++----- 5 files changed, 89 insertions(+), 82 deletions(-) diff --git a/nextflow.config b/nextflow.config index 092662fb2c..d309acfc21 100644 --- a/nextflow.config +++ b/nextflow.config @@ -77,26 +77,26 @@ params { wes = false // Set to true, if data is exome/targeted sequencing data. Used to use correct models in various variant callers // Annotation - bcftools_annotations = null // No extra annotation file - bcftools_annotations_index = null // No extra annotation file index - bcftools_header_lines = null // No header lines to be added to the VCF file - dbnsfp = null // No dbnsfp processed file - dbnsfp_consequence = null // No default consequence for dbnsfp plugin - dbnsfp_fields = "rs_dbSNP,HGVSc_VEP,HGVSp_VEP,1000Gp3_EAS_AF,1000Gp3_AMR_AF,LRT_score,GERP++_RS,gnomAD_exomes_AF" // Default fields for dbnsfp plugin - dbnsfp_tbi = null // No dbnsfp processed file index - outdir_cache = null // No default outdir cache - spliceai_indel = null // No spliceai_indel file - spliceai_indel_tbi = null // No spliceai_indel file index - spliceai_snv = null // No spliceai_snv file - spliceai_snv_tbi = null // No spliceai_snv file index - vep_custom_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" // Default arguments for VEP - vep_dbnsfp = null // dbnsfp plugin disabled within VEP - vep_include_fasta = false // Don't use fasta file for annotation with VEP - vep_loftee = null // loftee plugin disabled within VEP - vep_out_format = "vcf" - vep_spliceai = null // spliceai plugin disabled within VEP - vep_spliceregion = null // spliceregion plugin disabled within VEP - vep_version = "110.0-0" // Should be updated when we update VEP, needs this to get full path to some plugins + bcftools_annotations = null // No extra annotation file + bcftools_annotations_tbi = null // No extra annotation file index + bcftools_header_lines = null // No header lines to be added to the VCF file + dbnsfp = null // No dbnsfp processed file + dbnsfp_consequence = null // No default consequence for dbnsfp plugin + dbnsfp_fields = "rs_dbSNP,HGVSc_VEP,HGVSp_VEP,1000Gp3_EAS_AF,1000Gp3_AMR_AF,LRT_score,GERP++_RS,gnomAD_exomes_AF" // Default fields for dbnsfp plugin + dbnsfp_tbi = null // No dbnsfp processed file index + outdir_cache = null // No default outdir cache + spliceai_indel = null // No spliceai_indel file + spliceai_indel_tbi = null // No spliceai_indel file index + spliceai_snv = null // No spliceai_snv file + spliceai_snv_tbi = null // No spliceai_snv file index + vep_custom_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" // Default arguments for VEP + vep_dbnsfp = null // dbnsfp plugin disabled within VEP + vep_include_fasta = false // Don't use fasta file for annotation with VEP + vep_loftee = null // loftee plugin disabled within VEP + vep_out_format = "vcf" + vep_spliceai = null // spliceai plugin disabled within VEP + vep_spliceregion = null // spliceregion plugin disabled within VEP + vep_version = "110.0-0" // Should be updated when we update VEP, needs this to get full path to some plugins // MultiQC options multiqc_config = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 5be42f1ab0..3f3f21313f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -533,9 +533,9 @@ "bcftools_annotations": { "type": "string", "fa_icon": "fas fa-file", - "description": "A vcf file containing custom annotations to be used with bcftools annotate" + "description": "A vcf file containing custom annotations to be used with bcftools annotate. Needs to be bgzipped." }, - "bcftools_annotations_index": { + "bcftools_annotations_tbi": { "type": "string", "fa_icon": "fas fa-file", "description": "Index file for `bcftools_annotations`" diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 4945282d98..4582c6dd74 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -8,37 +8,39 @@ // Condition is based on params.step and params.tools // If and extra condition exists, it's specified in comments -include { BWA_INDEX as BWAMEM1_INDEX } from '../../../modules/nf-core/bwa/index/main' -include { BWAMEM2_INDEX } from '../../../modules/nf-core/bwamem2/index/main' -include { DRAGMAP_HASHTABLE } from '../../../modules/nf-core/dragmap/hashtable/main' -include { GATK4_CREATESEQUENCEDICTIONARY } from '../../../modules/nf-core/gatk4/createsequencedictionary/main' -include { MSISENSORPRO_SCAN } from '../../../modules/nf-core/msisensorpro/scan/main' -include { SAMTOOLS_FAIDX } from '../../../modules/nf-core/samtools/faidx/main' -include { TABIX_TABIX as TABIX_DBSNP } from '../../../modules/nf-core/tabix/tabix/main' -include { TABIX_TABIX as TABIX_GERMLINE_RESOURCE } from '../../../modules/nf-core/tabix/tabix/main' -include { TABIX_TABIX as TABIX_KNOWN_INDELS } from '../../../modules/nf-core/tabix/tabix/main' -include { TABIX_TABIX as TABIX_KNOWN_SNPS } from '../../../modules/nf-core/tabix/tabix/main' -include { TABIX_TABIX as TABIX_PON } from '../../../modules/nf-core/tabix/tabix/main' -include { UNTAR as UNTAR_CHR_DIR } from '../../../modules/nf-core/untar/main' -include { UNZIP as UNZIP_ALLELES } from '../../../modules/nf-core/unzip/main' -include { UNZIP as UNZIP_GC } from '../../../modules/nf-core/unzip/main' -include { UNZIP as UNZIP_LOCI } from '../../../modules/nf-core/unzip/main' -include { UNZIP as UNZIP_RT } from '../../../modules/nf-core/unzip/main' +include { BWA_INDEX as BWAMEM1_INDEX } from '../../../modules/nf-core/bwa/index/main' +include { BWAMEM2_INDEX } from '../../../modules/nf-core/bwamem2/index/main' +include { DRAGMAP_HASHTABLE } from '../../../modules/nf-core/dragmap/hashtable/main' +include { GATK4_CREATESEQUENCEDICTIONARY } from '../../../modules/nf-core/gatk4/createsequencedictionary/main' +include { MSISENSORPRO_SCAN } from '../../../modules/nf-core/msisensorpro/scan/main' +include { SAMTOOLS_FAIDX } from '../../../modules/nf-core/samtools/faidx/main' +include { TABIX_TABIX as TABIX_BCFTOOLS_ANNOTATIONS } from '../../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_DBSNP } from '../../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_GERMLINE_RESOURCE } from '../../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_KNOWN_INDELS } from '../../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_KNOWN_SNPS } from '../../../modules/nf-core/tabix/tabix/main' +include { TABIX_TABIX as TABIX_PON } from '../../../modules/nf-core/tabix/tabix/main' +include { UNTAR as UNTAR_CHR_DIR } from '../../../modules/nf-core/untar/main' +include { UNZIP as UNZIP_ALLELES } from '../../../modules/nf-core/unzip/main' +include { UNZIP as UNZIP_GC } from '../../../modules/nf-core/unzip/main' +include { UNZIP as UNZIP_LOCI } from '../../../modules/nf-core/unzip/main' +include { UNZIP as UNZIP_RT } from '../../../modules/nf-core/unzip/main' workflow PREPARE_GENOME { take: - ascat_alleles // channel: [optional] ascat allele files - ascat_loci // channel: [optional] ascat loci files - ascat_loci_gc // channel: [optional] ascat gc content file - ascat_loci_rt // channel: [optional] ascat replictiming file - chr_dir // channel: [optional] chromosome files - dbsnp // channel: [optional] dbsnp - fasta // channel: [mandatory] fasta - fasta_fai // channel: [optional] fasta_fai - germline_resource // channel: [optional] germline_resource - known_indels // channel: [optional] known_indels - known_snps // channel: [optional] known_snps - pon // channel: [optional] pon + ascat_alleles // channel: [optional] ascat allele files + ascat_loci // channel: [optional] ascat loci files + ascat_loci_gc // channel: [optional] ascat gc content file + ascat_loci_rt // channel: [optional] ascat replictiming file + bcftools_annotations // channel: [optional] bcftools annotations file + chr_dir // channel: [optional] chromosome files + dbsnp // channel: [optional] dbsnp + fasta // channel: [mandatory] fasta + fasta_fai // channel: [optional] fasta_fai + germline_resource // channel: [optional] germline_resource + known_indels // channel: [optional] known_indels + known_snps // channel: [optional] known_snps + pon // channel: [optional] pon main: @@ -57,6 +59,7 @@ workflow PREPARE_GENOME { // written for KNOWN_INDELS, but preemptively applied to the rest // [ file1, file2 ] becomes [ [ meta1, file1 ], [ meta2, file2 ] ] // outputs are collected to maintain a single channel for relevant TBI files + TABIX_BCFTOOLS_ANNOTATIONS(bcftools_annotations.flatten().map{ it -> [ [ id:it.baseName ], it ] }) TABIX_DBSNP(dbsnp.flatten().map{ it -> [ [ id:it.baseName ], it ] }) TABIX_GERMLINE_RESOURCE(germline_resource.flatten().map{ it -> [ [ id:it.baseName ], it ] }) TABIX_KNOWN_SNPS(known_snps.flatten().map{ it -> [ [ id:it.baseName ], it ] } ) @@ -105,6 +108,7 @@ workflow PREPARE_GENOME { versions = versions.mix(DRAGMAP_HASHTABLE.out.versions) versions = versions.mix(GATK4_CREATESEQUENCEDICTIONARY.out.versions) versions = versions.mix(MSISENSORPRO_SCAN.out.versions) + versions = versions.mix(TABIX_BCFTOOLS_ANNOTATIONS.out.versions) versions = versions.mix(TABIX_DBSNP.out.versions) versions = versions.mix(TABIX_GERMLINE_RESOURCE.out.versions) versions = versions.mix(TABIX_KNOWN_SNPS.out.versions) @@ -112,17 +116,18 @@ workflow PREPARE_GENOME { versions = versions.mix(TABIX_PON.out.versions) emit: - bwa = BWAMEM1_INDEX.out.index.map{ meta, index -> [index] }.collect() // path: bwa/* - bwamem2 = BWAMEM2_INDEX.out.index.map{ meta, index -> [index] }.collect() // path: bwamem2/* - hashtable = DRAGMAP_HASHTABLE.out.hashmap.map{ meta, index -> [index] }.collect() // path: dragmap/* - dbsnp_tbi = TABIX_DBSNP.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: dbsnb.vcf.gz.tbi - dict = GATK4_CREATESEQUENCEDICTIONARY.out.dict // path: genome.fasta.dict - fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] } // path: genome.fasta.fai - germline_resource_tbi = TABIX_GERMLINE_RESOURCE.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: germline_resource.vcf.gz.tbi - known_snps_tbi = TABIX_KNOWN_SNPS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: {known_indels*}.vcf.gz.tbi - known_indels_tbi = TABIX_KNOWN_INDELS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: {known_indels*}.vcf.gz.tbi - msisensorpro_scan = MSISENSORPRO_SCAN.out.list.map{ meta, list -> [list] } // path: genome_msi.list - pon_tbi = TABIX_PON.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: pon.vcf.gz.tbi + bcftools_annotations = TABIX_BCFTOOLS_ANNOTATIONS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // bcftools_annotations.vcf.gz.tbi + bwa = BWAMEM1_INDEX.out.index.map{ meta, index -> [index] }.collect() // path: bwa/* + bwamem2 = BWAMEM2_INDEX.out.index.map{ meta, index -> [index] }.collect() // path: bwamem2/* + hashtable = DRAGMAP_HASHTABLE.out.hashmap.map{ meta, index -> [index] }.collect() // path: dragmap/* + dbsnp_tbi = TABIX_DBSNP.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: dbsnb.vcf.gz.tbi + dict = GATK4_CREATESEQUENCEDICTIONARY.out.dict // path: genome.fasta.dict + fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] } // path: genome.fasta.fai + germline_resource_tbi = TABIX_GERMLINE_RESOURCE.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: germline_resource.vcf.gz.tbi + known_snps_tbi = TABIX_KNOWN_SNPS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: {known_indels*}.vcf.gz.tbi + known_indels_tbi = TABIX_KNOWN_INDELS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: {known_indels*}.vcf.gz.tbi + msisensorpro_scan = MSISENSORPRO_SCAN.out.list.map{ meta, list -> [list] } // path: genome_msi.list + pon_tbi = TABIX_PON.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: pon.vcf.gz.tbi allele_files chr_files gc_file diff --git a/subworkflows/local/samplesheet_to_channel/main.nf b/subworkflows/local/samplesheet_to_channel/main.nf index d674fa1dcd..6784b4616b 100644 --- a/subworkflows/local/samplesheet_to_channel/main.nf +++ b/subworkflows/local/samplesheet_to_channel/main.nf @@ -252,8 +252,8 @@ workflow SAMPLESHEET_TO_CHANNEL{ } // Fails when bcftools annotate is used but no files are supplied - if (params.tools && params.tools.split(',').contains('bcfann') && !(params.bcftools_annotations && params.bcftools_annotations_index && params.bcftools_header_lines)) { - error("Please specify --bcftools_annotations, --bcftools_annotations_index, and --bcftools_header_lines, when using BCFTools annotations") + if (params.tools && params.tools.split(',').contains('bcfann') && !(params.bcftools_annotations && params.bcftools_annotations_tbi && params.bcftools_header_lines)) { + error("Please specify --bcftools_annotations, --bcftools_annotations_tbi, and --bcftools_header_lines, when using BCFTools annotations") } emit: diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 99ecd733fc..5b0a9dcde9 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -28,7 +28,7 @@ def checkPathParamList = [ params.bwa, params.bwamem2, params.bcftools_annotations, - params.bcftools_annotations_index, + params.bcftools_annotations_tbi, params.bcftools_header_lines, params.cf_chrom_len, params.chr_dir, @@ -87,6 +87,8 @@ ascat_alleles = params.ascat_alleles ? Channel.fromPath(para ascat_loci = params.ascat_loci ? Channel.fromPath(params.ascat_loci).collect() : Channel.empty() ascat_loci_gc = params.ascat_loci_gc ? Channel.fromPath(params.ascat_loci_gc).collect() : Channel.value([]) ascat_loci_rt = params.ascat_loci_rt ? Channel.fromPath(params.ascat_loci_rt).collect() : Channel.value([]) +bcftools_annotations = params.bcftools_annotations ? Channel.fromPath(params.bcftools_annotations).collect() : Channel.empty() +bcftools_header_lines = params.bcftools_header_lines ? Channel.fromPath(params.bcftools_header_lines).collect() : Channel.empty() cf_chrom_len = params.cf_chrom_len ? Channel.fromPath(params.cf_chrom_len).collect() : [] chr_dir = params.chr_dir ? Channel.fromPath(params.chr_dir).collect() : Channel.value([]) dbsnp = params.dbsnp ? Channel.fromPath(params.dbsnp).collect() : Channel.value([]) @@ -100,18 +102,16 @@ pon = params.pon ? Channel.fromPath(para sentieon_dnascope_model = params.sentieon_dnascope_model ? Channel.fromPath(params.sentieon_dnascope_model).collect() : Channel.value([]) // Initialize value channels based on params, defined in the params.genomes[params.genome] scope -ascat_genome = params.ascat_genome ?: Channel.empty() -dbsnp_vqsr = params.dbsnp_vqsr ? Channel.value(params.dbsnp_vqsr) : Channel.empty() -known_indels_vqsr = params.known_indels_vqsr ? Channel.value(params.known_indels_vqsr) : Channel.empty() -known_snps_vqsr = params.known_snps_vqsr ? Channel.value(params.known_snps_vqsr) : Channel.empty() -ngscheckmate_bed = params.ngscheckmate_bed ? Channel.value(params.ngscheckmate_bed) : Channel.empty() -snpeff_db = params.snpeff_db ?: Channel.empty() -vep_cache_version = params.vep_cache_version ?: Channel.empty() -vep_genome = params.vep_genome ?: Channel.empty() -vep_species = params.vep_species ?: Channel.empty() -bcftools_annotations = params.bcftools_annotations ?: Channel.empty() -bcftools_annotations_index = params.bcftools_annotations_index ?: Channel.empty() -bcftools_header_lines = params.bcftools_header_lines ?: Channel.empty() +ascat_genome = params.ascat_genome ?: Channel.empty() +dbsnp_vqsr = params.dbsnp_vqsr ? Channel.value(params.dbsnp_vqsr) : Channel.empty() +known_indels_vqsr = params.known_indels_vqsr ? Channel.value(params.known_indels_vqsr) : Channel.empty() +known_snps_vqsr = params.known_snps_vqsr ? Channel.value(params.known_snps_vqsr) : Channel.empty() +ngscheckmate_bed = params.ngscheckmate_bed ? Channel.value(params.ngscheckmate_bed) : Channel.empty() +snpeff_db = params.snpeff_db ?: Channel.empty() +vep_cache_version = params.vep_cache_version ?: Channel.empty() +vep_genome = params.vep_genome ?: Channel.empty() +vep_species = params.vep_species ?: Channel.empty() + vep_extra_files = [] @@ -287,6 +287,7 @@ workflow SAREK { ascat_loci, ascat_loci_gc, ascat_loci_rt, + bcftools_annotations, chr_dir, dbsnp, fasta, @@ -325,11 +326,12 @@ workflow SAREK { rt_file = PREPARE_GENOME.out.rt_file // Tabix indexed vcf files: - dbsnp_tbi = params.dbsnp ? params.dbsnp_tbi ? Channel.fromPath(params.dbsnp_tbi).collect() : PREPARE_GENOME.out.dbsnp_tbi : Channel.value([]) - germline_resource_tbi = params.germline_resource ? params.germline_resource_tbi ? Channel.fromPath(params.germline_resource_tbi).collect() : PREPARE_GENOME.out.germline_resource_tbi : [] //do not change to Channel.value([]), the check for its existence then fails for Getpileupsumamries - known_indels_tbi = params.known_indels ? params.known_indels_tbi ? Channel.fromPath(params.known_indels_tbi).collect() : PREPARE_GENOME.out.known_indels_tbi : Channel.value([]) - known_snps_tbi = params.known_snps ? params.known_snps_tbi ? Channel.fromPath(params.known_snps_tbi).collect() : PREPARE_GENOME.out.known_snps_tbi : Channel.value([]) - pon_tbi = params.pon ? params.pon_tbi ? Channel.fromPath(params.pon_tbi).collect() : PREPARE_GENOME.out.pon_tbi : Channel.value([]) + bcftools_annotations_tbi = params.bcftools_annotations ? params.bcftools_annotations_tbi ? Channel.fromPath(params.bcftools_annotations_tbi).collect() : PREPARE_GENOME.out.bcftools_annotations_tbi : Channel.empty([]) + dbsnp_tbi = params.dbsnp ? params.dbsnp_tbi ? Channel.fromPath(params.dbsnp_tbi).collect() : PREPARE_GENOME.out.dbsnp_tbi : Channel.value([]) + germline_resource_tbi = params.germline_resource ? params.germline_resource_tbi ? Channel.fromPath(params.germline_resource_tbi).collect() : PREPARE_GENOME.out.germline_resource_tbi : [] //do not change to Channel.value([]), the check for its existence then fails for Getpileupsumamries + known_indels_tbi = params.known_indels ? params.known_indels_tbi ? Channel.fromPath(params.known_indels_tbi).collect() : PREPARE_GENOME.out.known_indels_tbi : Channel.value([]) + known_snps_tbi = params.known_snps ? params.known_snps_tbi ? Channel.fromPath(params.known_snps_tbi).collect() : PREPARE_GENOME.out.known_snps_tbi : Channel.value([]) + pon_tbi = params.pon ? params.pon_tbi ? Channel.fromPath(params.pon_tbi).collect() : PREPARE_GENOME.out.pon_tbi : Channel.value([]) // known_sites is made by grouping both the dbsnp and the known snps/indels resources // Which can either or both be optional @@ -1057,7 +1059,7 @@ workflow SAREK { vep_cache, vep_extra_files, bcftools_annotations, - bcftools_annotations_index, + bcftools_annotations_tbi, bcftools_header_lines) // Gather used softwares versions From 9771cfb9cffbae37e1121347b10af6a710ec22f3 Mon Sep 17 00:00:00 2001 From: Rike Date: Fri, 17 Nov 2023 16:26:36 +0100 Subject: [PATCH 070/545] fix naming, add config --- conf/modules/prepare_genome.config | 10 ++++++++++ subworkflows/local/prepare_genome/main.nf | 24 +++++++++++------------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/conf/modules/prepare_genome.config b/conf/modules/prepare_genome.config index 241c164e7e..e948e1eea5 100644 --- a/conf/modules/prepare_genome.config +++ b/conf/modules/prepare_genome.config @@ -96,6 +96,16 @@ process { ] } + withName: 'TABIX_BCFTOOLS_ANNOTATIONS' { + ext.when = { !params.bcftools_annotations_tbi && params.bcftools_annotations && params.tools && params.tools.split(',').contains('bcfann') } + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/reference/bcfann" }, + pattern: "*vcf.gz.tbi", + saveAs: { params.save_reference || params.build_only_index ? it : null } + ] + } + withName: 'TABIX_DBSNP' { ext.when = { !params.dbsnp_tbi && params.dbsnp && ((params.step == "mapping" || params.step == "markduplicates" || params.step == "prepare_recalibration") || params.tools && (params.tools.split(',').contains('controlfreec') || params.tools.split(',').contains('haplotypecaller') || params.tools.split(',').contains('sentieon_haplotyper') || params.tools.split(',').contains('sentieon_dnascope') || params.tools.split(',').contains('mutect2'))) } publishDir = [ diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 4582c6dd74..f9b9e62c95 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -116,18 +116,18 @@ workflow PREPARE_GENOME { versions = versions.mix(TABIX_PON.out.versions) emit: - bcftools_annotations = TABIX_BCFTOOLS_ANNOTATIONS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // bcftools_annotations.vcf.gz.tbi - bwa = BWAMEM1_INDEX.out.index.map{ meta, index -> [index] }.collect() // path: bwa/* - bwamem2 = BWAMEM2_INDEX.out.index.map{ meta, index -> [index] }.collect() // path: bwamem2/* - hashtable = DRAGMAP_HASHTABLE.out.hashmap.map{ meta, index -> [index] }.collect() // path: dragmap/* - dbsnp_tbi = TABIX_DBSNP.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: dbsnb.vcf.gz.tbi - dict = GATK4_CREATESEQUENCEDICTIONARY.out.dict // path: genome.fasta.dict - fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] } // path: genome.fasta.fai - germline_resource_tbi = TABIX_GERMLINE_RESOURCE.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: germline_resource.vcf.gz.tbi - known_snps_tbi = TABIX_KNOWN_SNPS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: {known_indels*}.vcf.gz.tbi - known_indels_tbi = TABIX_KNOWN_INDELS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: {known_indels*}.vcf.gz.tbi - msisensorpro_scan = MSISENSORPRO_SCAN.out.list.map{ meta, list -> [list] } // path: genome_msi.list - pon_tbi = TABIX_PON.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: pon.vcf.gz.tbi + bcftools_annotations_tbi = TABIX_BCFTOOLS_ANNOTATIONS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // bcftools_annotations.vcf.gz.tbi + bwa = BWAMEM1_INDEX.out.index.map{ meta, index -> [index] }.collect() // path: bwa/* + bwamem2 = BWAMEM2_INDEX.out.index.map{ meta, index -> [index] }.collect() // path: bwamem2/* + hashtable = DRAGMAP_HASHTABLE.out.hashmap.map{ meta, index -> [index] }.collect() // path: dragmap/* + dbsnp_tbi = TABIX_DBSNP.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: dbsnb.vcf.gz.tbi + dict = GATK4_CREATESEQUENCEDICTIONARY.out.dict // path: genome.fasta.dict + fasta_fai = SAMTOOLS_FAIDX.out.fai.map{ meta, fai -> [fai] } // path: genome.fasta.fai + germline_resource_tbi = TABIX_GERMLINE_RESOURCE.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: germline_resource.vcf.gz.tbi + known_snps_tbi = TABIX_KNOWN_SNPS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: {known_indels*}.vcf.gz.tbi + known_indels_tbi = TABIX_KNOWN_INDELS.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: {known_indels*}.vcf.gz.tbi + msisensorpro_scan = MSISENSORPRO_SCAN.out.list.map{ meta, list -> [list] } // path: genome_msi.list + pon_tbi = TABIX_PON.out.tbi.map{ meta, tbi -> [tbi] }.collect() // path: pon.vcf.gz.tbi allele_files chr_files gc_file From d978945b701d7270de85f08fdd12429da3d861c7 Mon Sep 17 00:00:00 2001 From: Rike Date: Mon, 20 Nov 2023 08:39:27 +0100 Subject: [PATCH 071/545] add parameter change to CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index abdd2166ef..2eaf71de06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | script | Old name | New name | | ------ | -------- | -------- | +### Parameter + +| Old name | New name | +| -------------------------- | ----------------------- | +| bcftools_annotations_index | bcftools_annotations_tbi| + ## [3.4.0](https://github.com/nf-core/sarek/releases/tag/3.4.0) - Pårtetjåkko Pårtetjåkko is a mountain in the south of the park. From c3b4e3be9854b3379260657b5413b1ff1313ea65 Mon Sep 17 00:00:00 2001 From: Rike Date: Mon, 20 Nov 2023 08:40:22 +0100 Subject: [PATCH 072/545] Describe changes in more detail --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2eaf71de06..16ee03603a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - [#1333](https://github.com/nf-core/sarek/pull/1333) - Back to dev +- [#1335](https://github.com/nf-core/sarek/pull/1335) - Add index computation of `bcftools_annotations`, if not provided ### Changed From fa45aaba33bae398e6d66670fd90150c92718d02 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Mon, 20 Nov 2023 07:44:54 +0000 Subject: [PATCH 073/545] [automated] Fix linting with Prettier --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16ee03603a..a2918e702c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,9 +33,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Parameter -| Old name | New name | -| -------------------------- | ----------------------- | -| bcftools_annotations_index | bcftools_annotations_tbi| +| Old name | New name | +| -------------------------- | ------------------------ | +| bcftools_annotations_index | bcftools_annotations_tbi | ## [3.4.0](https://github.com/nf-core/sarek/releases/tag/3.4.0) - Pårtetjåkko From 005953ef9631cd5a5a290bc77022cad66b6a64a1 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 20 Nov 2023 07:51:43 +0000 Subject: [PATCH 074/545] file path incorrect for variantcalling --- .github/workflows/upload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 96d0a8958e..c0e218fa09 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -8,7 +8,7 @@ url = f"https://sandbox.zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" -path = "../../variant_calling/%s" % filename +path = "./variant_calling/%s" % filename with open(path, "rb") as fp: r = requests.post( From 71a4352125ae727b51f790baf3ca20d8040edefd Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 20 Nov 2023 07:55:24 +0000 Subject: [PATCH 075/545] file path incorrect for variantcalling --- .github/workflows/upload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index c0e218fa09..d58f1ea59c 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -8,7 +8,7 @@ url = f"https://sandbox.zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" -path = "./variant_calling/%s" % filename +path = "../../../variant_calling/%s" % filename with open(path, "rb") as fp: r = requests.post( From 26c70d251b348615a34cad78614839e037714fbc Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 20 Nov 2023 07:58:14 +0000 Subject: [PATCH 076/545] file path incorrect for variantcalling --- .github/workflows/upload.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index d58f1ea59c..fc57487c05 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -3,12 +3,13 @@ headers = {"Content-Type": "application/json"} access_token = os.environ["ACCESS_TOKEN"] +workspace_directory = os.environ["GITHUB_WORKSPACE"] # TODO: replace sandbox link https://zenodo.org/api/deposit/depositions url = f"https://sandbox.zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" -path = "../../../variant_calling/%s" % filename +path = "{workspace_directory}/variant_calling/%s" % filename with open(path, "rb") as fp: r = requests.post( From 70e26bbefb6932d5bbc2f127e396b260e440d810 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 20 Nov 2023 07:59:24 +0000 Subject: [PATCH 077/545] file path incorrect for variantcalling --- .github/workflows/upload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index fc57487c05..9f47cda03f 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -9,7 +9,7 @@ url = f"https://sandbox.zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" -path = "{workspace_directory}/variant_calling/%s" % filename +path = "../../../../variant_calling/%s" % filename with open(path, "rb") as fp: r = requests.post( From d735a421139045666146a6a5e2d3413533b4cbf0 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 20 Nov 2023 08:05:32 +0000 Subject: [PATCH 078/545] file path incorrect for variantcalling --- .github/workflows/upload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 9f47cda03f..bc91329d0a 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -9,7 +9,7 @@ url = f"https://sandbox.zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" -path = "../../../../variant_calling/%s" % filename +path = "../../../variant_calling/%s" % filename with open(path, "rb") as fp: r = requests.post( From 5dbcb5bc18c8b2da7cea561c7712c55827c07b22 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Thu, 23 Nov 2023 22:42:15 +0000 Subject: [PATCH 079/545] Updating sentieon-modules --- modules.json | 16 ++++----- .../sentieon/applyvarcal/environment.yml | 2 ++ modules/nf-core/sentieon/applyvarcal/main.nf | 31 +++++++++++++---- .../nf-core/sentieon/bwamem/environment.yml | 2 ++ modules/nf-core/sentieon/bwamem/main.nf | 29 +++++++++++++--- .../nf-core/sentieon/dedup/environment.yml | 2 ++ modules/nf-core/sentieon/dedup/main.nf | 29 +++++++++++++--- .../sentieon/dnamodelapply/environment.yml | 2 ++ .../nf-core/sentieon/dnamodelapply/main.nf | 34 ++++++++++++++----- .../nf-core/sentieon/dnascope/environment.yml | 2 ++ modules/nf-core/sentieon/dnascope/main.nf | 34 ++++++++++++++----- .../sentieon/gvcftyper/environment.yml | 2 ++ modules/nf-core/sentieon/gvcftyper/main.nf | 31 +++++++++++++---- .../sentieon/haplotyper/environment.yml | 2 ++ modules/nf-core/sentieon/haplotyper/main.nf | 29 +++++++++++++--- .../nf-core/sentieon/varcal/environment.yml | 2 ++ modules/nf-core/sentieon/varcal/main.nf | 31 +++++++++++++---- 17 files changed, 223 insertions(+), 57 deletions(-) diff --git a/modules.json b/modules.json index dd5387fbb8..93e8ba3812 100644 --- a/modules.json +++ b/modules.json @@ -391,42 +391,42 @@ }, "sentieon/applyvarcal": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "89b6873f15dd31ed17f4d10ede2fa623e2a128ff", "installed_by": ["modules"] }, "sentieon/bwamem": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "89b6873f15dd31ed17f4d10ede2fa623e2a128ff", "installed_by": ["modules"] }, "sentieon/dedup": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "89b6873f15dd31ed17f4d10ede2fa623e2a128ff", "installed_by": ["modules"] }, "sentieon/dnamodelapply": { "branch": "master", - "git_sha": "214d575774c172062924ad3564b4f66655600730", + "git_sha": "89b6873f15dd31ed17f4d10ede2fa623e2a128ff", "installed_by": ["modules"] }, "sentieon/dnascope": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "89b6873f15dd31ed17f4d10ede2fa623e2a128ff", "installed_by": ["modules"] }, "sentieon/gvcftyper": { "branch": "master", - "git_sha": "214d575774c172062924ad3564b4f66655600730", + "git_sha": "89b6873f15dd31ed17f4d10ede2fa623e2a128ff", "installed_by": ["modules"] }, "sentieon/haplotyper": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "89b6873f15dd31ed17f4d10ede2fa623e2a128ff", "installed_by": ["modules"] }, "sentieon/varcal": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "89b6873f15dd31ed17f4d10ede2fa623e2a128ff", "installed_by": ["modules"] }, "snpeff/download": { diff --git a/modules/nf-core/sentieon/applyvarcal/environment.yml b/modules/nf-core/sentieon/applyvarcal/environment.yml index b7b5169a89..c4c11b1f85 100644 --- a/modules/nf-core/sentieon/applyvarcal/environment.yml +++ b/modules/nf-core/sentieon/applyvarcal/environment.yml @@ -3,3 +3,5 @@ channels: - conda-forge - bioconda - defaults +dependencies: + - bioconda::sentieon=202308.01 diff --git a/modules/nf-core/sentieon/applyvarcal/main.nf b/modules/nf-core/sentieon/applyvarcal/main.nf index 4e63b94ce4..304d0a0431 100644 --- a/modules/nf-core/sentieon/applyvarcal/main.nf +++ b/modules/nf-core/sentieon/applyvarcal/main.nf @@ -5,7 +5,10 @@ process SENTIEON_APPLYVARCAL { secret 'SENTIEON_LICENSE_BASE64' - container 'nf-core/sentieon:202112.06' + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sentieon:202308.01--h43eeafb_0' : + 'biocontainers/sentieon:202308.01--h43eeafb_0' }" input: tuple val(meta), path(vcf), path(vcf_tbi), path(recal), path(recal_index), path(tranches) @@ -21,10 +24,15 @@ process SENTIEON_APPLYVARCAL { task.ext.when == null || task.ext.when script: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def sentieon_auth_mech_base64 = task.ext.sentieon_auth_mech_base64 ?: '' @@ -47,6 +55,8 @@ process SENTIEON_APPLYVARCAL { echo "Decoded and exported Sentieon test-license system environment variables" fi + $fix_ld_library_path + sentieon driver -r ${fasta} --algo ApplyVarCal \\ -v $vcf \\ --recal $recal \\ @@ -61,12 +71,19 @@ process SENTIEON_APPLYVARCAL { """ stub: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def prefix = task.ext.prefix ?: "${meta.id}" """ + $fix_ld_library_path + touch ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi diff --git a/modules/nf-core/sentieon/bwamem/environment.yml b/modules/nf-core/sentieon/bwamem/environment.yml index efd460cfa4..c090bfa5ae 100644 --- a/modules/nf-core/sentieon/bwamem/environment.yml +++ b/modules/nf-core/sentieon/bwamem/environment.yml @@ -3,3 +3,5 @@ channels: - conda-forge - bioconda - defaults +dependencies: + - bioconda::sentieon=202308.01 diff --git a/modules/nf-core/sentieon/bwamem/main.nf b/modules/nf-core/sentieon/bwamem/main.nf index b58835fda5..e25515e7eb 100644 --- a/modules/nf-core/sentieon/bwamem/main.nf +++ b/modules/nf-core/sentieon/bwamem/main.nf @@ -5,7 +5,10 @@ process SENTIEON_BWAMEM { secret 'SENTIEON_LICENSE_BASE64' - container 'nf-core/sentieon:202112.06' + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sentieon:202308.01--h43eeafb_0' : + 'biocontainers/sentieon:202308.01--h43eeafb_0' }" input: tuple val(meta), path(reads) @@ -21,10 +24,15 @@ process SENTIEON_BWAMEM { task.ext.when == null || task.ext.when script: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def sentieon_auth_mech_base64 = task.ext.sentieon_auth_mech_base64 ?: '' @@ -47,6 +55,8 @@ process SENTIEON_BWAMEM { echo "Decoded and exported Sentieon test-license system environment variables" fi + $fix_ld_library_path + INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` sentieon bwa mem \\ @@ -64,8 +74,19 @@ process SENTIEON_BWAMEM { """ stub: + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' + } + def prefix = task.ext.prefix ?: "${meta.id}" """ + $fix_ld_library_path + touch ${prefix}.bam touch ${prefix}.bam.bai diff --git a/modules/nf-core/sentieon/dedup/environment.yml b/modules/nf-core/sentieon/dedup/environment.yml index bda2b1385a..622cf73909 100644 --- a/modules/nf-core/sentieon/dedup/environment.yml +++ b/modules/nf-core/sentieon/dedup/environment.yml @@ -3,3 +3,5 @@ channels: - conda-forge - bioconda - defaults +dependencies: + - bioconda::sentieon=202308.01 diff --git a/modules/nf-core/sentieon/dedup/main.nf b/modules/nf-core/sentieon/dedup/main.nf index c83d5e552a..01ee885a17 100644 --- a/modules/nf-core/sentieon/dedup/main.nf +++ b/modules/nf-core/sentieon/dedup/main.nf @@ -5,7 +5,10 @@ process SENTIEON_DEDUP { secret 'SENTIEON_LICENSE_BASE64' - container 'nf-core/sentieon:202112.06' + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sentieon:202308.01--h43eeafb_0' : + 'biocontainers/sentieon:202308.01--h43eeafb_0' }" input: tuple val(meta), path(bam), path(bai) @@ -26,10 +29,15 @@ process SENTIEON_DEDUP { task.ext.when == null || task.ext.when script: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def args3 = task.ext.args3 ?: '' @@ -58,6 +66,8 @@ process SENTIEON_DEDUP { echo "Decoded and exported Sentieon test-license system environment variables" fi + $fix_ld_library_path + sentieon driver $args $input_list -r ${fasta} --algo LocusCollector $args2 --fun score_info ${prefix}.score sentieon driver $args3 -t $task.cpus $input_list -r ${fasta} --algo Dedup $args4 --score_info ${prefix}.score --metrics ${metrics} ${prefix}${suffix} # This following tsv-file is produced in order to get a proper tsv-file with Dedup-metrics for importing in MultiQC as "custom content". @@ -71,8 +81,19 @@ process SENTIEON_DEDUP { """ stub: + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' + } + def prefix = task.ext.prefix ?: "${meta.id}" """ + $fix_ld_library_path + touch ${prefix}.cram touch ${prefix}.cram.crai touch ${prefix}.metrics diff --git a/modules/nf-core/sentieon/dnamodelapply/environment.yml b/modules/nf-core/sentieon/dnamodelapply/environment.yml index 3f92a79ab8..6d27d44a1d 100644 --- a/modules/nf-core/sentieon/dnamodelapply/environment.yml +++ b/modules/nf-core/sentieon/dnamodelapply/environment.yml @@ -3,3 +3,5 @@ channels: - conda-forge - bioconda - defaults +dependencies: + - bioconda::sentieon=202308.01 diff --git a/modules/nf-core/sentieon/dnamodelapply/main.nf b/modules/nf-core/sentieon/dnamodelapply/main.nf index 3fe9a28f19..1cbb02e3b3 100644 --- a/modules/nf-core/sentieon/dnamodelapply/main.nf +++ b/modules/nf-core/sentieon/dnamodelapply/main.nf @@ -5,7 +5,10 @@ process SENTIEON_DNAMODELAPPLY { secret 'SENTIEON_LICENSE_BASE64' - container 'nf-core/sentieon:202112.06' + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sentieon:202308.01--h43eeafb_0' : + 'biocontainers/sentieon:202308.01--h43eeafb_0' }" input: tuple val(meta), path(vcf), path(idx) @@ -22,10 +25,15 @@ process SENTIEON_DNAMODELAPPLY { task.ext.when == null || task.ext.when script: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def sentieon_auth_mech_base64 = task.ext.sentieon_auth_mech_base64 ?: '' @@ -48,6 +56,8 @@ process SENTIEON_DNAMODELAPPLY { echo "Decoded and exported Sentieon test-license system environment variables" fi + $fix_ld_library_path + sentieon driver \\ -t $task.cpus \\ -r $fasta \\ @@ -64,12 +74,20 @@ process SENTIEON_DNAMODELAPPLY { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + + def prefix = task.ext.prefix ?: "${meta.id}" + """ + $fix_ld_library_path + touch ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi diff --git a/modules/nf-core/sentieon/dnascope/environment.yml b/modules/nf-core/sentieon/dnascope/environment.yml index 2c5b4937bf..45c2116c04 100644 --- a/modules/nf-core/sentieon/dnascope/environment.yml +++ b/modules/nf-core/sentieon/dnascope/environment.yml @@ -3,3 +3,5 @@ channels: - conda-forge - bioconda - defaults +dependencies: + - bioconda::sentieon=202308.01 diff --git a/modules/nf-core/sentieon/dnascope/main.nf b/modules/nf-core/sentieon/dnascope/main.nf index 6be42a1728..7e5adefc7c 100644 --- a/modules/nf-core/sentieon/dnascope/main.nf +++ b/modules/nf-core/sentieon/dnascope/main.nf @@ -5,7 +5,10 @@ process SENTIEON_DNASCOPE { secret 'SENTIEON_LICENSE_BASE64' - container 'nf-core/sentieon:202112.06' + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sentieon:202308.01--h43eeafb_0' : + 'biocontainers/sentieon:202308.01--h43eeafb_0' }" input: tuple val(meta), path(bam), path(bai), path(intervals) @@ -29,10 +32,15 @@ process SENTIEON_DNASCOPE { task.ext.when == null || task.ext.when script: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def args = task.ext.args ?: '' // options for the driver def args2 = task.ext.args2 ?: '' // options for the vcf generation def args3 = task.ext.args3 ?: '' // options for the gvcf generation @@ -72,6 +80,8 @@ process SENTIEON_DNASCOPE { echo "Decoded and exported Sentieon test-license system environment variables" fi + $fix_ld_library_path + sentieon driver $args -r $fasta -t $task.cpus -i $bam $interval $vcf_cmd $gvcf_cmd cat <<-END_VERSIONS > versions.yml @@ -81,12 +91,20 @@ process SENTIEON_DNASCOPE { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + + def prefix = task.ext.prefix ?: "${meta.id}" + """ + $fix_ld_library_path + touch ${prefix}.unfiltered.vcf.gz touch ${prefix}.unfiltered.vcf.gz.tbi touch ${prefix}.g.vcf.gz diff --git a/modules/nf-core/sentieon/gvcftyper/environment.yml b/modules/nf-core/sentieon/gvcftyper/environment.yml index 5af2aaa8e8..9a8143068a 100644 --- a/modules/nf-core/sentieon/gvcftyper/environment.yml +++ b/modules/nf-core/sentieon/gvcftyper/environment.yml @@ -3,3 +3,5 @@ channels: - conda-forge - bioconda - defaults +dependencies: + - bioconda::sentieon=202308.01 diff --git a/modules/nf-core/sentieon/gvcftyper/main.nf b/modules/nf-core/sentieon/gvcftyper/main.nf index 134faa6835..d2be759fe3 100644 --- a/modules/nf-core/sentieon/gvcftyper/main.nf +++ b/modules/nf-core/sentieon/gvcftyper/main.nf @@ -5,7 +5,10 @@ process SENTIEON_GVCFTYPER { secret 'SENTIEON_LICENSE_BASE64' - container 'nf-core/sentieon:202112.06' + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sentieon:202308.01--h43eeafb_0' : + 'biocontainers/sentieon:202308.01--h43eeafb_0' }" input: tuple val(meta), path(gvcfs), path(tbis), path(intervals) @@ -23,10 +26,15 @@ process SENTIEON_GVCFTYPER { task.ext.when == null || task.ext.when script: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def prefix = task.ext.prefix ?: "${meta.id}" def sentieon_auth_mech_base64 = task.ext.sentieon_auth_mech_base64 ?: '' def sentieon_auth_data_base64 = task.ext.sentieon_auth_data_base64 ?: '' @@ -50,6 +58,8 @@ process SENTIEON_GVCFTYPER { echo "Decoded and exported Sentieon test-license system environment variables" fi + $fix_ld_library_path + sentieon driver -r ${fasta} --algo GVCFtyper ${gvcfs_input} ${dbsnp_cmd} ${prefix}.vcf.gz cat <<-END_VERSIONS > versions.yml @@ -59,13 +69,20 @@ process SENTIEON_GVCFTYPER { """ stub: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def prefix = task.ext.prefix ?: "${meta.id}" """ + $fix_ld_library_path + touch ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi diff --git a/modules/nf-core/sentieon/haplotyper/environment.yml b/modules/nf-core/sentieon/haplotyper/environment.yml index 5d8e4c58f9..a3a721cf1d 100644 --- a/modules/nf-core/sentieon/haplotyper/environment.yml +++ b/modules/nf-core/sentieon/haplotyper/environment.yml @@ -3,3 +3,5 @@ channels: - conda-forge - bioconda - defaults +dependencies: + - bioconda::sentieon=202308.01 diff --git a/modules/nf-core/sentieon/haplotyper/main.nf b/modules/nf-core/sentieon/haplotyper/main.nf index f83a137122..d349525dea 100644 --- a/modules/nf-core/sentieon/haplotyper/main.nf +++ b/modules/nf-core/sentieon/haplotyper/main.nf @@ -5,7 +5,10 @@ process SENTIEON_HAPLOTYPER { secret 'SENTIEON_LICENSE_BASE64' - container 'nf-core/sentieon:202112.06' + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sentieon:202308.01--h43eeafb_0' : + 'biocontainers/sentieon:202308.01--h43eeafb_0' }" input: tuple val(meta), path(input), path(input_index), path(intervals) @@ -27,10 +30,15 @@ process SENTIEON_HAPLOTYPER { task.ext.when == null || task.ext.when script: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def args = task.ext.args ?: '' // options for the driver def args2 = task.ext.args2 ?: '' // options for the vcf generation def args3 = task.ext.args3 ?: '' // options for the gvcf generation @@ -68,6 +76,8 @@ process SENTIEON_HAPLOTYPER { echo "Decoded and exported Sentieon test-license system environment variables" fi + $fix_ld_library_path + sentieon driver $args -r $fasta -t $task.cpus -i $input $interval_command $vcf_cmd $gvcf_cmd cat <<-END_VERSIONS > versions.yml @@ -77,8 +87,19 @@ process SENTIEON_HAPLOTYPER { """ stub: + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' + } + def prefix = task.ext.prefix ?: "${meta.id}" """ + $fix_ld_library_path + touch ${prefix}.unfiltered.vcf.gz touch ${prefix}.unfiltered.vcf.gz.tbi touch ${prefix}.g.vcf.gz diff --git a/modules/nf-core/sentieon/varcal/environment.yml b/modules/nf-core/sentieon/varcal/environment.yml index f04a8b78ce..93921ff046 100644 --- a/modules/nf-core/sentieon/varcal/environment.yml +++ b/modules/nf-core/sentieon/varcal/environment.yml @@ -3,3 +3,5 @@ channels: - conda-forge - bioconda - defaults +dependencies: + - bioconda::sentieon=202308.01 diff --git a/modules/nf-core/sentieon/varcal/main.nf b/modules/nf-core/sentieon/varcal/main.nf index 41e0ea40f5..7a0c807127 100644 --- a/modules/nf-core/sentieon/varcal/main.nf +++ b/modules/nf-core/sentieon/varcal/main.nf @@ -5,7 +5,10 @@ process SENTIEON_VARCAL { secret 'SENTIEON_LICENSE_BASE64' - container 'nf-core/sentieon:202112.06' + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sentieon:202308.01--h43eeafb_0' : + 'biocontainers/sentieon:202308.01--h43eeafb_0' }" input: tuple val(meta), path(vcf), path(tbi) // input vcf and tbi of variants to recalibrate @@ -26,10 +29,15 @@ process SENTIEON_VARCAL { task.ext.when == null || task.ext.when script: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def reference_command = fasta ? "--reference $fasta " : '' @@ -69,6 +77,8 @@ process SENTIEON_VARCAL { echo "Decoded and exported Sentieon test-license system environment variables" fi + $fix_ld_library_path + sentieon driver -r ${fasta} --algo VarCal \\ -v $vcf \\ --tranches_file ${prefix}.tranches \\ @@ -83,12 +93,19 @@ process SENTIEON_VARCAL { """ stub: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "Sentieon modules do not support Conda. Please use Docker / Singularity / Podman instead." + // The following code sets LD_LIBRARY_PATH in the script-section when the module is run by Singularity. + // That turned out to be one way of overcoming the following issue with the Singularity-Sentieon-containers from galaxy, Sentieon (LD_LIBRARY_PATH) and the way Nextflow runs Singularity-containers. + // The galaxy container uses a runscript which is responsible for setting LD_PRELOAD properly. Nextflow executes singularity containers using `singularity exec`, which avoids the run script, leading to the LD_LIBRARY_PATH/libstdc++.so.6 error. + if (workflow.containerEngine == 'singularity') { + fix_ld_library_path = 'LD_LIBRARY_PATH=/usr/local/lib/:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH' + } else { + fix_ld_library_path = '' } + def prefix = task.ext.prefix ?: "${meta.id}" """ + $fix_ld_library_path + touch ${prefix}.recal touch ${prefix}.idx touch ${prefix}.tranches From 8f1c91fd273324b1677b4ca72042789914660e7f Mon Sep 17 00:00:00 2001 From: asp8200 Date: Fri, 24 Nov 2023 08:07:58 +0000 Subject: [PATCH 080/545] Fixing md5sum for test.dnascope.filtered.bcftools_stats.txt --- tests/test_sentieon_dnascope.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_sentieon_dnascope.yml b/tests/test_sentieon_dnascope.yml index f51e0bca72..946bed2d4f 100644 --- a/tests/test_sentieon_dnascope.yml +++ b/tests/test_sentieon_dnascope.yml @@ -17,7 +17,7 @@ - path: results/preprocessing/recalibrated/test/test.recal.cram.crai should_exist: false - path: results/reports/bcftools/sentieon_dnascope/test/test.dnascope.filtered.bcftools_stats.txt - md5sum: 912c7d5b31784c50e0a75b4fcfa4997b + md5sum: fb3923060b59b7dc18705cac5704caba - path: results/reports/vcftools/sentieon_dnascope/test/test.dnascope.filtered.FILTER.summary md5sum: e67b24d296810a075378e5864bcea0fa - path: results/reports/vcftools/sentieon_dnascope/test/test.dnascope.filtered.TsTv.count @@ -60,7 +60,7 @@ - path: results/preprocessing/recalibrated/test/test.recal.cram.crai should_exist: false - path: results/reports/bcftools/sentieon_dnascope/test/test.dnascope.filtered.bcftools_stats.txt - md5sum: 912c7d5b31784c50e0a75b4fcfa4997b + md5sum: fb3923060b59b7dc18705cac5704caba - path: results/reports/vcftools/sentieon_dnascope/test/test.dnascope.filtered.FILTER.summary md5sum: e67b24d296810a075378e5864bcea0fa - path: results/reports/vcftools/sentieon_dnascope/test/test.dnascope.filtered.TsTv.count From 885eade5cf1b306047a4d76b4110383ddcdac849 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Fri, 24 Nov 2023 08:33:03 +0000 Subject: [PATCH 081/545] Updating changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2918e702c..af88975a48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1335](https://github.com/nf-core/sarek/pull/1335) - Add index computation of `bcftools_annotations`, if not provided ### Changed +- [#1339](https://github.com/nf-core/sarek/pull/1339) - Update sentieon-modules ### Fixed From dc20c27080abc5936979a5806d4f3680a4a63b9e Mon Sep 17 00:00:00 2001 From: asp8200 Date: Fri, 24 Nov 2023 08:37:32 +0000 Subject: [PATCH 082/545] Updating changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index af88975a48..daada653d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1335](https://github.com/nf-core/sarek/pull/1335) - Add index computation of `bcftools_annotations`, if not provided ### Changed + - [#1339](https://github.com/nf-core/sarek/pull/1339) - Update sentieon-modules ### Fixed From af35d2e7dd6945bc4c407f5c6a91b073b947fd33 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 21:36:16 +0000 Subject: [PATCH 083/545] find my files --- .github/workflows/ncbench.yml | 16 ++++------------ .github/workflows/upload.py | 2 +- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 9cf2f05665..2bfb6a5f2b 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -41,18 +41,10 @@ jobs: destination: ./variant_calling flags: --no-sign-request --include ".vcf.gz" --exclude "g.vcf.gz" - # TODO remove this, it is probably not needed anymore, we are using python now - #- name: Create new Zenodo entry - # uses: popperized/zenodo/create@master - # env: - # ZENODO_METADATA_PATH: sarek-ncbench/assets/zenodo_ncbench.json - # entrypoint: - # secrets: ${{ secrets.ZENODO_DEPOSIT }} - # - #- name: Upload file to Zenodo - # uses: popperized/zenodo/upload@master - # env: - # ZENODO_UPLOAD_PATH: ./variant_calling + - name: list files + run: | + ls + ls ../ - name: Install requests run: pip install requests # version pinning? diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index bc91329d0a..e969e0e547 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -6,7 +6,7 @@ workspace_directory = os.environ["GITHUB_WORKSPACE"] # TODO: replace sandbox link https://zenodo.org/api/deposit/depositions -url = f"https://sandbox.zenodo.org/api/deposit/depositions?access_token={access_token}" +url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" path = "../../../variant_calling/%s" % filename From f50427a797e4e49857dc8e459f71a3590918a55d Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 21:38:03 +0000 Subject: [PATCH 084/545] find my files --- .github/workflows/ncbench.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 2bfb6a5f2b..609c1b1168 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -43,8 +43,7 @@ jobs: - name: list files run: | - ls - ls ../ + ls .. - name: Install requests run: pip install requests # version pinning? From 724b4671f1f02dbdb6dc5521279fe10d7c647898 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 21:48:16 +0000 Subject: [PATCH 085/545] find my files --- .github/workflows/ncbench.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 609c1b1168..09a45947e8 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -43,7 +43,7 @@ jobs: - name: list files run: | - ls .. + ls ../../ - name: Install requests run: pip install requests # version pinning? From fa06b8745e4538ffe5cf68c1e758ca3346f28d40 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 21:50:47 +0000 Subject: [PATCH 086/545] find my files --- .github/workflows/ncbench.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index 09a45947e8..bb5c1bedfa 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -43,7 +43,7 @@ jobs: - name: list files run: | - ls ../../ + ls variant_calling/ - name: Install requests run: pip install requests # version pinning? From 62fc529e15f6d288f272abc7ca1306e1c97a8cdf Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 22:09:29 +0000 Subject: [PATCH 087/545] try again to upload now with proper file path --- .github/workflows/ncbench.yml | 4 ++-- .github/workflows/upload.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ncbench.yml b/.github/workflows/ncbench.yml index bb5c1bedfa..fc567756ba 100644 --- a/.github/workflows/ncbench.yml +++ b/.github/workflows/ncbench.yml @@ -35,7 +35,7 @@ jobs: if: ${{ matrix.enabled }} with: # TODO: download all vcfs - source: s3://nf-core-awsmegatests/sarek/results-test-59026dc07633edb83aab3bfb2f65f79db38437a1/test_full/variant_calling/strelka + source: s3://nf-core-awsmegatests/sarek/results-test-59026dc07633edb83aab3bfb2f65f79db38437a1/test_full/variant_calling command: sync aws_region: eu-west-1 destination: ./variant_calling @@ -43,7 +43,7 @@ jobs: - name: list files run: | - ls variant_calling/ + ls variant_calling/strelka/HCC1395N/ - name: Install requests run: pip install requests # version pinning? diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index e969e0e547..2b1db2597a 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -9,7 +9,7 @@ url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" -path = "../../../variant_calling/%s" % filename +path = "variant_calling/strelka/HCC1395N/%s" % filename with open(path, "rb") as fp: r = requests.post( From dad3c343711957dc2b20997ee2c649cd8ba2b476 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 22:23:32 +0000 Subject: [PATCH 088/545] find path in script --- .github/workflows/upload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 2b1db2597a..4be6786430 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -9,7 +9,7 @@ url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" -path = "variant_calling/strelka/HCC1395N/%s" % filename +path = "../../variant_calling/strelka/HCC1395N/%s" % filename with open(path, "rb") as fp: r = requests.post( From 9e816b37b477c7c3b091fd13216ab4afe2408e86 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 22:34:40 +0000 Subject: [PATCH 089/545] find path in script --- .github/workflows/upload.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 4be6786430..8615505da7 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -10,6 +10,8 @@ filename = "*.vcf.gz" path = "../../variant_calling/strelka/HCC1395N/%s" % filename +println(os.listdir('../../')) +println(os.listdir('../../../')) with open(path, "rb") as fp: r = requests.post( From a035077af1ecc2e9c5480dc506c4d4f883515da4 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 22:36:00 +0000 Subject: [PATCH 090/545] find path in script --- .github/workflows/upload.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 8615505da7..62289b8630 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -10,8 +10,8 @@ filename = "*.vcf.gz" path = "../../variant_calling/strelka/HCC1395N/%s" % filename -println(os.listdir('../../')) -println(os.listdir('../../../')) +print(os.listdir('../../')) +print(os.listdir('../../../')) with open(path, "rb") as fp: r = requests.post( From ab73097cf864d31b7b2c47c78d152d6655198719 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 22:38:29 +0000 Subject: [PATCH 091/545] find path in script --- .github/workflows/upload.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 62289b8630..97908c8465 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -12,6 +12,8 @@ path = "../../variant_calling/strelka/HCC1395N/%s" % filename print(os.listdir('../../')) print(os.listdir('../../../')) +print(os.listdir('../')) +print(os.listdir('.')) with open(path, "rb") as fp: r = requests.post( From cfae0604e82d1ef7d7bf55277ee695806ec98118 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 22:40:18 +0000 Subject: [PATCH 092/545] find path in script --- .github/workflows/upload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 97908c8465..dab6b98174 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -9,7 +9,7 @@ url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" filename = "*.vcf.gz" -path = "../../variant_calling/strelka/HCC1395N/%s" % filename +path = "./variant_calling/strelka/HCC1395N/%s" % filename print(os.listdir('../../')) print(os.listdir('../../../')) print(os.listdir('../')) From 2b364f61439ef38da6dde2f1746eaa427e29d0f4 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 22:43:59 +0000 Subject: [PATCH 093/545] find path in script --- .github/workflows/upload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index dab6b98174..3350f31ef1 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -13,7 +13,7 @@ print(os.listdir('../../')) print(os.listdir('../../../')) print(os.listdir('../')) -print(os.listdir('.')) +print(os.listdir('./variant_calling/')) with open(path, "rb") as fp: r = requests.post( From 543a7580d266ca086eab5ca1bb35bc341bfe27f5 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 22:47:42 +0000 Subject: [PATCH 094/545] find path in script --- .github/workflows/upload.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 3350f31ef1..d56a67584c 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -8,12 +8,12 @@ # TODO: replace sandbox link https://zenodo.org/api/deposit/depositions url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" -filename = "*.vcf.gz" +filename = "*.genome.vcf.gz" path = "./variant_calling/strelka/HCC1395N/%s" % filename print(os.listdir('../../')) print(os.listdir('../../../')) print(os.listdir('../')) -print(os.listdir('./variant_calling/')) +print(os.listdir('./variant_calling/strelka/HCC1395N/')) with open(path, "rb") as fp: r = requests.post( From cce002780c6a89303d8dc3c293a085d64c3646a9 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Tue, 28 Nov 2023 23:01:12 +0000 Subject: [PATCH 095/545] try with full path --- .github/workflows/upload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index d56a67584c..192ab17933 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -8,7 +8,7 @@ # TODO: replace sandbox link https://zenodo.org/api/deposit/depositions url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" -filename = "*.genome.vcf.gz" +filename = "HCC1395N.strelka.genome.vcf.gz" path = "./variant_calling/strelka/HCC1395N/%s" % filename print(os.listdir('../../')) print(os.listdir('../../../')) From 2e3e52e3153d8379494ec97531591c30e5606870 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Wed, 29 Nov 2023 07:56:47 +0000 Subject: [PATCH 096/545] uncomment test to go through actual upload --- .github/workflows/upload.py | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/.github/workflows/upload.py b/.github/workflows/upload.py index 192ab17933..e5293388b6 100644 --- a/.github/workflows/upload.py +++ b/.github/workflows/upload.py @@ -6,22 +6,27 @@ workspace_directory = os.environ["GITHUB_WORKSPACE"] # TODO: replace sandbox link https://zenodo.org/api/deposit/depositions -url = f"https://zenodo.org/api/deposit/depositions?access_token={access_token}" - -filename = "HCC1395N.strelka.genome.vcf.gz" -path = "./variant_calling/strelka/HCC1395N/%s" % filename -print(os.listdir('../../')) -print(os.listdir('../../../')) -print(os.listdir('../')) -print(os.listdir('./variant_calling/strelka/HCC1395N/')) - -with open(path, "rb") as fp: - r = requests.post( - "%s/%s" % (bucket_url, filename), - data=fp, - params=params, - ) -r.json() +url = f"https://sandbox.zenodo.org/api/deposit/depositions?access_token={access_token}" + +# Create empty upload + + + +# filename = "HCC1395N.strelka.genome.vcf.gz" +# path = "./variant_calling/strelka/HCC1395N/%s" % filename +# print(os.listdir('../../')) +# print(os.listdir('../../../')) +# print(os.listdir('../')) +# print(os.listdir('./variant_calling/strelka/HCC1395N/')) + +# bucket_url = "https://zenodo.org/api/deposit/depositions" +# with open(path, "rb") as fp: +# r = requests.post( +# "%s/%s" % (bucket_url, filename), +# data=fp, +# params=params, +# ) +# r.json() data = { 'metadata': { From 8990545d37e7882a01354e5d5b5a312ebf795216 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Thu, 30 Nov 2023 16:44:17 +0000 Subject: [PATCH 097/545] enable qc when starting from VC --- CHANGELOG.md | 1 + conf/modules/modules.config | 6 ++--- subworkflows/local/cram_sampleqc/main.nf | 28 +++++++++++++++++++----- tests/test_cnvkit.yml | 22 +++++++++++++++++++ workflows/sarek.nf | 22 +++++++------------ 5 files changed, 57 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index daada653d5..633a0f26a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - [#1339](https://github.com/nf-core/sarek/pull/1339) - Update sentieon-modules +- [#1344](https://github.com/nf-core/sarek/pull/134) - Enable CRAM QC, when satrting from variantcalling ### Fixed diff --git a/conf/modules/modules.config b/conf/modules/modules.config index a0411793a6..f24cb481b7 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -78,12 +78,12 @@ process { ] } - if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && params.skip_tools.split(',').contains('baserecalibrator')))) { - withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:MOSDEPTH' { + if (!(params.skip_tools && params.skip_tools.split(',').contains('baserecalibrator'))) { + withName: 'NFCORE_SAREK:SAREK:CRAM_SAMPLEQC:CRAM_QC_RECAL:MOSDEPTH' { ext.prefix = { "${meta.id}.recal" } } - withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:SAMTOOLS_STATS' { + withName: 'NFCORE_SAREK:SAREK:CRAM_SAMPLEQC:CRAM_QC_RECAL:SAMTOOLS_STATS' { ext.prefix = { "${meta.id}.recal.cram" } ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('samtools')) } publishDir = [ diff --git a/subworkflows/local/cram_sampleqc/main.nf b/subworkflows/local/cram_sampleqc/main.nf index 3e3b06f008..f00e18aafe 100644 --- a/subworkflows/local/cram_sampleqc/main.nf +++ b/subworkflows/local/cram_sampleqc/main.nf @@ -1,15 +1,32 @@ -include { BAM_NGSCHECKMATE } from '../../../subworkflows/nf-core/bam_ngscheckmate/main' - +include { BAM_NGSCHECKMATE } from '../../../subworkflows/nf-core/bam_ngscheckmate/main' +include { CRAM_QC_MOSDEPTH_SAMTOOLS as CRAM_QC_RECAL } from '../../../subworkflows/local/cram_qc_mosdepth_samtools/main' workflow CRAM_SAMPLEQC { take: - ch_cram // channel: [ val(meta), cram, crai ] - ngscheckmate_bed // channel: [ ngscheckmate_bed ] - fasta // channel: [ fasta ] + ch_cram // channel: [ val(meta), cram, crai ] + ngscheckmate_bed // channel: [ ngscheckmate_bed ] + fasta // channel: [ fasta ] + skip_baserecalibration // boolean: + intervals_for_preprocessing // channel: main: ch_versions = Channel.empty() + reports = Channel.empty() + + if(!skip_baserecalibration){ + + CRAM_QC_RECAL( + ch_cram, + fasta, + intervals_for_preprocessing) + + // Gather QC reports + reports = CRAM_QC_RECAL.out.reports.collect{ meta, report -> report } + + // Gather used softwares versions + ch_versions = ch_versions.mix(CRAM_QC_RECAL.out.versions) + } ch_ngscheckmate_bed = ngscheckmate_bed.map{bed -> [[id: "ngscheckmate"], bed]} @@ -24,6 +41,7 @@ workflow CRAM_SAMPLEQC { all = BAM_NGSCHECKMATE.out.all // channel: [ meta, all ] vcf = BAM_NGSCHECKMATE.out.vcf // channel: [ meta, vcf ] pdf = BAM_NGSCHECKMATE.out.pdf // channel: [ meta, pdf ] + reports versions = ch_versions // channel: [ versions.yml ] } diff --git a/tests/test_cnvkit.yml b/tests/test_cnvkit.yml index 3a1b8181cb..3b084e337b 100644 --- a/tests/test_cnvkit.yml +++ b/tests/test_cnvkit.yml @@ -57,6 +57,28 @@ md5sum: b4a49faf170e436ec32dcc21ccc3ce8f - path: results/cnvkit should_exist: false + - path: results/reports/mosdepth/test/test.md.mosdepth.global.dist.txt + md5sum: b61e1acee11a6ddf7ce + - path: results/reports/mosdepth/test/test.md.mosdepth.region.dist.txt + md5sum: 1a382f98d488d2ae3df83a0d87caafc1 + - path: results/reports/mosdepth/test/test.md.mosdepth.summary.txt + md5sum: 839108358878ada89e1eaddf6e0541ba + - path: results/reports/mosdepth/test/test.md.regions.bed.gz + md5sum: 0aaee6da65050bedcd40b9fbf0622873 + - path: results/reports/mosdepth/test/test.md.regions.bed.gz.csi + md5sum: 544e02fcca548749a0af758d0a2df352 + - path: results/reports/mosdepth/test/test.recal.mosdepth.global.dist.txt + md5sum: b61e1acee11a6ddf7ce3232a5948a6a0 + - path: results/reports/mosdepth/test/test.recal.mosdepth.region.dist.txt + md5sum: 1a382f98d488d2ae3df83a0d87caafc1 + - path: results/reports/mosdepth/test/test.recal.mosdepth.summary.txt + md5sum: 839108358878ada89e1eaddf6e0541ba + - path: results/reports/mosdepth/test/test.recal.regions.bed.gz + md5sum: 0aaee6da65050bedcd40b9fbf0622873 + - path: results/reports/mosdepth/test/test.recal.regions.bed.gz.csi + md5sum: 544e02fcca548749a0af758d0a2df35 + - path: results/reports/samtools/test/test.recal.cram.stats + # conda changes md5sums for test - name: Run variant calling on tumor_only sample with cnvkit command: nextflow run main.nf -profile test_cache,tools_tumoronly --tools cnvkit --outdir results tags: diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 5b0a9dcde9..a18d3864b3 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -801,17 +801,6 @@ workflow SAREK { cram_variant_calling_no_spark, cram_variant_calling_spark) - CRAM_QC_RECAL( - cram_variant_calling, - fasta, - intervals_for_preprocessing) - - // Gather QC reports - reports = reports.mix(CRAM_QC_RECAL.out.reports.collect{ meta, report -> report }) - - // Gather used softwares versions - versions = versions.mix(CRAM_QC_RECAL.out.versions) - // If params.save_output_as_bam, then convert CRAM files to BAM CRAM_TO_BAM_RECAL(cram_variant_calling, fasta, fasta_fai) versions = versions.mix(CRAM_TO_BAM_RECAL.out.versions) @@ -852,11 +841,16 @@ workflow SAREK { } - if (params.tools) { + if (params.step == 'annotate') cram_variant_calling = Channel.empty() - if (params.step == 'annotate') cram_variant_calling = Channel.empty() + // RUN CRAM QC on the recalibrated CRAM files or when starting from step variant calling. NGSCheckmate should be run also on non-recalibrated CRAM files + CRAM_SAMPLEQC(cram_variant_calling, + ngscheckmate_bed, + fasta, + params.skip_tools && params.skip_tools.split(',').contains('baserecalibrator'), + intervals_for_preprocessing) - CRAM_SAMPLEQC(cram_variant_calling, ngscheckmate_bed, fasta) + if (params.tools) { // // Logic to separate germline samples, tumor samples with no matched normal, and combine tumor-normal pairs From 47a9ef7dd22465ba8d2f2299379850d4c74255c8 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Thu, 30 Nov 2023 17:00:35 +0000 Subject: [PATCH 098/545] checksums, they are important --- tests/test_cnvkit.yml | 46 ++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/tests/test_cnvkit.yml b/tests/test_cnvkit.yml index 3b084e337b..f5f7cda349 100644 --- a/tests/test_cnvkit.yml +++ b/tests/test_cnvkit.yml @@ -57,27 +57,49 @@ md5sum: b4a49faf170e436ec32dcc21ccc3ce8f - path: results/cnvkit should_exist: false - - path: results/reports/mosdepth/test/test.md.mosdepth.global.dist.txt - md5sum: b61e1acee11a6ddf7ce - - path: results/reports/mosdepth/test/test.md.mosdepth.region.dist.txt + - path: results/reports/mosdepth/sample3/sample3.md.mosdepth.global.dist.txt md5sum: 1a382f98d488d2ae3df83a0d87caafc1 - - path: results/reports/mosdepth/test/test.md.mosdepth.summary.txt + - path: results/reports/mosdepth/sample3/sample3.md.mosdepth.region.dist.txt + md5sum: 1a382f98d488d2ae3df83a0d87caafc1 + - path: results/reports/mosdepth/sample3/sample3.md.mosdepth.summary.txt + md5sum: 839108358878ada89e1eaddf6e0541ba + - path: results/reports/mosdepth/sample3/sample3.md.regions.bed.gz + md5sum: 0aaee6da65050bedcd40b9fbf0622873 + - path: results/reports/mosdepth/sample3/sample3.md.regions.bed.gz.csi + md5sum: 544e02fcca548749a0af758d0a2df352 + - path: results/reports/mosdepth/sample3/sample3.recal.mosdepth.global.dist.txt + md5sum: b61e1acee11a6ddf7ce3232a5948a6a0 + - path: results/reports/mosdepth/sample3/sample3.recal.mosdepth.region.dist.txt + md5sum: 1a382f98d488d2ae3df83a0d87caafc1 + - path: results/reports/mosdepth/sample3/sample3.recal.mosdepth.summary.txt + md5sum: 839108358878ada89e1eaddf6e0541ba + - path: results/reports/mosdepth/sample3/sample3.recal.regions.bed.gz + md5sum: 0aaee6da65050bedcd40b9fbf0622873 + - path: results/reports/mosdepth/sample3/sample3.recal.regions.bed.gz.csi + md5sum: 544e02fcca548749a0af758d0a2df35 + - path: results/reports/samtools/sample3/sample3.recal.cram.stats + # conda changes md5sums for test + - path: results/reports/mosdepth/sample4/sample4.md.mosdepth.global.dist.txt + md5sum: 1a382f98d488d2ae3df83a0d87caafc1 + - path: results/reports/mosdepth/sample4/sample4.md.mosdepth.region.dist.txt + md5sum: 1a382f98d488d2ae3df83a0d87caafc1 + - path: results/reports/mosdepth/sample4/sample4.md.mosdepth.summary.txt md5sum: 839108358878ada89e1eaddf6e0541ba - - path: results/reports/mosdepth/test/test.md.regions.bed.gz + - path: results/reports/mosdepth/sample4/sample4.md.regions.bed.gz md5sum: 0aaee6da65050bedcd40b9fbf0622873 - - path: results/reports/mosdepth/test/test.md.regions.bed.gz.csi + - path: results/reports/mosdepth/sample4/sample4.md.regions.bed.gz.csi md5sum: 544e02fcca548749a0af758d0a2df352 - - path: results/reports/mosdepth/test/test.recal.mosdepth.global.dist.txt + - path: results/reports/mosdepth/sample4/sample4.recal.mosdepth.global.dist.txt md5sum: b61e1acee11a6ddf7ce3232a5948a6a0 - - path: results/reports/mosdepth/test/test.recal.mosdepth.region.dist.txt + - path: results/reports/mosdepth/sample4/sample4.recal.mosdepth.region.dist.txt md5sum: 1a382f98d488d2ae3df83a0d87caafc1 - - path: results/reports/mosdepth/test/test.recal.mosdepth.summary.txt + - path: results/reports/mosdepth/sample4/sample4.recal.mosdepth.summary.txt md5sum: 839108358878ada89e1eaddf6e0541ba - - path: results/reports/mosdepth/test/test.recal.regions.bed.gz + - path: results/reports/mosdepth/sample4/sample4.recal.regions.bed.gz md5sum: 0aaee6da65050bedcd40b9fbf0622873 - - path: results/reports/mosdepth/test/test.recal.regions.bed.gz.csi + - path: results/reports/mosdepth/sample4/sample4.recal.regions.bed.gz.csi md5sum: 544e02fcca548749a0af758d0a2df35 - - path: results/reports/samtools/test/test.recal.cram.stats + - path: results/reports/samtools/sample4/sample4.recal.cram.stats # conda changes md5sums for test - name: Run variant calling on tumor_only sample with cnvkit command: nextflow run main.nf -profile test_cache,tools_tumoronly --tools cnvkit --outdir results From 078129c580bc1847f4f012d5cc9995200e8351ef Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Thu, 30 Nov 2023 17:06:53 +0000 Subject: [PATCH 099/545] update subway --- docs/images/sarek_subway.png | Bin 1513933 -> 1512319 bytes docs/images/sarek_subway.svg | 70 +++++++++++++++-------------------- 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/docs/images/sarek_subway.png b/docs/images/sarek_subway.png index ff73d272d95afd86a7cbba00d4ad429b10f33a87..02937f57e5d07b87c5122a46ae738dec8da18f47 100644 GIT binary patch literal 1512319 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