From 758fd35e720eb8c49b29ae5e98fe6ef55d4806d6 Mon Sep 17 00:00:00 2001 From: brucemoran Date: Thu, 23 Jul 2020 13:40:59 +0100 Subject: [PATCH 001/359] GRCh37 option --- CHANGELOG.md | 3 +- conf/genomes.config | 12 ++++++- docs/references.md | 11 ++++++ docs/usage.md | 4 +-- download-references.nf | 78 +++++++++++++++++++++++++++--------------- main.nf | 35 +++++++++++-------- 6 files changed, 96 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a990f62..a2306ebe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## [1.2.0] nfcore/rnafusion - 2020/07/15 +## dev nfcore/rnafusion - 2020/07/15 ### Added * Added social preview image [#107](https://github.com/nf-core/rnafusion/issues/107) +* Added support for GRCh37 genome assembly [#77](https://github.com/nf-core/rnafusion/issues/77) ### Changed diff --git a/conf/genomes.config b/conf/genomes.config index 985345cc..934041b2 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -19,5 +19,15 @@ params { fusioncatcher_ref = "${params.genomes_base}/fusioncatcher/human_v98" star_fusion_ref = "${params.genomes_base}/star-fusion/ctat_genome_lib_build_dir" } + 'GRCh37' { + fasta = "${params.genomes_base}/Homo_sapiens.GRCh37_r${params.reference_release}.all.fa" + gtf = "${params.genomes_base}/Homo_sapiens.GRCh37_r${params.reference_release}.gtf" + transcript = "${params.genomes_base}/Homo_sapiens.GRCh37_r${params.reference_release}.cdna.all.fa.gz" + databases = "${params.genomes_base}/databases" + arriba_ref = "${params.genomes_base}/arriba" + ericscript_ref = "${params.genomes_base}/ericscript/ericscript_db_homosapiens_ensembl73" + fusioncatcher_ref = "${params.genomes_base}/fusioncatcher/README.txt" + star_fusion_ref = "${params.genomes_base}/star-fusion/ctat_genome_lib_build_dir" + } } -} \ No newline at end of file +} diff --git a/docs/references.md b/docs/references.md index d59d2dc5..23a4b8a9 100644 --- a/docs/references.md +++ b/docs/references.md @@ -27,6 +27,17 @@ nextflow run nf-core/rnafusion/download-references.nf \ --outdir ``` +## Download GRCh37 references + +```bash +# GRCh38 genome assembly is used by default. To use the previous assembly specify it using the --genome flag +nextflow run nf-core/rnafusion/download-references.nf \ + --genome GRCh37 \ + --download_all \ + --outdir \ + --cosmic_usr --cosmic_passwd +``` + ## Tool reference requirements | Tool | FASTA | GTF | STAR-index | Other | diff --git a/docs/usage.md b/docs/usage.md index 99ae7c4e..594c56d7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -226,7 +226,7 @@ If enabled, executes `Ericscript` tool. ### `--fusioncatcher` -If enabled, executes `Fusioncatcher` tool. +If enabled, executes `Fusioncatcher` tool. N.B. that Fusioncatcher is not available when using the `GRCh37` genome assembly. - `--fusioncatcher_opt` - Specify additional parameters. For more info, please refer to the [documentation](https://github.com/ndaniel/fusioncatcher/blob/master/doc/manual.md) of the tool. @@ -308,7 +308,7 @@ Required reference in order to run `Fusioncatcher`. ### `--genome` -This pipeline uses only `Homo Sapiens` version `GRCh38`. Also make sure to specify `--genomes_base`. +This pipeline uses `Homo Sapiens` version `GRCh38` by default. Assembly `GRCh37` is optionally available. N.B. that using `GRCh37` precludes use of the `Fusioncatcher` tool. Also make sure to specify `--genomes_base`. ```bash --genome 'GRCh38' --genome_base '/path/to/references' diff --git a/download-references.nf b/download-references.nf index c9545338..9e2d62fe 100644 --- a/download-references.nf +++ b/download-references.nf @@ -28,16 +28,17 @@ def helpMessage() { Mandatory arguments: --outdir [path] Output directory for downloading - + Options: --download_all [bool] Download all references + --genome [str] Genome version: GRCh37 or GRCh38 (default) --reference_release [int] Release number of Ensembl reference for FASTA and GTF Default: 97 -> ftp://ftp.ensembl.org/pub/release-97 --base [bool] Download FASTA, GTF, cDNA --arriba [bool] Download Arriba references --star_fusion [bool] Build STAR-Fusion references from FASTA ANF GTF --fusioncatcher [bool] Download Fusioncatcher references - --ericscript [bool] Download Ericscript references + --ericscript [bool] Download Ericscript references --fusion_report [bool] Download databases for fusion-report --cosmic_usr [str] [Required with fusion_report] COSMIC username --cosmic_passwd [str] [Required with fusion_report] COSMIC password @@ -87,29 +88,34 @@ checkHostname() process download_base { publishDir "${params.outdir}/", mode: 'copy' - + when: params.base || params.download_all output: - file "Homo_sapiens.GRCh38_r${params.reference_release}.all.fa" into fasta - file "Homo_sapiens.GRCh38_r${params.reference_release}.gtf" into gtf - file "Homo_sapiens.GRCh38_r${params.reference_release}.cdna.all.fa.gz" into transcript + file "Homo_sapiens.${params.genome}_r${params.reference_release}.all.fa" into fasta + file "Homo_sapiens.${params.genome}_r${params.reference_release}.gtf" into gtf + file "Homo_sapiens.${params.genome}_r${params.reference_release}.cdna.all.fa.gz" into transcript script: """ - wget ftp://ftp.ensembl.org/pub/release-${params.reference_release}/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.{1..22}.fa.gz - wget ftp://ftp.ensembl.org/pub/release-${params.reference_release}/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.{MT,X,Y}.fa.gz - gunzip -c Homo_sapiens.GRCh38.dna.chromosome.* > Homo_sapiens.GRCh38_r${params.reference_release}.all.fa - wget ftp://ftp.ensembl.org/pub/release-${params.reference_release}/gtf/homo_sapiens/Homo_sapiens.GRCh38.${params.reference_release}.chr.gtf.gz -O Homo_sapiens.GRCh38_r${params.reference_release}.gtf.gz - gunzip Homo_sapiens.GRCh38_r${params.reference_release}.gtf.gz - wget ftp://ftp.ensembl.org/pub/release-${params.reference_release}/fasta/homo_sapiens/cdna/Homo_sapiens.GRCh38.cdna.all.fa.gz -O Homo_sapiens.GRCh38_r${params.reference_release}.cdna.all.fa.gz + if [[ ${params.genome} == "GRCh37" ]];then + BASEURL="ftp://ftp.ensembl.org/pub/grch37" + else + BASEURL="ftp://ftp.ensembl.org/pub" + fi + wget \$BASEURL/release-${params.reference_release}/fasta/homo_sapiens/dna/Homo_sapiens.${params.genome}.dna.chromosome.{1..22}.fa.gz + wget \$BASEURL/release-${params.reference_release}/fasta/homo_sapiens/dna/Homo_sapiens.${params.genome}.dna.chromosome.{MT,X,Y}.fa.gz + gunzip -c Homo_sapiens.${params.genome}.dna.chromosome.* > Homo_sapiens.${params.genome}_r${params.reference_release}.all.fa + wget \$BASEURL/release-${params.reference_release}/gtf/homo_sapiens/Homo_sapiens.${params.genome}.*.chr.gtf.gz -O Homo_sapiens.${params.genome}_r${params.reference_release}.gtf.gz + gunzip Homo_sapiens.${params.genome}_r${params.reference_release}.gtf.gz + wget \$BASEURL/release-${params.reference_release}/fasta/homo_sapiens/cdna/Homo_sapiens.${params.genome}.cdna.all.fa.gz -O Homo_sapiens.${params.genome}_r${params.reference_release}.cdna.all.fa.gz """ } process download_arriba { publishDir "${params.outdir}/arriba", mode: 'copy' - + when: params.arriba || params.download_all @@ -125,7 +131,7 @@ process download_arriba { process download_star_fusion { publishDir "${params.outdir}/star-fusion", mode: 'copy' - + when: params.star_fusion || params.download_all @@ -134,15 +140,21 @@ process download_star_fusion { script: """ - aws s3 --no-sign-request --region ${params.awsregion} cp s3://ngi-igenomes/Homo_sapiens/Ensembl/GRCh38/Genome/CTAT/ctat_star_fusion_1_8_1.tar.gz . - tar -xf ctat_star_fusion_1_8_1.tar.gz --strip-components=5 - rm ctat_star_fusion_1_8_1.tar.gz + if [[ ${params.genome} == "GRCh37" ]]; then + wget -O GRCh37_gencode_v19_CTAT_lib_Apr032020.plug-n-play.tar.gz https://data.broadinstitute.org/Trinity/CTAT_RESOURCE_LIB/__genome_libs_StarFv1.9/GRCh37_gencode_v19_CTAT_lib_Apr032020.plug-n-play.tar.gz + tar -xf GRCh37_gencode_v19_CTAT_lib_Apr032020.plug-n-play.tar.gz --strip-components=5 + rm GRCh37_gencode_v19_CTAT_lib_Apr032020.plug-n-play.tar.gz + else + aws s3 --no-sign-request --region ${params.awsregion} cp s3://ngi-igenomes/Homo_sapiens/Ensembl/GRCh38/Genome/CTAT/ctat_star_fusion_1_8_1.tar.gz . + tar -xf ctat_star_fusion_1_8_1.tar.gz --strip-components=5 + rm ctat_star_fusion_1_8_1.tar.gz + fi """ } process download_fusioncatcher { publishDir "${params.outdir}/fusioncatcher", mode: 'copy' - + when: params.fusioncatcher || params.download_all @@ -151,18 +163,22 @@ process download_fusioncatcher { script: """ - wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v98.tar.gz.aa - wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v98.tar.gz.ab - wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v98.tar.gz.ac - wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v98.tar.gz.ad - cat human_v98.tar.gz.* | tar xz - rm human_v98.tar* + if [[ ${params.genome} == "GRCh37" ]]; then + echo "FusionCatcher unavailable for GRCh37" > README.txt + else + wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v98.tar.gz.aa + wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v98.tar.gz.ab + wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v98.tar.gz.ac + wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v98.tar.gz.ad + cat human_v98.tar.gz.* | tar xz + rm human_v98.tar* + fi """ } process download_ericscript { publishDir "${params.outdir}/ericscript", mode: 'copy' - + when: params.ericscript || params.download_all @@ -173,14 +189,20 @@ process download_ericscript { """ wget -N https://raw.githubusercontent.com/circulosmeos/gdown.pl/dfd6dc910a38a42d550397bb5c2335be2c4bcf54/gdown.pl chmod +x gdown.pl - ./gdown.pl "https://drive.google.com/uc?export=download&confirm=qgOc&id=0B9s__vuJPvIiUGt1SnFMZFg4TlE" ericscript_db_homosapiens_ensembl84.tar.bz2 - tar jxf ericscript_db_homosapiens_ensembl84.tar.bz2 - rm gdown.pl ericscript_db_homosapiens_ensembl84.tar.bz2 + if [[ ${params.genome} == "GRCh37" ]]; then + ./gdown.pl "https://drive.google.com/uc?export=download&confirm=qgOc&id=0B9s__vuJPvIibDRIb0RFdHFlQmM" ericscript_db_homosapiens_ensembl73.tar.bz2 + tar jxf ericscript_db_homosapiens_ensembl73.tar.bz2 + else + ./gdown.pl "https://drive.google.com/uc?export=download&confirm=qgOc&id=0B9s__vuJPvIiUGt1SnFMZFg4TlE" ericscript_db_homosapiens_ensembl84.tar.bz2 + tar jxf ericscript_db_homosapiens_ensembl84.tar.bz2 + fi + rm gdown.pl ericscript_db_homosapiens_ensembl*.tar.bz2 """ } process download_databases { publishDir "${params.outdir}/databases", mode: 'copy' + executor 'local' when: params.fusion_report || params.download_all diff --git a/main.nf b/main.nf index b4f9151c..7d9f46aa 100644 --- a/main.nf +++ b/main.nf @@ -30,13 +30,13 @@ def helpMessage() { Mandatory arguments: --reads [file] Path to input data (must be surrounded with quotes) -profile [str] Configuration profile to use. Can use multiple (comma separated) - Available: docker, singularity, test, awsbatch, and more + Available: docker, singularity, test, awsbatch, and more --reference_path [str] Path to reference folder (includes fasta, gtf, fusion tool ref ...) Tool flags: --arriba [bool] Run Arriba --arriba_opt [str] Specify extra parameters for Arriba - --ericscript [bool] Run Ericscript + --ericscript [bool] Run Ericscript --fusioncatcher [bool] Run FusionCatcher --fusioncatcher_opt [srt] Specify extra parameters for FusionCatcher --fusion_report_opt [str] Specify extra parameters for fusion-report @@ -45,7 +45,7 @@ def helpMessage() { --squid [bool] Run Squid --star_fusion [bool] Run STAR-Fusion --star_fusion_opt [str] Specify extra parameters for STAR-Fusion - + Visualization flags: --arriba_vis [bool] Generate a PDF visualization per detected fusion --fusion_inspector [bool] Run Fusion-Inspector @@ -63,6 +63,7 @@ def helpMessage() { --transcript [file] Path to transcript Options: + --genome [str] Genome version: GRCh37 or GRCh38 (default) --read_length [int] Length of the reads. Default: 100 --single_end [bool] Specifies that the input is single-end reads @@ -337,6 +338,7 @@ process arriba { script: def extra_params = params.arriba_opt ? params.arriba_opt : '' + blacklist = "${reference}/blacklist*${params.genome}*.tsv" """ STAR \\ --genomeDir ${star_index} \\ @@ -359,14 +361,14 @@ process arriba { --chimSegmentReadGapMax 3 \\ --readFilesCommand zcat \\ --sjdbOverhang ${params.read_length - 1} | - + tee Aligned.out.bam | arriba \\ -x /dev/stdin \\ -a ${fasta} \\ -g ${gtf} \\ - -b ${reference}/blacklist_hg38_GRCh38_2018-11-04.tsv \\ + -b ${blacklist} \\ -o ${sample}_arriba.tsv -O ${sample}_discarded_arriba.tsv \\ -T -P ${extra_params} @@ -450,7 +452,7 @@ star_fusion_fusions = star_fusion_fusions.dump(tag:'star_fusion_fusions') process fusioncatcher { tag "${sample}" label 'process_high' - + publishDir "${params.outdir}/tools/Fusioncatcher/${sample}", mode: 'copy' input: @@ -461,7 +463,7 @@ process fusioncatcher { set val(sample), file("${sample}_fusioncatcher.txt") optional true into fusioncatcher_fusions file("*.{txt,zip,log}") into fusioncatcher_output - when: params.fusioncatcher || (params.fusioncatcher && params.debug) + when: params.genome != "GRCh37" && params.fusioncatcher || (params.fusioncatcher && params.debug) script: option = params.single_end ? reads[0] : "${reads[0]},${reads[1]}" @@ -533,7 +535,7 @@ process pizzly { set val(sample), file(reads) from read_files_pizzly file(gtf) from ch_gtf file(transcript) from ch_transcript - + output: set val(sample), file("${sample}_pizzly.txt") optional true into pizzly_fusions file("*.{json,txt}") into pizzly_output @@ -575,7 +577,7 @@ process squid { set val(sample), file(reads) from read_files_squid file(star_index) from ch_star_index file(gtf) from ch_gtf - + output: set val(sample), file("${sample}_fusions_annotated.txt") optional true into squid_fusions file("*.txt") into squid_output @@ -633,7 +635,7 @@ process summary { tag "${sample}" publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' - + input: set val(sample), file(reads), file(arriba), file(ericscript), file(fusioncatcher), file(pizzly), file(squid), file(starfusion) from files_and_reports_summary @@ -641,9 +643,9 @@ process summary { set val(sample), file("${sample}_fusion_list.tsv") into fusion_inspector_input_list file("${sample}_fusion_genes_mqc.json") into summary_fusions_mq file("*") into report - + when: !params.debug && (running_tools.size() > 0) - + script: def extra_params = params.fusion_report_opt ? params.fusion_report_opt : '' @@ -658,6 +660,7 @@ process summary { ${tools} ${extra_params} mv fusion_list.tsv ${sample}_fusion_list.tsv mv fusion_genes_mqc.json ${sample}_fusion_genes_mqc.json + tar -czf ${sample}_fusion-report.tar.gz --exclude=${sample}* ./* """ } @@ -687,6 +690,8 @@ process arriba_visualization { script: def suff_mem = ("${(task.memory.toBytes() - 6000000000) / task.cpus}" > 2000000000) ? 'true' : 'false' def avail_mem = (task.memory && suff_mem) ? "-m" + "${(task.memory.toBytes() - 6000000000) / task.cpus}" : '' + cytobands = "${reference}/cytobands*${params.genome}*.tsv" + proteinDomains = "${reference}/protein_domains*${params.genome}*gff3" """ samtools sort -@ ${task.cpus} ${avail_mem} -O bam ${bam} > Aligned.sortedByCoord.out.bam samtools index Aligned.sortedByCoord.out.bam @@ -695,8 +700,8 @@ process arriba_visualization { --alignments=Aligned.sortedByCoord.out.bam \\ --output=${sample}.pdf \\ --annotation=${gtf} \\ - --cytobands=${reference}/cytobands_hg38_GRCh38_2018-02-23.tsv \\ - --proteinDomains=${reference}/protein_domains_hg38_GRCh38_2019-07-05.gff3 + --cytobands=\$(echo ${cytobands}) \\ + --proteinDomains=\$(echo ${proteinDomains}) """ } @@ -734,7 +739,7 @@ process fusion_inspector { --CPU ${task.cpus} \\ -O . \\ --out_prefix finspector \\ - --vis ${extra_params} + --vis ${extra_params} """ } From ca6dc5d68192c15e54d950c5bd296d501c2ada56 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 30 Jul 2020 20:09:41 +0000 Subject: [PATCH 002/359] Template update for nf-core/tools version 1.10.1 --- .github/.dockstore.yml | 5 + .github/CONTRIBUTING.md | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 15 +- .github/ISSUE_TEMPLATE/feature_request.md | 12 +- .github/PULL_REQUEST_TEMPLATE.md | 15 +- .github/workflows/awsfulltest.yml | 40 ++++ .github/workflows/awstest.yml | 40 ++++ .github/workflows/branch.yml | 30 ++- .github/workflows/ci.yml | 47 +++- .github/workflows/linting.yml | 13 +- .github/workflows/push_dockerhub.yml | 39 ++++ .gitignore | 1 + CHANGELOG.md | 8 +- CODE_OF_CONDUCT.md | 6 +- Dockerfile | 12 +- README.md | 42 ++-- bin/markdown_to_html.py | 43 ++-- bin/scrape_software_versions.py | 36 +-- conf/igenomes.config | 1 + conf/test.config | 2 +- conf/test_full.config | 22 ++ docs/README.md | 20 +- docs/output.md | 50 ++-- docs/usage.md | 272 +++------------------- environment.yml | 2 +- main.nf | 53 +++-- nextflow.config | 9 +- nextflow_schema.json | 259 ++++++++++++++++++++ 28 files changed, 685 insertions(+), 411 deletions(-) create mode 100644 .github/.dockstore.yml create mode 100644 .github/workflows/awsfulltest.yml create mode 100644 .github/workflows/awstest.yml create mode 100644 .github/workflows/push_dockerhub.yml create mode 100644 conf/test_full.config create mode 100644 nextflow_schema.json diff --git a/.github/.dockstore.yml b/.github/.dockstore.yml new file mode 100644 index 00000000..030138a0 --- /dev/null +++ b/.github/.dockstore.yml @@ -0,0 +1,5 @@ +# Dockstore config version, not pipeline version +version: 1.2 +workflows: + - subclass: nfl + primaryDescriptorPath: /nextflow.config diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 260f8fd6..e97e0285 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -54,4 +54,4 @@ These tests are run both with the latest available version of `Nextflow` and als ## Getting help -For further information/help, please consult the [nf-core/rnafusion documentation](https://nf-co.re/nf-core/rnafusion/docs) and don't hesitate to get in touch on the nf-core Slack [#rnafusion](https://nfcore.slack.com/channels/rnafusion) channel ([join our Slack here](https://nf-co.re/join/slack)). +For further information/help, please consult the [nf-core/rnafusion documentation](https://nf-co.re/rnafusion/docs) and don't hesitate to get in touch on the nf-core Slack [#rnafusion](https://nfcore.slack.com/channels/rnafusion) channel ([join our Slack here](https://nf-co.re/join/slack)). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 45a4d208..c9950f88 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,24 +1,27 @@ + -## Describe the bug +## Description of the bug -A clear and concise description of what the bug is. + ## Steps to reproduce Steps to reproduce the behaviour: -1. Command line: `nextflow run ...` -2. See error: _Please provide your error message_ +1. Command line: +2. See error: ## Expected behaviour -A clear and concise description of what you expected to happen. + ## System @@ -39,4 +42,4 @@ A clear and concise description of what you expected to happen. ## Additional context -Add any other context about the problem here. + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 167d7f93..4560071e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,24 +1,26 @@ + ## Is your feature request related to a problem? Please describe -A clear and concise description of what the problem is. + -Ex. I'm always frustrated when [...] + ## Describe the solution you'd like -A clear and concise description of what you want to happen. + ## Describe alternatives you've considered -A clear and concise description of any alternative solutions or features you've considered. + ## Additional context -Add any other context about the feature request here. + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e504e427..6e32aa01 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,3 +1,4 @@ + + ## PR checklist - [ ] This comment contains a description of changes (with reason) +- [ ] `CHANGELOG.md` is updated - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] If necessary, also make a PR on the [nf-core/rnafusion branch on the nf-core/test-datasets repo](https://github.com/nf-core/test-datasets/pull/new/nf-core/rnafusion) -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). -- [ ] Make sure your code lints (`nf-core lint .`). - [ ] Documentation in `docs` is updated -- [ ] `CHANGELOG.md` is updated -- [ ] `README.md` is updated - -**Learn more about contributing:** [CONTRIBUTING.md](https://github.com/nf-core/rnafusion/tree/master/.github/CONTRIBUTING.md) \ No newline at end of file +- [ ] If necessary, also make a PR on the [nf-core/rnafusion branch on the nf-core/test-datasets repo](https://github.com/nf-core/test-datasets/pull/new/nf-core/rnafusion) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml new file mode 100644 index 00000000..f486dc8b --- /dev/null +++ b/.github/workflows/awsfulltest.yml @@ -0,0 +1,40 @@ +name: nf-core AWS full size tests +# This workflow is triggered on push to the master branch. +# It runs the -profile 'test_full' on AWS batch + +on: + release: + types: [published] + +jobs: + run-awstest: + name: Run AWS full tests + if: github.repository == 'nf-core/rnafusion' + runs-on: ubuntu-latest + steps: + - name: Setup Miniconda + uses: goanpeca/setup-miniconda@v1.0.2 + with: + auto-update-conda: true + python-version: 3.7 + - name: Install awscli + run: conda install -c conda-forge awscli + - name: Start AWS batch job + # TODO nf-core: You can customise AWS full pipeline tests as required + # Add full size test data (but still relatively small datasets for few samples) + # on the `test_full.config` test runs with only one set of parameters + # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} + AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} + AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + run: | + aws batch submit-job \ + --region eu-west-1 \ + --job-name nf-core-rnafusion \ + --job-queue $AWS_JOB_QUEUE \ + --job-definition $AWS_JOB_DEFINITION \ + --container-overrides '{"command": ["nf-core/rnafusion", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/rnafusion/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/rnafusion/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml new file mode 100644 index 00000000..b687404c --- /dev/null +++ b/.github/workflows/awstest.yml @@ -0,0 +1,40 @@ +name: nf-core AWS test +# This workflow is triggered on push to the master branch. +# It runs the -profile 'test' on AWS batch + +on: + push: + branches: + - master + +jobs: + run-awstest: + name: Run AWS tests + if: github.repository == 'nf-core/rnafusion' + runs-on: ubuntu-latest + steps: + - name: Setup Miniconda + uses: goanpeca/setup-miniconda@v1.0.2 + with: + auto-update-conda: true + python-version: 3.7 + - name: Install awscli + run: conda install -c conda-forge awscli + - name: Start AWS batch job + # TODO nf-core: You can customise CI pipeline run tests as required + # For example: adding multiple test runs with different parameters + # Remember that you can parallelise this by using strategy.matrix + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} + AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} + AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + run: | + aws batch submit-job \ + --region eu-west-1 \ + --job-name nf-core-rnafusion \ + --job-queue $AWS_JOB_QUEUE \ + --job-definition $AWS_JOB_DEFINITION \ + --container-overrides '{"command": ["nf-core/rnafusion", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/rnafusion/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/rnafusion/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}'rnafusion/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index ed654eae..033f5230 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -3,14 +3,34 @@ name: nf-core branch protection # It fails when someone tries to make a PR against the nf-core `master` branch instead of `dev` on: pull_request: - branches: - - master + branches: [master] jobs: test: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest steps: - # PRs are only ok if coming from an nf-core `dev` branch or a fork `patch` branch + # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs + if: github.repository == 'nf-core/rnafusion' run: | - { [[ $(git remote get-url origin) == *nf-core/rnafusion ]] && [[ ${GITHUB_HEAD_REF} = "dev" ]]; } || [[ ${GITHUB_HEAD_REF} == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name}} == nf-core/rnafusion ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + + + # If the above check failed, post a comment on the PR explaining the failure + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@v1 + with: + message: | + Hi @${{ github.event.pull_request.user.login }}, + + It looks like this pull-request is has been made against the ${{github.event.pull_request.head.repo.full_name}} `master` branch. + The `master` branch on nf-core repositories should always contain code from the latest release. + Because of this, PRs to `master` are only allowed if they come from the ${{github.event.pull_request.head.repo.full_name}} `dev` branch. + + You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b08b3a2e..abcbc3b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,30 +1,55 @@ name: nf-core CI -# This workflow is triggered on pushes and PRs to the repository. -# It runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: [push, pull_request] +# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors +on: + push: + branches: + - dev + pull_request: + release: + types: [published] jobs: test: + name: Run workflow tests + # Only run on push if this is the nf-core dev branch (merged PRs) + if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/rnafusion') }} + runs-on: ubuntu-latest env: NXF_VER: ${{ matrix.nxf_ver }} NXF_ANSI_LOG: false - runs-on: ubuntu-latest strategy: matrix: # Nextflow versions: check pipeline minimum and current latest nxf_ver: ['19.10.0', ''] steps: - - uses: actions/checkout@v2 - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Check if Dockerfile or Conda environment changed + uses: technote-space/get-diff-action@v1 + with: + PREFIX_FILTER: | + Dockerfile + environment.yml + + - name: Build new docker image + if: env.GIT_DIFF + run: docker build --no-cache . -t nfcore/rnafusion:dev + - name: Pull docker image + if: ${{ !env.GIT_DIFF }} run: | docker pull nfcore/rnafusion:dev docker tag nfcore/rnafusion:dev nfcore/rnafusion:dev + + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + - name: Run pipeline with test data + # TODO nf-core: You can customise CI pipeline run tests as required + # For example: adding multiple test runs with different parameters + # Remember that you can parallelise this by using strategy.matrix run: | - # TODO nf-core: You can customise CI pipeline run tests as required - # (eg. adding multiple test runs with different parameters) nextflow run ${GITHUB_WORKSPACE} -profile test,docker diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 1e0827a8..eb66c144 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -33,18 +33,29 @@ jobs: nf-core: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + + - name: Check out pipeline code + uses: actions/checkout@v2 + - name: Install Nextflow run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ + - uses: actions/setup-python@v1 with: python-version: '3.6' architecture: 'x64' + - name: Install dependencies run: | python -m pip install --upgrade pip pip install nf-core + - name: Run nf-core lint + env: + GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} run: nf-core lint ${GITHUB_WORKSPACE} + diff --git a/.github/workflows/push_dockerhub.yml b/.github/workflows/push_dockerhub.yml new file mode 100644 index 00000000..a11ca9ad --- /dev/null +++ b/.github/workflows/push_dockerhub.yml @@ -0,0 +1,39 @@ +name: nf-core Docker push +# This builds the docker image and pushes it to DockerHub +# Runs on nf-core repo releases and push event to 'dev' branch (PR merges) +on: + push: + branches: + - dev + release: + types: [published] + +push_dockerhub: + name: Push new Docker image to Docker Hub + runs-on: ubuntu-latest + # Only run for the nf-core repo, for releases and merged PRs + if: ${{ github.repository == 'nf-core/rnafusion' }} + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Build new docker image + run: docker build --no-cache . -t nfcore/rnafusion:latest + + - name: Push Docker image to DockerHub (dev) + if: ${{ github.event_name == 'push' }} + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker tag nfcore/rnafusion:latest nfcore/rnafusion:dev + docker push nfcore/rnafusion:dev + + - name: Push Docker image to DockerHub (release) + if: ${{ github.event_name == 'release' }} + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker push nfcore/rnafusion:latest + docker tag nfcore/rnafusion:latest nfcore/rnafusion:${{ github.event.release.tag_name }} + docker push nfcore/rnafusion:${{ github.event.release.tag_name }} diff --git a/.gitignore b/.gitignore index 6354f370..aa4bb5b3 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ results/ .DS_Store tests/ testing/ +testing* *.pyc diff --git a/CHANGELOG.md b/CHANGELOG.md index 89cae718..06fdeeb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,11 @@ # nf-core/rnafusion: Changelog -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +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). -## vdev - [date] +## v1.2.0 - [date] -Initial release of nf-core/rnafusion, created with the [nf-core](http://nf-co.re/) template. +Initial release of nf-core/rnafusion, created with the [nf-core](https://nf-co.re/) template. ### `Added` diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index cf930c8a..405fb1bf 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -40,7 +40,7 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct/][version] -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ +[homepage]: https://contributor-covenant.org +[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct/ diff --git a/Dockerfile b/Dockerfile index c3748956..95e5d5f9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,17 @@ -FROM nfcore/base:1.9 +FROM nfcore/base:1.10.1 LABEL authors="Martin Proks" \ description="Docker image containing all software requirements for the nf-core/rnafusion pipeline" # Install the conda environment COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a +RUN conda env create --quiet -f /environment.yml && conda clean -a # Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-rnafusion-dev/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-rnafusion-1.2.0/bin:$PATH # Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-dev > nf-core-rnafusion-dev.yml +RUN conda env export --name nf-core-rnafusion-1.2.0 > nf-core-rnafusion-1.2.0.yml + +# Instruct R processes to use these empty files instead of clashing with a local version +RUN touch .Rprofile +RUN touch .Renviron diff --git a/README.md b/README.md index 183706e9..7f409297 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,9 @@ [![GitHub Actions Linting Status](https://github.com/nf-core/rnafusion/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/rnafusion/actions) [![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.10.0-brightgreen.svg)](https://www.nextflow.io/) -[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](http://bioconda.github.io/) +[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](https://bioconda.github.io/) [![Docker](https://img.shields.io/docker/automated/nfcore/rnafusion.svg)](https://hub.docker.com/r/nfcore/rnafusion) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23rnafusion-4A154B?logo=slack)](https://nfcore.slack.com/channels/rnafusion) ## Introduction @@ -15,40 +16,31 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool ## Quick Start -i. Install [`nextflow`](https://nf-co.re/usage/installation) +1. Install [`nextflow`](https://nf-co.re/usage/installation) -ii. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) for full pipeline reproducibility (please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles)) +2. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ -iii. Download the pipeline and test it on a minimal dataset with a single command +3. Download the pipeline and test it on a minimal dataset with a single command: -```bash -nextflow run nf-core/rnafusion -profile test, -``` + ```bash + nextflow run nf-core/rnafusion -profile test, + ``` -> Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. -iv. Start running your own analysis! +4. Start running your own analysis! - + -```bash -nextflow run nf-core/rnafusion -profile --reads '*_R{1,2}.fastq.gz' --genome GRCh37 -``` + ```bash + nextflow run nf-core/rnafusion -profile --input '*_R{1,2}.fastq.gz' --genome GRCh37 + ``` See [usage docs](docs/usage.md) for all of the available options when running the pipeline. ## Documentation -The nf-core/rnafusion pipeline comes with documentation about the pipeline, found in the `docs/` directory: - -1. [Installation](https://nf-co.re/usage/installation) -2. Pipeline configuration - * [Local installation](https://nf-co.re/usage/local_installation) - * [Adding your own system config](https://nf-co.re/usage/adding_own_config) - * [Reference genomes](https://nf-co.re/usage/reference_genomes) -3. [Running the pipeline](docs/usage.md) -4. [Output and how to interpret the results](docs/output.md) -5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) +The nf-core/rnafusion pipeline comes with documentation about the pipeline which you can read at [https://nf-core/rnafusion/docs](https://nf-core/rnafusion/docs) or find in the [`docs/` directory](docs). @@ -60,7 +52,7 @@ nf-core/rnafusion was originally written by Martin Proks. If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). -For further information or help, don't hesitate to get in touch on [Slack](https://nfcore.slack.com/channels/rnafusion) (you can join with [this invite](https://nf-co.re/join/slack)). +For further information or help, don't hesitate to get in touch on the [Slack `#rnafusion` channel](https://nfcore.slack.com/channels/rnafusion) (you can join with [this invite](https://nf-co.re/join/slack)). ## Citation @@ -73,5 +65,5 @@ You can cite the `nf-core` publication as follows: > > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > -> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). +> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). > ReadCube: [Full Access Link](https://rdcu.be/b1GjZ) diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py index 57cc4263..a26d1ff5 100755 --- a/bin/markdown_to_html.py +++ b/bin/markdown_to_html.py @@ -4,33 +4,23 @@ import markdown import os import sys +import io + def convert_markdown(in_fn): - input_md = open(in_fn, mode="r", encoding="utf-8").read() + input_md = io.open(in_fn, mode="r", encoding="utf-8").read() html = markdown.markdown( "[TOC]\n" + input_md, - extensions = [ - 'pymdownx.extra', - 'pymdownx.b64', - 'pymdownx.highlight', - 'pymdownx.emoji', - 'pymdownx.tilde', - 'toc' - ], - extension_configs = { - 'pymdownx.b64': { - 'base_path': os.path.dirname(in_fn) - }, - 'pymdownx.highlight': { - 'noclasses': True - }, - 'toc': { - 'title': 'Table of Contents' - } - } + extensions=["pymdownx.extra", "pymdownx.b64", "pymdownx.highlight", "pymdownx.emoji", "pymdownx.tilde", "toc"], + extension_configs={ + "pymdownx.b64": {"base_path": os.path.dirname(in_fn)}, + "pymdownx.highlight": {"noclasses": True}, + "toc": {"title": "Table of Contents"}, + }, ) return html + def wrap_html(contents): header = """ @@ -83,18 +73,19 @@ def wrap_html(contents): def parse_args(args=None): parser = argparse.ArgumentParser() - parser.add_argument('mdfile', type=argparse.FileType('r'), nargs='?', - help='File to convert. Defaults to stdin.') - parser.add_argument('-o', '--out', type=argparse.FileType('w'), - default=sys.stdout, - help='Output file name. Defaults to stdout.') + parser.add_argument("mdfile", type=argparse.FileType("r"), nargs="?", help="File to convert. Defaults to stdin.") + parser.add_argument( + "-o", "--out", type=argparse.FileType("w"), default=sys.stdout, help="Output file name. Defaults to stdout." + ) return parser.parse_args(args) + def main(args=None): args = parse_args(args) converted_md = convert_markdown(args.mdfile.name) html = wrap_html(converted_md) args.out.write(html) -if __name__ == '__main__': + +if __name__ == "__main__": sys.exit(main()) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index 283f73fa..981e8de6 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -5,16 +5,16 @@ # TODO nf-core: Add additional regexes for new tools in process get_software_versions regexes = { - 'nf-core/rnafusion': ['v_pipeline.txt', r"(\S+)"], - 'Nextflow': ['v_nextflow.txt', r"(\S+)"], - 'FastQC': ['v_fastqc.txt', r"FastQC v(\S+)"], - 'MultiQC': ['v_multiqc.txt', r"multiqc, version (\S+)"], + "nf-core/rnafusion": ["v_pipeline.txt", r"(\S+)"], + "Nextflow": ["v_nextflow.txt", r"(\S+)"], + "FastQC": ["v_fastqc.txt", r"FastQC v(\S+)"], + "MultiQC": ["v_multiqc.txt", r"multiqc, version (\S+)"], } results = OrderedDict() -results['nf-core/rnafusion'] = 'N/A' -results['Nextflow'] = 'N/A' -results['FastQC'] = 'N/A' -results['MultiQC'] = 'N/A' +results["nf-core/rnafusion"] = 'N/A' +results["Nextflow"] = 'N/A' +results["FastQC"] = 'N/A' +results["MultiQC"] = 'N/A' # Search each file using its regex for k, v in regexes.items(): @@ -30,10 +30,11 @@ # Remove software set to false in results for k in list(results): if not results[k]: - del(results[k]) + del results[k] # Dump to YAML -print (''' +print( + """ id: 'software_versions' section_name: 'nf-core/rnafusion Software Versions' section_href: 'https://github.com/nf-core/rnafusion' @@ -41,12 +42,13 @@ description: 'are collected at run time from the software output.' data: |
-''') -for k,v in results.items(): - print("
{}
{}
".format(k,v)) -print ("
") +""" +) +for k, v in results.items(): + print("
{}
{}
".format(k, v)) +print(" ") # Write out regexes as csv file: -with open('software_versions.csv', 'w') as f: - for k,v in results.items(): - f.write("{}\t{}\n".format(k,v)) +with open("software_versions.csv", "w") as f: + for k, v in results.items(): + f.write("{}\t{}\n".format(k, v)) diff --git a/conf/igenomes.config b/conf/igenomes.config index 2de92422..caeafceb 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -340,6 +340,7 @@ params { gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" mito_name = "chrM" + macs_gsize = "1.37e9" } 'dm6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" diff --git a/conf/test.config b/conf/test.config index 3112650d..c84e3197 100644 --- a/conf/test.config +++ b/conf/test.config @@ -19,7 +19,7 @@ params { // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed single_end = false - readPaths = [ + input_paths = [ ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] ] diff --git a/conf/test_full.config b/conf/test_full.config new file mode 100644 index 00000000..96b058e0 --- /dev/null +++ b/conf/test_full.config @@ -0,0 +1,22 @@ +/* + * ------------------------------------------------- + * Nextflow config file for running full-size tests + * ------------------------------------------------- + * Defines bundled input files and everything required + * to run a full size pipeline test. Use as follows: + * nextflow run nf-core/rnafusion -profile test_full, + */ + +params { + config_profile_name = 'Full test profile' + config_profile_description = 'Full test dataset to check pipeline function' + + // Input data for full size test + // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) + // TODO nf-core: Give any required params for the test so that command line flags are not needed + single_end = false + readPaths = [ + ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], + ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] + ] +} diff --git a/docs/README.md b/docs/README.md index 62f94b57..b8d76fa6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,12 +1,12 @@ # nf-core/rnafusion: Documentation -The nf-core/rnafusion documentation is split into the following files: - -1. [Installation](https://nf-co.re/usage/installation) -2. Pipeline configuration - * [Local installation](https://nf-co.re/usage/local_installation) - * [Adding your own system config](https://nf-co.re/usage/adding_own_config) - * [Reference genomes](https://nf-co.re/usage/reference_genomes) -3. [Running the pipeline](usage.md) -4. [Output and how to interpret the results](output.md) -5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) +The nf-core/rnafusion documentation is split into the following pages: + + + +* [Usage](usage.md) + * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. +* [Output](output.md) + * An overview of the different results produced by the pipeline and how to interpret them. + +You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/docs/output.md b/docs/output.md index 86dae502..0dbd4f72 100644 --- a/docs/output.md +++ b/docs/output.md @@ -2,6 +2,8 @@ This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. +The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. + ## Pipeline overview @@ -9,35 +11,47 @@ This document describes the output produced by the pipeline. Most of the plots a The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQC](#fastqc) - read quality control -* [MultiQC](#multiqc) - aggregate report, describing results of the whole pipeline +* [FastQC](#fastqc) - Read quality control +* [MultiQC](#multiqc) - Aggregate report describing results from the whole pipeline +* [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ## FastQC -[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%T/A/G/C). You get information about adapter contamination and other overrepresented sequences. +[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. -For further reading and documentation see the [FastQC help](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). +For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). -> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. To see how your reads look after trimming, look at the FastQC reports in the `trim_galore` directory. +**Output files:** -**Output directory: `results/fastqc`** +* `fastqc/` + * `*_fastqc.html`: FastQC report containing quality metrics for your untrimmed raw fastq files. +* `fastqc/zips/` + * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. -* `sample_fastqc.html` - * FastQC report, containing quality metrics for your untrimmed raw fastq files -* `zips/sample_fastqc.zip` - * zip file containing the FastQC report, tab-delimited data file and plot images +> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. ## MultiQC -[MultiQC](http://multiqc.info) is a visualisation tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in within the report data directory. +[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarizing all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. + +The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. + +For more information about how to use MultiQC reports, see [https://multiqc.info](https://multiqc.info). + +**Output files:** + +* `multiqc/` + * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. + * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. + * `multiqc_plots/`: directory containing static images from the report in various formats. -The pipeline has special steps which allow the software versions used to be reported in the MultiQC output for future traceability. +## Pipeline information -**Output directory: `results/multiqc`** +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. -* `Project_multiqc_report.html` - * MultiQC report - a standalone HTML file that can be viewed in your web browser -* `Project_multiqc_data/` - * Directory containing parsed statistics from the different tools used in the pipeline +**Output files:** -For more information about how to use MultiQC reports, see [http://multiqc.info](http://multiqc.info) +* `pipeline_info/` + * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.csv`. + * Documentation for interpretation of results in HTML format: `results_description.html`. diff --git a/docs/usage.md b/docs/usage.md index 94bf53a8..40c74e70 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,62 +1,15 @@ # nf-core/rnafusion: Usage -## Table of contents - -* [Table of contents](#table-of-contents) -* [Introduction](#introduction) -* [Running the pipeline](#running-the-pipeline) - * [Updating the pipeline](#updating-the-pipeline) - * [Reproducibility](#reproducibility) -* [Main arguments](#main-arguments) - * [`-profile`](#-profile) - * [`--reads`](#--reads) - * [`--single_end`](#--single_end) -* [Reference genomes](#reference-genomes) - * [`--genome` (using iGenomes)](#--genome-using-igenomes) - * [`--fasta`](#--fasta) - * [`--igenomes_ignore`](#--igenomes_ignore) -* [Job resources](#job-resources) - * [Automatic resubmission](#automatic-resubmission) - * [Custom resource requests](#custom-resource-requests) -* [AWS Batch specific parameters](#aws-batch-specific-parameters) - * [`--awsqueue`](#--awsqueue) - * [`--awsregion`](#--awsregion) - * [`--awscli`](#--awscli) -* [Other command line parameters](#other-command-line-parameters) - * [`--outdir`](#--outdir) - * [`--email`](#--email) - * [`--email_on_fail`](#--email_on_fail) - * [`--max_multiqc_email_size`](#--max_multiqc_email_size) - * [`-name`](#-name) - * [`-resume`](#-resume) - * [`-c`](#-c) - * [`--custom_config_version`](#--custom_config_version) - * [`--custom_config_base`](#--custom_config_base) - * [`--max_memory`](#--max_memory) - * [`--max_time`](#--max_time) - * [`--max_cpus`](#--max_cpus) - * [`--plaintext_email`](#--plaintext_email) - * [`--monochrome_logs`](#--monochrome_logs) - * [`--multiqc_config`](#--multiqc_config) - ## Introduction -Nextflow handles job submissions on SLURM or other environments, and supervises running the jobs. Thus the Nextflow process must run until the pipeline is finished. We recommend that you put the process running in the background through `screen` / `tmux` or similar tool. Alternatively you can run nextflow within a cluster job submitted your job scheduler. - -It is recommended to limit the Nextflow Java virtual machines memory. We recommend adding the following line to your environment (typically in `~/.bashrc` or `~./bash_profile`): - -```bash -NXF_OPTS='-Xms1g -Xmx4g' -``` - - + ## Running the pipeline The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/rnafusion --reads '*_R{1,2}.fastq.gz' -profile docker +nextflow run nf-core/rnafusion --input '*_R{1,2}.fastq.gz' -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -86,7 +39,9 @@ First, go to the [nf-core/rnafusion releases page](https://github.com/nf-core/rn This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. -## Main arguments +## Core Nextflow arguments + +> **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). ### `-profile` @@ -104,11 +59,11 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles. If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. * `docker` - * A generic configuration profile to be used with [Docker](http://docker.com/) - * Pulls software from dockerhub: [`nfcore/rnafusion`](http://hub.docker.com/r/nfcore/rnafusion/) + * A generic configuration profile to be used with [Docker](https://docker.com/) + * Pulls software from Docker Hub: [`nfcore/rnafusion`](https://hub.docker.com/r/nfcore/rnafusion/) * `singularity` - * A generic configuration profile to be used with [Singularity](http://singularity.lbl.gov/) - * Pulls software from DockerHub: [`nfcore/rnafusion`](http://hub.docker.com/r/nfcore/rnafusion/) + * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) + * Pulls software from Docker Hub: [`nfcore/rnafusion`](https://hub.docker.com/r/nfcore/rnafusion/) * `conda` * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker or Singularity. * A generic configuration profile to be used with [Conda](https://conda.io/docs/) @@ -117,215 +72,50 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof * A profile with a complete configuration for automated testing * Includes links to test data so needs no other parameters - - -### `--reads` - -Use this to specify the location of your input FastQ files. For example: - -```bash ---reads 'path/to/data/sample_*_{1,2}.fastq' -``` - -Please note the following requirements: - -1. The path must be enclosed in quotes -2. The path must have at least one `*` wildcard character -3. When using the pipeline with paired end data, the path must use `{1,2}` notation to specify read pairs. - -If left unspecified, a default pattern is used: `data/*{1,2}.fastq.gz` - -### `--single_end` - -By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--single_end` on the command line when you launch the pipeline. A normal glob pattern, enclosed in quotation marks, can then be used for `--reads`. For example: - -```bash ---single_end --reads '*.fastq' -``` - -It is not possible to run a mixture of single-end and paired-end files in one run. - -## Reference genomes - -The pipeline config files come bundled with paths to the illumina iGenomes reference index files. If running with docker or AWS, the configuration is set up to use the [AWS-iGenomes](https://ewels.github.io/AWS-iGenomes/) resource. - -### `--genome` (using iGenomes) +### `-resume` -There are 31 different species supported in the iGenomes references. To run the pipeline, you must specify which to use with the `--genome` flag. +Specify this when restarting a pipeline. Nextflow will used cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. -You can find the keys to specify the genomes in the [iGenomes config file](../conf/igenomes.config). Common genomes that are supported are: +You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. -* Human - * `--genome GRCh37` -* Mouse - * `--genome GRCm38` -* _Drosophila_ - * `--genome BDGP6` -* _S. cerevisiae_ - * `--genome 'R64-1-1'` +### `-c` -> There are numerous others - check the config file for more. +Specify the path to a specific config file (this is a core NextFlow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. -Note that you can use the same configuration setup to save sets of reference files for your own use, even if they are not part of the iGenomes resource. See the [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for instructions on where to save such a file. +#### Custom resource requests -The syntax for this reference configuration is as follows: +Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with an error code of `143` (exceeded requested resources) it will automatically resubmit with higher requests (2 x original, then 3 x original). If it still fails after three times then the pipeline is stopped. - +Whilst these default requirements will hopefully work for most people with most data, you may find that you want to customise the compute resources that the pipeline requests. You can do this by creating a custom config file. For example, to give the workflow process `star` 32GB of memory, you could use the following config: ```nextflow -params { - genomes { - 'GRCh37' { - fasta = '' // Used if no star index given - } - // Any number of additional genomes, key is used with --genome +process { + withName: star { + memory = 32.GB } } ``` - - -### `--fasta` - -If you prefer, you can specify the full path to your reference genome when you run the pipeline: - -```bash ---fasta '[path to Fasta reference]' -``` - -### `--igenomes_ignore` - -Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`. - -## Job resources - -### Automatic resubmission - -Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with an error code of `143` (exceeded requested resources) it will automatically resubmit with higher requests (2 x original, then 3 x original). If it still fails after three times then the pipeline is stopped. - -### Custom resource requests - -Wherever process-specific requirements are set in the pipeline, the default value can be changed by creating a custom config file. See the files hosted at [`nf-core/configs`](https://github.com/nf-core/configs/tree/master/conf) for examples. +See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information. If you are likely to be running `nf-core` pipelines regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter (see definition below). You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. -If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack). - -## AWS Batch specific parameters - -Running the pipeline on AWS Batch requires a couple of specific parameters to be set according to your AWS Batch configuration. Please use [`-profile awsbatch`](https://github.com/nf-core/configs/blob/master/conf/awsbatch.config) and then specify all of the following parameters. - -### `--awsqueue` - -The JobQueue that you intend to use on AWS Batch. +If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -### `--awsregion` +### Running in the background -The AWS region in which to run your job. Default is set to `eu-west-1` but can be adjusted to your needs. +Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. -### `--awscli` +The Nextflow `-bg` flag launches Nextflow in the background, detached from your terminal so that the workflow does not stop if you log out of your session. The logs are saved to a file. -The [AWS CLI](https://www.nextflow.io/docs/latest/awscloud.html#aws-cli-installation) path in your custom AMI. Default: `/home/ec2-user/miniconda/bin/aws`. +Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. +Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). -Please make sure to also set the `-w/--work-dir` and `--outdir` parameters to a S3 storage bucket of your choice - you'll get an error message notifying you if you didn't. +#### Nextflow memory requirements -## Other command line parameters - - - -### `--outdir` - -The output directory where the results will be saved. - -### `--email` - -Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run. - -### `--email_on_fail` - -This works exactly as with `--email`, except emails are only sent if the workflow is not successful. - -### `--max_multiqc_email_size` - -Threshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB). - -### `-name` - -Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic. - -This is used in the MultiQC report (if not default) and in the summary HTML / e-mail (always). - -**NB:** Single hyphen (core Nextflow option) - -### `-resume` - -Specify this when restarting a pipeline. Nextflow will used cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. - -You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. - -**NB:** Single hyphen (core Nextflow option) - -### `-c` - -Specify the path to a specific config file (this is a core NextFlow command). - -**NB:** Single hyphen (core Nextflow option) - -Note - you can use this to override pipeline defaults. - -### `--custom_config_version` - -Provide git commit id for custom Institutional configs hosted at `nf-core/configs`. This was implemented for reproducibility purposes. Default: `master`. - -```bash -## Download and use config file with following git commid id ---custom_config_version d52db660777c4bf36546ddb188ec530c3ada1b96 -``` - -### `--custom_config_base` - -If you're running offline, nextflow will not be able to fetch the institutional config files -from the internet. If you don't need them, then this is not a problem. If you do need them, -you should download the files from the repo and tell nextflow where to find them with the -`custom_config_base` option. For example: +In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. +We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): ```bash -## Download and unzip the config files -cd /path/to/my/configs -wget https://github.com/nf-core/configs/archive/master.zip -unzip master.zip - -## Run the pipeline -cd /path/to/my/data -nextflow run /path/to/pipeline/ --custom_config_base /path/to/my/configs/configs-master/ +NXF_OPTS='-Xms1g -Xmx4g' ``` - -> Note that the nf-core/tools helper package has a `download` command to download all required pipeline -> files + singularity containers + institutional configs in one go for you, to make this process easier. - -### `--max_memory` - -Use to set a top-limit for the default memory requirement for each process. -Should be a string in the format integer-unit. eg. `--max_memory '8.GB'` - -### `--max_time` - -Use to set a top-limit for the default time requirement for each process. -Should be a string in the format integer-unit. eg. `--max_time '2.h'` - -### `--max_cpus` - -Use to set a top-limit for the default CPU requirement for each process. -Should be a string in the format integer-unit. eg. `--max_cpus 1` - -### `--plaintext_email` - -Set to receive plain-text e-mails instead of HTML formatted. - -### `--monochrome_logs` - -Set to disable colourful command line output and live life in monochrome. - -### `--multiqc_config` - -Specify a path to a custom MultiQC configuration file. diff --git a/environment.yml b/environment.yml index 2be75611..5191a7a3 100644 --- a/environment.yml +++ b/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-rnafusion-dev +name: nf-core-rnafusion-1.2.0 channels: - conda-forge - bioconda diff --git a/main.nf b/main.nf index d7801386..bd2a1b35 100644 --- a/main.nf +++ b/main.nf @@ -18,12 +18,12 @@ def helpMessage() { The typical command for running the pipeline is as follows: - nextflow run nf-core/rnafusion --reads '*_R{1,2}.fastq.gz' -profile docker + nextflow run nf-core/rnafusion --input '*_R{1,2}.fastq.gz' -profile docker Mandatory arguments: - --reads [file] Path to input data (must be surrounded with quotes) - -profile [str] Configuration profile to use. Can use multiple (comma separated) - Available: conda, docker, singularity, test, awsbatch, and more + --input [file] Path to input data (must be surrounded with quotes) + -profile [str] Configuration profile to use. Can use multiple (comma separated) + Available: conda, docker, singularity, test, awsbatch, and more Options: --genome [str] Name of iGenomes reference @@ -34,9 +34,10 @@ def helpMessage() { Other options: --outdir [file] The output directory where the results will be saved + --publish_dir_mode [str] Mode for publishing results in the output directory. Available: symlink, rellink, link, copy, copyNoFollow, move (Default: copy) --email [email] Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits --email_on_fail [email] Same as --email, except only send mail if the workflow is not successful - --max_multiqc_email_size [str] Theshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB) + --max_multiqc_email_size [str] Threshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB) -name [str] Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic AWSBatch options: @@ -73,12 +74,13 @@ params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : if (params.fasta) { ch_fasta = file(params.fasta, checkIfExists: true) } // Has the run name been specified by the user? -// this has the bonus effect of catching both -name and --name +// this has the bonus effect of catching both -name and --name custom_runName = params.name if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { custom_runName = workflow.runName } +// Check AWS batch settings if (workflow.profile.contains('awsbatch')) { // AWSBatch sanity checking if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" @@ -93,28 +95,29 @@ if (workflow.profile.contains('awsbatch')) { ch_multiqc_config = file("$baseDir/assets/multiqc_config.yaml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true) : Channel.empty() ch_output_docs = file("$baseDir/docs/output.md", checkIfExists: true) +ch_output_docs_images = file("$baseDir/docs/images/", checkIfExists: true) /* * Create a channel for input read files */ -if (params.readPaths) { +if (params.input_paths) { if (params.single_end) { Channel - .from(params.readPaths) + .from(params.input_paths) .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true) ] ] } - .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } + .ifEmpty { exit 1, "params.input_paths was empty - no input files supplied" } .into { ch_read_files_fastqc; ch_read_files_trimming } } else { Channel - .from(params.readPaths) + .from(params.input_paths) .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true), file(row[1][1], checkIfExists: true) ] ] } - .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } + .ifEmpty { exit 1, "params.input_paths was empty - no input files supplied" } .into { ch_read_files_fastqc; ch_read_files_trimming } } } else { Channel - .fromFilePairs(params.reads, size: params.single_end ? 1 : 2) - .ifEmpty { exit 1, "Cannot find any reads matching: ${params.reads}\nNB: Path needs to be enclosed in quotes!\nIf this is single-end data, please specify --single_end on the command line." } + .fromFilePairs(params.input, size: params.single_end ? 1 : 2) + .ifEmpty { exit 1, "Cannot find any reads matching: ${params.input}\nNB: Path needs to be enclosed in quotes!\nIf this is single-end data, please specify --single_end on the command line." } .into { ch_read_files_fastqc; ch_read_files_trimming } } @@ -124,7 +127,7 @@ def summary = [:] if (workflow.revision) summary['Pipeline Release'] = workflow.revision summary['Run Name'] = custom_runName ?: workflow.runName // TODO nf-core: Report custom parameters here -summary['Reads'] = params.reads +summary['Reads'] = params.input summary['Fasta Ref'] = params.fasta summary['Data Type'] = params.single_end ? 'Single-End' : 'Paired-End' summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" @@ -140,9 +143,10 @@ if (workflow.profile.contains('awsbatch')) { summary['AWS CLI'] = params.awscli } summary['Config Profile'] = workflow.profile -if (params.config_profile_description) summary['Config Description'] = params.config_profile_description -if (params.config_profile_contact) summary['Config Contact'] = params.config_profile_contact -if (params.config_profile_url) summary['Config URL'] = params.config_profile_url +if (params.config_profile_description) summary['Config Profile Description'] = params.config_profile_description +if (params.config_profile_contact) summary['Config Profile Contact'] = params.config_profile_contact +if (params.config_profile_url) summary['Config Profile URL'] = params.config_profile_url +summary['Config Files'] = workflow.configFiles.join(', ') if (params.email || params.email_on_fail) { summary['E-mail Address'] = params.email summary['E-mail on failure'] = params.email_on_fail @@ -174,7 +178,7 @@ Channel.from(summary.collect{ [it.key, it.value] }) * Parse software version numbers */ process get_software_versions { - publishDir "${params.outdir}/pipeline_info", mode: 'copy', + publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode, saveAs: { filename -> if (filename.indexOf(".csv") > 0) filename else null @@ -201,7 +205,7 @@ process get_software_versions { process fastqc { tag "$name" label 'process_medium' - publishDir "${params.outdir}/fastqc", mode: 'copy', + publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, saveAs: { filename -> filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename" } @@ -222,7 +226,7 @@ process fastqc { * STEP 2 - MultiQC */ process multiqc { - publishDir "${params.outdir}/MultiQC", mode: 'copy' + publishDir "${params.outdir}/MultiQC", mode: params.publish_dir_mode input: file (multiqc_config) from ch_multiqc_config @@ -251,10 +255,11 @@ process multiqc { * STEP 3 - Output Description HTML */ process output_documentation { - publishDir "${params.outdir}/pipeline_info", mode: 'copy' + publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode input: file output_docs from ch_output_docs + file images from ch_output_docs_images output: file "results_description.html" @@ -345,7 +350,11 @@ workflow.onComplete { log.info "[nf-core/rnafusion] Sent summary e-mail to $email_address (sendmail)" } catch (all) { // Catch failures and try with plaintext - [ 'mail', '-s', subject, email_address ].execute() << email_txt + def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] + if ( mqc_report.size() <= params.max_multiqc_email_size.toBytes() ) { + mail_cmd += [ '-A', mqc_report ] + } + mail_cmd.execute() << email_html log.info "[nf-core/rnafusion] Sent summary e-mail to $email_address (mail)" } } diff --git a/nextflow.config b/nextflow.config index 49451c6c..2906b885 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,9 +11,10 @@ params { // Workflow flags // TODO nf-core: Specify your pipeline's command line flags genome = false - reads = "data/*{1,2}.fastq.gz" + input = "data/*{1,2}.fastq.gz" single_end = false outdir = './results' + publish_dir_mode = 'copy' // Boilerplate options name = false @@ -78,9 +79,11 @@ if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' } -// Export this variable to prevent local Python libraries from conflicting with those in the container +// Export these variables to prevent local Python/R libraries from conflicting with those in the container env { PYTHONNOUSERSITE = 1 + R_PROFILE_USER = "/.Rprofile" + R_ENVIRON_USER = "/.Renviron" } // Capture exit codes from upstream processes when piping @@ -110,7 +113,7 @@ manifest { description = 'Nextflow rnafusion analysis pipeline, part of the nf-core community.' mainScript = 'main.nf' nextflowVersion = '>=19.10.0' - version = 'dev' + version = '1.2.0' } // Function to ensure that resource requirements don't go beyond diff --git a/nextflow_schema.json b/nextflow_schema.json new file mode 100644 index 00000000..abf782b6 --- /dev/null +++ b/nextflow_schema.json @@ -0,0 +1,259 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "$id": "https://raw.githubusercontent.com/nf-core/rnafusion/master/nextflow_schema.json", + "title": "nf-core/rnafusion pipeline parameters", + "description": "Nextflow rnafusion analysis pipeline, part of the nf-core community.", + "type": "object", + "definitions": { + "input_output_options": { + "title": "Input/output options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data.", + "required": [ + "input" + ], + "properties": { + "input": { + "type": "string", + "fa_icon": "fas fa-dna", + "description": "Input FastQ files.", + "help_text": "Use this to specify the location of your input FastQ files. For example:\n\n```bash\n--input 'path/to/data/sample_*_{1,2}.fastq'\n```\n\nPlease note the following requirements:\n\n1. The path must be enclosed in quotes\n2. The path must have at least one `*` wildcard character\n3. When using the pipeline with paired end data, the path must use `{1,2}` notation to specify read pairs.\n\nIf left unspecified, a default pattern is used: `data/*{1,2}.fastq.gz`" + }, + "single_end": { + "type": "boolean", + "description": "Specifies that the input is single-end reads.", + "fa_icon": "fas fa-align-center", + "help_text": "By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--single_end` on the command line when you launch the pipeline. A normal glob pattern, enclosed in quotation marks, can then be used for `--input`. For example:\n\n```bash\n--single_end --input '*.fastq'\n```\n\nIt is not possible to run a mixture of single-end and paired-end files in one run." + }, + "outdir": { + "type": "string", + "description": "The output directory where the results will be saved.", + "default": "./results", + "fa_icon": "fas fa-folder-open" + }, + "email": { + "type": "string", + "description": "Email address for completion summary.", + "fa_icon": "fas fa-envelope", + "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", + "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" + } + } + }, + "reference_genome_options": { + "title": "Reference genome options", + "type": "object", + "fa_icon": "fas fa-dna", + "description": "Options for the reference genome indices used to align reads.", + "properties": { + "genome": { + "type": "string", + "description": "Name of iGenomes reference.", + "fa_icon": "fas fa-book", + "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`.\n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." + }, + "fasta": { + "type": "string", + "fa_icon": "fas fa-font", + "description": "Path to FASTA genome file.", + "help_text": "If you have no genome reference available, the pipeline can build one using a FASTA file. This requires additional time and resources, so it's better to use a pre-build index if possible." + }, + "igenomes_base": { + "type": "string", + "description": "Directory / URL base for iGenomes references.", + "default": "s3://ngi-igenomes/igenomes/", + "fa_icon": "fas fa-cloud-download-alt", + "hidden": true + }, + "igenomes_ignore": { + "type": "boolean", + "description": "Do not load the iGenomes reference config.", + "fa_icon": "fas fa-ban", + "hidden": true, + "help_text": "Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`." + } + } + }, + "generic_options": { + "title": "Generic options", + "type": "object", + "fa_icon": "fas fa-file-import", + "description": "Less common options for the pipeline, typically set in a config file.", + "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", + "properties": { + "help": { + "type": "boolean", + "description": "Display help text.", + "hidden": true, + "fa_icon": "fas fa-question-circle" + }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "hidden": true, + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "mov" + ] + }, + "name": { + "type": "string", + "description": "Workflow name.", + "fa_icon": "fas fa-fingerprint", + "hidden": true, + "help_text": "A custom name for the pipeline run. Unlike the core nextflow `-name` option with one hyphen this parameter can be reused multiple times, for example if using `-resume`. Passed through to steps such as MultiQC and used for things like report filenames and titles." + }, + "email_on_fail": { + "type": "string", + "description": "Email address for completion summary, only when pipeline fails.", + "fa_icon": "fas fa-exclamation-triangle", + "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$", + "hidden": true, + "help_text": "This works exactly as with `--email`, except emails are only sent if the workflow is not successful." + }, + "plaintext_email": { + "type": "boolean", + "description": "Send plain-text email instead of HTML.", + "fa_icon": "fas fa-remove-format", + "hidden": true, + "help_text": "Set to receive plain-text e-mails instead of HTML formatted." + }, + "max_multiqc_email_size": { + "type": "string", + "description": "File size limit when attaching MultiQC reports to summary emails.", + "default": "25.MB", + "fa_icon": "fas fa-file-upload", + "hidden": true, + "help_text": "If file generated by pipeline exceeds the threshold, it will not be attached." + }, + "monochrome_logs": { + "type": "boolean", + "description": "Do not use coloured log outputs.", + "fa_icon": "fas fa-palette", + "hidden": true, + "help_text": "Set to disable colourful command line output and live life in monochrome." + }, + "multiqc_config": { + "type": "string", + "description": "Custom config file to supply to MultiQC.", + "fa_icon": "fas fa-cog", + "hidden": true + }, + "tracedir": { + "type": "string", + "description": "Directory to keep pipeline Nextflow logs and reports.", + "default": "${params.outdir}/pipeline_info", + "fa_icon": "fas fa-cogs", + "hidden": true + } + } + }, + "max_job_request_options": { + "title": "Max job request options", + "type": "object", + "fa_icon": "fab fa-acquisitions-incorporated", + "description": "Set the top limit for requested resources for any single job.", + "help_text": "If you are running on a smaller system, a pipeline step requesting more resources than are available may cause the Nextflow to stop the run with an error. These options allow you to cap the maximum resources requested by any single job so that the pipeline will run on your system.\n\nNote that you can not _increase_ the resources requested by any job using these options. For that you will need your own configuration file. See [the nf-core website](https://nf-co.re/usage/configuration) for details.", + "properties": { + "max_cpus": { + "type": "integer", + "description": "Maximum number of CPUs that can be requested for any single job.", + "default": 16, + "fa_icon": "fas fa-microchip", + "hidden": true, + "help_text": "Use to set an upper-limit for the CPU requirement for each process. Should be an integer e.g. `--max_cpus 1`" + }, + "max_memory": { + "type": "string", + "description": "Maximum amount of memory that can be requested for any single job.", + "default": "128.GB", + "fa_icon": "fas fa-memory", + "hidden": true, + "help_text": "Use to set an upper-limit for the memory requirement for each process. Should be a string in the format integer-unit e.g. `--max_memory '8.GB'`" + }, + "max_time": { + "type": "string", + "description": "Maximum amount of time that can be requested for any single job.", + "default": "240.h", + "fa_icon": "far fa-clock", + "hidden": true, + "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" + } + } + }, + "institutional_config_options": { + "title": "Institutional config options", + "type": "object", + "fa_icon": "fas fa-university", + "description": "Parameters used to describe centralised config profiles. These should not be edited.", + "help_text": "The centralised nf-core configuration profiles use a handful of pipeline parameters to describe themselves. This information is then printed to the Nextflow log when you run a pipeline. You should not need to change these values when you run a pipeline.", + "properties": { + "custom_config_version": { + "type": "string", + "description": "Git commit id for Institutional configs.", + "default": "master", + "hidden": true, + "fa_icon": "fas fa-users-cog", + "help_text": "Provide git commit id for custom Institutional configs hosted at `nf-core/configs`. This was implemented for reproducibility purposes. Default: `master`.\n\n```bash\n## Download and use config file with following git commit id\n--custom_config_version d52db660777c4bf36546ddb188ec530c3ada1b96\n```" + }, + "custom_config_base": { + "type": "string", + "description": "Base directory for Institutional configs.", + "default": "https://raw.githubusercontent.com/nf-core/configs/master", + "hidden": true, + "help_text": "If you're running offline, nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell nextflow where to find them with the `custom_config_base` option. For example:\n\n```bash\n## Download and unzip the config files\ncd /path/to/my/configs\nwget https://github.com/nf-core/configs/archive/master.zip\nunzip master.zip\n\n## Run the pipeline\ncd /path/to/my/data\nnextflow run /path/to/pipeline/ --custom_config_base /path/to/my/configs/configs-master/\n```\n\n> Note that the nf-core/tools helper package has a `download` command to download all required pipeline files + singularity containers + institutional configs in one go for you, to make this process easier.", + "fa_icon": "fas fa-users-cog" + }, + "hostnames": { + "type": "string", + "description": "Institutional configs hostname.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "config_profile_description": { + "type": "string", + "description": "Institutional config description.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "config_profile_contact": { + "type": "string", + "description": "Institutional config contact information.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "config_profile_url": { + "type": "string", + "description": "Institutional config URL link.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/input_output_options" + }, + { + "$ref": "#/definitions/reference_genome_options" + }, + { + "$ref": "#/definitions/generic_options" + }, + { + "$ref": "#/definitions/max_job_request_options" + }, + { + "$ref": "#/definitions/institutional_config_options" + } + ] +} From 61ea7f7f469811e4adc3c7844ef270316cb48756 Mon Sep 17 00:00:00 2001 From: brucemoran Date: Fri, 31 Jul 2020 10:13:04 +0100 Subject: [PATCH 003/359] Suggested changes --- docs/output.md | 4 +++- docs/usage.md | 6 ++++-- download-references.nf | 26 +++++++++----------------- main.nf | 2 +- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/docs/output.md b/docs/output.md index 436ef45d..ec1be97b 100644 --- a/docs/output.md +++ b/docs/output.md @@ -155,7 +155,9 @@ For more info and help check [wiki page](https://github.com/FusionInspector/Fusi - filtered list of found fusions (uses tool cutoff as filter, by default: 2, can be adjusted by adding `-t ` when running the tool) - `fusions_list.txt` - unfiltered list of found fusions - +- `_fusion-report.tar.gz` + - tarball of the above files to allow easier import to local machine(s) for visualisation through browser + ### Tool detection Graphs displaying ratio of fusion genes caught by different tools. The last part *all tools* is an intersection of all tools. diff --git a/docs/usage.md b/docs/usage.md index 594c56d7..6f33b700 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -226,7 +226,8 @@ If enabled, executes `Ericscript` tool. ### `--fusioncatcher` -If enabled, executes `Fusioncatcher` tool. N.B. that Fusioncatcher is not available when using the `GRCh37` genome assembly. +If enabled, executes `Fusioncatcher` tool. +> N.B. that Fusioncatcher is not available when using the `GRCh37` genome assembly. - `--fusioncatcher_opt` - Specify additional parameters. For more info, please refer to the [documentation](https://github.com/ndaniel/fusioncatcher/blob/master/doc/manual.md) of the tool. @@ -308,7 +309,8 @@ Required reference in order to run `Fusioncatcher`. ### `--genome` -This pipeline uses `Homo Sapiens` version `GRCh38` by default. Assembly `GRCh37` is optionally available. N.B. that using `GRCh37` precludes use of the `Fusioncatcher` tool. Also make sure to specify `--genomes_base`. +This pipeline uses `Homo Sapiens` version `GRCh38` by default. Assembly `GRCh37` is optionally available. +> N.B. that using `GRCh37` precludes use of the `Fusioncatcher` tool. Also make sure to specify `--genomes_base`. ```bash --genome 'GRCh38' --genome_base '/path/to/references' diff --git a/download-references.nf b/download-references.nf index 9e2d62fe..4dd34b66 100644 --- a/download-references.nf +++ b/download-references.nf @@ -98,18 +98,14 @@ process download_base { file "Homo_sapiens.${params.genome}_r${params.reference_release}.cdna.all.fa.gz" into transcript script: + def base_url = params.genome == "GRCh37" ? "ftp://ftp.ensembl.org/pub/grch37" : "ftp://ftp.ensembl.org/pub/" """ - if [[ ${params.genome} == "GRCh37" ]];then - BASEURL="ftp://ftp.ensembl.org/pub/grch37" - else - BASEURL="ftp://ftp.ensembl.org/pub" - fi - wget \$BASEURL/release-${params.reference_release}/fasta/homo_sapiens/dna/Homo_sapiens.${params.genome}.dna.chromosome.{1..22}.fa.gz - wget \$BASEURL/release-${params.reference_release}/fasta/homo_sapiens/dna/Homo_sapiens.${params.genome}.dna.chromosome.{MT,X,Y}.fa.gz + wget ${base_url}/release-${params.reference_release}/fasta/homo_sapiens/dna/Homo_sapiens.${params.genome}.dna.chromosome.{1..22}.fa.gz + wget ${base_url}/release-${params.reference_release}/fasta/homo_sapiens/dna/Homo_sapiens.${params.genome}.dna.chromosome.{MT,X,Y}.fa.gz gunzip -c Homo_sapiens.${params.genome}.dna.chromosome.* > Homo_sapiens.${params.genome}_r${params.reference_release}.all.fa - wget \$BASEURL/release-${params.reference_release}/gtf/homo_sapiens/Homo_sapiens.${params.genome}.*.chr.gtf.gz -O Homo_sapiens.${params.genome}_r${params.reference_release}.gtf.gz + wget ${base_url}/release-${params.reference_release}/gtf/homo_sapiens/Homo_sapiens.${params.genome}.${params.reference_release}.chr.gtf.gz -O Homo_sapiens.${params.genome}_r${params.reference_release}.gtf.gz gunzip Homo_sapiens.${params.genome}_r${params.reference_release}.gtf.gz - wget \$BASEURL/release-${params.reference_release}/fasta/homo_sapiens/cdna/Homo_sapiens.${params.genome}.cdna.all.fa.gz -O Homo_sapiens.${params.genome}_r${params.reference_release}.cdna.all.fa.gz + wget ${base_url}/release-${params.reference_release}/fasta/homo_sapiens/cdna/Homo_sapiens.${params.genome}.cdna.all.fa.gz -O Homo_sapiens.${params.genome}_r${params.reference_release}.cdna.all.fa.gz """ } @@ -186,23 +182,19 @@ process download_ericscript { file '*' script: + def base_url = params.genome == "GRCh37" ? "https://drive.google.com/uc?export=download&confirm=qgOc&id=0B9s__vuJPvIibDRIb0RFdHFlQmM" : "https://drive.google.com/uc?export=download&confirm=qgOc&id=0B9s__vuJPvIiUGt1SnFMZFg4TlE" """ - wget -N https://raw.githubusercontent.com/circulosmeos/gdown.pl/dfd6dc910a38a42d550397bb5c2335be2c4bcf54/gdown.pl - chmod +x gdown.pl if [[ ${params.genome} == "GRCh37" ]]; then - ./gdown.pl "https://drive.google.com/uc?export=download&confirm=qgOc&id=0B9s__vuJPvIibDRIb0RFdHFlQmM" ericscript_db_homosapiens_ensembl73.tar.bz2 - tar jxf ericscript_db_homosapiens_ensembl73.tar.bz2 + gdown ${base_url} ericscript_db_homosapiens_ensembl73.tar.bz2 else - ./gdown.pl "https://drive.google.com/uc?export=download&confirm=qgOc&id=0B9s__vuJPvIiUGt1SnFMZFg4TlE" ericscript_db_homosapiens_ensembl84.tar.bz2 - tar jxf ericscript_db_homosapiens_ensembl84.tar.bz2 + gdown ${base_url} ericscript_db_homosapiens_ensembl84.tar.bz2 fi - rm gdown.pl ericscript_db_homosapiens_ensembl*.tar.bz2 + tar jxf ericscript_db_homosapiens_ensembl*.tar.bz2 && rm ericscript_db_homosapiens_ensembl*.tar.bz2 """ } process download_databases { publishDir "${params.outdir}/databases", mode: 'copy' - executor 'local' when: params.fusion_report || params.download_all diff --git a/main.nf b/main.nf index 7d9f46aa..ad5e39b2 100644 --- a/main.nf +++ b/main.nf @@ -691,7 +691,7 @@ process arriba_visualization { def suff_mem = ("${(task.memory.toBytes() - 6000000000) / task.cpus}" > 2000000000) ? 'true' : 'false' def avail_mem = (task.memory && suff_mem) ? "-m" + "${(task.memory.toBytes() - 6000000000) / task.cpus}" : '' cytobands = "${reference}/cytobands*${params.genome}*.tsv" - proteinDomains = "${reference}/protein_domains*${params.genome}*gff3" + proteinDomains = "${reference}/protein_domains*${params.genome}*.gff3" """ samtools sort -@ ${task.cpus} ${avail_mem} -O bam ${bam} > Aligned.sortedByCoord.out.bam samtools index Aligned.sortedByCoord.out.bam From 4e9c3fd9bf97d1440233eb50d8e71e92485f5032 Mon Sep 17 00:00:00 2001 From: brucemoran Date: Fri, 31 Jul 2020 10:31:04 +0100 Subject: [PATCH 004/359] Add gdown to conda env --- environment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/environment.yml b/environment.yml index 645b707a..8aa9d651 100644 --- a/environment.yml +++ b/environment.yml @@ -11,6 +11,7 @@ dependencies: - conda-forge::pymdown-extensions=6.0 - conda-forge::pygments=2.5.2 # Necessary tools + - conda-forge::gdown=3.12.0 - bioconda::fastqc=0.11.8 - bioconda::multiqc=1.7 # Custom packages From 504e037418ea0ed39e459a884120848eac0fcaeb Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Fri, 31 Jul 2020 13:25:07 +0200 Subject: [PATCH 005/359] Template update for nf-core/tools version 1.10.2 --- .github/CONTRIBUTING.md | 2 +- .github/workflows/awsfulltest.yml | 2 +- .github/workflows/branch.yml | 1 + .github/workflows/linting.yml | 9 ++++- .github/workflows/push_dockerhub.yml | 53 ++++++++++++++-------------- Dockerfile | 2 +- conf/test_full.config | 2 +- docs/usage.md | 2 +- main.nf | 2 +- 9 files changed, 42 insertions(+), 33 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e97e0285..e73e69c7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -46,7 +46,7 @@ These tests are run both with the latest available version of `Nextflow` and als ## Patch -: warning: Only in the unlikely and regretful event of a release happening with a bug. +:warning: Only in the unlikely and regretful event of a release happening with a bug. * On your own fork, make a new branch `patch` based on `upstream/master`. * Fix the bug, and bump version (X.Y.Z+1). diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index f486dc8b..106c1db0 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -21,7 +21,7 @@ jobs: run: conda install -c conda-forge awscli - name: Start AWS batch job # TODO nf-core: You can customise AWS full pipeline tests as required - # Add full size test data (but still relatively small datasets for few samples) + # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command env: diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 033f5230..eda35177 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -17,6 +17,7 @@ jobs: # If the above check failed, post a comment on the PR explaining the failure + # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets - name: Post PR comment if: failure() uses: mshick/add-pr-comment@v1 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index eb66c144..8e8d5bbc 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -57,5 +57,12 @@ jobs: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core lint ${GITHUB_WORKSPACE} + run: nf-core -l lint_log.txt lint ${GITHUB_WORKSPACE} + + - name: Upload linting log file artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: linting-log-file + path: lint_log.txt diff --git a/.github/workflows/push_dockerhub.yml b/.github/workflows/push_dockerhub.yml index a11ca9ad..44440ece 100644 --- a/.github/workflows/push_dockerhub.yml +++ b/.github/workflows/push_dockerhub.yml @@ -8,32 +8,33 @@ on: release: types: [published] -push_dockerhub: - name: Push new Docker image to Docker Hub - runs-on: ubuntu-latest - # Only run for the nf-core repo, for releases and merged PRs - if: ${{ github.repository == 'nf-core/rnafusion' }} - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 +jobs: + push_dockerhub: + name: Push new Docker image to Docker Hub + runs-on: ubuntu-latest + # Only run for the nf-core repo, for releases and merged PRs + if: ${{ github.repository == 'nf-core/rnafusion' }} + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 - - name: Build new docker image - run: docker build --no-cache . -t nfcore/rnafusion:latest + - name: Build new docker image + run: docker build --no-cache . -t nfcore/rnafusion:latest - - name: Push Docker image to DockerHub (dev) - if: ${{ github.event_name == 'push' }} - run: | - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker tag nfcore/rnafusion:latest nfcore/rnafusion:dev - docker push nfcore/rnafusion:dev + - name: Push Docker image to DockerHub (dev) + if: ${{ github.event_name == 'push' }} + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker tag nfcore/rnafusion:latest nfcore/rnafusion:dev + docker push nfcore/rnafusion:dev - - name: Push Docker image to DockerHub (release) - if: ${{ github.event_name == 'release' }} - run: | - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker push nfcore/rnafusion:latest - docker tag nfcore/rnafusion:latest nfcore/rnafusion:${{ github.event.release.tag_name }} - docker push nfcore/rnafusion:${{ github.event.release.tag_name }} + - name: Push Docker image to DockerHub (release) + if: ${{ github.event_name == 'release' }} + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker push nfcore/rnafusion:latest + docker tag nfcore/rnafusion:latest nfcore/rnafusion:${{ github.event.release.tag_name }} + docker push nfcore/rnafusion:${{ github.event.release.tag_name }} diff --git a/Dockerfile b/Dockerfile index 95e5d5f9..d5c21ebd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.10.1 +FROM nfcore/base:1.10.2 LABEL authors="Martin Proks" \ description="Docker image containing all software requirements for the nf-core/rnafusion pipeline" diff --git a/conf/test_full.config b/conf/test_full.config index 96b058e0..64a344d4 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,7 +15,7 @@ params { // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) // TODO nf-core: Give any required params for the test so that command line flags are not needed single_end = false - readPaths = [ + input_paths = [ ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] ] diff --git a/docs/usage.md b/docs/usage.md index 40c74e70..0c4db52b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -80,7 +80,7 @@ You can also supply a run name to resume a specific run: `-resume [run-name]`. U ### `-c` -Specify the path to a specific config file (this is a core NextFlow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. +Specify the path to a specific config file (this is a core Nextflow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. #### Custom resource requests diff --git a/main.nf b/main.nf index bd2a1b35..5d283978 100644 --- a/main.nf +++ b/main.nf @@ -127,7 +127,7 @@ def summary = [:] if (workflow.revision) summary['Pipeline Release'] = workflow.revision summary['Run Name'] = custom_runName ?: workflow.runName // TODO nf-core: Report custom parameters here -summary['Reads'] = params.input +summary['Input'] = params.input summary['Fasta Ref'] = params.fasta summary['Data Type'] = params.single_end ? 'Single-End' : 'Paired-End' summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" From f510a3385dd69e089b7c75ed07facf4c04b5f246 Mon Sep 17 00:00:00 2001 From: brucemoran Date: Sat, 1 Aug 2020 21:55:15 +0100 Subject: [PATCH 006/359] Add GRCh37 to build-ctat.nf, update references.md to reflect this option to use Ensembl annotation with STAR-Fusion --- build-ctat.nf | 14 ++++++++------ docs/references.md | 7 +++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/build-ctat.nf b/build-ctat.nf index b8b46f78..6f5dfa78 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -29,6 +29,7 @@ def helpMessage() { Mandatory arguments: --fasta [file] Path to fasta reference --gtf [file] Path to GTF annotation + --genome [str] Either "GRCh37" or "GRCh38" (default) --outdir [path] Output directory for downloading -profile [str] Configuration profile [https://github.com/nf-core/configs] """.stripIndent() @@ -73,22 +74,23 @@ checkHostname() process star_fusion { label 'process_high' label 'process_long' - publishDir "${params.outdir}", mode: 'copy' + publishDir "${params.outdir}/star-fusion", mode: 'move' input: file(fasta) from ch_fasta file(gtf) from ch_gtf output: - file '*' + file 'ctat_genome_lib_build_dir/' script: + def ctat_url = params.genome == "GRCh37" ? "https://github.com/FusionAnnotator/CTAT_HumanFusionLib/releases/download/CTAT_HumanFusionLib.v0.1.0/CTAT_HumanFusionLib.v0.1.0.dat.gz" : "https://github.com/FusionAnnotator/CTAT_HumanFusionLib/releases/download/v0.2.0/fusion_lib.Mar2019.dat.gz" """ - wget -N ftp://ftp.ebi.ac.uk/pub/databases/Pfam/current_releases/Pfam-A.hmm.gz + wget -N ftp://ftp.ebi.ac.uk/pub/databases/Pfam/current_release/Pfam-A.hmm.gz gunzip Pfam-A.hmm.gz && hmmpress Pfam-A.hmm - wget https://github.com/FusionAnnotator/CTAT_HumanFusionLib/releases/download/v0.2.0/fusion_lib.Mar2019.dat.gz -O CTAT_HumanFusionLib.dat.gz - + wget ${ctat_url} -O CTAT_HumanFusionLib.dat.gz + # Dfam wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3f @@ -100,7 +102,7 @@ process star_fusion { prep_genome_lib.pl \\ --genome_fa ${fasta} \\ --gtf ${gtf} \\ - --annot_filter_rule /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/AnnotFilterRuleLib/AnnotFilterRule.pm \\ + --annot_filter_rule /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/STAR-Fusion/ctat-genome-lib-builder/AnnotFilterRuleLib/AnnotFilterRule.pm \\ --fusion_annot_lib CTAT_HumanFusionLib.dat.gz \\ --pfam_db Pfam-A.hmm \\ --dfam_db homo_sapiens_dfam.hmm \\ diff --git a/docs/references.md b/docs/references.md index 23a4b8a9..840dc1b7 100644 --- a/docs/references.md +++ b/docs/references.md @@ -36,6 +36,13 @@ nextflow run nf-core/rnafusion/download-references.nf \ --download_all \ --outdir \ --cosmic_usr --cosmic_passwd + +# Please note that using the above example command downloads NCBI-based references for STAR-Fusion. To use Ensembl-based references run the following command with the same as used above +nextflow run nf-core/rnafusion/build-ctat.nf \ + --genome GRCh37 \ + --outdir \ + --fasta /Homo_sapiens.GRCh37_r97.all.fa \ + --gtf /Homo_sapiens.GRCh37_r97.gtf ``` ## Tool reference requirements From 51fcf75d86ad086c69a4e7ba902b5792b1c7d8c0 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 14 Aug 2020 13:08:28 +0200 Subject: [PATCH 007/359] fix linting --- Dockerfile | 4 +- docs/usage.md | 4 +- environment.yml | 2 +- nextflow.config | 4 +- nextflow_schema.json | 145 +++++++++++++++++++++++++++++++++++++++---- 5 files changed, 141 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index d5c21ebd..c380e798 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,10 +7,10 @@ COPY environment.yml / RUN conda env create --quiet -f /environment.yml && conda clean -a # Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-rnafusion-1.2.0/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-rnafusion-1.3.0dev/bin:$PATH # Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-1.2.0 > nf-core-rnafusion-1.2.0.yml +RUN conda env export --name nf-core-rnafusion-1.3.0dev > nf-core-rnafusion-1.3.0dev.yml # Instruct R processes to use these empty files instead of clashing with a local version RUN touch .Rprofile diff --git a/docs/usage.md b/docs/usage.md index 5cdfd6af..91f6d4b9 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -520,4 +520,6 @@ NXF_OPTS='-Xms1g -Xmx4g' ### Automatic resubmission -Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with an error code of `143` (exceeded requested resources) it will automatically resubmit with higher requests (2 x original, then 3 x original). If it still fails after three times then the pipeline is stopped. \ No newline at end of file +Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. +For most of the steps in the pipeline, if the job exits with an error code of `143` (exceeded requested resources) it will automatically resubmit with higher requests (2 x original, then 3 x original). +If it still fails after three times then the pipeline is stopped. diff --git a/environment.yml b/environment.yml index 8aa9d651..4f754e10 100644 --- a/environment.yml +++ b/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-rnafusion-1.2.0 +name: nf-core-rnafusion-1.3.0dev channels: - conda-forge - bioconda diff --git a/nextflow.config b/nextflow.config index 028f2bb5..04a2092c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -88,7 +88,7 @@ params { // Container slug. Stable releases should specify release tag! // Developmental code should specify :dev -process.container = 'nfcore/rnafusion:1.2.0' +process.container = 'nfcore/rnafusion:dev' // Load nf-core custom profiles from different Institutions try { @@ -162,7 +162,7 @@ manifest { description = 'Nextflow rnafusion analysis pipeline, part of the nf-core community.' mainScript = 'main.nf' nextflowVersion = '>=19.10.0' - version = '1.2.0' + version = '1.3.0dev' } // Function to ensure that resource requirements don't go beyond diff --git a/nextflow_schema.json b/nextflow_schema.json index abf782b6..a87cf4ad 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -59,19 +59,39 @@ "description": "Path to FASTA genome file.", "help_text": "If you have no genome reference available, the pipeline can build one using a FASTA file. This requires additional time and resources, so it's better to use a pre-build index if possible." }, - "igenomes_base": { - "type": "string", - "description": "Directory / URL base for iGenomes references.", - "default": "s3://ngi-igenomes/igenomes/", - "fa_icon": "fas fa-cloud-download-alt", - "hidden": true + "gtf": { + "type": "string" }, - "igenomes_ignore": { - "type": "boolean", - "description": "Do not load the iGenomes reference config.", - "fa_icon": "fas fa-ban", - "hidden": true, - "help_text": "Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`." + "genomes_base": { + "type": "string" + }, + "reference_release": { + "type": "integer", + "default": 97 + }, + "star_index": { + "type": "string" + }, + "transcript": { + "type": "string" + }, + "base": { + "type": "string" + }, + "arriba_ref": { + "type": "string" + }, + "databases": { + "type": "string" + }, + "ericscript_ref": { + "type": "string" + }, + "fusioncatcher_ref": { + "type": "string" + }, + "star_fusion_ref": { + "type": "string" } } }, @@ -156,6 +176,90 @@ } } }, + "new_group_1": { + "title": "New Group 1", + "type": "object", + "description": "", + "default": "", + "properties": { + "arriba": { + "type": "string" + }, + "read_length": { + "type": "integer", + "default": 100 + }, + "star_fusion": { + "type": "string" + }, + "fusioncatcher": { + "type": "string" + }, + "fusion_inspector": { + "type": "string" + }, + "ericscript": { + "type": "string" + }, + "pizzly": { + "type": "string" + }, + "squid": { + "type": "string" + }, + "arriba_opt": { + "type": "string" + }, + "arriba_vis": { + "type": "string" + }, + "star_fusion_opt": { + "type": "string" + }, + "fusioncatcher_opt": { + "type": "string" + }, + "pizzly_k": { + "type": "integer", + "default": 31 + }, + "fusion_inspector_opt": { + "type": "string" + }, + "fusion_report_opt": { + "type": "string" + }, + "fusion_report": { + "type": "string" + }, + "input_paths": { + "type": "string", + "default": "null", + "hidden": true + }, + "debug": { + "type": "string", + "hidden": true + } + } + }, + "new_group_2": { + "title": "New Group 2", + "type": "object", + "description": "", + "default": "", + "properties": { + "download_all": { + "type": "string" + }, + "cosmic_usr": { + "type": "string" + }, + "cosmic_passwd": { + "type": "string" + } + } + }, "max_job_request_options": { "title": "Max job request options", "type": "object", @@ -235,6 +339,17 @@ "description": "Institutional config URL link.", "hidden": true, "fa_icon": "fas fa-users-cog" + }, + "clusterOptions": { + "type": "string", + "hidden": true + }, + "awsqueue": { + "type": "string" + }, + "awsregion": { + "type": "string", + "default": "eu-west-1" } } } @@ -249,6 +364,12 @@ { "$ref": "#/definitions/generic_options" }, + { + "$ref": "#/definitions/new_group_1" + }, + { + "$ref": "#/definitions/new_group_2" + }, { "$ref": "#/definitions/max_job_request_options" }, From 648364f6d2bd8057342572c65b1cd452697d022f Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Fri, 14 Aug 2020 13:17:29 +0200 Subject: [PATCH 008/359] Apply suggestions from code review --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5eafec2d..1e25a03e 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 1. Install [`nextflow`](https://nf-co.re/usage/installation) -2. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) for full pipeline reproducibility; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ +2. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) for full pipeline reproducibility; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles)) 3. Download references for all tools From b71c9b52203c724295697b35bf8849a74fd365f7 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Tue, 22 Sep 2020 17:18:21 +0200 Subject: [PATCH 009/359] fix: using official STAR-Fusion container --- CHANGELOG.md | 2 ++ README.md | 4 ++-- bin/scrape_software_versions.py | 4 ++-- build-ctat.nf | 4 ++-- conf/base.config | 15 ++++++++------- containers/star-fusion/Dockerfile | 20 -------------------- containers/star-fusion/environment.yml | 12 ------------ main.nf | 4 ++-- 8 files changed, 18 insertions(+), 47 deletions(-) delete mode 100644 containers/star-fusion/Dockerfile delete mode 100644 containers/star-fusion/environment.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index e9060a4b..5c0f0bc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## dev nfcore/rnafusion - 2020/07/15 +* Using official STAR-Fusion container [#160](https://github.com/nf-core/rnafusion/issues/160) + ### Added * Added social preview image [#107](https://github.com/nf-core/rnafusion/issues/107) diff --git a/README.md b/README.md index 1e25a03e..8e56e62d 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,11 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool | [Arriba](https://github.com/suhrig/arriba) | :x: | `1.2.0` | | [EricScript](https://sites.google.com/site/bioericscript/getting-started) | :x: | `0.5.5` | | [FusionCatcher](https://github.com/ndaniel/fusioncatcher) | :white_check_mark: | `1.20` | -| [Fusion-Inspector](https://github.com/FusionInspector/FusionInspector) | :x: | `2.2.1` | +| [Fusion-Inspector](https://github.com/FusionInspector/FusionInspector) | :x: | `2.3.1` | | [fusion-report](https://github.com/matq007/fusion-report) | - | `2.1.3` | | [Pizzly](https://github.com/pmelsted/pizzly) | :x: | `0.37.3` | | [Squid](https://github.com/Kingsford-Group/squid) | :x: | `1.5` | -| [Star-Fusion](https://github.com/STAR-Fusion/STAR-Fusion) | :white_check_mark: | `1.8.1` | +| [Star-Fusion](https://github.com/STAR-Fusion/STAR-Fusion) | :white_check_mark: | `1.9.1` | ## Quick Start diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index 1618db14..f949eef2 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -12,10 +12,10 @@ "Arriba": ["v_arriba.txt", r"arriba=(\S+)"], "EricScript": ["v_ericscript.txt", r"ericscript=(\S+)"], "FusionCatcher": ["v_fusioncatcher.txt", r"fusioncatcher=(\S+)"], - "Fusion-Inspector": ["v_fusion_inspector.txt", r"fusion-inspector=(\S+)"], + "Fusion-Inspector": ["v_fusion_inspector.txt", r"fusion_inspector = (\S+)"], "fusion-report": ["v_fusion_report.txt", r"fusion-report=(\S+)"], "Pizzly": ["v_pizzly.txt", r"pizzly=(\S+)"], - "STAR-Fusion": ["v_star_fusion.txt", r"star-fusion=(\S+)"], + "STAR-Fusion": ["v_star_fusion.txt", r"star_fusion = (\S+)"], "Squid": ["v_squid.txt", r"squid=(\S+)"] } results = OrderedDict() diff --git a/build-ctat.nf b/build-ctat.nf index 6f5dfa78..8bb0fbc2 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -99,10 +99,10 @@ process star_fusion { wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3p export TMPDIR=/tmp - prep_genome_lib.pl \\ + /usr/local/src/STAR-Fusion/ctat-genome-lib-builder/prep_genome_lib.pl \\ --genome_fa ${fasta} \\ --gtf ${gtf} \\ - --annot_filter_rule /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/STAR-Fusion/ctat-genome-lib-builder/AnnotFilterRuleLib/AnnotFilterRule.pm \\ + --annot_filter_rule /usr/local/src/STAR-Fusion/ctat-genome-lib-builder/AnnotFilterRuleLib/AnnotFilterRule.pm \\ --fusion_annot_lib CTAT_HumanFusionLib.dat.gz \\ --pfam_db Pfam-A.hmm \\ --dfam_db homo_sapiens_dfam.hmm \\ diff --git a/conf/base.config b/conf/base.config index 0081fde2..c6d26d72 100644 --- a/conf/base.config +++ b/conf/base.config @@ -11,12 +11,13 @@ params { versions { - arriba = '1.2.0' - ericscript = '0.5.5' - fusioncatcher = '1.20' - pizzly = '0.37.3' - squid = '1.5-star2.7.1a' - star_fusion = '1.8.1' + arriba = '1.2.0' + ericscript = '0.5.5' + fusioncatcher = '1.20' + pizzly = '0.37.3' + squid = '1.5-star2.7.1a' + star_fusion = '1.9.1' + fusion_inspector = '2.3.1' } } @@ -68,6 +69,6 @@ process { container = "nfcore/rnafusion:squid_${params.versions.squid}" } withName:"star_fusion|fusion_inspector" { - container = "nfcore/rnafusion:star-fusion_${params.versions.star_fusion}" + container = "trinityctat/starfusion:${params.versions.star_fusion}" } } \ No newline at end of file diff --git a/containers/star-fusion/Dockerfile b/containers/star-fusion/Dockerfile deleted file mode 100644 index 79c6fdbc..00000000 --- a/containers/star-fusion/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM nfcore/base:1.9 - -LABEL authors="Martin Proks" \ - description="Docker image containing all requirements for nfcore/rnafusion pipeline" - -# Install the conda environment -COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/bin:$PATH - -# FusionInspector -ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/STAR-Fusion/FusionInspector:$PATH - -# ctat-genome-lib-builder -ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/STAR-Fusion/ctat-genome-lib-builder:$PATH - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-star-fusion_1.8.1 > nf-core-rnafusion-star-fusion_1.8.1.yml \ No newline at end of file diff --git a/containers/star-fusion/environment.yml b/containers/star-fusion/environment.yml deleted file mode 100644 index 4ca4be91..00000000 --- a/containers/star-fusion/environment.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: nf-core-rnafusion-star-fusion_1.8.1 -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - bioconda::dfam=2.0 - - bioconda::hmmer=3.2.1 - - bioconda::star-fusion=1.8.1 - - bioconda::trinity=2.6.6 - - bioconda::samtools=1.9 - - conda-forge::perl-carp-assert \ No newline at end of file diff --git a/main.nf b/main.nf index cf15754a..a4c4c754 100644 --- a/main.nf +++ b/main.nf @@ -773,8 +773,8 @@ process get_software_versions { multiqc --version > v_multiqc.txt cat ${baseDir}/containers/arriba/environment.yml > v_arriba.txt cat ${baseDir}/containers/fusioncatcher/environment.yml > v_fusioncatcher.txt - cat ${baseDir}/containers/star-fusion/environment.yml > v_fusion_inspector.txt - cat ${baseDir}/containers/star-fusion/environment.yml > v_star_fusion.txt + cat ${baseDir}/conf/base.config | grep -m1 fusion_inspector > v_fusion_inspector.txt + cat ${baseDir}/conf/base.config | grep -m1 star_fusion > v_star_fusion.txt cat ${baseDir}/containers/ericscript/environment.yml > v_ericscript.txt cat ${baseDir}/containers/pizzly/environment.yml > v_pizzly.txt cat ${baseDir}/containers/squid/environment.yml > v_squid.txt From 94fa3ea4424486396fb55a3f7de09feb4a1b404e Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 25 Sep 2020 12:47:54 +0200 Subject: [PATCH 010/359] fix: homo_sapiens_dfam requires `--no-check-certificate` --- build-ctat.nf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build-ctat.nf b/build-ctat.nf index 8bb0fbc2..272e9e83 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -89,14 +89,14 @@ process star_fusion { wget -N ftp://ftp.ebi.ac.uk/pub/databases/Pfam/current_release/Pfam-A.hmm.gz gunzip Pfam-A.hmm.gz && hmmpress Pfam-A.hmm - wget ${ctat_url} -O CTAT_HumanFusionLib.dat.gz + wget -N ${ctat_url} -O CTAT_HumanFusionLib.dat.gz # Dfam - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3f - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3i - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3m - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3p + wget -N --no-check-certificate https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm + wget -N --no-check-certificate https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3f + wget -N --no-check-certificate https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3i + wget -N --no-check-certificate https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3m + wget -N --no-check-certificate https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3p export TMPDIR=/tmp /usr/local/src/STAR-Fusion/ctat-genome-lib-builder/prep_genome_lib.pl \\ From ce68f7afa49c7567c3f37aca3fbb570748ddc465 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 2 Oct 2020 09:56:34 +0200 Subject: [PATCH 011/359] fix: increased horse power for building star-index --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index a4c4c754..a5a773d5 100644 --- a/main.nf +++ b/main.nf @@ -279,7 +279,7 @@ Channel.from(summary.collect{ [it.key, it.value] }) process build_star_index { tag "${fasta}-${gtf}" - label 'process_medium' + label 'process_high' publishDir params.outdir, mode: 'copy' From f6a052ca021155c17abbca1145f8b7609b2c96cd Mon Sep 17 00:00:00 2001 From: Tobias Neumann Date: Fri, 2 Oct 2020 16:01:51 +0200 Subject: [PATCH 012/359] Capture full fusion_inspector output. --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index a5a773d5..37168013 100644 --- a/main.nf +++ b/main.nf @@ -728,7 +728,7 @@ process fusion_inspector { file(reference) from reference.fusion_inspector output: - file("*.{fa,gtf,bed,bam,bai,txt,html}") into fusion_inspector_output + file("*.{fa,gtf,bed,bam,bai,txt,html,tsv,gff3,fasta}") into fusion_inspector_output when: params.fusion_inspector && (!params.single_end || params.debug) From 26125b9661421c668da39794d8545abe0c650079 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Tue, 6 Oct 2020 11:40:44 +0200 Subject: [PATCH 013/359] fix: optional publish_dir mode from TEMPLATE --- main.nf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/main.nf b/main.nf index 37168013..359e53a9 100644 --- a/main.nf +++ b/main.nf @@ -281,7 +281,7 @@ process build_star_index { tag "${fasta}-${gtf}" label 'process_high' - publishDir params.outdir, mode: 'copy' + publishDir params.outdir, mode: params.publish_dir_mode input: file(fasta) from ch_fasta @@ -324,7 +324,7 @@ process arriba { tag "${sample}" label 'process_medium' - publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: params.publish_dir_mode input: set val(sample), file(reads) from read_files_arriba @@ -390,7 +390,7 @@ process star_fusion { tag "${sample}" label 'process_high' - publishDir "${params.outdir}/tools/Star-Fusion/${sample}", mode: 'copy' + publishDir "${params.outdir}/tools/Star-Fusion/${sample}", mode: params.publish_dir_mode input: set val(sample), file(reads) from read_files_star_fusion @@ -457,7 +457,7 @@ process fusioncatcher { tag "${sample}" label 'process_high' - publishDir "${params.outdir}/tools/Fusioncatcher/${sample}", mode: 'copy' + publishDir "${params.outdir}/tools/Fusioncatcher/${sample}", mode: params.publish_dir_mode input: set val(sample), file(reads) from read_files_fusioncatcher @@ -493,7 +493,7 @@ process ericscript { tag "${sample}" label 'process_high' - publishDir "${params.outdir}/tools/EricScript/${sample}", mode: 'copy' + publishDir "${params.outdir}/tools/EricScript/${sample}", mode: params.publish_dir_mode input: set val(sample), file(reads) from read_files_ericscript @@ -533,7 +533,7 @@ process pizzly { tag "${sample}" label 'process_medium' - publishDir "${params.outdir}/tools/Pizzly/${sample}", mode: 'copy' + publishDir "${params.outdir}/tools/Pizzly/${sample}", mode: params.publish_dir_mode input: set val(sample), file(reads) from read_files_pizzly @@ -575,7 +575,7 @@ process squid { tag "${sample}" label 'process_high' - publishDir "${params.outdir}/tools/Squid/${sample}", mode: 'copy' + publishDir "${params.outdir}/tools/Squid/${sample}", mode: params.publish_dir_mode input: set val(sample), file(reads) from read_files_squid @@ -638,7 +638,7 @@ files_and_reports_summary = files_and_reports_summary.dump(tag:'files_and_report process summary { tag "${sample}" - publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' + publishDir "${params.outdir}/Reports/${sample}", mode: params.publish_dir_mode input: set val(sample), file(reads), file(arriba), file(ericscript), file(fusioncatcher), file(pizzly), file(squid), file(starfusion) from files_and_reports_summary @@ -679,7 +679,7 @@ process arriba_visualization { tag "${sample}" label 'process_medium' - publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: params.publish_dir_mode input: file(reference) from reference.arriba_vis @@ -721,7 +721,7 @@ process fusion_inspector { tag "${sample}" label 'process_high' - publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' + publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: params.publish_dir_mode input: set val(sample), file(fi_input_list), file(reads) from fusion_inspector_input From 8da3392c488e89841862dcb131b8552a99b6c383 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Tue, 6 Oct 2020 11:42:48 +0200 Subject: [PATCH 014/359] fix: removed docker extra run option parameters --- nextflow.config | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 04a2092c..2f7d2565 100644 --- a/nextflow.config +++ b/nextflow.config @@ -119,7 +119,10 @@ profiles { // WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap. // Testing this in nf-core after discussion here https://github.com/nf-core/tools/pull/351 // once this is established and works well, nextflow might implement this behavior as new default. - docker.runOptions = '-u \$(id -u):\$(id -g)' + + // Some people are experiencing issues with enforcing this runOptions. If you are experiencing issues, try including this + // in your custom configuration. + // docker.runOptions = '-u \$(id -u):\$(id -g)' } singularity { singularity.enabled = true From 0ffb915a03e29f517d130cbce91994c45f954b62 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 27 Oct 2020 09:25:29 +0000 Subject: [PATCH 015/359] Template update for nf-core/tools version 1.11 --- .github/CONTRIBUTING.md | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/workflows/awsfulltest.yml | 4 +- .github/workflows/awstest.yml | 9 +- .github/workflows/ci.yml | 10 +- .gitignore | 3 +- CHANGELOG.md | 154 +--- Dockerfile | 2 +- README.md | 93 +-- assets/nf-core-rnafusion_social_preview.png | Bin 47745 -> 0 bytes assets/nf-core-rnafusion_social_preview.svg | 446 ------------ bin/scrape_software_versions.py | 18 +- build-ctat.nf | 162 ----- conf/base.config | 50 +- conf/genomes.config | 33 - conf/igenomes.config | 421 +++++++++++ conf/test.config | 10 +- containers/arriba/Dockerfile | 14 - containers/arriba/environment.yml | 14 - containers/ericscript/Dockerfile | 17 - containers/ericscript/environment.yml | 8 - containers/fusioncatcher/Dockerfile | 14 - containers/fusioncatcher/environment.yml | 7 - containers/pizzly/Dockerfile | 14 - containers/pizzly/environment.yml | 9 - containers/squid/Dockerfile | 19 - containers/squid/environment.yml | 11 - containers/star-fusion/Dockerfile | 20 - containers/star-fusion/environment.yml | 12 - docs/images/BTB_logo.png | Bin 13624 -> 0 bytes docs/images/BTB_logo.svg | 184 ----- docs/images/NGI_logo.png | Bin 20547 -> 0 bytes docs/images/NGI_logo.svg | 333 --------- docs/images/SDU_logo.png | Bin 11894 -> 0 bytes docs/images/SciLifeLab_logo.png | Bin 8387 -> 0 bytes docs/images/SciLifeLab_logo.svg | 99 --- docs/images/rnafusion_logo.png | Bin 15692 -> 0 bytes docs/images/rnafusion_logo.svg | 208 ------ docs/images/summary_graph_1.png | Bin 95932 -> 0 bytes docs/images/summary_graph_2.png | Bin 66019 -> 0 bytes docs/images/summary_graph_3.png | Bin 83535 -> 0 bytes docs/output.md | 271 +------ docs/usage.md | 467 +----------- download-references.nf | 260 ------- environment.yml | 12 +- main.nf | 742 ++------------------ nextflow.config | 82 +-- nextflow_schema.json | 149 +--- scripts/build.sh | 51 -- 49 files changed, 659 insertions(+), 3777 deletions(-) delete mode 100644 assets/nf-core-rnafusion_social_preview.png delete mode 100644 assets/nf-core-rnafusion_social_preview.svg delete mode 100644 build-ctat.nf delete mode 100644 conf/genomes.config create mode 100644 conf/igenomes.config delete mode 100644 containers/arriba/Dockerfile delete mode 100644 containers/arriba/environment.yml delete mode 100644 containers/ericscript/Dockerfile delete mode 100644 containers/ericscript/environment.yml delete mode 100644 containers/fusioncatcher/Dockerfile delete mode 100644 containers/fusioncatcher/environment.yml delete mode 100644 containers/pizzly/Dockerfile delete mode 100644 containers/pizzly/environment.yml delete mode 100644 containers/squid/Dockerfile delete mode 100644 containers/squid/environment.yml delete mode 100644 containers/star-fusion/Dockerfile delete mode 100644 containers/star-fusion/environment.yml delete mode 100644 docs/images/BTB_logo.png delete mode 100644 docs/images/BTB_logo.svg delete mode 100644 docs/images/NGI_logo.png delete mode 100644 docs/images/NGI_logo.svg delete mode 100644 docs/images/SDU_logo.png delete mode 100644 docs/images/SciLifeLab_logo.png delete mode 100644 docs/images/SciLifeLab_logo.svg delete mode 100644 docs/images/rnafusion_logo.png delete mode 100644 docs/images/rnafusion_logo.svg delete mode 100644 docs/images/summary_graph_1.png delete mode 100644 docs/images/summary_graph_2.png delete mode 100644 docs/images/summary_graph_3.png delete mode 100644 download-references.nf delete mode 100755 scripts/build.sh diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e73e69c7..7f74910f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -54,4 +54,4 @@ These tests are run both with the latest available version of `Nextflow` and als ## Getting help -For further information/help, please consult the [nf-core/rnafusion documentation](https://nf-co.re/rnafusion/docs) and don't hesitate to get in touch on the nf-core Slack [#rnafusion](https://nfcore.slack.com/channels/rnafusion) channel ([join our Slack here](https://nf-co.re/join/slack)). +For further information/help, please consult the [nf-core/rnafusion documentation](https://nf-co.re/rnafusion/usage) and don't hesitate to get in touch on the nf-core Slack [#rnafusion](https://nfcore.slack.com/channels/rnafusion) channel ([join our Slack here](https://nf-co.re/join/slack)). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index c9950f88..09c1d9d4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -36,7 +36,7 @@ Steps to reproduce the behaviour: ## Container engine -- Engine: +- Engine: - version: - Image tag: diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 106c1db0..214d01aa 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,10 +1,12 @@ name: nf-core AWS full size tests -# This workflow is triggered on push to the master branch. +# This workflow is triggered on published releases. +# It can be additionally triggered manually with GitHub actions workflow dispatch. # It runs the -profile 'test_full' on AWS batch on: release: types: [published] + workflow_dispatch: jobs: run-awstest: diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index b687404c..e54f10f7 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -1,11 +1,10 @@ name: nf-core AWS test # This workflow is triggered on push to the master branch. -# It runs the -profile 'test' on AWS batch +# It can be additionally triggered manually with GitHub actions workflow dispatch. +# It runs the -profile 'test' on AWS batch. on: - push: - branches: - - master + workflow_dispatch: jobs: run-awstest: @@ -37,4 +36,4 @@ jobs: --job-name nf-core-rnafusion \ --job-queue $AWS_JOB_QUEUE \ --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/rnafusion", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/rnafusion/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/rnafusion/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}'rnafusion/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + --container-overrides '{"command": ["nf-core/rnafusion", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/rnafusion/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/rnafusion/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4991dc7b..abcbc3b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,9 +47,9 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ - - name: Run pipeline help + - name: Run pipeline with test data + # TODO nf-core: You can customise CI pipeline run tests as required + # For example: adding multiple test runs with different parameters + # Remember that you can parallelise this by using strategy.matrix run: | - nextflow run ${GITHUB_WORKSPACE} --help - - name: Run pipeline for downloading references help - run: | - nextflow run ${GITHUB_WORKSPACE}/download-references.nf --help + nextflow run ${GITHUB_WORKSPACE} -profile test,docker diff --git a/.gitignore b/.gitignore index ed9be7c2..aa4bb5b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,9 @@ .nextflow* work/ +data/ results/ .DS_Store -test/ tests/ testing/ testing* *.pyc -.vscode/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index e9060a4b..01d65559 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,156 +1,16 @@ -# nfcore/rnafusion: Changelog - -All notable changes to this project will be documented in this file. +# nf-core/rnafusion: Changelog 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 nfcore/rnafusion - 2020/07/15 - -### Added - -* Added social preview image [#107](https://github.com/nf-core/rnafusion/issues/107) -* Added support for GRCh37 genome assembly [#77](https://github.com/nf-core/rnafusion/issues/77) - -### Changed - -* Upgrade `fusion-report v2.1.2` to `fusion-report v2.1.3` -* Upgrade `fusion-report v2.1.1` to `fusion-report v2.1.2` -* Upgrade `fusion-report v2.1.0` to `fusion-report v2.1.1` -* Upgrade `Arriba v1.1.0` to `Arriba v1.2.0` -* Upgrade `fusion-report v2.0.2` to `fusion-report v2.1.0` - -### Fixed - -* Missing `strip-components` in `download-references.nf/star-fusion` [#148](https://github.com/nf-core/rnafusion/issues/148) -* Missing version prefix for cdna [#143](https://github.com/nf-core/rnafusion/issues/143) -* `samtools` missing header in empty file for FusionInspector [ref](https://github.com/STAR-Fusion/STAR-Fusion/issues/191) -* Removed `profile` from helper scripts [#139](https://github.com/nf-core/rnafusion/issues/139) -* Wrong url path for `Pfam-A.hmm.gz` [#140](https://github.com/nf-core/rnafusion/issues/140) - -### Removed - -* Removed `scripts/download-singularity-img.sh` and `download-singularity-img.nf` as they are not necessary any more - -## [1.1.0] nfcore/rnafusion - 2020/02/10 - -* Fusion gene detection tools: - * `Arriba v1.1.0` - * `Ericscript v0.5.5` - * `Fusioncatcher v1.20` - * `Pizzly v0.37.3` - * `Squid v1.5` - * `STAR-Fusion v1.6.0` -* Visualization tools: - * `Arriba v1.1.0` - * `FusionInspector v1.3.1` -* Other tools: - * `fusion-report v2.0.1` - * `FastQ v0.11.8` - * `MultiQC v1.7` - * `STAR aligner v2.7.0f` - -### Added - -* Added `Arriba 1.1.0` [#63](https://github.com/nf-core/rnafusion/issues/63) -* Added Batch mode [#54](https://github.com/nf-core/rnafusion/issues/54) - -### Changed - -* Updated examples and configurations -* Upgraded `fusion-report v1.0.0` to `fusion-report v2.0.1` -* Divided `running_tools` into fusion and visualization tools -* Updated `STAR` in `Squid`, `Fusion-Inspector` version to `2.7.0f` -* Upgraded `STAR-Fusion v1.5.0` to `STAR-Fusion v1.6.0` [#83](https://github.com/nf-core/rnafusion/issues/83) -* Parameter `igenomesIgnore` renamed to `igenome` [#81](https://github.com/nf-core/rnafusion/issues/81) -* Finished STAR-Fusion file renaming [#18](https://github.com/nf-core/rnafusion/issues/18) -* Updated logos -* Updated to nf-core `1.8` TEMPLATE - -### Fixed - -* iGenomes optional, but not really [#91](https://github.com/nf-core/rnafusion/issues/91) -* Updated `fusioncatcher` to latest `1.20` version also solving [#95](https://github.com/nf-core/rnafusion/issues/95) - -### Removed - -* Variables `pizzly_fasta` and `pizzly_gtf` have been removed and replaced with `transcript` and `gtf` -* `Jenkisfile`, test configuration, pylintrc configuration -* Removed `igenomes.config` because the pipeline only supports `Ensembl` version - ---- - -## [1.0.2] nfcore/rnafusion - 2019/05/13 - -### Changed - -* Bumped nf-core template to 1.6 [#69](https://github.com/nf-core/rnafusion/pull/69) - -### Fixed - -* Fixed COSMIC parameters not wrapped in quotes [#75](https://github.com/nf-core/rnafusion/issues/75) -* Implemented output output for fusion tools [#72](https://github.com/nf-core/rnafusion/issues/72) -* Fixed reference download link for STAR-Fusion [#71](https://github.com/nf-core/rnafusion/issues/71) - ---- - -## [1.0.1] nfcore/rnafusion - 2019/04/06 - -### Added - -* Added support for extra parameters for tools STAR-Fusion, FusionCatcher and fusion-report -* Added example configuration for `singularity` and `docker` -* Added [fusion-report](https://github.com/matq007/fusion-report) into the stack [#62](https://github.com/nf-core/rnafusion/issues/62), [#55](https://github.com/nf-core/rnafusion/issues/55), [#53](https://github.com/nf-core/rnafusion/issues/53), [#51](https://github.com/nf-core/rnafusion/issues/51) -* Added nextflow helper script `download-singularity-img.nf` -* Added nextflow helper script `download-references.nf` -* Added `Jenkinsfile` for in-house testing - -### Changed - -* Updated installation of `FusionCatcher` (available now on bioconda) - -### Fixed - -* Fixed empty symlinks (`input.X`) in fusion-report [#68](https://github.com/nf-core/rnafusion/issues/68) -* Fixed FASTA issues [#60](https://github.com/nf-core/rnafusion/issues/60) -* Fixed centralized nf-core/config [#64](https://github.com/nf-core/rnafusion/issues/64) -* Fixed `scrape_software_versions.py` to parse tools versions correctly [#65](https://github.com/nf-core/rnafusion/issues/65) - -### Removed - -* Removed `Singularity` - ---- - -## [1.0] nfcore/rnafusion - 2018/02/14 - -Version 1.0 marks the first production release of this pipeline under the nf-core flag. -The pipeline includes additional help scripts to download references for fusion tools and Singularity images. +## v1.3.0dev - [date] -* Fusion gene detection tools: - * `STAR-Fusion v1.5.0` - * `Fusioncatcher v1.00` - * `Ericscript v0.5.5` - * `Pizzly v0.37.3` - * `Squid v1.5` -* Visualization tools: - * `FusionInspector v1.3.1` -* Other tools: - * `Summary report` - * `FastQ v0.11.8` - * `MultiQC v1.7` - * `FusionGDB updated 2019/01/23` +Initial release of nf-core/rnafusion, created with the [nf-core](https://nf-co.re/) template. ---- +### `Added` -## [0.1] SciLifeLab/NGI-RNAfusion (ARCHIVED) - 2018/10/05 +### `Fixed` -Initial release of NGI-RNAfusion, created with the [nf-core](http://nf-co.re/) template. -Source code can be found at [SciLifeLab/NGI-RNAfusion](https://github.com/SciLifeLab/NGI-RNAfusion). -The solution works with Docker and Singularity. +### `Dependencies` -* Tools: - * STAR-Fusion - * Fusioncatcher - * FusionInspector - * Custom tool for fusion comparison - generates intersection of detected fusion genes from all tools +### `Deprecated` diff --git a/Dockerfile b/Dockerfile index c380e798..deb83220 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.10.2 +FROM nfcore/base:1.11 LABEL authors="Martin Proks" \ description="Docker image containing all software requirements for the nf-core/rnafusion pipeline" diff --git a/README.md b/README.md index 1e25a03e..09cf24b9 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,12 @@ # ![nf-core/rnafusion](docs/images/nf-core-rnafusion_logo.png) -> RNA sequencing analysis pipeline with curated list of tools for detecting and visualizing fusion genes - -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.10.0-brightgreen.svg)](https://www.nextflow.io/) -[![nf-core](https://img.shields.io/badge/nf--core-pipeline-brightgreen.svg)](https://nf-co.re/) -[![DOI](https://zenodo.org/badge/151721952.svg)](https://zenodo.org/badge/latestdoi/151721952) +**Nextflow rnafusion analysis pipeline, part of the nf-core community.**. [![GitHub Actions CI Status](https://github.com/nf-core/rnafusion/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/rnafusion/actions) [![GitHub Actions Linting Status](https://github.com/nf-core/rnafusion/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/rnafusion/actions) +[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.10.0-brightgreen.svg)](https://www.nextflow.io/) +[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](https://bioconda.github.io/) [![Docker](https://img.shields.io/docker/automated/nfcore/rnafusion.svg)](https://hub.docker.com/r/nfcore/rnafusion) [![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23rnafusion-4A154B?logo=slack)](https://nfcore.slack.com/channels/rnafusion) @@ -16,89 +14,39 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It comes with docker containers making installation trivial and results highly reproducible. -> The pipeline **requires** >=16 CPU cores and >=30GB RAM - -| Tool | Single-end reads | Version | -| ------------------------------------------------------------------------- | :----------------: | :------: | -| [Arriba](https://github.com/suhrig/arriba) | :x: | `1.2.0` | -| [EricScript](https://sites.google.com/site/bioericscript/getting-started) | :x: | `0.5.5` | -| [FusionCatcher](https://github.com/ndaniel/fusioncatcher) | :white_check_mark: | `1.20` | -| [Fusion-Inspector](https://github.com/FusionInspector/FusionInspector) | :x: | `2.2.1` | -| [fusion-report](https://github.com/matq007/fusion-report) | - | `2.1.3` | -| [Pizzly](https://github.com/pmelsted/pizzly) | :x: | `0.37.3` | -| [Squid](https://github.com/Kingsford-Group/squid) | :x: | `1.5` | -| [Star-Fusion](https://github.com/STAR-Fusion/STAR-Fusion) | :white_check_mark: | `1.8.1` | - ## Quick Start 1. Install [`nextflow`](https://nf-co.re/usage/installation) -2. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) for full pipeline reproducibility; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles)) +2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) or [`Podman`](https://podman.io/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ -3. Download references for all tools +3. Download the pipeline and test it on a minimal dataset with a single command: ```bash - nextflow run nf-core/rnafusion/download-references.nf -profile \ - --download_all \ - --genome GRCh38 \ - --outdir \ - --cosmic_usr --cosmic_passwd + nextflow run nf-core/rnafusion -profile test, ``` - > Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. - > If so, you can simply use `-profile ` in your command. - > This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. 4. Start running your own analysis! - ```bash - nextflow run nf-core/rnafusion -profile \ - --input "*_R{1,2}.fastq.gz" \ - --genomes_base - --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid \ - --arriba_vis --fusion_inspector - ``` - -See [usage docs](docs/usage.md) for all of the available options when running the pipeline. - -## Documentation - -The nf-core/rnafusion pipeline comes with documentation about the pipeline which you can read at [https://nf-core/rnafusion/docs](https://nf-core/rnafusion/docs) or find in the [`docs/` directory](docs). - -## Credits + -Following a development initiated by [Rickard Hammarén](https://github.com/Hammarn), this pipeline was originally developed by [Martin Proks](https://github.com/matq007) developed at the [National Genomics Infastructure](https://ngisweden.scilifelab.se) from [SciLifeLab](https://scilifelab.se), with the support of [The Swedish Childhood Tumor Biobank (Barntumörbanken)](https://ki.se/forskning/barntumorbanken) and [University of Southern Denmark](https://www.sdu.dk/en) as a master thesis. + ```bash + nextflow run nf-core/rnafusion -profile --input '*_R{1,2}.fastq.gz' --genome GRCh37 + ``` -Main authors: +See [usage docs](https://nf-co.re/rnafusion/usage) for all of the available options when running the pipeline. -* [Martin Proks](https://github.com/matq007) -* [Maxime Garcia](https://github.com/MaxUlysse) +## Documentation -Special thanks and helpful contributors: +The nf-core/rnafusion pipeline comes with documentation about the pipeline: [usage](https://nf-co.re/rnafusion/usage) and [output](https://nf-co.re/rnafusion/output). -* [Bruce Moran](https://github.com/brucemoran) -* [Lars Grøntved](https://portal.findresearcher.sdu.dk/en/persons/larsgr) -* [Monica Nistér](https://ki.se/en/onkpat/research-team-monica-nister) -* [Phil Ewels](https://github.com/ewels) -* [Rickard Hammarén](https://github.com/Hammarn) -* [Szilveszter Juhos](https://github.com/szilvajuhos) -* [Teresita Díaz de Ståhl](https://ki.se/en/onkpat/teresita-diaz-de-stahls-group) + -## Tool References +## Credits -* **STAR-Fusion: Fast and Accurate Fusion Transcript Detection from RNA-Seq** -Brian Haas, Alexander Dobin, Nicolas Stransky, Bo Li, Xiao Yang, Timothy Tickle, Asma Bankapur, Carrie Ganote, Thomas Doak, Natalie Pochet, Jing Sun, Catherine Wu, Thomas Gingeras, Aviv Regev -bioRxiv 120295; doi: [https://doi.org/10.1101/120295](https://doi.org/10.1101/120295) -* D. Nicorici, M. Satalan, H. Edgren, S. Kangaspeska, A. Murumagi, O. Kallioniemi, S. Virtanen, O. Kilkku, **FusionCatcher – a tool for finding somatic fusion genes in paired-end RNA-sequencing data**, bioRxiv, Nov. 2014, -[DOI:10.1101/011650](http://dx.doi.org/10.1101/011650) -* Benelli M, Pescucci C, Marseglia G, Severgnini M, Torricelli F, Magi A. **Discovering chimeric transcripts in paired-end RNA-seq data by using EricScript**. Bioinformatics. 2012; 28(24): 3232-3239. -* **Fusion detection and quantification by pseudoalignment** -Páll Melsted, Shannon Hateley, Isaac Charles Joseph, Harold Pimentel, Nicolas L Bray, Lior Pachter, bioRxiv 166322; doi: [https://doi.org/10.1101/166322](https://doi.org/10.1101/166322) -* **SQUID: transcriptomic structural variation detection from RNA-seq** Cong Ma, Mingfu Shao and Carl Kingsford, Genome Biology, 2018, doi: [https://doi.org/10.1186/s13059-018-1421-5](https://doi.org/10.1186/s13059-018-1421-5) -* **Fusion-Inspector** download: [https://github.com/FusionInspector](https://github.com/FusionInspector) -* **fusion-report** download: [https://github.com/matq007/fusion-report](https://github.com/matq007/fusion-report); doi: [https://doi.org/10.5281/zenodo.3520171](https://doi.org/10.5281/zenodo.3520171) -* **FastQC** download: [https://www.bioinformatics.babraham.ac.uk/projects/fastqc/](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* **MultiQC** Ewels, P., Magnusson, M., Lundin, S., & Käller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. [https://doi.org/10.1093/bioinformatics/btw354](https://doi.org/10.1093/bioinformatics/btw354) Download: [https://multiqc.info/](https://multiqc.info/) +nf-core/rnafusion was originally written by Martin Proks. ## Contributions and Support @@ -108,7 +56,8 @@ For further information or help, don't hesitate to get in touch on the [Slack `# ## Citation -If you use nf-core/rnafusion for your analysis, please cite it using the following doi: [10.5281/zenodo.151721952](https://zenodo.org/badge/latestdoi/151721952) + + You can cite the `nf-core` publication as follows: @@ -118,7 +67,3 @@ You can cite the `nf-core` publication as follows: > > _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). > ReadCube: [Full Access Link](https://rdcu.be/b1GjZ) - -[![Barntumörbanken](docs/images/BTB_logo.png)](https://ki.se/forskning/barntumorbanken-0) | [![SciLifeLab](docs/images/SciLifeLab_logo.png)](https://scilifelab.se) -:-:|:-: -[![National Genomics Infrastructure](docs/images/NGI_logo.png)](https://ngisweden.scilifelab.se/) | [![University of Southern Denmark](docs/images/SDU_logo.png)](https://www.sdu.dk/da) diff --git a/assets/nf-core-rnafusion_social_preview.png b/assets/nf-core-rnafusion_social_preview.png deleted file mode 100644 index a24ca06654d6ba24a9309ad424928aa5f375b8e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47745 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
@rzMuso+`LV9^b2YPRK1hy0Q;xB0 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 z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - RNA-seq analysis pipeline for detection gene-fusions - rnafusion - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index 1618db14..981e8de6 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -2,35 +2,19 @@ from __future__ import print_function from collections import OrderedDict import re -import os +# TODO nf-core: Add additional regexes for new tools in process get_software_versions regexes = { "nf-core/rnafusion": ["v_pipeline.txt", r"(\S+)"], "Nextflow": ["v_nextflow.txt", r"(\S+)"], "FastQC": ["v_fastqc.txt", r"FastQC v(\S+)"], "MultiQC": ["v_multiqc.txt", r"multiqc, version (\S+)"], - "Arriba": ["v_arriba.txt", r"arriba=(\S+)"], - "EricScript": ["v_ericscript.txt", r"ericscript=(\S+)"], - "FusionCatcher": ["v_fusioncatcher.txt", r"fusioncatcher=(\S+)"], - "Fusion-Inspector": ["v_fusion_inspector.txt", r"fusion-inspector=(\S+)"], - "fusion-report": ["v_fusion_report.txt", r"fusion-report=(\S+)"], - "Pizzly": ["v_pizzly.txt", r"pizzly=(\S+)"], - "STAR-Fusion": ["v_star_fusion.txt", r"star-fusion=(\S+)"], - "Squid": ["v_squid.txt", r"squid=(\S+)"] } results = OrderedDict() results["nf-core/rnafusion"] = 'N/A' results["Nextflow"] = 'N/A' results["FastQC"] = 'N/A' results["MultiQC"] = 'N/A' -results["Arriba"] = 'N/A' -results["EricScript"] = 'N/A' -results["FusionCatcher"] = 'N/A' -results["Fusion-Inspector"] = 'N/A' -results["fusion-report"] = 'N/A' -results["Pizzly"] = 'N/A' -results["STAR-Fusion"] = 'N/A' -results["Squid"] = 'N/A' # Search each file using its regex for k, v in regexes.items(): diff --git a/build-ctat.nf b/build-ctat.nf deleted file mode 100644 index 6f5dfa78..00000000 --- a/build-ctat.nf +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env nextflow -/* -================================================================================ - nf-core/rnafusion -================================================================================ -nf-core/rnafusion: - RNA-seq analysis pipeline for detection gene-fusions --------------------------------------------------------------------------------- - @Homepage - https://nf-co.re/rnafusion --------------------------------------------------------------------------------- - @Documentation - https://nf-co.re/rnafusion/docs --------------------------------------------------------------------------------- - @Repository - https://github.com/nf-core/rnafusion --------------------------------------------------------------------------------- -*/ - -def helpMessage() { - log.info nfcoreHeader() - log.info""" - Usage: - - The typical command for downloading references is as follows: - - nextflow run nf-core/rnafusion/build-ctat.nf -profile [PROFILE] [OPTIONS] --outdir /path/to/output - - Mandatory arguments: - --fasta [file] Path to fasta reference - --gtf [file] Path to GTF annotation - --genome [str] Either "GRCh37" or "GRCh38" (default) - --outdir [path] Output directory for downloading - -profile [str] Configuration profile [https://github.com/nf-core/configs] - """.stripIndent() -} - -/* - * SET UP CONFIGURATION VARIABLES - */ - -// Show help message -if (params.help) exit 0, helpMessage() - -params.fasta = params.genome ? params.genomes[params.genome].fasta ?: null : null -params.gtf = params.genome ? params.genomes[params.genome].gtf ?: null : null - -ch_fasta = Channel.value(file(params.fasta)).ifEmpty{exit 1, "Fasta file not found: ${params.fasta}"} -ch_gtf = Channel.value(file(params.gtf)).ifEmpty{exit 1, "GTF annotation file not found: ${params.gtf}"} - -if (!params.outdir) exit 1, "Output directory not specified!" - -// Header log info -log.info nfcoreHeader() -def summary = [:] -summary['Pipeline Name'] = 'nf-core/rnafusion/build-ctat.nf' -summary['Pipeline Version'] = workflow.manifest.version -if(workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" -summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" -summary['Output dir'] = params.outdir -summary['User'] = workflow.userName -log.info summary.collect { k,v -> "${k.padRight(18)}: $v" }.join("\n") -log.info "\033[2m----------------------------------------------------\033[0m" - -// Check the hostnames against configured profiles -checkHostname() - -/* -================================================================================ - DOWNLOAD -================================================================================ -*/ - -process star_fusion { - label 'process_high' - label 'process_long' - publishDir "${params.outdir}/star-fusion", mode: 'move' - - input: - file(fasta) from ch_fasta - file(gtf) from ch_gtf - - output: - file 'ctat_genome_lib_build_dir/' - - script: - def ctat_url = params.genome == "GRCh37" ? "https://github.com/FusionAnnotator/CTAT_HumanFusionLib/releases/download/CTAT_HumanFusionLib.v0.1.0/CTAT_HumanFusionLib.v0.1.0.dat.gz" : "https://github.com/FusionAnnotator/CTAT_HumanFusionLib/releases/download/v0.2.0/fusion_lib.Mar2019.dat.gz" - """ - wget -N ftp://ftp.ebi.ac.uk/pub/databases/Pfam/current_release/Pfam-A.hmm.gz - gunzip Pfam-A.hmm.gz && hmmpress Pfam-A.hmm - - wget ${ctat_url} -O CTAT_HumanFusionLib.dat.gz - - # Dfam - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3f - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3i - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3m - wget https://www.dfam.org/releases/Dfam_3.1/infrastructure/dfamscan/homo_sapiens_dfam.hmm.h3p - - export TMPDIR=/tmp - prep_genome_lib.pl \\ - --genome_fa ${fasta} \\ - --gtf ${gtf} \\ - --annot_filter_rule /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/STAR-Fusion/ctat-genome-lib-builder/AnnotFilterRuleLib/AnnotFilterRule.pm \\ - --fusion_annot_lib CTAT_HumanFusionLib.dat.gz \\ - --pfam_db Pfam-A.hmm \\ - --dfam_db homo_sapiens_dfam.hmm \\ - --CPU ${task.cpus} - """ -} - -/* - * Completion - */ -workflow.onComplete { - log.info "[nf-core/rnafusion/build-ctat.nf] Pipeline Complete" -} - -def nfcoreHeader() { - // Log colors ANSI codes - c_black = params.monochrome_logs ? '' : "\033[0;30m"; - c_blue = params.monochrome_logs ? '' : "\033[0;34m"; - c_cyan = params.monochrome_logs ? '' : "\033[0;36m"; - c_dim = params.monochrome_logs ? '' : "\033[2m"; - c_green = params.monochrome_logs ? '' : "\033[0;32m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; - c_reset = params.monochrome_logs ? '' : "\033[0m"; - c_white = params.monochrome_logs ? '' : "\033[0;37m"; - c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; - - return """ -${c_dim}--------------------------------------------------${c_reset}- - ${c_green},--.${c_black}/${c_green},-.${c_reset} - ${c_blue} ___ __ __ __ ___ ${c_green}/,-._.--~\'${c_reset} - ${c_blue} |\\ | |__ __ / ` / \\ |__) |__ ${c_yellow}} {${c_reset} - ${c_blue} | \\| | \\__, \\__/ | \\ |___ ${c_green}\\`-._,-`-,${c_reset} - ${c_green}`._,._,\'${c_reset} - ${c_purple} nf-core/rnafusion v${workflow.manifest.version}${c_reset} - -${c_dim}--------------------------------------------------${c_reset}- - """.stripIndent() -} - -def checkHostname() { - def c_reset = params.monochrome_logs ? '' : "\033[0m" - def c_white = params.monochrome_logs ? '' : "\033[0;37m" - def c_red = params.monochrome_logs ? '' : "\033[1;91m" - def c_yellow_bold = params.monochrome_logs ? '' : "\033[1;93m" - if (params.hostnames) { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.error "====================================================\n" + - " ${c_red}WARNING!${c_reset} You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${c_white}'$hostname'${c_reset}\n" + - " ${c_yellow_bold}It's highly recommended that you use `-profile $prof${c_reset}`\n" + - "============================================================" - } - } - } - } -} diff --git a/conf/base.config b/conf/base.config index 0081fde2..e2a4c1ac 100644 --- a/conf/base.config +++ b/conf/base.config @@ -9,26 +9,23 @@ * run on the logged in environment. */ -params { - versions { - arriba = '1.2.0' - ericscript = '0.5.5' - fusioncatcher = '1.20' - pizzly = '0.37.3' - squid = '1.5-star2.7.1a' - star_fusion = '1.8.1' - } -} - process { + + // TODO nf-core: Check the defaults for all processes cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 7.GB * task.attempt, 'memory' ) } - time = { check_max( 6.h * task.attempt, 'time' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' + // Process-specific resource requirements + // NOTE - Only one of the labels below are used in the fastqc process in the main script. + // If possible, it would be nice to keep the same label naming convention when + // adding in your processes. + // TODO nf-core: Customise requirements for specific processes. + // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_low { cpus = { check_max( 2 * task.attempt, 'cpus' ) } memory = { check_max( 14.GB * task.attempt, 'memory' ) } @@ -37,37 +34,18 @@ process { withLabel:process_medium { cpus = { check_max( 6 * task.attempt, 'cpus' ) } memory = { check_max( 42.GB * task.attempt, 'memory' ) } - time = { check_max( 12.h * task.attempt, 'time' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } } withLabel:process_high { cpus = { check_max( 12 * task.attempt, 'cpus' ) } memory = { check_max( 84.GB * task.attempt, 'memory' ) } - time = { check_max( 24.h * task.attempt, 'time' ) } + time = { check_max( 10.h * task.attempt, 'time' ) } } withLabel:process_long { - time = { check_max( 48.h * task.attempt, 'time' ) } + time = { check_max( 20.h * task.attempt, 'time' ) } } withName:get_software_versions { cache = false } - - // Fusion tools - withName:"arriba|arriba_visualization" { - container = "nfcore/rnafusion:arriba_${params.versions.arriba}" - } - withName:ericscript { - container = "nfcore/rnafusion:ericscript_${params.versions.ericscript}" - } - withName:fusioncatcher { - container = "nfcore/rnafusion:fusioncatcher_${params.versions.fusioncatcher}" - } - withName:pizzly { - container = "nfcore/rnafusion:pizzly_${params.versions.pizzly}" - } - withName:squid { - container = "nfcore/rnafusion:squid_${params.versions.squid}" - } - withName:"star_fusion|fusion_inspector" { - container = "nfcore/rnafusion:star-fusion_${params.versions.star_fusion}" - } -} \ No newline at end of file + +} diff --git a/conf/genomes.config b/conf/genomes.config deleted file mode 100644 index 934041b2..00000000 --- a/conf/genomes.config +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ------------------------------------------------- - * Nextflow config file for reference genome - * ------------------------------------------------- - * Defines reference genomes, without using iGenome paths - * Can be used by any config that customizes the base - * path using $params.genomes_base / --genomes_base - */ - -params { - genomes { - 'GRCh38' { - fasta = "${params.genomes_base}/Homo_sapiens.GRCh38_r${params.reference_release}.all.fa" - gtf = "${params.genomes_base}/Homo_sapiens.GRCh38_r${params.reference_release}.gtf" - transcript = "${params.genomes_base}/Homo_sapiens.GRCh38_r${params.reference_release}.cdna.all.fa.gz" - databases = "${params.genomes_base}/databases" - arriba_ref = "${params.genomes_base}/arriba" - ericscript_ref = "${params.genomes_base}/ericscript/ericscript_db_homosapiens_ensembl84" - fusioncatcher_ref = "${params.genomes_base}/fusioncatcher/human_v98" - star_fusion_ref = "${params.genomes_base}/star-fusion/ctat_genome_lib_build_dir" - } - 'GRCh37' { - fasta = "${params.genomes_base}/Homo_sapiens.GRCh37_r${params.reference_release}.all.fa" - gtf = "${params.genomes_base}/Homo_sapiens.GRCh37_r${params.reference_release}.gtf" - transcript = "${params.genomes_base}/Homo_sapiens.GRCh37_r${params.reference_release}.cdna.all.fa.gz" - databases = "${params.genomes_base}/databases" - arriba_ref = "${params.genomes_base}/arriba" - ericscript_ref = "${params.genomes_base}/ericscript/ericscript_db_homosapiens_ensembl73" - fusioncatcher_ref = "${params.genomes_base}/fusioncatcher/README.txt" - star_fusion_ref = "${params.genomes_base}/star-fusion/ctat_genome_lib_build_dir" - } - } -} diff --git a/conf/igenomes.config b/conf/igenomes.config new file mode 100644 index 00000000..caeafceb --- /dev/null +++ b/conf/igenomes.config @@ -0,0 +1,421 @@ +/* + * ------------------------------------------------- + * Nextflow config file for iGenomes paths + * ------------------------------------------------- + * Defines reference genomes, using iGenome paths + * Can be used by any config that customises the base + * path using $params.igenomes_base / --igenomes_base + */ + +params { + // illumina iGenomes reference file paths + genomes { + 'GRCh37' { + fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "2.7e9" + blacklist = "${baseDir}/assets/blacklists/GRCh37-blacklist.bed" + } + 'GRCh38' { + fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${baseDir}/assets/blacklists/hg38-blacklist.bed" + } + 'GRCm38' { + fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.87e9" + blacklist = "${baseDir}/assets/blacklists/GRCm38-blacklist.bed" + } + 'TAIR10' { + fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" + mito_name = "Mt" + } + 'EB2' { + fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" + } + 'UMD3.1' { + fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" + mito_name = "MT" + } + 'WBcel235' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" + mito_name = "MtDNA" + macs_gsize = "9e7" + } + 'CanFam3.1' { + fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" + mito_name = "MT" + } + 'GRCz10' { + fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'BDGP6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" + mito_name = "M" + macs_gsize = "1.2e8" + } + 'EquCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" + mito_name = "MT" + } + 'EB1' { + fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" + } + 'Galgal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'Gm01' { + fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" + } + 'Mmul_1' { + fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" + mito_name = "MT" + } + 'IRGSP-1.0' { + fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'CHIMP2.1.4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" + mito_name = "MT" + } + 'Rnor_6.0' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'R64-1-1' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" + mito_name = "MT" + macs_gsize = "1.2e7" + } + 'EF2' { + fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.21e7" + } + 'Sbi1' { + fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" + } + 'Sscrofa10.2' { + fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" + mito_name = "MT" + } + 'AGPv3' { + fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'hg38' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${baseDir}/assets/blacklists/hg38-blacklist.bed" + } + 'hg19' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${baseDir}/assets/blacklists/hg19-blacklist.bed" + } + 'mm10' { + fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.87e9" + blacklist = "${baseDir}/assets/blacklists/mm10-blacklist.bed" + } + 'bosTau8' { + fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'ce10' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "9e7" + } + 'canFam3' { + fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" + mito_name = "chrM" + } + 'danRer10' { + fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "1.37e9" + } + 'dm6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "1.2e8" + } + 'equCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" + mito_name = "chrM" + } + 'galGal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" + mito_name = "chrM" + } + 'panTro4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" + mito_name = "chrM" + } + 'rn6' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'sacCer3' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" + readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.2e7" + } + 'susScr3' { + fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" + mito_name = "chrM" + } + } +} diff --git a/conf/test.config b/conf/test.config index 08c1db37..c84e3197 100644 --- a/conf/test.config +++ b/conf/test.config @@ -15,6 +15,12 @@ params { max_memory = 6.GB max_time = 48.h - // Impossible to CI test rnafusion due to huge indexes requirements - help = true + // Input data + // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets + // TODO nf-core: Give any required params for the test so that command line flags are not needed + single_end = false + input_paths = [ + ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], + ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] + ] } diff --git a/containers/arriba/Dockerfile b/containers/arriba/Dockerfile deleted file mode 100644 index f6a94950..00000000 --- a/containers/arriba/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM nfcore/base:1.9 - -LABEL authors="Martin Proks" \ - description="Docker image containing all requirements for nfcore/rnafusion pipeline" - -# Install the conda environment -COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-rnafusion-arriba_1.2.0/bin:$PATH - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-arriba_1.2.0 > nf-core-rnafusion-arriba_1.2.0.yml \ No newline at end of file diff --git a/containers/arriba/environment.yml b/containers/arriba/environment.yml deleted file mode 100644 index 393b2e11..00000000 --- a/containers/arriba/environment.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: nf-core-rnafusion-arriba_1.2.0 -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - bioconda::arriba=1.2.0 - - bioconda::bioconductor-genomicalignments - - bioconda::bioconductor-genomicranges - - bioconda::samtools=1.9 - - bioconda::star=2.7.1a - - conda-forge::openssl=1.0 - - conda-forge::r-circlize - - conda-forge::readline=6.2 \ No newline at end of file diff --git a/containers/ericscript/Dockerfile b/containers/ericscript/Dockerfile deleted file mode 100644 index d418d1c7..00000000 --- a/containers/ericscript/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM nfcore/base:1.9 - -LABEL authors="Martin Proks" \ - description="Docker image containing all requirements for nfcore/rnafusion pipeline" - -# Install the conda environment -COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-rnafusion-ericscript_0.5.5/bin:$PATH - -# Ignore database check (https://github.com/nf-core/rnafusion/issues/119) -RUN echo 1 > /opt/conda/envs/nf-core-rnafusion-ericscript_0.5.5/share/ericscript-0.5.5-4/lib/data/_resources/.flag.dbexists - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-ericscript_0.5.5 > nf-core-rnafusion-ericscript_0.5.5.yml \ No newline at end of file diff --git a/containers/ericscript/environment.yml b/containers/ericscript/environment.yml deleted file mode 100644 index 3edc48ce..00000000 --- a/containers/ericscript/environment.yml +++ /dev/null @@ -1,8 +0,0 @@ -name: nf-core-rnafusion-ericscript_0.5.5 -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - bioconda::ericscript=0.5.5 - - conda-forge::ncurses=6.1 \ No newline at end of file diff --git a/containers/fusioncatcher/Dockerfile b/containers/fusioncatcher/Dockerfile deleted file mode 100644 index 203bb32a..00000000 --- a/containers/fusioncatcher/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM nfcore/base:1.7 - -LABEL authors="Martin Proks" \ - description="Docker image containing all requirements for nfcore/rnafusion pipeline" - -# Install the conda environment -COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-rnafusion-fusioncatcher_1.20/bin:$PATH - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-fusioncatcher_1.20 > nf-core-rnafusion-fusioncatcher_1.20.yml \ No newline at end of file diff --git a/containers/fusioncatcher/environment.yml b/containers/fusioncatcher/environment.yml deleted file mode 100644 index 1d6a105d..00000000 --- a/containers/fusioncatcher/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: nf-core-rnafusion-fusioncatcher_1.20 -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - bioconda::fusioncatcher=1.20 diff --git a/containers/pizzly/Dockerfile b/containers/pizzly/Dockerfile deleted file mode 100644 index 2817069f..00000000 --- a/containers/pizzly/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM nfcore/base:1.9 - -LABEL authors="Martin Proks" \ - description="Docker image containing all requirements for nfcore/rnafusion pipeline" - -# Install the conda environment -COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-rnafusion-pizzly_0.37.3/bin:$PATH - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-pizzly_0.37.3 > nf-core-rnafusion-pizzly_0.37.3.yml \ No newline at end of file diff --git a/containers/pizzly/environment.yml b/containers/pizzly/environment.yml deleted file mode 100644 index 79974871..00000000 --- a/containers/pizzly/environment.yml +++ /dev/null @@ -1,9 +0,0 @@ -name: nf-core-rnafusion-pizzly_0.37.3 -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - bioconda::kallisto=0.44.0 - - bioconda::pizzly=0.37.3 - - conda-forge::pigz=2.3.4 diff --git a/containers/squid/Dockerfile b/containers/squid/Dockerfile deleted file mode 100644 index 5dbcaf4c..00000000 --- a/containers/squid/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM nfcore/base:1.9 - -LABEL authors="Martin Proks" \ - description="Docker image containing all requirements for nfcore/rnafusion pipeline" - -# Install the conda environment -COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.1a/bin:$PATH - -RUN cd /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.1a/bin \ - && wget https://raw.githubusercontent.com/Kingsford-Group/squid/f45c9025d41cffd982ecbbdd52844e5a4f074de9/utils/AnnotateSQUIDOutput.py \ - && chmod +x /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.1a/bin/AnnotateSQUIDOutput.py \ - && ln -s /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.1a/bin/python3 /bin/python - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-squid_1.5-star2.7.1a > nf-core-rnafusion-squid_1.5-star2.7.1a.yml \ No newline at end of file diff --git a/containers/squid/environment.yml b/containers/squid/environment.yml deleted file mode 100644 index 7385b163..00000000 --- a/containers/squid/environment.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: nf-core-rnafusion-squid_1.5-star2.7.1a -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - bioconda::samtools=1.9 - - bioconda::squid=1.5 - - bioconda::star=2.7.1a - - conda-forge::numpy=1.18.1 - - conda-forge::python=3.7.6 diff --git a/containers/star-fusion/Dockerfile b/containers/star-fusion/Dockerfile deleted file mode 100644 index 79c6fdbc..00000000 --- a/containers/star-fusion/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM nfcore/base:1.9 - -LABEL authors="Martin Proks" \ - description="Docker image containing all requirements for nfcore/rnafusion pipeline" - -# Install the conda environment -COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/bin:$PATH - -# FusionInspector -ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/STAR-Fusion/FusionInspector:$PATH - -# ctat-genome-lib-builder -ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/STAR-Fusion/ctat-genome-lib-builder:$PATH - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-star-fusion_1.8.1 > nf-core-rnafusion-star-fusion_1.8.1.yml \ No newline at end of file diff --git a/containers/star-fusion/environment.yml b/containers/star-fusion/environment.yml deleted file mode 100644 index 4ca4be91..00000000 --- a/containers/star-fusion/environment.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: nf-core-rnafusion-star-fusion_1.8.1 -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - bioconda::dfam=2.0 - - bioconda::hmmer=3.2.1 - - bioconda::star-fusion=1.8.1 - - bioconda::trinity=2.6.6 - - bioconda::samtools=1.9 - - conda-forge::perl-carp-assert \ No newline at end of file diff --git a/docs/images/BTB_logo.png b/docs/images/BTB_logo.png deleted file mode 100644 index 6a197b807508b6722abbe70c49210ca0d693bcdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13624 zcmXwg1yoy2*L8wBL0a6cEf(C}y+Dh*Q=quJySrPlV#OVT6xZTb+={!yAD;L7vsQAG ztb1q9+;iugGkfm||Ews5jzWk6007Wsq{USL0N^$By9p8k^fMQ}ObmK}a}<^Nf&_he zA(@0he+EaSo|^MS%Fw6@>!Mk4xyMjI_b)i{n_s~sSn41< zpoBi?-8DSknYZSbnR)o@uSp7O-sdIc0dSxmCOI%16?OVa)ya@(!jScliCJsg$^G+G z;*VR?;#3(2p@~Gg>85{w9a~#}j_ZyKgo1}y(2N@cEd=Eu9b5Q0>k~yT z@WG70{JK8MM(n$HLsu{&f;*U@YXAsMO8(~$xF{08)6pce`I#oB;M^&Y$N=E-o(nGj zb1?bob!acM2!Y#Mi$_IY#!5Z;+6Dg{N2b|R0F)Z8q$z}hJb8*&xAad>e>SrI*D%dXfV{6-KK@{TGMWOSdCfWcSvASG9wS6c)0A(U`3I0{tIa0Ulau)D z_a%&0R^DL?suCcrwD(Jw4N}RVm2_dyX$*(dpq#6G7f6}2i))^(;tHK$AXHo zov?mQ#K-DnCkZNEvIF=ZLxO2t?L1%QkDvwy!trdh!1^>Qmq`=C5liy-=Gf-VTEEpyatB>pqvl{KHkIo2>s zDo+Sl${a7~$q2^{^r|mv`8df1K2vMB{$DEt&C#s`>|MfnZ2)fBl5xFQ$vn(PPOj@K z47Ad+{~Y!u$)3Qu+R`Trzo`&z`u33=ZjxYHE2FaW<%O%fGV0CP8?p$Oq|0U{w0ctHm89|RWL^J0skJpnRi#DhbzYz&Bg@-J?tah2tkxm(6lK z>w%j0%WUR)9dR@8fqcHIxfJ42ma&R0A7p9rFddT+TTNHia>+Mjw}y5 z%YGrd+prDjaiLi-H8&ie*V-(vzXjvCK6Hk`{^Ly;cE;wmj=;ofJfFxHmQ3Fx=8MW? zBJ!J#x4zQOq)s7a3FzWikIgPLRnXYWnOng=B-;0_$`bw0yS|C@o~z~=12`M4D#%ee z=kAdB#eosrhGbCje_oDVp}N*MA_6#QPaBcLd?Rwm>B-1B&-z%v zWP2H{0Y4vt4{09mS+{C6YDtZ4sADFC!&eeul zfV1=+(7xLf=VXdqzwt~L!FZ@|&iO**@>+MTe=5ou6%J{tfqzcv+=A3yq> zI=|+!*h0y~u*af&FlwpGXwoteEb+ttX=qaSPuH`zbS1R9Up0M31a~A!_$vT3@@yNP_*k*)pRz zu0V|Yx0SB0ZsF{ta{dQAOFa{`*7wP*`;cZdUO?2~xj>|fkqW*OfSjTlc$TkH-(a^P zx;Gd@q7P@m;ztV@0~AL+_b$A)WuZ30;sf2{$VJgADEgOKx|uanOp`^)f(r=m&~A&+ z9@YHBUmI;EV7YNqtnnr@9ng^&_~vO1ABAQe9-NJ$S726TT8L5cx%eRF z*}ix4kb4q>3B-g2&E6FU0PxZ#jO+wEl><8Shp{g!NVD3fK z6qVS+cQ*;YJ+WVM>he0gwSsp}Q5j_Kmic^Np89`UvLefP8R7`%mIh6>YW35Yqi;kN zhOl&K7WjT%Pv`n}mKj=XuxxPsi0j~icw{Vy#xsB#Awk~y*YD;}t}sG87KXl>IPPqu0UA=e9+enLGWcI`pGI_KG}s-@dgB};Jd>oJ59h0yy_J-q zWkk~v>HEYuysx6`MSEy81Xto__0mu47ca7<@mSw8{P#<`Qdu_8nw%*g$})#3Q-x{L z1IRFax_l#rh<#WLG}kbLD!1S_K!A@VXuSPa&DB360v_=NQ>`|}ms-I=&uY=dkKV_f zF;5M+!JnnWx^k^OP z7LNNTs>spb$uT(`im4jx;g`N%D5?H@f3Dzp&wM^ptqD5RL$pb=%Ssysr{pEXKcV>F zuO=mEew`9~i@osq6Q@U6IIw14WY;5Hvzj09#_q<80xc@mj8~-!gY;ipfK5WIG*ZVG zqRUO)_K&`l9tW|1hE_@#sjDY~o21Fy58;$B?1dC>3FM|~vQ!u>J{k3GS$_>EH2moGQ-hbanVvIG1 zjR9Inalk=ZKS|&fXx+RgQTbzPaPLNE)_l+5agdF^zgzQP@fi8`2zl-as|?GbMCk%` zP)NBI>}4Kla#NvqU9ij}nXG+}%{K(`2i-7}g507$^i&0Oip6AF0= zN&(-T=A0}*17`nF;S%3WFg_fERua*V*60d+#)?wZ9VL~Xw`|733E)d#|Iu0V-69+j2u2~*o|8_H?lbtPk^;(f&_kL>MNYUmya zKgrw>0L|{SM}>j_9#5tZ?}7K~!oEAo;r+5xmQgaCvt;|Qc)$w?)|X@UuGk3bj_7mdqj4r_E|yCdN}XV9 z64f5erxa&rqxg9{A^0;HV=_hreG&0o;$@(UbWn{5<&z2Z`!=3sLC0!KLB#$V`1)j6 zpJ6hT?1VojWRSc4g#pIxN!_h*-4l)#A(*>z00a_ew|}C`oGk7Y@)(QuH#ygUUe2Bt z&Nl&qXW-hrQBjc)ASkPx@MAF-etJM;pFy}o(64h36W%w7GJw^cpA=8#o)OF>l7g1> zF{s-qQHZ!5{bP14THHK15D--}F#(#c);Mc0X8tSxRqal!yBAxoJ!CP~?R&^M7-`Zr zw6Jjgosr$%Xu7KYo?TVX9qacSpjV<0?!!k1C$IPQO-+(cQel40y>uJjr9H6va^dW# zQPRClDgq%5J|hoe6cO&|j&#^Lst)@K!Egf(Ejo-C*s(yj*OS(u%r=I@3~OgEL46`A zqxrx)6~7Dk&xU}m)PT--+q_!0b0aC=iN^1J=$wG3=(H2_o)UmwK){K<9_D+lyWZ|K z$_<_=%|Go9Jia?d2GZ*_sq`fIHQ-WTwyOajRr?kOOH#j`cX(OwDcoV$q%zop|2_*t z(zkG_09n<6if2x4F(dB~^=ftj3m8dz!PH05#+_q8mc;%Z%z35Y^wTdj z)ysUHoHNv=TThkvPNEfctF7gIcYAX)j^zn0Q?thVBuz?_MxzTkbU@)8{m!Hib*vO>k(W!r{*mACzlu9;j1D}rC z&bN4znuM6Y>VOgZO8K( zP6!N=r)DQaLd)iu7qDp7g@E<*5zei*HG$Lj5IFSC&O(&-g;DLKEV&1lZV!#GT=jC%Y@R>Bu*fXCV z`e@2BZv#3%{%t{ED78l=I9fm zllK~6lqY`Pc#J`UHudZe~0-3q^} zPSZ+>0k1DtDQz49(q%gL!u%C$uGw>5>y_G+Q5aJ;+*CQHv-8lE6N-Hy*u(y=D=PY< z1j+5ba+5zR54ZH;drP(KHpqU5z$F3Gv8d_^XgO;tSAB4BMLhn?H{wSO?0~QnA`p|k zp|LY9O?8!BLDgJPETA*R%lFbK`u;uOcQh+76XI)J@Mvw|-mjTS47x)>c&TIwC610h zRIk>{#@%2N3_jr|&7%io#k++$Kjzaw9#hQ;B&s#*%pTi$F5fSX53(4Lz7x-+9L*HV zpL}nEk3Nwr)WyO}ETAW>HxhJ9W8vPieB8;1kJhPq$F+qoJb`tm4C<(7!`4i0Hd#M+ z(-9rUWZC*g9i@SMSG&CPqTOi|9*nJDyF~|-Jpr(gk|x(&vUTLjPqT;bcuOl{n6T|L zfmdm=HXDLym~E;oNooC2A$R;Pt_(7CyKAFdQN9((!2uGb48V5LASvriJ-azRb=uAe z`RS}88D7M`HSx_+tPNwm)JGOyZZ|G>^h;Cf3YIT03gB@z>#RRmy-~b*u1RM{wEnNC z+~6$pg0Y%k7~{r76lOerNK}n3a8ybd0f-l0Dsm(C!|_Cz_z`sGk!mW5mgF$SJdHKI zV4tb|{MBJ7taQ30%I0PirYqiI&tp*x(Z?abV*RSnkCtlExs$)7AC*30v?XgWW@8hu zCY|Qb<+i*c1a2@{EHyyud%1kpj*!LBAX09iE6h`5)#v?aFXvQ%#{&379{HFLMwbm` ziel{6&%Qy(`Z*72^%>x@XAu|hK5F2ur276+=H>JL0op|XV00Bes0(zq#qZfMWSoJC zvvm|y>l?LHgLC=2l}n*c&6q#>&f|z_)#ng1STJ?NY0N6k7RXJWZ(T>8)i{#RO!S7Q zP}OLQ+?g2h)N%8HFrGMi?`?>qi=H~4l5jVze&e^za5yvmv(|32w^0&t);*aBxKpEc zGDtfM_A`BM{d^z1etG}Rg!)F@h!hE7jR-0Dk7&53ZdIYkW^hn}h@X!I&YGGuqPd=w zR9oeN66FEcHr`YIXEom>(fOGUrg@{dJEBcR8|1Mq*KEVXKRcSdVtTz^2*d_^I1Eo@hQ4`Jq`y6VPtQrLg>l;)DW=hrX|QXg zAB>T#axHU$O#(^d15$R`_5qW#vmF00wQ~tFjaI3`x92ZrNeb7Xg^tR~zO&I=`o^Xx zgO$cs&+j{^ZEJ0n?4~^61?@ZGZnjHkY+=INGC1`c9Y0(X{m8qFXLl4HXkI;$(4>C{ z(P?_*j&mdYh>(rM_1HUCl4{Pf@3?xh6=ywJ7z|CDNC<(p*c&?3OvWI^>lU5UAw4TD z0smjuW1>>m8+OgH9Ow3aw?`r5qt_X`D*ksjkrDPAEBG-v>5G^>tAouOXQTJ;*n7j5 z>R6eZR0=~LBDL#=qr8p??X=BGmKRv|x&`-tL=AkxNc~efO`_L(wfACfeNAXqAvxUy zymIxclHez?5@mDKt1iDsy6{Ad#Tx?o%6u{uY?ZH-?Md5cp{bDv(5cDg4oRDTxcaw{ zanEGdwtAATNl!ib4y7Y%8}z%*J3HGFLw~fHp=jH@+raKC);HOYc08Mh3vJw;kW{;` zli$95m({YO8_l-L2u;;`L$e7teURELu3bDZ2VGvo@elDCZ2A)-J@cYwMF1EsK zQCHw$udZ2?ZY!vyhP>Q2&0)UN_vM`yjMTmWdpd@SHtT}tm_vlgK?o{du4ziR$)qGc zkU;?jpKUavs*eXZz3$@1iiqN?rT(0By%rr+ST_YL-AhMQ6GQIpMxSMTBQ?X6rg!h8 zrsF$qZP@k)ejJu02?;jpWZ#7gn<@eMm5q}4dyM-Zl{c}b|BgD4OF|y{SjQSm@U(IX zhOG88QtD}!rlyn;*SCK-T6gR-(svtx;rh2^YAHS?tbF6IfQEZMwgld8v?LljSge=q zC(YKnY(7KH_3gcnmiI+=?Zx-@FwX=s+NwPLL2~_#(q_Ne$F#uMI1DuiOiT8$etg(M zY{`4K;iz&xn83{s-S3FYZ~(@#FV}}H3I}@@Y?pf)cx-=qM}`{}g|~A!66%Iss^254 zGhZm8phfw)%SoxL)6^bXE2b#GNALd}N=sDVN z_(q>og{c@_UTmWo#3}xH&tx94vAAX^d-LmkhMKf6J^)}pjH8s4b(8w>V<{@zMOC4> z7>Ushwt&Nf}5w5>Gh?EmmFz_&p63Wt5$Xy;ilb_1!gtyUy-x-<>}7M9Q`Q&L2wR zkVG>?xHAV9UTOoJI1B6GxQliB#^l7b;v!wHY(Em6ZTKuC+iMi!zbW4CoS*!^b{tIj z%n$~5ei#riWi!gZf@m4l!K2wC{;Qp^wvu4%O~(1O$j-&$%?|TernASLt*9$b8O;eM z5+z3JSLq8Jr0x_}+O{}imh($YP5qFx^@bT}H+^3fpr=Sb#Gy*GGn|6Z!pdZ0Y0uM* z$&Ykmz}8`_Z%Ic9^-{2v%w^B;V2CS3>&H-cKx_G2r0hw~oVSJR)%?tnUatvdHg*Pe z_kD@nKzOC4m?&+T{+)^m`;9lH7e!0lJkDjA?#5XcoBA+7*<1z5e4Nypo;eC+F;T_J zG%YZ@w8T5JmS{3hT{a9^T;U26ONO%4FqVdi zk>uB_+IN4Z;ij-KvGrN>Rw_0^%d_r={js>Q{~jjzBf|3fwD3AEef>+pa#dbg`l>_J zH)GOE>g`A;`I5Hkb1-rOXd0C~+Q0PcYcA;JTYp+@63&d&LNWdv7nX|dyiH} zcW<~+?ds(8QM; z#|kYZ_{heRh-7A9Zsay6O|24Z!u+z@cl$D3bguE*IFwg2V1Ei;`rTdKyTMHrM-eOX zH$!|Z9BVqE13GWa{7D}0iCXX*`nO=O2TiC^8o4l z#Pen>yd?Ne|8PU&3#NApEHTi?N(zK(67|xIXxVH3dOex@EN~Po6?j+@(C8%Qd1*O0 z+01vhllM>38?7q+&)H5qiI`jsor_bU>bwvNxp7`(OiWBGVgA}sRP0xIx!*phIK)GX zC)?twAqoGaoCGfSjS_@EKFsxhV^cKr;OjsPI1U|<+x7y5_n~ zsn`}m4+003^;n-(DIBdwIn(H*Do5JL8p0!&wJ_{(>= zKwE~14U@eSCo+0C`ogNuNl3X9>b+C@tI}Ni6MhFw+Gmd8HMeXVEGu2)XL=?xQ+;^@ zdxZVxiw^K#fCy(5g~hv_vdA;tM!Fm-)t^`)1^c)eJL2D#9&lr4>a%tncSp<2C%=ZT ziXyDhXT`|5@|?&M#=`&Z6#pk@RX~;a<3TjcLE{#kFKS?c)Ej?w{vZ*F!s{9BFg|waXZlP7N-!3UC?-l># z6OP|Q1P|hSxLIV26GDsQ@d%q=KbLIdgDu!IGN|(@uCug4x2}G84X-n8EErF|i>QTU zIoV=IJ|J_ZwFZB3%orI00+a5%7i%l1eTmIp>>S>`EDC;`?9NIk519N2y$~F=sQJ?* z2(pEl!X7?ZIBIo;qSQ6rPLqf80&92D!aNicp#KVc*C6zT%StO+_*qJ8)6jAtiU)HM z-^Tf821z|(MdL$1OhT(o%(|F#DtPsjA+OWhD~kk zNN3a7c}oz`ugP*lG7^Vd=?&#R;C}jq=h%WJ`a`j)#Kzn>o%o9gj2e%#3b|!DqQplj zj~;Kl0QpwD^ua-w?}GBvP85brnVX(}>5i}3rVpHGe9Xubr(`{tjKv?XK53|bxYGS$ z@(Xq!5_aM?%sv(n#U?_lD}|k=%8O1f)!rmEm?~T2M0}$xY=X%z8tO}I_k~WjbgScf z63--6*VT-zv`St?6@S7Y!G`!9iz14UOjcGNEFkQ|#|XkAd=iPW4P4`X&m9Y+0_nMg zUSS6_x^dA-(~Hs+|A-=05=;+S4UORn+iy<2-Y+dz+H)M_)HK%=>ju&1`vvK2(2ZJ_kQnS2r4pCeeu-1Sm;vs9X1eLZ5t-2?dQ)Gl(B%_j#DkWAgTj1Q_Sr!p~i5$Y-tF~qii&}duO&)Ha1mUF&H_n!~Z zJbC=%$-2<#H>!EwXff$B^#+z5Nc$JM%*{S8?p@BB{H#aS9o}Bcw!edV{igMh79b2W zLQffuG&d6AE17Fv&9*Z_=quP;G9P2^EiqAHJjc zkK@o%f$}^G>ik9;Mmncj3ocVuu22XGCJ7&#fZ-Fjqb5J0pJSqIT53s-xUkaZ9`+f@an<)nYNGK*Sk*YP(3RFfr!K-pe`GuyQrTC>;14;M zfx&i^sD>(gEZHoiWh9MGrLw!;(W{9|9WR8YpX&_gW4aLalL+6KD>}&9G4}Y5XR_IP z5X>+Td3F*PQa+x$9bc@_wLfC~svJBHrlGu~sk(cSkc%IHC@bpTf`oY1zzG>kBbtJuCt$ zr3FRt+|h0sHR=CtGEv)_TQ`x!hmK_Xv?fs(e`#sLhH?K*)}2|0CL7u)B6u&9{F#bs zYL*Xc%y2>KWd)Ixv4c6&uR^0fU!Ea@r>@%=fA1dcQjoR=Wg(Fj1VFm`s?L39P~2(^ zBu$}9{X@pjG%vHbonG7mvBIDCM6Zj)zg6lRva}5h=c4v`KRQ4@Fi4?_gVxDYbaeHS zW25B8%fDDv2o2bn7lbFap6Hhf*cV>`p56>+cHAoi;;-o{ULMiKuf2ON%n~Vw-=G4V zYQv|jO{?ngL;vz3$i#4wEiL7^^k1irNIYg2Hz-DdtiYrsllW}w!0i)XhOzkYEUdzA zGx6ExSnQIIkIlo0S+9Lz!?7*ZL*deuMXC>GU+bvovEFqGx~!JQIClCmN{fBxP`%N~ zqM9vC4i=Wzm;WdjQ8+aVMV5O+=N8@yxplTEF@X?!e`uYuy63=1{Mz&(XY~;E#qLg` zdPE1YXQfs)Dmvix3foARj0*NO1$;*^qNSJEYFor5CgkH-D( zXuLeM>|OKVRM-`GN>7H>(xxu+<$U}Rl_q9^bg14#8_ISURSe`H8l3R-tX-t-#`u|f z3sov|yT#6%<{lfWUQ4ZUA~A5#MJ9l-zth~TmZYwFj> z0WGSsIy|obp~?J~Q%aZyAoD|_4u_dII8l6de9q`^Q+2=8*d?(%4d_MjuONP#_5UDt z(?8s}7=?6Oz+X85YoS+_^6_?>2)K{X_3nxELSCv0N}iLZ-aAu1!3{lnVlm8VoAdMbU1g6u=q>8c=6cb~fyxVTeiBP=w{2V<hQ6KOhJhkyBeCW+hJiI1c$1Up>1G^_PMSX;Oe?J85#b>iTkKMn-?KZz>WIj^GkYK|q#*v!y-;x$Tv(naQ;V z1{@4*gDRn-@nmc~O{~j%N&u-5we7Nz!iX1RA{*kcH1(gv^Y*B(sxFe!ns)C+Ws$=q zcur1d%hjcx3=d(zop5&D4-}nA=ThAlcD~$CMpZalx6+#r0qR1235_)4rLL=j_I zIuGBt_78rH$Pz>eH+I+PH`k4vO$;z+Ip;{9aS{DrwofrkMwRp!*fKKJWhuG*v=E4s z+SSq`l>y~|7y6p!^sEQpyFh=$CUi7hoBaobhc#=fGk5>(giNewlxlH4hEQ9ERdS? zGv$>v+LR-f8~z5 zksy8^mY*;7uZpPgjOmPwCvslgC=t*z`3%X6C&d~TKucQ-27rO+hA6hOgQ*Gs7{lJA z=t*BiwhTDA3>Cf4!8w7d3yT^mkJS=x5MZbSm)HamgPH)Hp+z^z!V3=vjsE_fXvZ`) zmeaJ0e^%NUmKh69`Ey}K@)m-6#hgWkB@b8rzA)E z(|nV@hxNO~>Y&)tMZjmGS|xjHgfl|?5x|NVjL=zVMP{7CYU9ZYp{3<_6l@DYKRohV zhtKr7H?a;k6tNZ7(w|CJL`q6ZS3zOSNqiD6Voq9Nda$?*kcZqNAjytq;0VTN&<C1|X@ekRLQ7GrMWr{TJ`8)b_e@Rq0wQn8qn^1GUiR}_nZ#nHT;IZ+W za^<^gW^W@ArRb5hg~fj5jMiV1ABBa+8C8dDVWs_8(Kp-~8I6i_hb-pfSr1D~O9v{$ z9ty( zRzjzf5H6L@gAV%3YU=leaKG1t;XHb%fVW`A zB=_+BCJKO0j`3_eW`)Y=^h-aG@j&u*hRQ+8!7A6#IG@j(uw#tn9U@mV+ss0*j6$RX zDKkqiul>098q}Qp&rzWjk^&&4p!9gcmT#gUKZ1t)XQU;fKhX~rb5DH7yY)q`_-5P} zp#eF^7DJwj2YIKJ$iX)UEB$X*mtyers-l$mu%Rp{X@5X7kOJnMz{Wc@G-B?={@_X5 z$U3fhs#!uj{xje>5wJ%4V)!!sraR96kdu{CTV8IJq^W~qH`K`2-b&-@G3}4^>zj6~ z7V|6pZR24!6%74+ktf7es?kuD{g!h^J>*k7d9<<0pAyEApBDJCZ^j=9ZIiqp^!Vce zp47|W{yxOSOc9U#6Vlu1lMdO!6i^R^^jDPGogWHu8SF_v%o~DzY7T19I5w>#Z3dpT zRoSkRNntt*v$o!hQdV@p%pBM!!gs4FD!Z4abff!ZxBOvaOb+&#G`DztE|jotScj_?dAT5vyS^K>WMTScDPEy@ zxRr#6QUX!u>5x*0u8-BOG!&Z(fmx8vXoCCVGr^fZG+yT?!r@(HJD$J~@-7?X&3nK3YRzKstzF(5&{s{|VfQP1ML zmF{2^Gi-YyG3(DhFxJcRdyOAxt#4=15}B?UpIF^G{~~>662?o`R^y>K)8|+p=E(p2 zYpM0Wj^e{3;A75Pb);~nIM8_O5*+9-ItHzM=|C8-9sjq{BR(>MXx>c)|DMB-3Bpaa z^c5hpKJa6v3eyQuul)b-V-cN|9KFo2_xtf(i+s$pbiAx)K-#qsj zxA#XH!fpEQWBNS~U>v@*u%L%vmE1=IwAwaat5;TP{olhOJNN_qFZ_Rdag53DEWnDe z>z``E7|HoZu$i&9q3a_ziST9hH|q;N$@3QGL_n2p6hCwzD&wXF?gpcMF?;PsUC%c|$^4d^Z>fQ*Eq Kc$KI@!2bhJTgn{( diff --git a/docs/images/BTB_logo.svg b/docs/images/BTB_logo.svg deleted file mode 100644 index 099f1101..00000000 --- a/docs/images/BTB_logo.svg +++ /dev/null @@ -1,184 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/docs/images/NGI_logo.png b/docs/images/NGI_logo.png deleted file mode 100644 index 3f4b769e551050a878e22bd1120033b097b22670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20547 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 - - -image/svg+xml \ No newline at end of file diff --git a/docs/images/SDU_logo.png b/docs/images/SDU_logo.png deleted file mode 100644 index 38e60b4b6a1de2255f2086e8c36a84ecfbe6e14e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11894 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 diff --git a/docs/images/SciLifeLab_logo.png b/docs/images/SciLifeLab_logo.png deleted file mode 100644 index bc4dbda623f8f70d82f883c5019638d86016a298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8387 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 Z^1n)knbg1LpQ-==002ovPDHLkV1kk8bd>-A diff --git a/docs/images/SciLifeLab_logo.svg b/docs/images/SciLifeLab_logo.svg deleted file mode 100644 index b8a44b79..00000000 --- a/docs/images/SciLifeLab_logo.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/docs/images/rnafusion_logo.png b/docs/images/rnafusion_logo.png deleted file mode 100644 index 548f1578dd0ec9f1531e72f099ee15149900446e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15692 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 -image/svg+xmlnf- - -core/ - -rnafusion - - \ No newline at end of file diff --git a/docs/images/summary_graph_1.png b/docs/images/summary_graph_1.png deleted file mode 100644 index 61d32e5951d33ce769870eae523c4c472fc1eb83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95932 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%0A!B#Ss?Lo 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 SJWu!*@KRCGkgtAd5%zy+iOr(` diff --git a/docs/images/summary_graph_2.png b/docs/images/summary_graph_2.png deleted file mode 100644 index 75dffc13ac9d07df4709d63cc9d285845d5a4fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66019 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